Files
Inboxintel/src/InboxIntel.Api/Controllers/UnsubscribeController.cs
T
cesnimda c5c33f7023
CI / backend (push) Successful in 53s
CI / frontend (push) Successful in 14s
Deploy Staging / deploy (push) Successful in 28s
Security / secrets (push) Successful in 3s
Security / dependencies (push) Successful in 59s
CI / backend (pull_request) Successful in 51s
CI / frontend (pull_request) Successful in 15s
Security / secrets (pull_request) Successful in 3s
Security / dependencies (pull_request) Successful in 56s
fix(security): audit batch A — validation, rate limiting, sessions (#20)
2026-07-02 03:22:17 +02:00

33 lines
1.3 KiB
C#

using InboxIntel.Application.Abstractions;
using InboxIntel.Application.DTOs;
using Microsoft.AspNetCore.Mvc;
namespace InboxIntel.Api.Controllers;
[Microsoft.AspNetCore.RateLimiting.EnableRateLimiting("expensive")] // AUDIT H-2: triggers server-side outbound HTTP
public class UnsubscribeController : ApiControllerBase
{
private readonly IUnsubscribeService _unsub;
public UnsubscribeController(IUnsubscribeService unsub) => _unsub = unsub;
[HttpPost("detect")]
public async Task<IActionResult> Detect(CancellationToken ct)
{
await _unsub.DetectAsync(UserId, ct);
return NoContent();
}
/// <summary>Senders that are safe to unsubscribe from, ranked by volume.</summary>
[HttpGet("safe-list")]
public async Task<IActionResult> SafeList(CancellationToken ct)
=> Ok(await _unsub.GetSafeToUnsubscribeAsync(UserId, ct));
/// <summary>Process the confirmed unsubscribe queue. Requires Confirmed = true.</summary>
[HttpPost("process")]
public async Task<IActionResult> Process([FromBody] UnsubscribeRequestDto request, CancellationToken ct)
{
var result = await _unsub.ProcessQueueAsync(UserId, request, ct);
return result.Succeeded ? Ok(result.Value) : BadRequest(new { error = result.Error });
}
}