using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RMuseum.Models.Auth.Memory; using RMuseum.Models.Diwan.ViewModels; using RMuseum.Services; using RSecurityBackend.Models.Generic; using System; using System.IO; using System.Net; using System.Threading.Tasks; namespace RMuseum.Controllers { [Produces("application/json")] [Route("api/banners")] public class SiteBannersController : Controller { /// /// add site banner (send form) with these fields: alt, url and an image attachment /// /// [HttpPost] [Authorize(Policy = RMuseumSecurableItem.DiwanEntityShortName + ":" + RMuseumSecurableItem.Banners)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DiwanSiteBannerViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task AddSiteBanner() { try { if (!Request.Form.TryGetValue("alt", out Microsoft.Extensions.Primitives.StringValues alt)) { return BadRequest("alt is null"); } if (!Request.Form.TryGetValue("url", out Microsoft.Extensions.Primitives.StringValues url)) { return BadRequest("url is null"); } if (Request.Form.Files.Count != 1) { return BadRequest("a single image is not provided"); } using Stream stream = Request.Form.Files[0].OpenReadStream(); RServiceResult res = await _bannersService.AddSiteBanner(stream, Request.Form.Files[0].FileName, alt.ToString(), url.ToString(), false); if (!string.IsNullOrEmpty(res.ExceptionString)) { return BadRequest(res.ExceptionString); } return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// modify site banner /// /// /// /// [HttpPut("{id}")] [Authorize(Policy = RMuseumSecurableItem.DiwanEntityShortName + ":" + RMuseumSecurableItem.Banners)] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task ModifySiteBanner(int id, [FromBody] DiwanSiteBannerModifyViewModel model) { try { RServiceResult res = await _bannersService.ModifySiteBanner(id, model.AlternateText, model.TargetUrl, model.Active); if (!string.IsNullOrEmpty(res.ExceptionString)) { return BadRequest(res.ExceptionString); } if (!res.Result) { return NotFound(); } return Ok(); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// delete site banner /// /// /// [HttpDelete] [Authorize(Policy = RMuseumSecurableItem.DiwanEntityShortName + ":" + RMuseumSecurableItem.Banners)] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task DeleteSiteBanner(int id) { try { RServiceResult res = await _bannersService.DeleteSiteBanner(id); if (!string.IsNullOrEmpty(res.ExceptionString)) { return BadRequest(res.ExceptionString); } if (!res.Result) { return NotFound(); } return Ok(); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// get all defined site banners /// /// [HttpGet] [Authorize(Policy = RMuseumSecurableItem.DiwanEntityShortName + ":" + RMuseumSecurableItem.Banners)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DiwanSiteBannerViewModel[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task GetSiteBanners() { try { RServiceResult res = await _bannersService.GetSiteBanners(); if (!string.IsNullOrEmpty(res.ExceptionString)) { return BadRequest(res.ExceptionString); } return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// get a random active site banner /// /// [HttpGet] [Route("random")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DiwanSiteBannerViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task GetARandomActiveSiteBanner() { try { RServiceResult res = await _bannersService.GetARandomActiveSiteBanner(); if (!string.IsNullOrEmpty(res.ExceptionString)) { return BadRequest(res.ExceptionString); } return Ok(res.Result); //this might be null } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// Diwan Service /// protected readonly ISiteBannersService _bannersService; /// /// constructor /// /// public SiteBannersController(ISiteBannersService bannersService) { _bannersService = bannersService; } } }