using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using DomainResults.Mvc; using WeatherForecast.Services; using WeatherForecast.Models.Blog.Requests; using WeatherForecast.Policies; using Core.Enumerations; using DataProviders.Collections; using ExtensionMethods; using DomainResults.Common; using DomainObjects.Documents; namespace WeatherForecast.Controllers; /// /// /// [ApiController] [Route("api/[controller]")] public class BlogItemController : ControllerBase { private readonly IAuthorizationService _authorizationService; private readonly IBlogCatalogDataProvider _blogCatalogDataProvider; private readonly IBlogItemService _blogItemService; /// /// Provides functionality to work with items from blog catalog /// /// /// /// public BlogItemController( IAuthorizationService authorizationService, IBlogCatalogDataProvider blogCatalogDataProvider, IBlogItemService blogItemService ) { _authorizationService = authorizationService; _blogCatalogDataProvider = blogCatalogDataProvider; _blogItemService = blogItemService; } #region Authless methods /// /// /// /// /// /// [HttpGet("{siteId}")] public IActionResult GetSlug([FromRoute] Guid siteId, [FromQuery] string slug) { var result = _blogItemService.GetSlug(siteId, slug); return result.ToActionResult(); } #endregion /// /// /// /// /// /// [HttpPost("{siteId}")] public async Task Post([FromRoute] Guid siteId, [FromBody] BlogItemRequestModel requestData) { var blogItem = requestData.ToDomainObject(); blogItem.SiteId = siteId; var userId = User?.Identity?.Name?.ToNullableGuid(); if (userId == null) return IDomainResult.Failed().ToActionResult(); blogItem.Author = userId.Value; if ((await _authorizationService.AuthorizeAsync(User, new List { blogItem }, new BlogAuthorizationRequirement { Action = CrudActions.Create })).Succeeded) { var result = _blogItemService.Post(blogItem); return result.ToActionResult(); } return Unauthorized(); } /// /// Returns full object /// /// [HttpGet("{siteId}/{blogId}")] public async Task Get([FromRoute] Guid siteId, [FromRoute] Guid blogId) { var (blogItem, getBlogItemResult) = _blogCatalogDataProvider.Get(siteId, blogId); if (!getBlogItemResult.IsSuccess || blogItem == null) return getBlogItemResult.ToActionResult(); if ((await _authorizationService.AuthorizeAsync(User, new List { blogItem }, new BlogAuthorizationRequirement { Action = CrudActions.Read })).Succeeded) { var result = _blogItemService.Get(blogItem); return result.ToActionResult(); } return Unauthorized(); } /// /// /// /// /// /// /// [HttpPut("{siteId}/{blogId}")] public async Task Update([FromRoute] Guid siteId, [FromRoute] Guid blogId, [FromBody] BlogItemRequestModel requestData) { var (blogItem, getBlogItemResult) = _blogCatalogDataProvider.Get(siteId, blogId); if (!getBlogItemResult.IsSuccess || blogItem == null) return getBlogItemResult.ToActionResult(); if ((await _authorizationService.AuthorizeAsync(User, new List { blogItem }, new BlogAuthorizationRequirement { Action = CrudActions.Update })).Succeeded) { var result = _blogItemService.Update(blogItem, requestData); return result.ToActionResult(); } return Unauthorized(); } /// /// /// /// /// /// [HttpDelete("{siteId}/{blogId}")] public async Task Delete([FromRoute] Guid siteId, [FromRoute] Guid blogId) { var (blogItem, getBlogItemResult) = _blogCatalogDataProvider.Get(siteId, blogId); if (!getBlogItemResult.IsSuccess || blogItem == null) return getBlogItemResult.ToActionResult(); if ((await _authorizationService.AuthorizeAsync(User, new List { blogItem }, new BlogAuthorizationRequirement { Action = CrudActions.Delete })).Succeeded) { var result = _blogCatalogDataProvider.Delete(blogItem.Id); return result.ToActionResult(); } return Unauthorized(); } }