using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using DomainResults.Common; using DomainResults.Mvc; using DataProviders.Buckets; using WeatherForecast.Services; using WeatherForecast.Models.Template.Requests; using Core.Binders; using Core.Enumerations; using DomainObjects.Documents.Users; using WeatherForecast.Policies; namespace WeatherForecast.Controllers; /// /// /// [AllowAnonymous] [Route("api/[controller]")] public class TemplateController : ControllerBase { private readonly IAuthorizationService _authorizationService; private readonly ITemplateBucketDataProvider _templateBucketDataProvider; private readonly ITemplateService _templateService; /// /// /// /// /// /// public TemplateController( IAuthorizationService authorizationService, ITemplateBucketDataProvider templateBucketDataProvider, ITemplateService templateService ) { _authorizationService = authorizationService; _templateBucketDataProvider = templateBucketDataProvider; _templateService = templateService; } /// /// Allows to upload private dkim certificate /// /// /// /// /// [HttpPost("{siteId}")] public async Task Post([FromRoute] Guid siteId, [ModelBinder(typeof(JsonModelBinder))] PostTemplateRequestModel? requestData, IFormFile formFile) { if (!(formFile.Length > 0)) return IDomainResult.Failed().ToActionResult(); using var ms = new MemoryStream(); formFile.CopyTo(ms); var newFile = new BucketFile(siteId, formFile.FileName, ms.ToArray(), formFile.ContentType); var authorizationResult = await _authorizationService.AuthorizeAsync(User, new List { newFile }, new TemplateAuthorisationRequirement { Action = CrudActions.Create, Roles = new List { new TemplateRole { Role = Roles.Admin } } }); if (authorizationResult.Succeeded) { var result = _templateService.Post(newFile); return result.ToActionResult(); } return Unauthorized(); } /// /// /// /// /// /// [HttpGet("{siteId}/{fileId}")] public async Task Get([FromRoute] Guid siteId, [FromRoute] Guid fileId) { var (file, result) = _templateBucketDataProvider.Download(siteId, fileId); if (!result.IsSuccess || file == null) return result.ToActionResult(); var authorizationResult = await _authorizationService.AuthorizeAsync(User, new List { file }, new TemplateAuthorisationRequirement { Action = CrudActions.Read, Roles = new List { new TemplateRole { Role = Roles.Admin } } }); if (authorizationResult.Succeeded) { var stream = new MemoryStream(file.Bytes); return new FileStreamResult(stream, file.ContentType) { FileDownloadName = file.Name }; } return Unauthorized(); } /// /// /// /// /// /// /// /// [HttpGet("{siteId}/{fileId}")] public IActionResult Put([FromRoute] Guid siteId, [FromRoute] Guid fileId, [ModelBinder(typeof(JsonModelBinder))] PutTemplateRequestModel requestData, IFormFile file) { return BadRequest(); } /// /// Delete template /// /// /// /// [HttpDelete("{siteId}/{fileId}")] public IActionResult Delete([FromRoute] Guid siteId, [FromRoute] Guid fileId) { var result = _templateService.Delete(siteId, fileId); return result.ToActionResult(); } }