a0a0575a99
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 10s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 1m17s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 12s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 6s
63 lines
3.0 KiB
C#
63 lines
3.0 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using UniVerse.Application.DTOs.Notifications;
|
|
using UniVerse.Application.Interfaces;
|
|
|
|
namespace UniVerse.Api.Controllers;
|
|
|
|
/// <summary>Отправка и планирование уведомлений через доступные каналы.</summary>
|
|
[ApiController]
|
|
[Route("api/v1/notifications")]
|
|
[Authorize(Roles = "Admin")]
|
|
[Produces("application/json")]
|
|
public class NotificationsController : ControllerBase
|
|
{
|
|
private readonly INotificationService _notifications;
|
|
|
|
public NotificationsController(INotificationService notifications)
|
|
{
|
|
_notifications = notifications;
|
|
}
|
|
|
|
/// <summary>Отправить уведомление немедленно.</summary>
|
|
/// <remarks>
|
|
/// Канал задаётся строкой, например `email`. Новые провайдеры добавляются через `INotificationProvider`.
|
|
/// </remarks>
|
|
/// <param name="request">Канал, получатель, тема и текст уведомления.</param>
|
|
/// <response code="202">Уведомление принято к отправке.</response>
|
|
/// <response code="401">Требуется аутентификация.</response>
|
|
/// <response code="403">Требуется роль Admin.</response>
|
|
[HttpPost("send")]
|
|
[ProducesResponseType(StatusCodes.Status202Accepted)]
|
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
|
public async Task<IActionResult> Send([FromBody] SendNotificationRequest request, CancellationToken cancellationToken)
|
|
{
|
|
var message = new NotificationMessage(
|
|
request.Channel,
|
|
request.Recipient,
|
|
request.Subject,
|
|
request.Body,
|
|
request.RecipientName,
|
|
request.Metadata);
|
|
|
|
await _notifications.SendAsync(message, cancellationToken);
|
|
return Accepted();
|
|
}
|
|
|
|
/// <summary>Запланировать отложенную отправку уведомления через Quartz.NET.</summary>
|
|
/// <param name="request">Уведомление и момент отправки.</param>
|
|
/// <response code="202">Уведомление поставлено в очередь Quartz.NET.</response>
|
|
/// <response code="401">Требуется аутентификация.</response>
|
|
/// <response code="403">Требуется роль Admin.</response>
|
|
[HttpPost("schedule")]
|
|
[ProducesResponseType(typeof(ScheduledNotificationResponse), StatusCodes.Status202Accepted)]
|
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
|
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
|
public async Task<ActionResult<ScheduledNotificationResponse>> Schedule([FromBody] ScheduleNotificationRequest request, CancellationToken cancellationToken)
|
|
{
|
|
var response = await _notifications.ScheduleAsync(request, cancellationToken);
|
|
return Accepted(response);
|
|
}
|
|
}
|