Iceshrimp.NET/Iceshrimp.Backend/Controllers/Mastodon/NotificationController.cs
2024-09-13 21:44:31 +02:00

82 lines
No EOL
3.5 KiB
C#

using System.Net;
using System.Net.Mime;
using Iceshrimp.Backend.Controllers.Mastodon.Attributes;
using Iceshrimp.Backend.Controllers.Mastodon.Renderers;
using Iceshrimp.Backend.Controllers.Mastodon.Schemas;
using Iceshrimp.Backend.Controllers.Mastodon.Schemas.Entities;
using Iceshrimp.Backend.Controllers.Shared.Attributes;
using Iceshrimp.Backend.Core.Database;
using Iceshrimp.Backend.Core.Extensions;
using Iceshrimp.Backend.Core.Middleware;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;
using Microsoft.EntityFrameworkCore;
using static Iceshrimp.Backend.Core.Database.Tables.Notification;
namespace Iceshrimp.Backend.Controllers.Mastodon;
[MastodonApiController]
[Route("/api/v1/notifications")]
[Authenticate]
[EnableCors("mastodon")]
[EnableRateLimiting("sliding")]
[Produces(MediaTypeNames.Application.Json)]
public class NotificationController(DatabaseContext db, NotificationRenderer notificationRenderer) : ControllerBase
{
[HttpGet]
[Authorize("read:notifications")]
[LinkPagination(40, 80)]
[ProducesResults(HttpStatusCode.OK)]
[ProducesErrors(HttpStatusCode.NotFound)]
public async Task<List<NotificationEntity>> GetNotifications(
MastodonPaginationQuery query, NotificationSchemas.GetNotificationsRequest request
)
{
var user = HttpContext.GetUserOrFail();
var isPleroma = HttpContext.GetOauthToken()!.IsPleroma;
return await db.Notifications
.IncludeCommonProperties()
.Where(p => p.Notifiee == user)
.Where(p => p.Notifier != null)
.Where(p => p.Type == NotificationType.Follow ||
p.Type == NotificationType.Mention ||
p.Type == NotificationType.Reply ||
p.Type == NotificationType.Renote ||
p.Type == NotificationType.Quote ||
p.Type == NotificationType.Like ||
p.Type == NotificationType.PollEnded ||
p.Type == NotificationType.FollowRequestReceived ||
p.Type == NotificationType.Reaction ||
p.Type == NotificationType.Edit)
.FilterByGetNotificationsRequest(request)
.EnsureNoteVisibilityFor(p => p.Note, user)
.FilterHiddenNotifications(user, db)
.FilterMutedThreads(user, db)
.Paginate(p => p.MastoId, query, ControllerContext)
.PrecomputeNoteVisibilities(user)
.RenderAllForMastodonAsync(notificationRenderer, user, isPleroma);
}
[HttpGet("{id:long}")]
[Authorize("read:notifications")]
[ProducesResults(HttpStatusCode.OK)]
[ProducesErrors(HttpStatusCode.NotFound)]
public async Task<NotificationEntity> GetNotification(long id)
{
var user = HttpContext.GetUserOrFail();
var isPleroma = HttpContext.GetOauthToken()!.IsPleroma;
var notification = await db.Notifications
.IncludeCommonProperties()
.Where(p => p.Notifiee == user && p.MastoId == id)
.EnsureNoteVisibilityFor(p => p.Note, user)
.PrecomputeNoteVisibilities(user)
.FirstOrDefaultAsync() ??
throw GracefulException.RecordNotFound();
return await notificationRenderer.RenderAsync(notification.EnforceRenoteReplyVisibility(p => p.Note),
user, isPleroma);
}
}