using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Localization; using MongoDB.Entities; using PrivaPub.ClientModels; using PrivaPub.ClientModels.Admin; using PrivaPub.Federation.Moderation; using PrivaPub.Models.Federation; using PrivaPub.Resources; namespace PrivaPub.Controllers.ClientToServer { [ApiController, Route("clientapi/admin/domainblocks"), Authorize(Policy = Policies.IsAdmin)] public class DomainBlockController : ControllerBase { readonly IDomainBlocks _domainBlocks; readonly IStringLocalizer _localizer; public DomainBlockController(IDomainBlocks domainBlocks, IStringLocalizer localizer) { _domainBlocks = domainBlocks; _localizer = localizer; } [HttpGet, Route("/clientapi/admin/domainblocks/list")] public async Task List(CancellationToken token) => Ok((await DB.Default.Find().Sort(b => b.Domain, Order.Ascending).ExecuteAsync(token)).Select(ToView).ToList()); [HttpPost, Route("/clientapi/admin/domainblocks/insert")] public async Task Insert(DomainBlockForm form, CancellationToken token) { var domain = DomainBlocks.Normalise(form.Domain); if (!ModelState.IsValid || Uri.CheckHostName(domain) != UriHostNameType.Dns) return BadRequest(new WebResult().Invalidate(_localizer["Invalid model."])); var block = await DB.Default.UpdateAndGet() .Match(b => b.Domain == domain) .Modify(b => b.Domain, domain) .Modify(b => b.Severity, form.Suspend ? DomainBlockSeverity.Suspend : DomainBlockSeverity.Silence) .Modify(b => b.RejectMedia, form.RejectMedia) .Modify(b => b.PublicComment, form.PublicComment) .Modify(b => b.PrivateComment, form.PrivateComment) .Modify(b => b.SetOnInsert(x => x.CreatedAt, DateTime.UtcNow)) .Option(o => o.IsUpsert = true) .ExecuteAsync(token); await _domainBlocks.Reload(token); return Ok(ToView(block)); } [HttpPost, Route("/clientapi/admin/domainblocks/delete")] public async Task Delete([FromQuery] string domain, CancellationToken token) { domain = DomainBlocks.Normalise(domain); await DB.Default.DeleteAsync(b => b.Domain == domain); await _domainBlocks.Reload(token); return Ok(); } static ViewDomainBlock ToView(DomainBlock block) => new() { Id = block.ID, Domain = block.Domain, Severity = block.Severity.ToString(), RejectMedia = block.RejectMedia, PublicComment = block.PublicComment, PrivateComment = block.PrivateComment, CreatedAt = block.CreatedAt }; } }