diff --git a/Iceshrimp.Backend/Controllers/Web/EmojiController.cs b/Iceshrimp.Backend/Controllers/Web/EmojiController.cs index 4231df57..d4b2136d 100644 --- a/Iceshrimp.Backend/Controllers/Web/EmojiController.cs +++ b/Iceshrimp.Backend/Controllers/Web/EmojiController.cs @@ -1,8 +1,10 @@ using System.Net; using System.Net.Mime; using Iceshrimp.Backend.Controllers.Shared.Attributes; +using Iceshrimp.Backend.Controllers.Shared.Schemas; using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Database; +using Iceshrimp.Backend.Core.Extensions; using Iceshrimp.Backend.Core.Middleware; using Iceshrimp.Backend.Core.Services; using Iceshrimp.Shared.Schemas.Web; @@ -46,25 +48,28 @@ public class EmojiController( .ToListAsync(); } - [HttpGet("remote")] + [HttpGet("remote/{host?}")] [Authorize("role:moderator")] + [RestPagination(100, 500)] [ProducesResults(HttpStatusCode.OK)] - public async Task> GetRemoteEmoji() + public async Task>> GetRemoteEmoji(string? host, PaginationQuery pq) { - return await db.Emojis - .Where(p => p.Host != null) - .Select(p => new EmojiResponse - { - Id = p.Id, - Name = p.Name, - Uri = p.Uri, - Aliases = p.Aliases, - Category = p.Host, - PublicUrl = p.GetAccessUrl(instance.Value), - License = p.License, - Sensitive = p.Sensitive - }) - .ToListAsync(); + var res = await db.Emojis + .Where(p => host == null ? p.Host != null : p.Host == host) + .Select(p => new EmojiResponse + { + Id = p.Id, + Name = p.Name, + Uri = p.Uri, + Aliases = p.Aliases, + Category = p.Host, + PublicUrl = p.GetAccessUrl(instance.Value), + License = p.License, + Sensitive = p.Sensitive + }) + .ToListAsync(); + + return HttpContext.CreatePaginationWrapper(pq, res); } [HttpGet("{id}")] @@ -72,8 +77,8 @@ public class EmojiController( [ProducesErrors(HttpStatusCode.NotFound)] public async Task GetEmoji(string id) { - var emoji = await db.Emojis.FirstOrDefaultAsync(p => p.Id == id) ?? - throw GracefulException.NotFound("Emoji not found"); + var emoji = await db.Emojis.FirstOrDefaultAsync(p => p.Id == id) + ?? throw GracefulException.NotFound("Emoji not found"); return new EmojiResponse { @@ -155,8 +160,8 @@ public class EmojiController( public async Task UpdateEmoji(string id, UpdateEmojiRequest request) { var emoji = await emojiSvc.UpdateLocalEmojiAsync(id, request.Name, request.Aliases, request.Category, - request.License, request.Sensitive) ?? - throw GracefulException.NotFound("Emoji not found"); + request.License, request.Sensitive) + ?? throw GracefulException.NotFound("Emoji not found"); return new EmojiResponse { diff --git a/Iceshrimp.Backend/Core/Database/IEntity.cs b/Iceshrimp.Backend/Core/Database/IEntity.cs index 088ee262..78e4a1bd 100644 --- a/Iceshrimp.Backend/Core/Database/IEntity.cs +++ b/Iceshrimp.Backend/Core/Database/IEntity.cs @@ -1,12 +1,11 @@ +using Iceshrimp.Shared.Helpers; + namespace Iceshrimp.Backend.Core.Database; -public interface IEntity -{ - public string Id { get; } -} +public interface IEntity : IIdentifiable; public class EntityWrapper : IEntity { public required T Entity { get; init; } public required string Id { get; init; } -} \ No newline at end of file +} diff --git a/Iceshrimp.Backend/Core/Extensions/HttpContextExtensions.cs b/Iceshrimp.Backend/Core/Extensions/HttpContextExtensions.cs index 6cdc2432..cab6a698 100644 --- a/Iceshrimp.Backend/Core/Extensions/HttpContextExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/HttpContextExtensions.cs @@ -2,6 +2,7 @@ using Iceshrimp.Backend.Controllers.Shared.Attributes; using Iceshrimp.Backend.Controllers.Shared.Schemas; using Iceshrimp.Backend.Core.Database; using Iceshrimp.Backend.Core.Middleware; +using Iceshrimp.Shared.Helpers; using Iceshrimp.Shared.Schemas.Web; using Microsoft.AspNetCore.Http.Extensions; @@ -10,7 +11,7 @@ namespace Iceshrimp.Backend.Core.Extensions; public static partial class HttpContextExtensions { public static PaginationWrapper CreatePaginationWrapper( - this HttpContext ctx, PaginationQuery query, IEnumerable paginationData, TData data + this HttpContext ctx, PaginationQuery query, IEnumerable paginationData, TData data ) { var attr = ctx.GetEndpoint()?.Metadata.GetMetadata(); @@ -37,7 +38,7 @@ public static partial class HttpContextExtensions public static PaginationWrapper CreatePaginationWrapper( this HttpContext ctx, PaginationQuery query, TData data - ) where TData : IEnumerable + ) where TData : IEnumerable { return CreatePaginationWrapper(ctx, query, data, data); } diff --git a/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs b/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs index 13c5133d..9bdbd93b 100644 --- a/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs +++ b/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs @@ -10,8 +10,11 @@ internal class EmojiControllerModel(ApiClient api) public Task> GetAllEmojiAsync() => api.CallAsync>(HttpMethod.Get, "/emoji"); - public Task> GetRemoteEmojiAsync() => - api.CallAsync>(HttpMethod.Get, "/emoji/remote"); + public Task>> GetRemoteEmojiAsync(PaginationQuery pq) => + api.CallAsync>>(HttpMethod.Get, "/emoji/remote", pq); + + public Task>> GetRemoteEmojiAsync(string instance, PaginationQuery pq) => + api.CallAsync>>(HttpMethod.Get, $"/emoji/remote/{instance}", pq); public Task UploadEmojiAsync(IBrowserFile file, string? name) => api.CallAsync(HttpMethod.Post, "/emoji", @@ -31,4 +34,4 @@ internal class EmojiControllerModel(ApiClient api) public Task GetEmojiAsync(string id) => api.CallNullableAsync(HttpMethod.Get, $"/emoji/{id}"); -} \ No newline at end of file +} diff --git a/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor index e31eb592..184ab5d1 100644 --- a/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor +++ b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor @@ -106,7 +106,17 @@ { State = State.Loading; - Emojis = Source == "remote" ? await Api.Emoji.GetRemoteEmojiAsync() : await Api.Emoji.GetAllEmojiAsync(); + if (Source == "remote") + { + //TODO: impolement proper pagination + var res = await Api.Emoji.GetRemoteEmojiAsync(new PaginationQuery()); + Emojis = res.Data; + } + else + { + Emojis = await Api.Emoji.GetAllEmojiAsync(); + } + if (Emojis.Count == 0) { State = State.Empty;