using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RMuseum.Models.Accounting; using RMuseum.Models.Accounting.ViewModels; using RMuseum.Models.Auth.Memory; using RMuseum.Services; using System; using System.Linq; using System.Net; using System.Threading.Tasks; namespace RMuseum.Controllers { [Produces("application/json")] [Route("api/donations")] public class DonationAccountingController : Controller { /// /// returns all donations /// /// [HttpGet] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorDonationViewModel[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetDonations() { try { var res = await _donationService.GetDonations(); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// add donation + regenerate donations page /// /// /// [HttpPost] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorDonationViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task AddDonation([FromBody] GanjoorDonationViewModel donation) { try { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); var res = await _donationService.AddDonation(userId, donation); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// delete donation + regenerate donations page /// /// /// [HttpDelete("{id}")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task DeleteDonation(int id) { try { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); var res = await _donationService.DeleteDonation(userId, id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// returns all expenses /// /// [HttpGet("expenses")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorExpense[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetExpenses() { try { var res = await _donationService.GetExpenses(); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// add expense + regenerate donations page /// /// /// [HttpPost("expense")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorDonationViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task AddExpense([FromBody] GanjoorExpense expense) { try { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); var res = await _donationService.AddExpense(userId, expense); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// delete expense /// /// /// [HttpDelete("expense/{id}")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task DeleteExpense(int id) { try { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); var res = await _donationService.DeleteExpense(userId, id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// one time import /// /// [HttpPost("onetimeimport")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task Import() { try { var res = await _donationService.InitializeRecords(); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// regenerate donations page /// /// [HttpPut("page")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task RegenerateDonationsPage() { try { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); var res = await _donationService.RegenerateDonationsPage(userId, "بازسازی دستی صفحهٔ کمکهای مالی"); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// is account info settings is on or off (for deciding to regenerate donations page based on it) /// /// [HttpGet("accountinfo/visible")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Donations)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public IActionResult IsAccountInfoVisible() { return Ok(_donationService.ShowAccountInfo); } /// /// donation service /// private readonly IDonationService _donationService; public DonationAccountingController(IDonationService donationService) { _donationService = donationService; } } }