[backend/masto-client] Return instance name, instance description & admin contact

This commit is contained in:
Laura Hausmann 2024-03-17 14:00:50 +01:00
parent d0c2d1bedc
commit f36daf860a
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
3 changed files with 54 additions and 20 deletions

View file

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

View file

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

View file

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