From 05541c11a72735d79d98cf3ae14d592e70bd8f54 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 24 Dec 2017 23:28:07 -0500 Subject: decouple API clients from mods API (#411) --- src/SMAPI.Web/Controllers/ModsApiController.cs | 34 ++++++++------------------ 1 file changed, 10 insertions(+), 24 deletions(-) (limited to 'src/SMAPI.Web/Controllers') diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs index a600662c..dcb4ec52 100644 --- a/src/SMAPI.Web/Controllers/ModsApiController.cs +++ b/src/SMAPI.Web/Controllers/ModsApiController.cs @@ -7,6 +7,9 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using StardewModdingAPI.Common.Models; +using StardewModdingAPI.Web.Framework.Clients.Chucklefish; +using StardewModdingAPI.Web.Framework.Clients.GitHub; +using StardewModdingAPI.Web.Framework.Clients.Nexus; using StardewModdingAPI.Web.Framework.ConfigModels; using StardewModdingAPI.Web.Framework.ModRepositories; @@ -39,39 +42,22 @@ namespace StardewModdingAPI.Web.Controllers /// Construct an instance. /// The cache in which to store mod metadata. /// The config settings for mod update checks. - public ModsApiController(IMemoryCache cache, IOptions configProvider) + /// The Chucklefish API client. + /// The GitHub API client. + /// The Nexus API client. + public ModsApiController(IMemoryCache cache, IOptions configProvider, IChucklefishClient chucklefish, IGitHubClient github, INexusClient nexus) { ModUpdateCheckConfig config = configProvider.Value; this.Cache = cache; this.CacheMinutes = config.CacheMinutes; this.VersionRegex = config.SemanticVersionRegex; - - string version = this.GetType().Assembly.GetName().Version.ToString(3); this.Repositories = new IModRepository[] { - new ChucklefishRepository( - vendorKey: config.ChucklefishKey, - userAgent: string.Format(config.ChucklefishUserAgent, version), - baseUrl: config.ChucklefishBaseUrl, - modPageUrlFormat: config.ChucklefishModPageUrlFormat - ), - new GitHubRepository( - vendorKey: config.GitHubKey, - baseUrl: config.GitHubBaseUrl, - releaseUrlFormat: config.GitHubReleaseUrlFormat, - userAgent: string.Format(config.GitHubUserAgent, version), - acceptHeader: config.GitHubAcceptHeader, - username: config.GitHubUsername, - password: config.GitHubPassword - ), - new NexusRepository( - vendorKey: config.NexusKey, - userAgent: config.NexusUserAgent, - baseUrl: config.NexusBaseUrl, - modUrlFormat: config.NexusModUrlFormat - ) + new ChucklefishRepository(config.ChucklefishKey, chucklefish), + new GitHubRepository(config.GitHubKey, github), + new NexusRepository(config.NexusKey, nexus) } .ToDictionary(p => p.VendorKey, StringComparer.CurrentCultureIgnoreCase); } -- cgit From bbd021f8736d1496f34a58b12bb0ee6c341d1c5e Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 24 Dec 2017 23:40:23 -0500 Subject: decouple Pastebin client from log parser (#411) --- src/SMAPI.Web/Controllers/LogParserController.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'src/SMAPI.Web/Controllers') diff --git a/src/SMAPI.Web/Controllers/LogParserController.cs b/src/SMAPI.Web/Controllers/LogParserController.cs index 454440bb..b9227a2f 100644 --- a/src/SMAPI.Web/Controllers/LogParserController.cs +++ b/src/SMAPI.Web/Controllers/LogParserController.cs @@ -6,8 +6,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using StardewModdingAPI.Web.Framework; +using StardewModdingAPI.Web.Framework.Clients.Pastebin; using StardewModdingAPI.Web.Framework.ConfigModels; -using StardewModdingAPI.Web.Framework.LogParser; using StardewModdingAPI.Web.ViewModels; namespace StardewModdingAPI.Web.Controllers @@ -22,7 +22,7 @@ namespace StardewModdingAPI.Web.Controllers private readonly LogParserConfig Config; /// The underlying Pastebin client. - private readonly PastebinClient PastebinClient; + private readonly IPastebinClient Pastebin; /// The first bytes in a valid zip file. /// See . @@ -37,13 +37,11 @@ namespace StardewModdingAPI.Web.Controllers ***/ /// Construct an instance. /// The log parser config settings. - public LogParserController(IOptions configProvider) + /// The Pastebin API client. + public LogParserController(IOptions configProvider, IPastebinClient pastebin) { - // init Pastebin client this.Config = configProvider.Value; - string version = this.GetType().Assembly.GetName().Version.ToString(3); - string userAgent = string.Format(this.Config.PastebinUserAgent, version); - this.PastebinClient = new PastebinClient(this.Config.PastebinBaseUrl, userAgent, this.Config.PastebinUserKey, this.Config.PastebinDevKey); + this.Pastebin = pastebin; } /*** @@ -67,9 +65,9 @@ namespace StardewModdingAPI.Web.Controllers /// The Pastebin paste ID. [HttpGet, Produces("application/json")] [Route("log/fetch/{id}")] - public async Task GetAsync(string id) + public async Task GetAsync(string id) { - GetPasteResponse response = await this.PastebinClient.GetAsync(id); + PasteInfo response = await this.Pastebin.GetAsync(id); response.Content = this.DecompressString(response.Content); return response; } @@ -78,10 +76,10 @@ namespace StardewModdingAPI.Web.Controllers /// The log content to save. [HttpPost, Produces("application/json"), AllowLargePosts] [Route("log/save")] - public async Task PostAsync([FromBody] string content) + public async Task PostAsync([FromBody] string content) { content = this.CompressString(content); - return await this.PastebinClient.PostAsync(content); + return await this.Pastebin.PostAsync(content); } -- cgit From adee66b3b4ea111b0082a31108e55726fab10643 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 25 Dec 2017 01:47:10 -0500 Subject: add basic download page (#411) --- src/SMAPI.Web/Controllers/IndexController.cs | 79 ++++++++++++++++++++++++ src/SMAPI.Web/Controllers/LogParserController.cs | 1 - 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/SMAPI.Web/Controllers/IndexController.cs (limited to 'src/SMAPI.Web/Controllers') diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs new file mode 100644 index 00000000..c2c5f2fe --- /dev/null +++ b/src/SMAPI.Web/Controllers/IndexController.cs @@ -0,0 +1,79 @@ +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using StardewModdingAPI.Web.Framework.Clients.GitHub; +using StardewModdingAPI.Web.ViewModels; + +namespace StardewModdingAPI.Web.Controllers +{ + /// Provides an info/download page about SMAPI. + [Route("")] + [Route("install")] + internal class IndexController : Controller + { + /********* + ** Properties + *********/ + /// The GitHub API client. + private readonly IGitHubClient GitHub; + + + /********* + ** Public methods + *********/ + /// Construct an instance. + /// The GitHub API client. + public IndexController(IGitHubClient github) + { + this.GitHub = github; + } + + /// Display the index page. + [HttpGet] + public async Task Index() + { + // fetch latest SMAPI release + GitRelease release = await this.GitHub.GetLatestReleaseAsync("Pathoschild/SMAPI"); + string downloadUrl = this.GetMainDownloadUrl(release); + string devDownloadUrl = this.GetDevDownloadUrl(release); + + // render view + var model = new IndexModel(release.Name, release.Body, downloadUrl, devDownloadUrl); + return this.View(model); + } + + + /********* + ** Private methods + *********/ + /// Get the main download URL for a SMAPI release. + /// The SMAPI release. + private string GetMainDownloadUrl(GitRelease release) + { + // get main download URL + foreach (GitAsset asset in release.Assets ?? new GitAsset[0]) + { + if (Regex.IsMatch(asset.FileName, @"SMAPI-[\d\.]+-installer.zip")) + return asset.DownloadUrl; + } + + // fallback just in case + return "https://github.com/pathoschild/SMAPI/releases"; + } + + /// Get the for-developers download URL for a SMAPI release. + /// The SMAPI release. + private string GetDevDownloadUrl(GitRelease release) + { + // get dev download URL + foreach (GitAsset asset in release.Assets ?? new GitAsset[0]) + { + if (Regex.IsMatch(asset.FileName, @"SMAPI-[\d\.]+-installer-for-developers.zip")) + return asset.DownloadUrl; + } + + // fallback just in case + return "https://github.com/pathoschild/SMAPI/releases"; + } + } +} diff --git a/src/SMAPI.Web/Controllers/LogParserController.cs b/src/SMAPI.Web/Controllers/LogParserController.cs index b9227a2f..ad979397 100644 --- a/src/SMAPI.Web/Controllers/LogParserController.cs +++ b/src/SMAPI.Web/Controllers/LogParserController.cs @@ -50,7 +50,6 @@ namespace StardewModdingAPI.Web.Controllers /// Render the log parser UI. /// The paste ID. [HttpGet] - [Route("")] [Route("log")] [Route("log/{id}")] public ViewResult Index(string id = null) -- cgit From 70cbfa541dade1822394f81bd1d5b6baa18e51e9 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 25 Dec 2017 01:53:10 -0500 Subject: support contextual nav URLs, update nav menu (#411) --- src/SMAPI.Web/Controllers/LogParserController.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/SMAPI.Web/Controllers') diff --git a/src/SMAPI.Web/Controllers/LogParserController.cs b/src/SMAPI.Web/Controllers/LogParserController.cs index ad979397..04a11a82 100644 --- a/src/SMAPI.Web/Controllers/LogParserController.cs +++ b/src/SMAPI.Web/Controllers/LogParserController.cs @@ -19,7 +19,7 @@ namespace StardewModdingAPI.Web.Controllers ** Properties *********/ /// The log parser config settings. - private readonly LogParserConfig Config; + private readonly ContextConfig Config; /// The underlying Pastebin client. private readonly IPastebinClient Pastebin; @@ -36,11 +36,11 @@ namespace StardewModdingAPI.Web.Controllers ** Constructor ***/ /// Construct an instance. - /// The log parser config settings. + /// The context config settings. /// The Pastebin API client. - public LogParserController(IOptions configProvider, IPastebinClient pastebin) + public LogParserController(IOptions contextProvider, IPastebinClient pastebin) { - this.Config = configProvider.Value; + this.Config = contextProvider.Value; this.Pastebin = pastebin; } @@ -54,7 +54,7 @@ namespace StardewModdingAPI.Web.Controllers [Route("log/{id}")] public ViewResult Index(string id = null) { - return this.View("Index", new LogParserModel(this.Config.SectionUrl, id)); + return this.View("Index", new LogParserModel(this.Config.LogParserUrl, id)); } /*** -- cgit From 3da98ff0a032255d8b567d27554f13abe1dba62e Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 25 Dec 2017 02:18:24 -0500 Subject: cache release info (#411) --- src/SMAPI.Web/Controllers/IndexController.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/SMAPI.Web/Controllers') diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs index c2c5f2fe..5d45118f 100644 --- a/src/SMAPI.Web/Controllers/IndexController.cs +++ b/src/SMAPI.Web/Controllers/IndexController.cs @@ -1,6 +1,8 @@ +using System; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; using StardewModdingAPI.Web.Framework.Clients.GitHub; using StardewModdingAPI.Web.ViewModels; @@ -14,17 +16,25 @@ namespace StardewModdingAPI.Web.Controllers /********* ** Properties *********/ + /// The cache in which to store release data. + private readonly IMemoryCache Cache; + /// The GitHub API client. private readonly IGitHubClient GitHub; + /// The cache time for release info. + private readonly TimeSpan CacheTime = TimeSpan.FromMinutes(5); + /********* ** Public methods *********/ /// Construct an instance. + /// The cache in which to store release data. /// The GitHub API client. - public IndexController(IGitHubClient github) + public IndexController(IMemoryCache cache, IGitHubClient github) { + this.Cache = cache; this.GitHub = github; } @@ -33,7 +43,11 @@ namespace StardewModdingAPI.Web.Controllers public async Task Index() { // fetch latest SMAPI release - GitRelease release = await this.GitHub.GetLatestReleaseAsync("Pathoschild/SMAPI"); + GitRelease release = await this.Cache.GetOrCreateAsync("latest-smapi-release", async entry => + { + entry.AbsoluteExpiration = DateTimeOffset.UtcNow.Add(this.CacheTime); + return await this.GitHub.GetLatestReleaseAsync("Pathoschild/SMAPI"); + }); string downloadUrl = this.GetMainDownloadUrl(release); string devDownloadUrl = this.GetDevDownloadUrl(release); -- cgit