[backend/masto-client] Return instance name, instance description & admin contact
This commit is contained in:
parent
d0c2d1bedc
commit
f36daf860a
3 changed files with 54 additions and 20 deletions
|
@ -4,6 +4,7 @@ using Iceshrimp.Backend.Controllers.Mastodon.Schemas;
|
|||
using Iceshrimp.Backend.Controllers.Mastodon.Schemas.Entities;
|
||||
using Iceshrimp.Backend.Core.Configuration;
|
||||
using Iceshrimp.Backend.Core.Database;
|
||||
using Iceshrimp.Backend.Core.Services;
|
||||
using Microsoft.AspNetCore.Cors;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.RateLimiting;
|
||||
|
@ -16,7 +17,7 @@ namespace Iceshrimp.Backend.Controllers.Mastodon;
|
|||
[EnableCors("mastodon")]
|
||||
[EnableRateLimiting("sliding")]
|
||||
[Produces(MediaTypeNames.Application.Json)]
|
||||
public class InstanceController(DatabaseContext db) : ControllerBase
|
||||
public class InstanceController(DatabaseContext db, MetaService meta) : ControllerBase
|
||||
{
|
||||
[HttpGet("/api/v1/instance")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(InstanceInfoV1Response))]
|
||||
|
@ -24,11 +25,13 @@ public class InstanceController(DatabaseContext db) : ControllerBase
|
|||
{
|
||||
var userCount =
|
||||
await db.Users.LongCountAsync(p => p.Host == null && !Constants.SystemUsers.Contains(p.UsernameLower));
|
||||
var noteCount = await db.Notes.LongCountAsync(p => p.UserHost == null);
|
||||
var instanceCount = await db.Instances.LongCountAsync();
|
||||
//TODO: admin contact
|
||||
var noteCount = await db.Notes.LongCountAsync(p => p.UserHost == null);
|
||||
var instanceCount = await db.Instances.LongCountAsync();
|
||||
var instanceName = await meta.Get(MetaEntity.InstanceName);
|
||||
var instanceDescription = await meta.Get(MetaEntity.InstanceDescription);
|
||||
var adminContact = await meta.Get(MetaEntity.AdminContactEmail);
|
||||
|
||||
var res = new InstanceInfoV1Response(config.Value)
|
||||
var res = new InstanceInfoV1Response(config.Value, instanceName, instanceDescription, adminContact)
|
||||
{
|
||||
Stats = new InstanceStats(userCount, noteCount, instanceCount)
|
||||
};
|
||||
|
@ -44,9 +47,12 @@ public class InstanceController(DatabaseContext db) : ControllerBase
|
|||
var activeMonth = await db.Users.LongCountAsync(p => p.Host == null &&
|
||||
!Constants.SystemUsers.Contains(p.UsernameLower) &&
|
||||
p.LastActiveDate > cutoff);
|
||||
//TODO: admin contact
|
||||
|
||||
var res = new InstanceInfoV2Response(config.Value)
|
||||
var instanceName = await meta.Get(MetaEntity.InstanceName);
|
||||
var instanceDescription = await meta.Get(MetaEntity.InstanceDescription);
|
||||
var adminContact = await meta.Get(MetaEntity.AdminContactEmail);
|
||||
|
||||
var res = new InstanceInfoV2Response(config.Value, instanceName, instanceDescription, adminContact)
|
||||
{
|
||||
Usage = new InstanceUsage { Users = new InstanceUsersUsage { ActiveMonth = activeMonth } }
|
||||
};
|
||||
|
|
|
@ -1,18 +1,31 @@
|
|||
using Iceshrimp.Backend.Core.Configuration;
|
||||
using Iceshrimp.Backend.Core.Extensions;
|
||||
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
|
||||
|
||||
namespace Iceshrimp.Backend.Controllers.Mastodon.Schemas;
|
||||
|
||||
public class InstanceInfoV1Response(Config config)
|
||||
public class InstanceInfoV1Response(
|
||||
Config config,
|
||||
string? instanceName,
|
||||
string? instanceDescription,
|
||||
string? adminContact
|
||||
)
|
||||
{
|
||||
[J("stats")] public required InstanceStats Stats;
|
||||
[J("version")] public string Version => $"4.2.1 (compatible; Iceshrimp.NET/{config.Instance.Version})";
|
||||
|
||||
[J("max_toot_chars")] public int MaxNoteChars => config.Instance.CharacterLimit;
|
||||
[J("uri")] public string AccountDomain => config.Instance.AccountDomain;
|
||||
[J("title")] public string InstanceName => config.Instance.AccountDomain;
|
||||
[J("short_description")] public string ShortDescription => $"{config.Instance.AccountDomain} on Iceshrimp.NET";
|
||||
[J("description")] public string Description => $"{config.Instance.AccountDomain} on Iceshrimp.NET";
|
||||
[J("max_toot_chars")] public int MaxNoteChars => config.Instance.CharacterLimit;
|
||||
[J("uri")] public string AccountDomain => config.Instance.AccountDomain;
|
||||
[J("title")] public string InstanceName => instanceName ?? config.Instance.AccountDomain;
|
||||
[J("email")] public string Email => adminContact ?? "unset@example.org";
|
||||
|
||||
[J("short_description")]
|
||||
public string ShortDescription => instanceDescription?.Truncate(140) ??
|
||||
"This Iceshrimp.NET instance does not appear to have a description";
|
||||
|
||||
[J("description")]
|
||||
public string Description => instanceDescription ??
|
||||
"This Iceshrimp.NET instance does not appear to have a description";
|
||||
|
||||
[J("registrations")] public bool RegsOpen => config.Security.Registrations == Enums.Registrations.Open;
|
||||
[J("invites_enabled")] public bool RegsInvite => config.Security.Registrations == Enums.Registrations.Invite;
|
||||
|
|
|
@ -1,20 +1,30 @@
|
|||
using Iceshrimp.Backend.Core.Configuration;
|
||||
using Iceshrimp.Backend.Core.Extensions;
|
||||
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
|
||||
|
||||
namespace Iceshrimp.Backend.Controllers.Mastodon.Schemas;
|
||||
|
||||
public class InstanceInfoV2Response(Config config)
|
||||
public class InstanceInfoV2Response(
|
||||
Config config,
|
||||
string? instanceName,
|
||||
string? instanceDescription,
|
||||
string? adminContact
|
||||
)
|
||||
{
|
||||
[J("version")] public string Version => $"4.2.1 (compatible; Iceshrimp.NET/{config.Instance.Version})";
|
||||
[J("source_url")] public string SourceUrl => "https://iceshrimp.dev/iceshrimp/iceshrimp.net";
|
||||
[J("domain")] public string AccountDomain => config.Instance.AccountDomain;
|
||||
[J("title")] public string InstanceName => config.Instance.AccountDomain;
|
||||
[J("description")] public string Description => $"{config.Instance.AccountDomain} on Iceshrimp.NET";
|
||||
[J("version")] public string Version => $"4.2.1 (compatible; Iceshrimp.NET/{config.Instance.Version})";
|
||||
[J("source_url")] public string SourceUrl => "https://iceshrimp.dev/iceshrimp/iceshrimp.net";
|
||||
[J("domain")] public string AccountDomain => config.Instance.AccountDomain;
|
||||
[J("title")] public string InstanceName => instanceName ?? config.Instance.AccountDomain;
|
||||
|
||||
[J("description")]
|
||||
public string Description => instanceDescription?.Truncate(140) ??
|
||||
"This Iceshrimp.NET instance does not appear to have a description";
|
||||
|
||||
[J("contact")] public InstanceContact Contact => new(adminContact);
|
||||
[J("registrations")] public InstanceRegistrations Registrations => new(config.Security);
|
||||
[J("configuration")] public InstanceConfigurationV2 Configuration => new(config.Instance);
|
||||
|
||||
[J("usage")] public required InstanceUsage Usage { get; set; }
|
||||
[J("usage")] public required InstanceUsage Usage { get; set; }
|
||||
|
||||
//TODO: add the rest
|
||||
}
|
||||
|
@ -46,3 +56,8 @@ public class InstanceUsersUsage
|
|||
{
|
||||
[J("active_month")] public required long ActiveMonth { get; set; }
|
||||
}
|
||||
|
||||
public class InstanceContact(string? adminContact)
|
||||
{
|
||||
[J("email")] public string Email => adminContact ?? "unset@example.org";
|
||||
}
|
Loading…
Add table
Reference in a new issue