added database to store metadata

This commit is contained in:
2025-04-10 19:56:35 +05:00
parent c4af1f31e8
commit d7dcd7afc9
15 changed files with 278 additions and 153 deletions
@@ -1,4 +1,5 @@
using System.Net;
using ParadoxSaveParser.WebAPI.Database;
using ParadoxSaveParser.WebAPI.HttpHelpers;
namespace ParadoxSaveParser.WebAPI.Routes;
@@ -18,7 +19,8 @@ internal class GetSaveDataHandler : RouteHandlerBase
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, idOrError.Error!);
string id = idOrError.Value!;
if(!Program._saveMetadataStorage.TryGetValue(id, out var meta))
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"));
@@ -27,7 +29,7 @@ internal class GetSaveDataHandler : RouteHandlerBase
new ErrorMessage(HttpStatusCode.BadRequest,
$"Save with id {id} has status {meta.status}"));
IOPath dataFilePath = PathHelper.GetParsedSaveFilePath(id);
IOPath dataFilePath = meta.GetParsedDataPath();
if (!File.Exists(dataFilePath))
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
new ErrorMessage(HttpStatusCode.InternalServerError,
@@ -17,8 +17,9 @@ internal class GetSaveStatusHandler : RouteHandlerBase
if (idOrError.HasError)
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, idOrError.Error!);
string id = idOrError.Value!;
if (!Program._saveMetadataStorage.TryGetValue(id, out var meta))
var meta = await Program.DB.GetMetadata(id);
if (meta is null)
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
new ErrorMessage(HttpStatusCode.InternalServerError,
$"Save with id {id} not found")
@@ -1,6 +1,8 @@
using System.Linq;
using System.Net;
using System.Reflection.Metadata;
using ParadoxSaveParser.WebAPI.BackgroundTasks;
using ParadoxSaveParser.WebAPI.Database;
using ParadoxSaveParser.WebAPI.HttpHelpers;
using ParadoxSaveParser.WebAPI.SaveDataFilters;
@@ -28,34 +30,28 @@ public class UploadSaveHandler : RouteHandlerBase
if (contentType != "application/octet-stream")
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
new ErrorMessage(HttpStatusCode.BadRequest,
$"Invalid request Content-Type: '{contentType}'")
);
$"Invalid request Content-Type: '{contentType}'"));
string saveId = Guid.NewGuid().ToString();
var metaFilePath = PathHelper.GetMetaFilePath(saveId);
if (File.Exists(metaFilePath))
var gameStrOrError = RequestHelper.GetQueryValue(ctx, "game");
if (gameStrOrError.HasError)
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken, gameStrOrError.Error!);
if (!Enum.TryParse(gameStrOrError.Value, ignoreCase: true, out Game game))
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
new ErrorMessage(HttpStatusCode.InternalServerError,
$"Guid collision! file' {metaFilePath}' already exists.")
);
new ErrorMessage(HttpStatusCode.BadRequest,
$"Invalid requested game: '{gameStrOrError.Value}'"));
var meta = await Program.DB.CreateMetadata(game);
var meta = new SaveFileMetadata
{ id = saveId, game = Game.EU4, status = SaveFileProcessingStatus.Initialized };
if (!Program._saveMetadataStorage.TryAdd(saveId, meta))
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
new ErrorMessage(HttpStatusCode.InternalServerError,
$"Guid collision! Can't create metadata with id {saveId}")
);
meta.status = SaveFileProcessingStatus.Uploading;
var saveFilePath = PathHelper.GetSaveFilePath(meta.id);
await using var saveFile = File.OpenWrite(saveFilePath);
await using var remoteStream = ctx.Request.InputStream;
await remoteStream.CopyToAsync(saveFile, _cancelAllToken);
meta.status = SaveFileProcessingStatus.Uploaded;
var saveFilePath = meta.GetSaveFilePath();
await using (var saveFile = File.OpenWrite(saveFilePath))
{
await using (var remoteStream = ctx.Request.InputStream)
await remoteStream.CopyToAsync(saveFile, _cancelAllToken);
}
await Program.DB.UpdateMetadataStatus(meta, SaveFileProcessingStatus.Uploaded);
_bgJobManager.StartNewParsingOperation(meta, _saveFilters[meta.game], _cancelAllToken);
dynamic responseData = new { saveId };
dynamic responseData = new { meta.id };
return await ReturnHelper.ResponseJson(ctx, requestLogger, _cancelAllToken, responseData);
}
}