summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/StardewModdingAPI.Web/Controllers/ModsController.cs27
-rw-r--r--src/StardewModdingAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs21
-rw-r--r--src/StardewModdingAPI.Web/Framework/ModRepositories/NexusRepository.cs18
-rw-r--r--src/StardewModdingAPI.Web/Startup.cs2
-rw-r--r--src/StardewModdingAPI.Web/appsettings.json11
5 files changed, 64 insertions, 15 deletions
diff --git a/src/StardewModdingAPI.Web/Controllers/ModsController.cs b/src/StardewModdingAPI.Web/Controllers/ModsController.cs
index bd5ecef9..50c23b99 100644
--- a/src/StardewModdingAPI.Web/Controllers/ModsController.cs
+++ b/src/StardewModdingAPI.Web/Controllers/ModsController.cs
@@ -4,6 +4,8 @@ using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.Options;
+using StardewModdingAPI.Web.Framework.ConfigModels;
using StardewModdingAPI.Web.Framework.ModRepositories;
using StardewModdingAPI.Web.Models;
@@ -18,25 +20,34 @@ namespace StardewModdingAPI.Web.Controllers
** Properties
*********/
/// <summary>The mod repositories which provide mod metadata.</summary>
- private readonly IDictionary<string, IModRepository> Repositories =
- new IModRepository[]
- {
- new NexusRepository()
- }
- .ToDictionary(p => p.VendorKey, StringComparer.CurrentCultureIgnoreCase);
+ private readonly IDictionary<string, IModRepository> Repositories;
/// <summary>The cache in which to store mod metadata.</summary>
private readonly IMemoryCache Cache;
+ /// <summary>The number of minutes update checks should be cached before refetching them.</summary>
+ private readonly int CacheMinutes;
+
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
/// <param name="cache">The cache in which to store mod metadata.</param>
- public ModsController(IMemoryCache cache)
+ /// <param name="configProvider">The config settings for mod update checks.</param>
+ public ModsController(IMemoryCache cache, IOptions<ModUpdateCheckConfig> configProvider)
{
+ ModUpdateCheckConfig config = configProvider.Value;
+
this.Cache = cache;
+ this.CacheMinutes = config.CacheMinutes;
+
+ this.Repositories =
+ new IModRepository[]
+ {
+ new NexusRepository(config.NexusKey, config.NexusUserAgent, config.NexusBaseUrl, config.NexusModUrlFormat)
+ }
+ .ToDictionary(p => p.VendorKey, StringComparer.CurrentCultureIgnoreCase);
}
/// <summary>Fetch version metadata for the given mods.</summary>
@@ -82,7 +93,7 @@ namespace StardewModdingAPI.Web.Controllers
// fetch mod info
result[modKey] = await this.Cache.GetOrCreateAsync($"{repository.VendorKey}:{modID}".ToLower(), async entry =>
{
- entry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddHours(1);
+ entry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(this.CacheMinutes);
return await repository.GetModInfoAsync(modID);
});
}
diff --git a/src/StardewModdingAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs b/src/StardewModdingAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs
new file mode 100644
index 00000000..c8763800
--- /dev/null
+++ b/src/StardewModdingAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs
@@ -0,0 +1,21 @@
+namespace StardewModdingAPI.Web.Framework.ConfigModels
+{
+ /// <summary>The config settings for mod update checks.</summary>
+ public class ModUpdateCheckConfig
+ {
+ /// <summary>The number of minutes update checks should be cached before refetching them.</summary>
+ public int CacheMinutes { get; set; }
+
+ /// <summary>The repository key for Nexus Mods.</summary>
+ public string NexusKey { get; set; }
+
+ /// <summary>The user agent for the Nexus Mods API client.</summary>
+ public string NexusUserAgent { get; set; }
+
+ /// <summary>The base URL for the Nexus Mods API.</summary>
+ public string NexusBaseUrl { get; set; }
+
+ /// <summary>The URL for a Nexus Mods API query excluding the <see cref="NexusBaseUrl"/>, where {0} is the mod ID.</summary>
+ public string NexusModUrlFormat { get; set; }
+ }
+}
diff --git a/src/StardewModdingAPI.Web/Framework/ModRepositories/NexusRepository.cs b/src/StardewModdingAPI.Web/Framework/ModRepositories/NexusRepository.cs
index 02c2939a..312058ae 100644
--- a/src/StardewModdingAPI.Web/Framework/ModRepositories/NexusRepository.cs
+++ b/src/StardewModdingAPI.Web/Framework/ModRepositories/NexusRepository.cs
@@ -20,17 +20,25 @@ namespace StardewModdingAPI.Web.Framework.ModRepositories
** Accessors
*********/
/// <summary>The unique key for this vendor.</summary>
- public string VendorKey { get; } = "Nexus";
+ public string VendorKey { get; }
+
+ /// <summary>The URL for a Nexus Mods API query excluding the base URL, where {0} is the mod ID.</summary>
+ public string ModUrlFormat { get; }
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
- public NexusRepository()
+ /// <param name="vendorKey">The unique key for this vendor.</param>
+ /// <param name="userAgent">The user agent for the Nexus Mods API client.</param>
+ /// <param name="baseUrl">The base URL for the Nexus Mods API.</param>
+ /// <param name="modUrlFormat">The URL for a Nexus Mods API query excluding the <paramref name="baseUrl"/>, where {0} is the mod ID.</param>
+ public NexusRepository(string vendorKey, string userAgent, string baseUrl, string modUrlFormat)
{
- this.Client = new FluentClient("http://www.nexusmods.com/stardewvalley")
- .SetUserAgent("Nexus Client v0.63.15");
+ this.VendorKey = vendorKey;
+ this.ModUrlFormat = modUrlFormat;
+ this.Client = new FluentClient(baseUrl).SetUserAgent(userAgent);
}
/// <summary>Get metadata about a mod in the repository.</summary>
@@ -40,7 +48,7 @@ namespace StardewModdingAPI.Web.Framework.ModRepositories
try
{
NexusResponseModel response = await this.Client
- .GetAsync($"mods/{id}")
+ .GetAsync(string.Format(this.ModUrlFormat, id))
.As<NexusResponseModel>();
return response != null
diff --git a/src/StardewModdingAPI.Web/Startup.cs b/src/StardewModdingAPI.Web/Startup.cs
index 8aba6a5a..fbe2bd92 100644
--- a/src/StardewModdingAPI.Web/Startup.cs
+++ b/src/StardewModdingAPI.Web/Startup.cs
@@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using StardewModdingAPI.Web.Framework;
+using StardewModdingAPI.Web.Framework.ConfigModels;
namespace StardewModdingAPI.Web
{
@@ -39,6 +40,7 @@ namespace StardewModdingAPI.Web
public void ConfigureServices(IServiceCollection services)
{
services
+ .Configure<ModUpdateCheckConfig>(this.Configuration.GetSection("ModUpdateCheck"))
.AddMemoryCache()
.AddMvc()
.AddJsonOptions(options =>
diff --git a/src/StardewModdingAPI.Web/appsettings.json b/src/StardewModdingAPI.Web/appsettings.json
index 5fff67ba..1e624055 100644
--- a/src/StardewModdingAPI.Web/appsettings.json
+++ b/src/StardewModdingAPI.Web/appsettings.json
@@ -1,8 +1,15 @@
-{
+{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
- }
+ },
+ "ModUpdateCheck": {
+ "CacheMinutes": 60,
+ "NexusKey": "Nexus",
+ "NexusUserAgent": "Nexus Client v0.63.15",
+ "NexusBaseUrl": "http://www.nexusmods.com/stardewvalley",
+ "NexusModUrlFormat": "mods/{0}"
+ }
}