using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading; using Jellyfin.Api.Constants; using Jellyfin.Api.Models.NotificationDtos; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Notifications; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Notifications; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace Jellyfin.Api.Controllers { /// /// The notification controller. /// [Authorize(Policy = Policies.DefaultAuthorization)] public class NotificationsController : BaseJellyfinApiController { private readonly INotificationManager _notificationManager; private readonly IUserManager _userManager; /// /// Initializes a new instance of the class. /// /// The notification manager. /// The user manager. public NotificationsController(INotificationManager notificationManager, IUserManager userManager) { _notificationManager = notificationManager; _userManager = userManager; } /// /// Gets a user's notifications. /// /// Notifications returned. /// An containing a list of notifications. [HttpGet("{userId}")] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult GetNotifications() { return new NotificationResultDto(); } /// /// Gets a user's notification summary. /// /// Summary of user's notifications returned. /// An containing a summary of the users notifications. [HttpGet("{userId}/Summary")] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult GetNotificationsSummary() { return new NotificationsSummaryDto(); } /// /// Gets notification types. /// /// All notification types returned. /// An containing a list of all notification types. [HttpGet("Types")] [ProducesResponseType(StatusCodes.Status200OK)] public IEnumerable GetNotificationTypes() { return _notificationManager.GetNotificationTypes(); } /// /// Gets notification services. /// /// All notification services returned. /// An containing a list of all notification services. [HttpGet("Services")] [ProducesResponseType(StatusCodes.Status200OK)] public IEnumerable GetNotificationServices() { return _notificationManager.GetNotificationServices(); } /// /// Sends a notification to all admins. /// /// The URL of the notification. /// The level of the notification. /// The name of the notification. /// The description of the notification. /// Notification sent. /// A . [HttpPost("Admin")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult CreateAdminNotification( [FromQuery] string? url, [FromQuery] NotificationLevel? level, [FromQuery, Required] string name = "", [FromQuery, Required] string description = "") { var notification = new NotificationRequest { Name = name, Description = description, Url = url, Level = level ?? NotificationLevel.Normal, UserIds = _userManager.Users .Where(user => user.HasPermission(PermissionKind.IsAdministrator)) .Select(user => user.Id) .ToArray(), Date = DateTime.UtcNow, }; _notificationManager.SendNotification(notification, CancellationToken.None); return NoContent(); } /// /// Sets notifications as read. /// /// Notifications set as read. /// A . [HttpPost("{userId}/Read")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SetRead() { return NoContent(); } /// /// Sets notifications as unread. /// /// Notifications set as unread. /// A . [HttpPost("{userId}/Unread")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SetUnread() { return NoContent(); } } }