using FastEndpoints; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using GB5Shared.FastEndPoint; using IceImportBLL.IceImportUploadStagingService; using IceImportSL.Parameters.Import; using static GB5Shared.GB5Constant.Constant; namespace IceImportSL.Endpoints.Import; // Multipart file upload. Stores the source file via IIceImportUploadStagingService // (IStorageProvider under the hood) and returns an opaque UploadToken the client passes to // CommitImport — never the raw storage path. Modeled on // FrameworkSL.Endpoints.DataSync.ImportFromFile / DMSSL.EndPoints.ESSDocument.UploadDocument. public class UploadImportFile : BaseEndpoint> { private readonly IIceImportUploadStagingService _staging; public UploadImportFile(IIceImportUploadStagingService staging) => _staging = staging; public override void Configure() { Post("/IceImport/UploadImportFile"); AllowAnonymous(); //AllowFileUploads(); } // Mutation endpoint — never cached. protected override string? GetCacheKey(UploadImportFileParameters req, LoginDTO login) => null; protected override async Task> ExecuteAsync( UploadImportFileParameters req, LoginDTO login, CancellationToken ct) { try { var file = HttpContext.Request.Form.Files.FirstOrDefault(); if (file is null || file.Length == 0) throw new ArgumentException("No file provided or file is empty."); await using var stream = file.OpenReadStream(); var token = await _staging .StageAsync(stream, file.FileName, req.IceMapId, login, ct) .ConfigureAwait(false); return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse( token, CacheKeyLevel.NOT_REQUIRED, login); } catch (Exception ex) { return await GB5Shared.ResponseStandard.Response.CreateExceptionError( ex, CacheKeyLevel.NOT_REQUIRED, login, ex.Message, 500); } } }