using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using StardewModdingAPI.Web.Framework.ModRepositories; using StardewModdingAPI.Web.Models; namespace StardewModdingAPI.Web.Controllers { /// Provides an API to perform mod update checks. [Route("v1.0/mods")] [Produces("application/json")] public class ModsController : Controller { /********* ** Properties *********/ /// The mod repositories which provide mod metadata. private readonly IDictionary Repositories = new IModRepository[] { new NexusRepository() } .ToDictionary(p => p.VendorKey, StringComparer.CurrentCultureIgnoreCase); /********* ** Public methods *********/ /// Fetch version metadata for the given mods. /// The namespaced mod keys to search. [HttpGet] public async Task Post(IEnumerable modKeys) { IList result = new List(); foreach (string modKey in modKeys) { // parse mod key if (!this.TryParseModKey(modKey, out string vendorKey, out string modID)) { result.Add(new ModInfoModel(modKey, "The mod key isn't in a valid format. It should contain the mod repository key and mod ID like 'Nexus:541'.")); continue; } // get matching repository if (!this.Repositories.TryGetValue(vendorKey, out IModRepository repository)) { result.Add(new ModInfoModel(modKey, "There's no mod repository matching this namespaced mod ID.")); continue; } // fetch mod info result.Add(await repository.GetModInfoAsync(modID)); } return result.ToArray(); } /********* ** Private methods *********/ /// Parse a namespaced mod ID. /// The raw mod ID to parse. /// The parsed vendor key. /// The parsed mod ID. /// Returns whether the value could be parsed. private bool TryParseModKey(string raw, out string vendorKey, out string modID) { // split parts string[] parts = raw?.Split(':'); if (parts == null || parts.Length != 2) { vendorKey = null; modID = null; return false; } // parse vendorKey = parts[0]; modID = parts[1]; return true; } } }