feat: добавил личные уведомления для пользователей
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 9s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 26s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 19s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 8s
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 9s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 26s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 19s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 8s
Реализовал хранение, получение и отметку прочитанными пользовательских уведомлений. Обновил фронтенд для отображения и управления уведомлениями в профиле студента.
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Security.Claims;
|
||||
using UniVerse.Application.DTOs.Common;
|
||||
using UniVerse.Application.DTOs.Notifications;
|
||||
using UniVerse.Application.Interfaces;
|
||||
|
||||
@@ -8,7 +10,7 @@ namespace UniVerse.Api.Controllers;
|
||||
/// <summary>Отправка и планирование уведомлений через доступные каналы.</summary>
|
||||
[ApiController]
|
||||
[Route("api/v1/notifications")]
|
||||
[Authorize(Roles = "Admin")]
|
||||
[Authorize]
|
||||
[Produces("application/json")]
|
||||
public class NotificationsController : ControllerBase
|
||||
{
|
||||
@@ -19,6 +21,34 @@ public class NotificationsController : ControllerBase
|
||||
_notifications = notifications;
|
||||
}
|
||||
|
||||
private int CurrentUserId => int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier) ?? User.FindFirstValue("sub") ?? "0");
|
||||
|
||||
/// <summary>Получить уведомления текущего пользователя.</summary>
|
||||
/// <param name="pagination">Параметры пагинации.</param>
|
||||
/// <param name="cancellationToken">Токен отмены запроса.</param>
|
||||
/// <response code="200">Список уведомлений.</response>
|
||||
/// <response code="401">Требуется аутентификация.</response>
|
||||
[HttpGet]
|
||||
[ProducesResponseType(typeof(PagedResult<UserNotificationDto>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
public async Task<ActionResult<PagedResult<UserNotificationDto>>> GetMine(
|
||||
[FromQuery] PaginationRequest pagination,
|
||||
CancellationToken cancellationToken) =>
|
||||
Ok(await _notifications.GetUserNotificationsAsync(CurrentUserId, pagination, cancellationToken));
|
||||
|
||||
/// <summary>Отметить все уведомления текущего пользователя как прочитанные.</summary>
|
||||
/// <param name="cancellationToken">Токен отмены запроса.</param>
|
||||
/// <response code="204">Уведомления отмечены прочитанными.</response>
|
||||
/// <response code="401">Требуется аутентификация.</response>
|
||||
[HttpPatch("read-all")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
public async Task<IActionResult> MarkAllRead(CancellationToken cancellationToken)
|
||||
{
|
||||
await _notifications.MarkAllReadAsync(CurrentUserId, cancellationToken);
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
/// <summary>Отправить уведомление немедленно.</summary>
|
||||
/// <remarks>
|
||||
/// Канал задаётся строкой, например `email`. Новые провайдеры добавляются через `INotificationProvider`.
|
||||
@@ -27,6 +57,7 @@ public class NotificationsController : ControllerBase
|
||||
/// <response code="202">Уведомление принято к отправке.</response>
|
||||
/// <response code="401">Требуется аутентификация.</response>
|
||||
/// <response code="403">Требуется роль Admin.</response>
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpPost("send")]
|
||||
[ProducesResponseType(StatusCodes.Status202Accepted)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
@@ -50,6 +81,7 @@ public class NotificationsController : ControllerBase
|
||||
/// <response code="202">Уведомление поставлено в очередь Quartz.NET.</response>
|
||||
/// <response code="401">Требуется аутентификация.</response>
|
||||
/// <response code="403">Требуется роль Admin.</response>
|
||||
[Authorize(Roles = "Admin")]
|
||||
[HttpPost("schedule")]
|
||||
[ProducesResponseType(typeof(ScheduledNotificationResponse), StatusCodes.Status202Accepted)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
|
||||
Reference in New Issue
Block a user