using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using RMuseum.Models.Auth.Memory; using RMuseum.Models.Divan.ViewModels; using RMuseum.Services; using RSecurityBackend.Models.Generic; using System; using System.Linq; using System.Net; using System.Threading.Tasks; using System.IO; using Microsoft.AspNetCore.Http; namespace RMuseum.Controllers { [Produces("application/json")] [Route("api/poetphotos")] public class DivanPoetSuggestedPhotosController : Controller { /// /// returns list of suggested photos for a poet /// /// poet id /// [HttpGet("poet/{id}")] [AllowAnonymous] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanPoetSuggestedPictureViewModel[]))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetPoetSuggestedPhotosAsync(int id) { var res = await _poetPhotosService.GetPoetSuggestedPhotosAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// returns a single suggested photo /// /// /// [HttpGet("{id}")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + RMuseumSecurableItem.ModeratePoetPhotos)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanPoetSuggestedPictureViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] public async Task GetPoetSuggestedPhotoByIdAsync(int id) { var res = await _poetPhotosService.GetPoetSuggestedPhotoByIdAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// return the next unpublished suggested line for poets /// /// /// [HttpGet("unpublished/next")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + RMuseumSecurableItem.ModeratePoetPhotos)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanPoetSuggestedPictureViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task GetNextUnmoderatedPoetSuggestedPhotoAsync(int skip) { var res = await _poetPhotosService.GetNextUnmoderatedPoetSuggestedPhotoAsync(skip); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); if (res.Result == null) return NotFound(); var resCount = await _poetPhotosService.GetNextUnmoderatedPoetSuggestedPhotosCountAsync(); if (!string.IsNullOrEmpty(resCount.ExceptionString)) return BadRequest(resCount.ExceptionString); // Paging Header HttpContext.Response.Headers.Append("paging-headers", JsonConvert.SerializeObject( new PaginationMetadata() { totalCount = resCount.Result, pageSize = -1, currentPage = -1, hasNextPage = false, hasPreviousPage = false, totalPages = -1 }) ); return Ok(res.Result); } /// /// add a suggestion for poets photos (send form) with these fields: poetId, title, description, srcUrl and an image attachment /// /// [HttpPost] [Authorize] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(DivanPoetSuggestedPictureViewModel))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task SuggestPhotoForPoet() { try { if (!Request.Form.TryGetValue("poetId", out Microsoft.Extensions.Primitives.StringValues poetId)) { return BadRequest("poetId is null"); } if (!Request.Form.TryGetValue("title", out Microsoft.Extensions.Primitives.StringValues title)) { return BadRequest("title is null"); } if (!Request.Form.TryGetValue("description", out Microsoft.Extensions.Primitives.StringValues description)) { return BadRequest("description is null"); } if (!Request.Form.TryGetValue("srcUrl", out Microsoft.Extensions.Primitives.StringValues srcUrl)) { return BadRequest("srcUrl is null"); } if (Request.Form.Files.Count != 1) { return BadRequest("a single image is not provided"); } Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); using Stream stream = Request.Form.Files[0].OpenReadStream(); RServiceResult res = await _poetPhotosService.SuggestPhotoForPoet(int.Parse(poetId.ToString()), userId, stream, Request.Form.Files[0].FileName, title.ToString(), description.ToString(), srcUrl.ToString()); if (!string.IsNullOrEmpty(res.ExceptionString)) { return BadRequest(res.ExceptionString); } return Ok(res.Result); } catch (Exception exp) { return BadRequest(exp.ToString()); } } /// /// modify a suggestion for poets photos /// /// /// [HttpPut] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + RMuseumSecurableItem.ModeratePoetPhotos)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task ModifyPoetSuggestedPhotosAsync([FromBody] DivanPoetSuggestedPictureViewModel photo) { var res = await _poetPhotosService.ModifyPoetSuggestedPhotoAsync(photo); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// reject a suggestion for poets photos /// /// /// /// [HttpPut("reject/{id}")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + RMuseumSecurableItem.ModeratePoetPhotos)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task RejectPoetSuggestedPhotosAsync(int id, [FromBody] string rejectionCause) { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); var res = await _poetPhotosService.RejectPoetSuggestedPhotosAsync(id, userId, rejectionCause); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// delete published suggested photo /// /// /// [HttpDelete("{id}")] [Authorize(Policy = RMuseumSecurableItem.DivanEntityShortName + ":" + RMuseumSecurableItem.ModeratePoetPhotos)] [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] [ProducesResponseType((int)HttpStatusCode.Unauthorized)] public async Task DeletePoetSuggestedPhotoAsync(int id) { var res = await _poetPhotosService.DeletePoetSuggestedPhotoAsync(id); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); return Ok(res.Result); } /// /// Poets Photos Service /// protected readonly IPoetPhotoSuggestionService _poetPhotosService; /// /// constructor /// /// public DivanPoetSuggestedPhotosController(IPoetPhotoSuggestionService divanService) { _poetPhotosService = divanService; } } }