diff --git a/ALttPRandomizer/Program.cs b/ALttPRandomizer/Program.cs index 25553d3..25b5424 100644 --- a/ALttPRandomizer/Program.cs +++ b/ALttPRandomizer/Program.cs @@ -12,6 +12,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Serilog; + using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; @@ -43,9 +44,7 @@ builder.Services.AddCors(options => { options.AddPolicy("AllowDomains", policy => { - foreach (var domain in settings.AllowedCors) { - policy.WithOrigins(domain).AllowAnyHeader(); - } + policy.WithOrigins(settings.AllowedCors.ToArray()).AllowAnyMethod().AllowAnyHeader(); }); }); diff --git a/ALttPRandomizer/SeedController.cs b/ALttPRandomizer/SeedController.cs index c08bfa5..5d6d38e 100644 --- a/ALttPRandomizer/SeedController.cs +++ b/ALttPRandomizer/SeedController.cs @@ -51,39 +51,30 @@ [Route("/seed/{id}")] [HttpGet] public async Task GetSeed(string id) { - var result = await this.SeedService.GetSeed(id); - if (result.TryGetValue("status", out var responseCode)) { - switch (responseCode) { - case 200: - return Ok(result); - case 404: - return NotFound(result); - case 409: - return Conflict(result); - } - } + return ResolveResult(await this.SeedService.GetSeed(id)); + } - this.Logger.LogWarning("Unexpected result from SeedService: {@result}", result); - return StatusCode(500); + [Route("/seed/{id}")] + [HttpPost] + public async Task RetrySeed(string id) { + return ResolveResult(await this.RandomizeService.RetrySeed(id)); } [Route("/multi/{id}")] [HttpGet] public async Task GetMulti(string id) { - var result = await this.SeedService.GetMulti(id); + return ResolveResult(await this.SeedService.GetMulti(id)); + } + + private ActionResult ResolveResult(IDictionary result) { if (result.TryGetValue("status", out var responseCode)) { - switch (responseCode) { - case 200: - return Ok(result); - case 404: - return NotFound(result); - case 409: - return Conflict(result); + if (responseCode is int code) { + return StatusCode(code, result); } } this.Logger.LogWarning("Unexpected result from SeedService: {@result}", result); - return StatusCode(500); + return StatusCode(500, result); } } } diff --git a/ALttPRandomizer/Service/RandomizeService.cs b/ALttPRandomizer/Service/RandomizeService.cs index 8c04870..ac114a4 100644 --- a/ALttPRandomizer/Service/RandomizeService.cs +++ b/ALttPRandomizer/Service/RandomizeService.cs @@ -1,4 +1,5 @@ namespace ALttPRandomizer.Service { + using ALttPRandomizer.Azure; using ALttPRandomizer.Model; using ALttPRandomizer.Randomizers; using ALttPRandomizer.Settings; @@ -7,13 +8,20 @@ using System; using System.Collections.Generic; using System.Reflection; + using System.Text.Json; using System.Threading.Tasks; public class RandomizeService { - public RandomizeService(IdGenerator idGenerator, IServiceProvider serviceProvider, BaseRandomizer baseRandomizer, ILogger logger) { + public RandomizeService( + IdGenerator idGenerator, + IServiceProvider serviceProvider, + BaseRandomizer baseRandomizer, + AzureStorage azureStorage, + ILogger logger) { this.IdGenerator = idGenerator; this.ServiceProvider = serviceProvider; this.BaseRandomizer = baseRandomizer; + this.AzureStorage = azureStorage; this.Logger = logger; } @@ -22,9 +30,10 @@ private IdGenerator IdGenerator { get; } private BaseRandomizer BaseRandomizer { get; } private IServiceProvider ServiceProvider { get; } + private AzureStorage AzureStorage { get; } - public async Task RandomizeSeed(SeedSettings settings) { - var id = this.IdGenerator.GenerateId(); + public async Task RandomizeSeed(SeedSettings settings, string? seedId = null) { + var id = seedId ?? this.IdGenerator.GenerateId(); this.Logger.LogInformation("Generating seed {seedId} with settings {@settings}", id, settings); var fi = typeof(RandomizerInstance).GetField(settings.Randomizer.ToString(), BindingFlags.Static | BindingFlags.Public); @@ -42,8 +51,8 @@ return id; } - public async Task RandomizeMultiworld(IList settings) { - var id = this.IdGenerator.GenerateId(); + public async Task RandomizeMultiworld(IList settings, string? multiId = null) { + var id = multiId ?? this.IdGenerator.GenerateId(); this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings); this.BaseRandomizer.ValidateAll(settings); @@ -51,5 +60,40 @@ await this.BaseRandomizer.RandomizeMultiworld(id, settings); return id; } + + public async Task> RetrySeed(string seedId) { + var files = await this.AzureStorage.GetFiles(seedId); + + this.Logger.LogDebug("Found files: {@files}", files.Keys); + + var result = new Dictionary(); + + if (!files.TryGetValue("settings.json", out var settingsData)) { + result["status"] = 404; + result["error"] = "seed not found"; + return result; + } + + var settingsJson = JsonDocument.Parse(settingsData.ToString()); + + var settings = settingsJson.Deserialize(JsonOptions.Default) ?? new SeedSettings(); + + if (files.TryGetValue("patch.bps", out var patchData)) { + result["status"] = 409; + result["error"] = "generation already successful"; + return result; + } + + if (files.ContainsKey("generating")) { + result["status"] = 409; + result["error"] = "generation still in progress"; + return result; + } + + await this.RandomizeSeed(settings, seedId); + + result["status"] = 202; + return result; + } } } diff --git a/ALttPRandomizer/Service/SeedService.cs b/ALttPRandomizer/Service/SeedService.cs index be3412d..406a801 100644 --- a/ALttPRandomizer/Service/SeedService.cs +++ b/ALttPRandomizer/Service/SeedService.cs @@ -43,6 +43,7 @@ } else { result["status"] = 404; result["error"] = "generation failed"; + result["retry"] = true; return result; } }