From f36daf860a2080a8f9a42f19d7191dc0e6e74a7d Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 17 Mar 2024 14:00:50 +0100 Subject: [PATCH] [backend/masto-client] Return instance name, instance description & admin contact --- .../Mastodon/InstanceController.cs | 20 ++++++++----- .../Schemas/InstanceInfoV1Response.cs | 25 ++++++++++++---- .../Schemas/InstanceInfoV2Response.cs | 29 ++++++++++++++----- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/Iceshrimp.Backend/Controllers/Mastodon/InstanceController.cs b/Iceshrimp.Backend/Controllers/Mastodon/InstanceController.cs index bb916247..241ef304 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/InstanceController.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/InstanceController.cs @@ -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 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) + var res = new InstanceInfoV2Response(config.Value, instanceName, instanceDescription, adminContact) { Usage = new InstanceUsage { Users = new InstanceUsersUsage { ActiveMonth = activeMonth } } }; diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV1Response.cs b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV1Response.cs index 0f9ae176..612e5bea 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV1Response.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV1Response.cs @@ -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; diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV2Response.cs b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV2Response.cs index 1ae3bf16..95d0f337 100644 --- a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV2Response.cs +++ b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/InstanceInfoV2Response.cs @@ -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 } @@ -45,4 +55,9 @@ public class InstanceUsage 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"; } \ No newline at end of file