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;
}
}
}