using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Nexus.Api.Data; using Nexus.Api.Models; using Nexus.Api.Services; namespace Nexus.Api.Controllers; [Authorize] [ApiController] [Route("api/dashboard/notifications")] public class NotificationsController(INotificationService notificationService) : ControllerBase { [HttpGet] public async Task>> GetNotifications( [FromQuery] string forUser = "bao", [FromQuery] int limit = 50, [FromQuery] bool unreadOnly = false, CancellationToken ct = default) { var notifications = await notificationService.GetForUserAsync(forUser, limit, unreadOnly, ct); return Ok(notifications.Select(MapToDto).ToList()); } [HttpGet("unread-count")] public async Task> GetUnreadCount( [FromQuery] string forUser = "bao", CancellationToken ct = default) { var count = await notificationService.GetUnreadCountAsync(forUser, ct); return Ok(new UnreadCountDto(count)); } [HttpPatch("{id:guid}/read")] public async Task MarkAsRead(Guid id, CancellationToken ct = default) { var ok = await notificationService.MarkAsReadAsync(id, ct); return ok ? NoContent() : NotFound(new { error = "Notification not found." }); } [HttpPatch("read-all")] public async Task MarkAllAsRead( [FromQuery] string forUser = "bao", CancellationToken ct = default) { var count = await notificationService.MarkAllAsReadAsync(forUser, ct); return Ok(new { marked = count }); } private static NotificationDto MapToDto(Notification n) => new( n.Id, n.Type, n.Title, n.Message, n.ForUser, n.TaskId, n.IsRead, n.CreatedAt); }