using Ashi.MongoInterface.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Submission.Api.Configuration; using Submission.Api.Dto; using Submission.Api.Models; namespace Submission.Api.Controllers { [Route("api/[controller]")] [ApiController] [Authorize] public class AdminController : ControllerBase { private readonly PetitionSettings _petitionSettings; private readonly IMongoRepository _authorRepository; private readonly IMongoRepository _petitionRepository; private readonly IMongoRepository _signatureRepository; public AdminController(IOptions petitionSettings, IMongoRepository authorRepository, IMongoRepository petitionRepository, IMongoRepository signatureRepository) { _petitionSettings = petitionSettings.Value; _authorRepository = authorRepository; _petitionRepository = petitionRepository; _signatureRepository = signatureRepository; } [HttpGet("petitions", Name = "GetPetitions")] public IActionResult GetPetitions() { try { var petitions = _petitionRepository.FilterBy(x => x.Id != null); return Ok(petitions); } catch (Exception e) { return Problem("Petitions Folder not found"); } } [HttpGet("petitions-list", Name = "GetPetitionsList")] public IActionResult GetPetitionsList() { var list = _petitionRepository.FilterBy(x => x.Id != null); return Ok(list); } [HttpGet("create-petition-folder", Name = "CreatePetitionFolder")] public IActionResult create_petition_folder() { if (Directory.Exists("Petitions")) { return Ok("Petitions folder already exists"); } try { Directory.CreateDirectory("Petitions"); return Ok("Petitions folder created"); } catch (Exception e) { return Problem(e.Message); } } [HttpGet("export/{petition_id}", Name = "ExportSignatures")] public async Task ExportSignatures([FromRoute] Guid petition_id) { var petition = await _petitionRepository.FindByIdAsync(petition_id); if (petition == null) return NotFound("Petition not found"); var signatures = _signatureRepository.FilterBy(x => x.PetitionId == petition_id) .OrderBy(x => x.Timestamp) .ToList(); var rows = new System.Text.StringBuilder(); int index = 1; foreach (var sig in signatures) { rows.Append($@" {index++} {System.Net.WebUtility.HtmlEncode(sig.Name)} {System.Net.WebUtility.HtmlEncode(sig.IdCard)} {sig.Timestamp:yyyy-MM-dd} {sig.Signature_SVG} "); } var html = $@" Signatures - {System.Net.WebUtility.HtmlEncode(petition.NameEng)}

Signatures for: {System.Net.WebUtility.HtmlEncode(petition.NameEng)}

Total signatures: {signatures.Count}

{rows}
# Name ID Card Date Signed Signature
"; return Content(html, "text/html"); } [HttpPatch("petitions/{petition_id}/approve")] public async Task ApprovePetition([FromRoute] Guid petition_id, [FromBody] ApprovalDto body) { var petition = await _petitionRepository.FindByIdAsync(petition_id); if (petition == null) return NotFound("Petition not found"); petition.isApproved = body.IsApproved; await _petitionRepository.ReplaceOneAsync(petition); return Ok(petition); } } }