Files
NostrServices/NostrServices/Controllers/RelaysController.cs
2024-02-02 16:44:28 +00:00

84 lines
2.4 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using NostrServices.Services;
namespace NostrServices.Controllers;
[Route("/api/v1/relays")]
public class RelaysController : Controller
{
private readonly RedisStore _database;
public RelaysController(RedisStore database)
{
_database = database;
}
[HttpPost]
public async Task<IActionResult> GetCloseRelays([FromBody] LatLonReq pos, [FromQuery] int count = 5)
{
const int distance = 5000 * 1000; // 5,000km
var relays = await _database.FindCloseRelays(pos.Lat, pos.Lon, distance, count);
return Json(relays.Select(a => a.FromDistance()));
}
[HttpGet("top")]
public async Task<IActionResult> GetTop([FromQuery] int count = 10)
{
var top = await _database.CountRelayUsers();
var topSelected = top.OrderByDescending(a => a.Value).Take(count);
var infos = await Task.WhenAll(topSelected.Select(a => _database.GetRelay(a.Key)));
return Json(infos.Where(a => a != default).Select(a => a!.FromInfo()));
}
}
public class LatLonReq
{
[JsonProperty("lat")]
public double Lat { get; init; }
[JsonProperty("lon")]
public double Lon { get; init; }
}
public static class RelayDistanceExtension
{
public static Client.RelayDistance FromDistance(this RelayDistance x)
{
var rp = x.Relay.Positions.FirstOrDefault(a => a.IpAddress == x.IpAddress) ?? x.Relay.Positions.First();
return new Client.RelayDistance()
{
Url = x.Relay.Url,
Distance = x.Distance,
Users = x.Relay.Users,
Country = rp.Country,
City = rp.City,
Description = x.Relay.Description,
IsPaid = x.Relay.IsPaid,
IsWriteRestricted = x.Relay.IsWriteRestricted,
Latitude = rp.Lat,
Longitude = rp.Lon
};
}
public static Client.RelayDistance FromInfo(this RelayInfo x)
{
var rp = x.Positions.First();
return new Client.RelayDistance()
{
Url = x.Url,
Distance = 0,
Users = x.Users,
Country = rp.Country,
City = rp.City,
Description = x.Description,
IsPaid = x.IsPaid,
IsWriteRestricted = x.IsWriteRestricted,
Latitude = rp.Lat,
Longitude = rp.Lon
};
}
}