[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.Controllers.Mastodon.Schemas.Entities;
|
||||||
using Iceshrimp.Backend.Core.Configuration;
|
using Iceshrimp.Backend.Core.Configuration;
|
||||||
using Iceshrimp.Backend.Core.Database;
|
using Iceshrimp.Backend.Core.Database;
|
||||||
|
using Iceshrimp.Backend.Core.Services;
|
||||||
using Microsoft.AspNetCore.Cors;
|
using Microsoft.AspNetCore.Cors;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.RateLimiting;
|
using Microsoft.AspNetCore.RateLimiting;
|
||||||
|
@ -16,7 +17,7 @@ namespace Iceshrimp.Backend.Controllers.Mastodon;
|
||||||
[EnableCors("mastodon")]
|
[EnableCors("mastodon")]
|
||||||
[EnableRateLimiting("sliding")]
|
[EnableRateLimiting("sliding")]
|
||||||
[Produces(MediaTypeNames.Application.Json)]
|
[Produces(MediaTypeNames.Application.Json)]
|
||||||
public class InstanceController(DatabaseContext db) : ControllerBase
|
public class InstanceController(DatabaseContext db, MetaService meta) : ControllerBase
|
||||||
{
|
{
|
||||||
[HttpGet("/api/v1/instance")]
|
[HttpGet("/api/v1/instance")]
|
||||||
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(InstanceInfoV1Response))]
|
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(InstanceInfoV1Response))]
|
||||||
|
@ -26,9 +27,11 @@ public class InstanceController(DatabaseContext db) : ControllerBase
|
||||||
await db.Users.LongCountAsync(p => p.Host == null && !Constants.SystemUsers.Contains(p.UsernameLower));
|
await db.Users.LongCountAsync(p => p.Host == null && !Constants.SystemUsers.Contains(p.UsernameLower));
|
||||||
var noteCount = await db.Notes.LongCountAsync(p => p.UserHost == null);
|
var noteCount = await db.Notes.LongCountAsync(p => p.UserHost == null);
|
||||||
var instanceCount = await db.Instances.LongCountAsync();
|
var instanceCount = await db.Instances.LongCountAsync();
|
||||||
//TODO: admin contact
|
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)
|
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 &&
|
var activeMonth = await db.Users.LongCountAsync(p => p.Host == null &&
|
||||||
!Constants.SystemUsers.Contains(p.UsernameLower) &&
|
!Constants.SystemUsers.Contains(p.UsernameLower) &&
|
||||||
p.LastActiveDate > cutoff);
|
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 } }
|
Usage = new InstanceUsage { Users = new InstanceUsersUsage { ActiveMonth = activeMonth } }
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,18 +1,31 @@
|
||||||
using Iceshrimp.Backend.Core.Configuration;
|
using Iceshrimp.Backend.Core.Configuration;
|
||||||
|
using Iceshrimp.Backend.Core.Extensions;
|
||||||
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
|
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
|
||||||
|
|
||||||
namespace Iceshrimp.Backend.Controllers.Mastodon.Schemas;
|
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("stats")] public required InstanceStats Stats;
|
||||||
[J("version")] public string Version => $"4.2.1 (compatible; Iceshrimp.NET/{config.Instance.Version})";
|
[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("max_toot_chars")] public int MaxNoteChars => config.Instance.CharacterLimit;
|
||||||
[J("uri")] public string AccountDomain => config.Instance.AccountDomain;
|
[J("uri")] public string AccountDomain => config.Instance.AccountDomain;
|
||||||
[J("title")] public string InstanceName => config.Instance.AccountDomain;
|
[J("title")] public string InstanceName => instanceName ?? config.Instance.AccountDomain;
|
||||||
[J("short_description")] public string ShortDescription => $"{config.Instance.AccountDomain} on Iceshrimp.NET";
|
[J("email")] public string Email => adminContact ?? "unset@example.org";
|
||||||
[J("description")] public string Description => $"{config.Instance.AccountDomain} on Iceshrimp.NET";
|
|
||||||
|
[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("registrations")] public bool RegsOpen => config.Security.Registrations == Enums.Registrations.Open;
|
||||||
[J("invites_enabled")] public bool RegsInvite => config.Security.Registrations == Enums.Registrations.Invite;
|
[J("invites_enabled")] public bool RegsInvite => config.Security.Registrations == Enums.Registrations.Invite;
|
||||||
|
|
|
@ -1,16 +1,26 @@
|
||||||
using Iceshrimp.Backend.Core.Configuration;
|
using Iceshrimp.Backend.Core.Configuration;
|
||||||
|
using Iceshrimp.Backend.Core.Extensions;
|
||||||
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
|
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
|
||||||
|
|
||||||
namespace Iceshrimp.Backend.Controllers.Mastodon.Schemas;
|
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("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("source_url")] public string SourceUrl => "https://iceshrimp.dev/iceshrimp/iceshrimp.net";
|
||||||
[J("domain")] public string AccountDomain => config.Instance.AccountDomain;
|
[J("domain")] public string AccountDomain => config.Instance.AccountDomain;
|
||||||
[J("title")] public string InstanceName => config.Instance.AccountDomain;
|
[J("title")] public string InstanceName => instanceName ?? config.Instance.AccountDomain;
|
||||||
[J("description")] public string Description => $"{config.Instance.AccountDomain} on Iceshrimp.NET";
|
|
||||||
|
|
||||||
|
[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("registrations")] public InstanceRegistrations Registrations => new(config.Security);
|
||||||
[J("configuration")] public InstanceConfigurationV2 Configuration => new(config.Instance);
|
[J("configuration")] public InstanceConfigurationV2 Configuration => new(config.Instance);
|
||||||
|
|
||||||
|
@ -46,3 +56,8 @@ public class InstanceUsersUsage
|
||||||
{
|
{
|
||||||
[J("active_month")] public required long ActiveMonth { get; set; }
|
[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