using Netina.Domain.Dtos.ResponseDtos; using Netina.Domain.Enums; namespace Netina.Api.Controllers; public class FileController : ICarterModule { public void AddRoutes(IEndpointRouteBuilder app) { var group = app.NewVersionedApi("File") .MapGroup("api/file"); group.MapGet("", GetFilesAsync) .WithDisplayName("GetFilesAsync") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageFiles, ApplicationPermission.ViewFiles)) .HasApiVersion(1.0); group.MapPost("", UploadFileAsync) .WithDisplayName("UploadFileAsync") .HasApiVersion(1.0); group.MapPost("/ckeditor", UploadCkEditorFileAsync) .WithDisplayName("Upload CkEditor File") .AllowAnonymous() .DisableAntiforgery() .HasApiVersion(1.0); } public async Task UploadCkEditorFileAsync(IFormFile upload, [FromServices] IHttpContextAccessor httpContextAccessor, [FromServices] IStorageService storageService, IUploadFileService uploadFileService, CancellationToken cancellationToken) { try { if (httpContextAccessor.HttpContext?.Request?.Headers is { } dictionary && dictionary.TryGetValue("Authorization", out StringValues value)) { if (value.ToString() != "xuwp4KzU1/YBoevpzgH0cz8+zLKQ+EOaYXeo4JtRxmVIuN7Hqxz97oQ398tNX68+") throw new Exception("ارسال فایل از طرف شما معتبر نمی باشد"); using var stream = new MemoryStream(); await upload.CopyToAsync(stream, cancellationToken); var uploadRequest = new FileUploadRequest { FileName = upload.FileName, ContentType = upload.ContentType, FileUploadType = FileUploadType.Image, StringBaseFile = Convert.ToBase64String(stream.ToArray()) }; var fileUrl = await uploadFileService.UploadImageAsync(uploadRequest); return TypedResults.Ok(new CkEditorFileUploadResponseDto { url = fileUrl.FileUrl }); } throw new Exception("ارسال فایل از طرف شما معتبر نمی باشد"); } catch (Exception e) { var errorMessage = new { message = e.Message }; var errorResponse = new { error = errorMessage }; return TypedResults.BadRequest(errorResponse); } } public async Task GetFilesAsync([FromQuery]StorageFileType? fileType,[FromServices] IStorageService storageService, CancellationToken cancellationToken) => TypedResults.Ok(await storageService.GetStorageFiles(fileType: fileType ?? StorageFileType.Image)); public async Task UploadFileAsync([FromBody] FileUploadRequest uploadRequest, [FromServices] IUploadFileService uploadFileService, CancellationToken cancellationToken) { return TypedResults.Ok(await uploadFileService.UploadImageAsync(uploadRequest)); } }