using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using RMuseum.Models.Auth.Memory; using RMuseum.Models.Divan; using RMuseum.Models.Divan.ViewModels; using RMuseum.Services; using RSecurityBackend.Models.Auth.Memory; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; namespace RMuseum.Controllers { [Produces("application/json")] [Route("api/numberings")] public class NumberingController : Controller { /// /// get all numberings /// /// [HttpGet] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanNumbering[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetNumberingsAsync() { var res = await _numberingService.GetNumberingsAsync(); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get numbering by id /// /// /// [HttpGet("{id}")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanNumbering))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetNumberingAsync(int id) { var res = await _numberingService.GetNumberingAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get all numberings related to a category /// /// category id /// [HttpGet("cat/{id}")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanNumbering[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetNumberingsRelatedToCategoryAsync(int id) { var res1 = await _numberingService.GetNumberingsForCatAsync(id); if (!string.IsNullOrEmpty(res1.ExceptionString)) return BadRequest(res1.ExceptionString); var res2 = await _numberingService.GetNumberingsForDirectSubCatsAsync(id); if (!string.IsNullOrEmpty(res2.ExceptionString)) return BadRequest(res2.ExceptionString); List combined = new List(); foreach (var numbering in res1.Result) { combined.Add(numbering); } foreach (var numbering in res2.Result) { if(combined.Where(n => n.Id == numbering.Id).FirstOrDefault() == null) { combined.Add(numbering); } } return Ok(combined); } /// /// get all numbering patterns for a couplet /// /// /// /// [HttpGet("couplet/{poemId}/{coupletIndex}")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanCoupletNumberViewModel[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetNumberingsForCouplet(int poemId, int coupletIndex) { var res = await _numberingService.GetNumberingsForCouplet(poemId, coupletIndex); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// add new numbering /// /// /// [HttpPost] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanNumbering))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task AddNumberingAsync([FromBody] DivanNumbering numbering) { if (ReadOnlyMode) return BadRequest("سایت به دلایل فنی مثل انتقال سرور موقتاً در حالت فقط خواندنی قرار دارد. لطفاً ساعاتی دیگر مجدداً تلاش کنید."); var res = await _numberingService.AddNumberingAsync(numbering); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// update an existing numbering /// /// /// [HttpPut] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task UpdateNumberingAsync([FromBody] DivanNumbering numbering) { if (ReadOnlyMode) return BadRequest("سایت به دلایل فنی مثل انتقال سرور موقتاً در حالت فقط خواندنی قرار دارد. لطفاً ساعاتی دیگر مجدداً تلاش کنید."); var res = await _numberingService.UpdateNumberingAsync(numbering); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } [HttpDelete("{id}")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task DeleteNumberingAsync(int id) { if (ReadOnlyMode) return BadRequest("سایت به دلایل فنی مثل انتقال سرور موقتاً در حالت فقط خواندنی قرار دارد. لطفاً ساعاتی دیگر مجدداً تلاش کنید."); var res = await _numberingService.DeleteNumberingAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// recount a numbering /// /// /// [HttpPut("recount/start/{id}")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public IActionResult Recount(int id) { if (ReadOnlyMode) return BadRequest("سایت به دلایل فنی مثل انتقال سرور موقتاً در حالت فقط خواندنی قرار دارد. لطفاً ساعاتی دیگر مجدداً تلاش کنید."); var res = _numberingService.Recount(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// generate missing default numberings and start counting /// /// [HttpPost("generatemissing")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public IActionResult GenerateMissingDefaultNumberings() { if (ReadOnlyMode) return BadRequest("سایت به دلایل فنی مثل انتقال سرور موقتاً در حالت فقط خواندنی قرار دارد. لطفاً ساعاتی دیگر مجدداً تلاش کنید."); var res = _numberingService.GenerateMissingDefaultNumberings(); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// readonly mode /// public bool ReadOnlyMode { get { try { return bool.Parse(Configuration["ReadOnlyMode"]); } catch { return false; } } } /// /// Configuration /// protected IConfiguration Configuration { get; } /// /// numbering service /// private readonly IDivanNumberingService _numberingService; /// /// constructor /// /// /// public NumberingController(IDivanNumberingService numberingService, IConfiguration configuration) { _numberingService = numberingService; Configuration = configuration; } } }