// Copyright (C) 2023-present sam/u1f320 (vulpine.solutions) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . using Foxnouns.Backend.Database; using Foxnouns.Backend.Database.Models; using Foxnouns.Backend.Middleware; using Foxnouns.Backend.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Foxnouns.Backend.Controllers.Moderation; [Route("/api/v2/moderation/audit-log")] [Authorize("user.moderation")] [Limit(RequireModerator = true)] public class AuditLogController(DatabaseContext db, ModerationRendererService moderationRenderer) : ApiControllerBase { public async Task GetAuditLogAsync( [FromQuery] AuditLogEntryType? type = null, [FromQuery] int? limit = null, [FromQuery] Snowflake? before = null ) { limit = limit switch { > 100 => 100, < 0 => 100, null => 100, _ => limit, }; IQueryable query = db.AuditLog.OrderByDescending(e => e.Id); if (before != null) query = query.Where(e => e.Id < before.Value); if (type != null) query = query.Where(e => e.Type == type); List entries = await query.Take(limit!.Value).ToListAsync(); return Ok(entries.Select(moderationRenderer.RenderAuditLogEntry)); } }