summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2018-06-28 22:01:04 -0400
committerJesse Plamondon-Willard <github@jplamondonw.com>2018-06-28 22:01:04 -0400
commit3f5a5e54041a641e30fc5cc899046953d9763da4 (patch)
treeca02735544614b85cfc75201823b3dd8d36f2b8a /src/SMAPI.Web
parent89ad599561a058289d8ea44e0c345f1a30a3a6ac (diff)
downloadSMAPI-3f5a5e54041a641e30fc5cc899046953d9763da4.tar.gz
SMAPI-3f5a5e54041a641e30fc5cc899046953d9763da4.tar.bz2
SMAPI-3f5a5e54041a641e30fc5cc899046953d9763da4.zip
use more structured API response for update checks (#532)
Diffstat (limited to 'src/SMAPI.Web')
-rw-r--r--src/SMAPI.Web/Controllers/ModsApiController.cs44
-rw-r--r--src/SMAPI.Web/Framework/ModRepositories/IModRepository.cs1
-rw-r--r--src/SMAPI.Web/Framework/ModRepositories/ModInfoModel.cs2
3 files changed, 24 insertions, 23 deletions
diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs
index 960602f4..c4f1023b 100644
--- a/src/SMAPI.Web/Controllers/ModsApiController.cs
+++ b/src/SMAPI.Web/Controllers/ModsApiController.cs
@@ -80,7 +80,11 @@ namespace StardewModdingAPI.Web.Controllers
[HttpPost]
public async Task<IDictionary<string, ModEntryModel>> PostAsync([FromBody] ModSearchModel model)
{
- ModSearchEntryModel[] searchMods = this.GetSearchMods(model).ToArray();
+ // parse request data
+ ISemanticVersion apiVersion = this.GetApiVersion();
+ ModSearchEntryModel[] searchMods = this.GetSearchMods(model, apiVersion).ToArray();
+
+ // perform checks
IDictionary<string, ModEntryModel> mods = new Dictionary<string, ModEntryModel>(StringComparer.CurrentCultureIgnoreCase);
foreach (ModSearchEntryModel mod in searchMods)
{
@@ -119,11 +123,10 @@ namespace StardewModdingAPI.Web.Controllers
continue;
}
- if (result.Version == null || version.IsNewerThan(new SemanticVersion(result.Version)))
+ if (result.Main == null || result.Main.Version.IsOlderThan(version))
{
result.Name = data.Name;
- result.Url = data.Url;
- result.Version = version.ToString();
+ result.Main = new ModEntryVersionModel(version, data.Url);
}
}
@@ -136,35 +139,34 @@ namespace StardewModdingAPI.Web.Controllers
continue;
}
- if (result.PreviewVersion == null || version.IsNewerThan(new SemanticVersion(data.PreviewVersion)))
+ if (result.Optional == null || result.Optional.Version.IsOlderThan(version))
{
result.Name = result.Name ?? data.Name;
- result.PreviewUrl = data.Url;
- result.PreviewVersion = version.ToString();
+ result.Optional = new ModEntryVersionModel(version, data.Url);
}
}
}
// fallback to preview if latest is invalid
- if (result.Version == null && result.PreviewVersion != null)
+ if (result.Main == null && result.Optional != null)
{
- result.Version = result.PreviewVersion;
- result.Url = result.PreviewUrl;
- result.PreviewVersion = null;
- result.PreviewUrl = null;
+ result.Main = result.Optional;
+ result.Optional = null;
}
// special cases
if (mod.ID == "Pathoschild.SMAPI")
{
result.Name = "SMAPI";
- result.Url = "https://smapi.io/";
- if (result.PreviewUrl != null)
- result.PreviewUrl = "https://smapi.io/";
+ if (result.Main != null)
+ result.Main.Url = "https://smapi.io/";
+ if (result.Optional != null)
+ result.Optional.Url = "https://smapi.io/";
}
// add result
result.Errors = errors.ToArray();
+ result.SetBackwardsCompatibility(apiVersion);
mods[mod.ID] = result;
}
@@ -199,7 +201,8 @@ namespace StardewModdingAPI.Web.Controllers
/// <summary>Get the mods for which the API should return data.</summary>
/// <param name="model">The search model.</param>
- private IEnumerable<ModSearchEntryModel> GetSearchMods(ModSearchModel model)
+ /// <param name="apiVersion">The requested API version.</param>
+ private IEnumerable<ModSearchEntryModel> GetSearchMods(ModSearchModel model, ISemanticVersion apiVersion)
{
if (model == null)
yield break;
@@ -212,7 +215,7 @@ namespace StardewModdingAPI.Web.Controllers
}
// yield mod update keys if backwards compatible
- if (model.ModKeys != null && model.ModKeys.Any() && this.ShouldBeBackwardsCompatible("2.6-beta.17"))
+ if (model.ModKeys != null && model.ModKeys.Any() && !apiVersion.IsNewerThan("2.6-beta.17"))
{
foreach (string updateKey in model.ModKeys.Distinct())
yield return new ModSearchEntryModel(updateKey, new[] { updateKey });
@@ -247,12 +250,11 @@ namespace StardewModdingAPI.Web.Controllers
});
}
- /// <summary>Get whether the API should return data in a backwards compatible way.</summary>
- /// <param name="maxVersion">The last version for which data should be backwards compatible.</param>
- private bool ShouldBeBackwardsCompatible(string maxVersion)
+ /// <summary>Get the requested API version.</summary>
+ private ISemanticVersion GetApiVersion()
{
string actualVersion = (string)this.RouteData.Values["version"];
- return !new SemanticVersion(actualVersion).IsNewerThan(new SemanticVersion(maxVersion));
+ return new SemanticVersion(actualVersion);
}
}
}
diff --git a/src/SMAPI.Web/Framework/ModRepositories/IModRepository.cs b/src/SMAPI.Web/Framework/ModRepositories/IModRepository.cs
index 4c879c8d..09c59a86 100644
--- a/src/SMAPI.Web/Framework/ModRepositories/IModRepository.cs
+++ b/src/SMAPI.Web/Framework/ModRepositories/IModRepository.cs
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
-using StardewModdingAPI.Toolkit.Framework.Clients.WebApi;
namespace StardewModdingAPI.Web.Framework.ModRepositories
{
diff --git a/src/SMAPI.Web/Framework/ModRepositories/ModInfoModel.cs b/src/SMAPI.Web/Framework/ModRepositories/ModInfoModel.cs
index ccb0699c..18252298 100644
--- a/src/SMAPI.Web/Framework/ModRepositories/ModInfoModel.cs
+++ b/src/SMAPI.Web/Framework/ModRepositories/ModInfoModel.cs
@@ -1,7 +1,7 @@
namespace StardewModdingAPI.Web.Framework.ModRepositories
{
/// <summary>Generic metadata about a mod.</summary>
- public class ModInfoModel
+ internal class ModInfoModel
{
/*********
** Accessors