using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using MongoDB.Entities; using PrivaPub.ClientModels; using PrivaPub.ClientModels.Admin; using PrivaPub.Extensions; using PrivaPub.Models.Social; namespace PrivaPub.Controllers.ClientToServer { [ApiController, Route("clientapi/moderator"), Authorize(Policy = Policies.IsModerator)] public class ModeratorController : ControllerBase { [HttpGet, Route("/clientapi/moderator/reports")] public async Task Reports([FromQuery] bool resolved, CancellationToken token) => Ok((await DB.Default.Find().Match(r => r.IsResolved == resolved).Sort(r => r.ID, Order.Descending).Limit(100).ExecuteAsync(token)) .Select(r => new ViewReport { ID = r.ID, Reporter = r.ReporterAvatarId != default ? "local" : r.ReporterActorURI, TargetAccountId = r.TargetAccountId, TargetActorURI = r.TargetActorURI, PostIds = r.PostIds, ObjectURIs = r.ObjectURIs, Category = r.Category, Comment = r.Comment, Forwarded = r.Forwarded, IsResolved = r.IsResolved, CreatedAt = r.CreatedAt, ResolvedAt = r.ResolvedAt, RemoteResolvedAt = r.RemoteResolvedAt, RemoteResolvedBy = r.RemoteResolvedBy })); [HttpPost, Route("/clientapi/moderator/reports/{id}/resolve")] public async Task Resolve(string id, CancellationToken token) { var result = await DB.Default.Update().MatchID(id) .Modify(r => r.IsResolved, true) .Modify(r => r.ResolvedAt, DateTime.UtcNow) .Modify(r => r.ResolvedBy, User.GetUserId()) .ExecuteAsync(token); return result.MatchedCount == 0 ? NotFound() : Ok(); } } }