public async Task <NexusApiClient.GetModFilesResponse> GetModFiles(string GameName, string ModId) { var result = await Db.NexusModFiles.FindOneAsync(info => info.Game == GameName && info.ModId == ModId); string method = "CACHED"; if (result == null) { var api = await NexusApiClient.Get(Request.Headers["apikey"].FirstOrDefault()); var path = $"/v1/games/{GameName}/mods/{ModId}/files.json"; var body = await api.Get <NexusApiClient.GetModFilesResponse>(path); result = new NexusCacheData <NexusApiClient.GetModFilesResponse> { Data = body, Path = path, Game = GameName, ModId = ModId }; try { await Db.NexusModFiles.InsertOneAsync(result); } catch (MongoWriteException) { } method = "NOT_CACHED"; } Response.Headers.Add("x-cache-result", method); return(result.Data); }
public override async Task <JobResult> Execute(SqlService sql, AppSettings settings) { var api = await NexusApiClient.Get(); var gameTasks = GameRegistry.Games.Values .Where(game => game.NexusName != null) .Select(async game => { var mods = await api.Get <List <NexusUpdateEntry> >( $"https://api.nexusmods.com/v1/games/{game.NexusName}/mods/updated.json?period=1m"); var entry = new NexusCacheData <List <NexusUpdateEntry> >(); entry.Game = game.NexusName; entry.Path = $"/v1/games/{game.NexusName}/mods/updated.json?period=1m"; entry.Data = mods; return(game, mods); }) .Select(async rTask => { var(game, mods) = await rTask; return(mods.Select(mod => new { game = game, mod = mod })); }).ToList(); Utils.Log($"Getting update list for {gameTasks.Count} games"); var purge = (await Task.WhenAll(gameTasks)) .SelectMany(i => i) .ToList(); Utils.Log($"Found {purge.Count} updated mods in the last month"); using (var queue = new WorkQueue()) { var collected = purge.Select(d => { var a = d.mod.LatestFileUpdate.AsUnixTime(); // Mod activity could hide files var b = d.mod.LastestModActivity.AsUnixTime(); return(new { Game = d.game.Game, Date = (a > b ? a : b), ModId = d.mod.ModId }); }); var purged = await collected.PMap(queue, async t => { var resultA = await sql.DeleteNexusModInfosUpdatedBeforeDate(t.Game, t.ModId, t.Date); var resultB = await sql.DeleteNexusModFilesUpdatedBeforeDate(t.Game, t.ModId, t.Date); return(resultA + resultB); }); Utils.Log($"Purged {purged.Sum()} cache entries"); } return(JobResult.Success()); }