using System.Collections.Generic; using System.Threading.Tasks; using System.Linq; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; using PluralKit.Core; namespace PluralKit.API { [ApiController] [ApiVersion("1.0")] [Route("v{version:apiVersion}")] public class MetaController: ControllerBase { private readonly IDatabase _db; private readonly ModelRepository _repo; public MetaController(IDatabase db, ModelRepository repo) { _db = db; _repo = repo; } [HttpGet("meta")] public async Task> GetMeta() { await using var conn = await _db.Obtain(); var shards = await _repo.GetShards(conn); var o = new JObject(); o.Add("shards", shards.ToJSON()); o.Add("version", BuildInfoService.Version); return Ok(o); } } public static class MetaJsonExt { public static JArray ToJSON(this IEnumerable shards) { var o = new JArray(); foreach (var shard in shards) { var s = new JObject(); s.Add("id", shard.Id); if (shard.Status == PKShardInfo.ShardStatus.Down) s.Add("status", "down"); else s.Add("status", "up"); s.Add("ping", shard.Ping); s.Add("last_heartbeat", shard.LastHeartbeat.ToString()); s.Add("last_connection", shard.LastConnection.ToString()); o.Add(s); } return o; } } }