61 lines
2.7 KiB
C#
61 lines
2.7 KiB
C#
using System.Linq;
|
|
using System.Net;
|
|
using ParadoxSaveParser.WebAPI.BackgroundTasks;
|
|
using ParadoxSaveParser.WebAPI.HttpHelpers;
|
|
using ParadoxSaveParser.WebAPI.SaveDataFilters;
|
|
|
|
namespace ParadoxSaveParser.WebAPI.Routes;
|
|
|
|
public class UploadSaveHandler : RouteHandlerBase
|
|
{
|
|
private readonly BackgroundJobManager _bgJobManager;
|
|
private readonly Dictionary<Game, ISaveDataFilter> _saveFilters;
|
|
|
|
public UploadSaveHandler(
|
|
CancellationToken cancelAllToken,
|
|
BackgroundJobManager bgJobManager,
|
|
Dictionary<Game, ISaveDataFilter> saveFilters)
|
|
: base(cancelAllToken)
|
|
{
|
|
_bgJobManager = bgJobManager;
|
|
_saveFilters = saveFilters;
|
|
}
|
|
|
|
public override async Task<HttpStatusCode> HandleRequest(
|
|
HttpListenerContext ctx, ContextLogger requestLogger)
|
|
{
|
|
string? contentType = ctx.Request.Headers.GetValues("Content-Type")?.FirstOrDefault();
|
|
if (contentType != "application/octet-stream")
|
|
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
|
|
new ErrorMessage(HttpStatusCode.BadRequest,
|
|
$"Invalid request Content-Type: '{contentType}'")
|
|
);
|
|
|
|
string saveId = Guid.NewGuid().ToString();
|
|
var metaFilePath = PathHelper.GetMetaFilePath(saveId);
|
|
if (File.Exists(metaFilePath))
|
|
return await ReturnHelper.ResponseError(ctx, requestLogger, _cancelAllToken,
|
|
new ErrorMessage(HttpStatusCode.InternalServerError,
|
|
$"Guid collision! file' {metaFilePath}' already exists.")
|
|
);
|
|
|
|
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;
|
|
|
|
_bgJobManager.StartNewParsingOperation(meta, _saveFilters[meta.game], _cancelAllToken);
|
|
dynamic responseData = new { saveId };
|
|
return await ReturnHelper.ResponseJson(ctx, requestLogger, _cancelAllToken, responseData);
|
|
}
|
|
} |