using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Localization; using PrivaPub.ClientModels; using PrivaPub.ClientModels.User; using PrivaPub.Extensions; using PrivaPub.Resources; using PrivaPub.Services; using System.ComponentModel.DataAnnotations; namespace PrivaPub.Controllers.ClientToServer { [ApiController, Route("clientapi/admin")] public class AdminController : ControllerBase { readonly IRootUsersService RootUsersService; readonly ILogger Logger; readonly IStringLocalizer Localizer; public AdminController(ILogger logger, IStringLocalizer localizer, IRootUsersService rootUsersService) { Logger = logger; Localizer = localizer; RootUsersService = rootUsersService; } // an administrator never removes, bans or unbans itself; the request's own list is left as it came UsersIds Others(UsersIds usersIds) { var selfId = User.GetUserId(); return new UsersIds { UserIdList = usersIds.UserIdList.Where(id => id != selfId).ToList() }; } [HttpDelete, Route("/clientapi/admin/remove/users"), Authorize(Policy = Policies.IsAdmin)] public async Task RemoveUsers([Required] UsersIds usersIds) { var result = new WebResult(); try { result = await RootUsersService.RemoveUserAsync(Others(usersIds)); if (!result.IsValid) return StatusCode(result.StatusCode, result); return Ok(); } catch (Exception ex) { Logger.LogError(ex, $"{nameof(User)}.{nameof(RemoveUsers)}()"); return BadRequest(result.Invalidate(Localizer["Something went wrong."])); } } [HttpPost, Authorize(Policy = Policies.IsAdmin), Route("/clientapi/admin/ban/users")] public async Task BanUsers([Required] UsersIds usersIds) { if (!ModelState.IsValid) return BadRequest(usersIds); var result = new WebResult(); try { result = await RootUsersService.BanUserAsync(Others(usersIds)); if (!result.IsValid) return StatusCode(result.StatusCode, result); return Ok(); } catch (Exception ex) { Logger.LogError(ex, $"{nameof(User)}.{nameof(BanUsers)}()"); return BadRequest(result.Invalidate(Localizer["Something went wrong."])); } } [HttpPost, Authorize(Policy = Policies.IsAdmin), Route("/clientapi/admin/unban/users")] public async Task UnbanUsers([Required] UsersIds usersIds) { if (!ModelState.IsValid) return BadRequest(usersIds); var result = new WebResult(); try { result = await RootUsersService.UnbanUserAsync(Others(usersIds)); if (!result.IsValid) return StatusCode(result.StatusCode, result); return Ok(); } catch (Exception ex) { Logger.LogError(ex, $"{nameof(User)}.{nameof(UnbanUsers)}()"); return BadRequest(result.Invalidate(Localizer["Something went wrong."])); } } } }