diff --git a/Wabbajack.BuildServer/Controllers/AControllerBase.cs b/Wabbajack.BuildServer/Controllers/AControllerBase.cs index a6300cf1..34f95c0c 100644 --- a/Wabbajack.BuildServer/Controllers/AControllerBase.cs +++ b/Wabbajack.BuildServer/Controllers/AControllerBase.cs @@ -4,10 +4,11 @@ using Wabbajack.BuildServer.Models; namespace Wabbajack.BuildServer.Controllers { + [ApiController] public abstract class AControllerBase : ControllerBase { - protected readonly ILogger Logger; protected readonly DBContext Db; + protected readonly ILogger Logger; protected AControllerBase(ILogger logger, DBContext db) { diff --git a/Wabbajack.BuildServer/Controllers/GraphQL.cs b/Wabbajack.BuildServer/Controllers/GraphQL.cs index 479692d3..c1d2bf7c 100644 --- a/Wabbajack.BuildServer/Controllers/GraphQL.cs +++ b/Wabbajack.BuildServer/Controllers/GraphQL.cs @@ -1,12 +1,8 @@ -using System.Collections.Generic; -using System.Reflection.Metadata; -using System.Threading.Tasks; +using System.Threading.Tasks; using GraphQL; -using GraphQL.Language.AST; using GraphQL.Types; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; -using Newtonsoft.Json.Linq; using Wabbajack.BuildServer.GraphQL; using Wabbajack.BuildServer.Models; @@ -24,12 +20,8 @@ namespace Wabbajack.BuildServer.Controllers public async Task Post([FromBody] GraphQLQuery query) { var inputs = query.Variables.ToInputs(); - var schema = new Schema - { - Query = new Query(Db), - Mutation = new Mutation(Db) - }; - + var schema = new Schema {Query = new Query(Db), Mutation = new Mutation(Db)}; + var result = await new DocumentExecuter().ExecuteAsync(_ => { _.Schema = schema; @@ -37,14 +29,13 @@ namespace Wabbajack.BuildServer.Controllers _.OperationName = query.OperationName; _.Inputs = inputs; }); - - if(result.Errors?.Count > 0) + + if (result.Errors?.Count > 0) { return BadRequest(); } return Ok(result); } - } } diff --git a/Wabbajack.BuildServer/Controllers/Heartbeat.cs b/Wabbajack.BuildServer/Controllers/Heartbeat.cs new file mode 100644 index 00000000..3fcd4a56 --- /dev/null +++ b/Wabbajack.BuildServer/Controllers/Heartbeat.cs @@ -0,0 +1,31 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Wabbajack.BuildServer.Models; +using Wabbajack.Common; + +namespace Wabbajack.BuildServer.Controllers +{ + [Route("/heartbeat")] + public class Heartbeat : AControllerBase + { + static Heartbeat() + { + _startTime = DateTime.Now; + + } + private static DateTime _startTime; + + public Heartbeat(ILogger logger, DBContext db) : base(logger, db) + { + } + + [HttpGet] + public async Task GetHeartbeat() + { + return DateTime.Now - _startTime; + } + } +} diff --git a/Wabbajack.BuildServer/Controllers/IndexedFiles.cs b/Wabbajack.BuildServer/Controllers/IndexedFiles.cs index e5e8f913..b92ab0a7 100644 --- a/Wabbajack.BuildServer/Controllers/IndexedFiles.cs +++ b/Wabbajack.BuildServer/Controllers/IndexedFiles.cs @@ -22,7 +22,7 @@ namespace Wabbajack.BuildServer.Controllers [Route("{xxHashAsBase64}")] public async Task GetFile(string xxHashAsBase64) { - var id = xxHashAsBase64;//.FromHex().ToBase64(); + var id = xxHashAsBase64.FromHex().ToBase64(); var query = new[] { new BsonDocument("$match", @@ -47,16 +47,18 @@ namespace Wabbajack.BuildServer.Controllers if (t == null) return null; - Dictionary indexed_children= new Dictionary(); - if (t.IsArchive) + Dictionary indexed_children = new Dictionary(); + if (t.IsArchive) indexed_children = t.ChildFiles.ToDictionary(t => t.Hash); - + var file = new IndexedVirtualFile { Name = Name, Size = t.Size, - Hash = t.Hash, - Children = t.IsArchive ? t.Children.Select(child => Convert(indexed_children[child.Hash], child.Name)).ToList() : new List() + Hash = t.Hash, + Children = t.IsArchive + ? t.Children.Select(child => Convert(indexed_children[child.Hash], child.Name)).ToList() + : new List() }; return file; } @@ -68,7 +70,5 @@ namespace Wabbajack.BuildServer.Controllers { public List ChildFiles { get; set; } } - - } } diff --git a/Wabbajack.BuildServer/Controllers/Jobs.cs b/Wabbajack.BuildServer/Controllers/Jobs.cs index bfddab59..fa5a34bd 100644 --- a/Wabbajack.BuildServer/Controllers/Jobs.cs +++ b/Wabbajack.BuildServer/Controllers/Jobs.cs @@ -26,6 +26,5 @@ namespace Wabbajack.BuildServer.Controllers .OrderByDescending(j => j.Priority) .ToListAsync(); } - } } diff --git a/Wabbajack.BuildServer/Controllers/ListValidation.cs b/Wabbajack.BuildServer/Controllers/ListValidation.cs index 61011388..d9de495f 100644 --- a/Wabbajack.BuildServer/Controllers/ListValidation.cs +++ b/Wabbajack.BuildServer/Controllers/ListValidation.cs @@ -11,13 +11,12 @@ namespace Wabbajack.BuildServer.Controllers { [ApiController] [Route("/lists")] - public class ListValidation : AControllerBase { public ListValidation(ILogger logger, DBContext db) : base(logger, db) { } - + [HttpGet] [Route("status.json")] public async Task> HandleGetLists() diff --git a/Wabbajack.BuildServer/Controllers/Metrics.cs b/Wabbajack.BuildServer/Controllers/Metrics.cs deleted file mode 100644 index 95b4e70c..00000000 --- a/Wabbajack.BuildServer/Controllers/Metrics.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; -using Wabbajack.BuildServer.Models; -using Wabbajack.Common; - -namespace Wabbajack.BuildServer.Controllers -{ - [Route("/metrics")] - public class Metrics : AControllerBase - { - [HttpGet] - [Route("{Action}/Value")] - public async Task NewMetric(string Action, string Value) - { - - var date = DateTime.UtcNow; - await Log(date, Action, Value, Request.Headers[Consts.MetricsKeyHeader].FirstOrDefault()); - return date.ToString(); - } - - public Metrics(ILogger logger, DBContext db) : base(logger, db) - { - } - - internal async Task Log(DateTime timestamp, string action, string subject, string metricsKey = null) - { - var msg = new[] {string.Join("\t", new[]{timestamp.ToString(), metricsKey, action, subject})}; - Utils.Log(msg.First()); - await Db.Metrics.InsertOneAsync(new Metric {Timestamp = timestamp, Action = action, Subject = subject, MetricsKey = metricsKey}); - } - } -} diff --git a/Wabbajack.BuildServer/Controllers/MetricsController.cs b/Wabbajack.BuildServer/Controllers/MetricsController.cs new file mode 100644 index 00000000..ae9c2836 --- /dev/null +++ b/Wabbajack.BuildServer/Controllers/MetricsController.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using Wabbajack.BuildServer.Models; +using Wabbajack.Common; +using Wabbajack.Lib.ModListRegistry; + +namespace Wabbajack.BuildServer.Controllers +{ + [ApiController] + [Route("/metrics")] + public class MetricsController : AControllerBase + { + public MetricsController(ILogger logger, DBContext db) : base(logger, db) + { + } + + [HttpGet] + [Route("{Subject}/{Value}")] + public async Task LogMetricAsync(string Subject, string Value) + { + var date = DateTime.UtcNow; + await Log(date, Subject, Value, Request.Headers[Consts.MetricsKeyHeader].FirstOrDefault()); + return new Result { Timestamp = date}; + } + + private async Task Log(DateTime timestamp, string action, string subject, string metricsKey = null) + { + Logger.Log(LogLevel.Information, $"Log - {timestamp} {action} {subject} {metricsKey}"); + await Db.Metrics.InsertOneAsync(new Metric + { + Timestamp = timestamp, Action = action, Subject = subject, MetricsKey = metricsKey + }); + } + + public class Result + { + public DateTime Timestamp { get; set; } + } + } +} diff --git a/Wabbajack.BuildServer/Controllers/NexusCache.cs b/Wabbajack.BuildServer/Controllers/NexusCache.cs index f9bd417d..7af7493b 100644 --- a/Wabbajack.BuildServer/Controllers/NexusCache.cs +++ b/Wabbajack.BuildServer/Controllers/NexusCache.cs @@ -13,14 +13,13 @@ namespace Wabbajack.BuildServer.Controllers [Route("/v1/games/")] public class NexusCache : AControllerBase { - public NexusCache(ILogger logger, DBContext db) : base(logger, db) { } - + /// - /// Looks up the mod details for a given Gamename/ModId pair. If the entry is not found in the cache it will - /// be requested from the server (using the caller's Nexus API key if provided). + /// Looks up the mod details for a given Gamename/ModId pair. If the entry is not found in the cache it will + /// be requested from the server (using the caller's Nexus API key if provided). /// /// /// The Nexus game name @@ -38,13 +37,7 @@ namespace Wabbajack.BuildServer.Controllers var api = await NexusApiClient.Get(Request.Headers["apikey"].FirstOrDefault()); var path = $"/v1/games/{GameName}/mods/{ModId}.json"; var body = await api.Get(path); - result = new NexusCacheData - { - Data = body, - Path = path, - Game = GameName, - ModId = ModId - }; + result = new NexusCacheData {Data = body, Path = path, Game = GameName, ModId = ModId}; try { await Db.NexusModInfos.InsertOneAsync(result); @@ -74,10 +67,7 @@ namespace Wabbajack.BuildServer.Controllers var body = await api.Get(path); result = new NexusCacheData { - Data = body, - Path = path, - Game = GameName, - ModId = ModId + Data = body, Path = path, Game = GameName, ModId = ModId }; try { @@ -85,7 +75,6 @@ namespace Wabbajack.BuildServer.Controllers } catch (MongoWriteException) { - } method = "NOT_CACHED"; @@ -96,10 +85,11 @@ namespace Wabbajack.BuildServer.Controllers } [HttpGet] - [Route("{GameName}/mods/{ModId}/files/{FileId}.json")] + [Route("{GameName}/mods/{ModId}/files/{FileId}.json")] public async Task GetFileInfo(string GameName, string ModId, string FileId) { - var result = await Db.NexusFileInfos.FindOneAsync(info => info.Game == GameName && info.ModId == ModId && info.FileId == FileId); + var result = await Db.NexusFileInfos.FindOneAsync(info => + info.Game == GameName && info.ModId == ModId && info.FileId == FileId); string method = "CACHED"; if (result == null) @@ -109,9 +99,9 @@ namespace Wabbajack.BuildServer.Controllers var body = await api.Get(path); result = new NexusCacheData { - Data = body, - Path = path, - Game = GameName, + Data = body, + Path = path, + Game = GameName, ModId = ModId, FileId = FileId }; @@ -121,7 +111,6 @@ namespace Wabbajack.BuildServer.Controllers } catch (MongoWriteException) { - } method = "NOT_CACHED"; @@ -130,7 +119,5 @@ namespace Wabbajack.BuildServer.Controllers Response.Headers.Add("x-cache-method", method); return result.Data; } - - } } diff --git a/Wabbajack.BuildServer/Program.cs b/Wabbajack.BuildServer/Program.cs index 132ba62a..f38d2517 100644 --- a/Wabbajack.BuildServer/Program.cs +++ b/Wabbajack.BuildServer/Program.cs @@ -15,12 +15,12 @@ namespace Wabbajack.BuildServer { CreateHostBuilder(args).Build().Run(); } - + public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { - webBuilder.UseUrls("http://*:5000", "https://*:5001"); + webBuilder.UseUrls("http://*:5000"); webBuilder.UseStartup(); }); } diff --git a/Wabbajack.BuildServer/Startup.cs b/Wabbajack.BuildServer/Startup.cs index a2789b4c..fc7f46d7 100644 --- a/Wabbajack.BuildServer/Startup.cs +++ b/Wabbajack.BuildServer/Startup.cs @@ -22,6 +22,7 @@ using Swashbuckle.AspNetCore.Swagger; using Wabbajack.BuildServer.Controllers; using Wabbajack.BuildServer.Models; using Microsoft.AspNetCore.Mvc.NewtonsoftJson; +using Wabbajack.BuildServer.Controllers; using Microsoft.Extensions.FileProviders; using Directory = System.IO.Directory; @@ -44,15 +45,15 @@ namespace Wabbajack.BuildServer { c.SwaggerDoc("v1", new OpenApiInfo {Title = "Wabbajack Build API", Version = "v1"}); }); - + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddControllers(o => + services.AddMvc(); + services.AddControllers() + .AddNewtonsoftJson(o => { - }).AddNewtonsoftJson(o => - { o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }); diff --git a/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj b/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj index 89a50834..a79e2feb 100644 --- a/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj +++ b/Wabbajack.BuildServer/Wabbajack.BuildServer.csproj @@ -2,11 +2,8 @@ netcoreapp3.1 - Exe aspnet-Wabbajack.BuildServer-6E798B30-DB04-4436-BE65-F043AF37B314 0 - true - true win10-x64 Debug;Release AnyCPU;x64