using System.Net; using ParadoxSaveParser.WebAPI.Database; using ParadoxSaveParser.WebAPI.HttpHelpers; namespace ParadoxSaveParser.WebAPI.Routes; internal class GetSaveFileHandler : RouteHandlerBase { public GetSaveFileHandler(CancellationToken cancelAllToken) : base(cancelAllToken) { } public override async Task HandleRequest( HttpListenerContext ctx, ContextLogger requestLogger) { var idOrError = RequestHelper.GetQueryValue(ctx, "id"); if (idOrError.HasError) return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, idOrError.Error!); string id = idOrError.Value!; var meta = await Program.DB.GetMetadata(id); if(meta is null) return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, new ErrorMessage(HttpStatusCode.NotFound, $"Save with id {id} not found")); // file is being uploaded (Initialized) or was deleted (Error) if(meta.status is SaveFileProcessingStatus.Initialized or SaveFileProcessingStatus.Error) return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, new ErrorMessage(HttpStatusCode.BadRequest, $"Save with id {id} has status {meta.status}")); IOPath saveFilePath = meta.GetSaveFilePath(); if (!File.Exists(saveFilePath)) return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, new ErrorMessage(HttpStatusCode.InternalServerError, $"Save with id {id} not found") ); await using var saveFile = File.OpenRead(saveFilePath); return await ReturnHelper.ResponseStream(ctx, requestLogger, _cancelAllToken, saveFile, contentType: "application/zstd"); } }