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;
}
}
}