[backend/masto-client] Add notification filtering

This commit is contained in:
Laura Hausmann 2024-02-20 19:46:06 +01:00
parent cbd4b576e2
commit df726f6f9f
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
4 changed files with 54 additions and 2 deletions

View file

@ -27,7 +27,9 @@ public class NotificationController(DatabaseContext db, NotificationRenderer not
[LinkPagination(40, 80)] [LinkPagination(40, 80)]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<NotificationEntity>))] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<NotificationEntity>))]
[ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(MastodonErrorResponse))] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(MastodonErrorResponse))]
public async Task<IActionResult> GetNotifications(MastodonPaginationQuery query) public async Task<IActionResult> GetNotifications(
MastodonPaginationQuery query, NotificationSchemas.GetNotificationsRequest request
)
{ {
var user = HttpContext.GetUserOrFail(); var user = HttpContext.GetUserOrFail();
var res = await db.Notifications var res = await db.Notifications
@ -42,6 +44,7 @@ public class NotificationController(DatabaseContext db, NotificationRenderer not
p.Type == NotificationType.PollEnded || p.Type == NotificationType.PollEnded ||
p.Type == NotificationType.FollowRequestReceived || p.Type == NotificationType.FollowRequestReceived ||
p.Type == NotificationType.Edit) p.Type == NotificationType.Edit)
.FilterByGetNotificationsRequest(request)
.EnsureNoteVisibilityFor(p => p.Note, user) .EnsureNoteVisibilityFor(p => p.Note, user)
.FilterBlocked(p => p.Notifier, user) .FilterBlocked(p => p.Notifier, user)
.FilterBlocked(p => p.Note, user) .FilterBlocked(p => p.Note, user)

View file

@ -32,4 +32,20 @@ public class NotificationEntity : IEntity
_ => throw new GracefulException($"Unsupported notification type: {type}") _ => throw new GracefulException($"Unsupported notification type: {type}")
}; };
} }
public static IEnumerable<NotificationType> DecodeType(string type)
{
return type switch
{
"follow" => [NotificationType.Follow],
"mention" => [NotificationType.Mention, NotificationType.Reply],
"renote" => [NotificationType.Renote],
"reblog" => [NotificationType.Quote],
"favourite" => [NotificationType.Like],
"poll" => [NotificationType.PollEnded],
"follow_request" => [NotificationType.FollowRequestReceived],
"update" => [NotificationType.Edit],
_ => []
};
}
} }

View file

@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
namespace Iceshrimp.Backend.Controllers.Mastodon.Schemas;
public abstract class NotificationSchemas
{
public class GetNotificationsRequest
{
[FromQuery(Name = "types")] public List<string>? Types { get; set; }
[FromQuery(Name = "exclude_types")] public List<string>? ExcludeTypes { get; set; }
[FromQuery(Name = "account_id")] public string? AccountId { get; set; }
}
}

View file

@ -292,6 +292,26 @@ public static class QueryableExtensions
return query; return query;
} }
public static IQueryable<Notification> FilterByGetNotificationsRequest(
this IQueryable<Notification> query,
NotificationSchemas.GetNotificationsRequest request
)
{
if (request.AccountId != null)
query = query.Where(p => p.NotifierId == request.AccountId);
if (request.Types != null)
query = query.Where(p => request.Types.SelectMany(NotificationEntity.DecodeType)
.Distinct()
.Contains(p.Type));
if (request.ExcludeTypes != null)
query = query.Where(p => !request.ExcludeTypes.SelectMany(NotificationEntity.DecodeType)
.Distinct()
.Contains(p.Type));
return query;
}
#pragma warning disable CS8602 // Dereference of a possibly null reference. #pragma warning disable CS8602 // Dereference of a possibly null reference.
// Justification: in the context of nullable EF navigation properties, null values are ignored and therefore irrelevant. // Justification: in the context of nullable EF navigation properties, null values are ignored and therefore irrelevant.
// Source: https://learn.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#navigating-and-including-nullable-relationships // Source: https://learn.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#navigating-and-including-nullable-relationships