using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RMuseum.Models.Auth.Memory; using RMuseum.Services; using System.Net; using System.Threading.Tasks; using RMuseum.Models.FAQ; namespace RMuseum.Controllers { [Produces("application/json")] [Route("api/faq")] public class FAQController : Controller { /// /// get published categories /// /// [HttpGet("cat")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetCategoriesAsync() { var res = await _faqService.GetCategoriesAsync(true); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get all categories /// /// [HttpGet("cat/secure")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetAllCategoriesAsync() { var res = await _faqService.GetCategoriesAsync(false); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get category by id /// /// /// [HttpGet("cat/secure/{id}")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetCategoryByIdAsync(int id) { var res = await _faqService.GetCategoryByIdAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// add a new faq category /// /// /// [HttpPost("cat")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task AddCategoryAsync([FromBody]FAQCategory cat) { var res = await _faqService.AddCategoryAsync(cat); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// update an existing faq category /// /// /// [HttpPut("cat")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task UpdateCategoryAsync([FromBody] FAQCategory cat) { var res = await _faqService.UpdateCategoryAsync(cat); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// delete a faq category /// /// /// [HttpDelete("cat/{id}")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task DeleteCategoryAsync(int id) { var res = await _faqService.DeleteCategoryAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get published pinned items /// /// [HttpGet("pinned")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetPinnedItemsAsync() { var res = await _faqService.GetPinnedItemsAsync(); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get published category items /// /// /// [HttpGet("cat/items")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQItem[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetCategoryItemsAsync(int catId) { var res = await _faqService.GetCategoryItemsAsync(catId, true); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get all category items /// /// [HttpGet("cat/items/secure")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQItem[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetAllCategoryItemsAsync(int catId) { var res = await _faqService.GetCategoryItemsAsync(catId, false); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get item by id /// /// /// [HttpGet("secure/{id}")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQItem))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetItemByIdAsync(int id) { var res = await _faqService.GetItemByIdAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// get published item by id /// /// /// [HttpGet("{id}")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQItem))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetPublishedItemByIdAsync(int id) { var res = await _faqService.GetItemByIdAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); if (!res.Result.Published) return NotFound(); return Ok(res.Result); } /// /// add a new faq item /// /// /// [HttpPost] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task AddItemAsync([FromBody] FAQItem item) { var res = await _faqService.AddItemAsync(item); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// update an existing faq item /// /// /// [HttpPut] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FAQCategory))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task UpdateItemAsync([FromBody] FAQItem item) { var res = await _faqService.UpdateItemAsync(item); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// delete a faq item /// /// /// [HttpDelete("{id}")] [Authorize(Policy = RMuseumSecurableItem.FAQEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task DeleteItemAsync(int id) { var res = await _faqService.DeleteItemAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// FAQ Service /// protected readonly IFAQService _faqService; /// /// constructor /// /// public FAQController(IFAQService faqService) { _faqService = faqService; } } }