@page "/admin/metadata" @using System.Text.RegularExpressions @using Iceshrimp.Backend.Components.Admin @using Iceshrimp.Backend.Core.Extensions @using Iceshrimp.Backend.Core.Services @using Microsoft.AspNetCore.Components.Forms @inherits AdminComponentBase

Here you can adjust basic instance metadata. It gets displayed to all users, including guests.

@code { [Inject] public required DriveService Drive { get; set; } [Inject] public required MetaService Meta { get; set; } [Inject] public required SystemUserService SystemUser { get; set; } [SupplyParameterFromForm] private MetadataModel Model { get; set; } = null!; private class MetadataModel { public string? Name { get; set; } public string? Description { get; set; } public string? AdminContact { get; set; } public string? ThemeColor { get; set; } public IFormFile? IconFile { get; set; } public IFormFile? BannerFile { get; set; } public void Canonicalize() { var colorRegex = new Regex(@"^#(?:[0-9a-f]{3}){1,2}$", RegexOptions.IgnoreCase); Name = Name?.Trim(); Description = Description?.Trim(); AdminContact = AdminContact?.Trim(); ThemeColor = ThemeColor?.Trim(); if (Name?.Length == 0 || Name == "Iceshrimp.NET") Name = null; if (Description?.Length == 0) Description = null; if (AdminContact?.Length == 0) AdminContact = null; if (!colorRegex.IsMatch(ThemeColor ?? "")) ThemeColor = null; if (!IconFile?.ContentType.StartsWith("image/") ?? false) IconFile = null; if (!BannerFile?.ContentType.StartsWith("image/") ?? false) BannerFile = null; } } protected override void OnParametersSet() { // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract Model ??= new MetadataModel(); } protected override async Task OnGet() { (Model.Name, Model.Description, Model.AdminContact, Model.ThemeColor) = await Meta.GetManyAsync(MetaEntity.InstanceName, MetaEntity.InstanceDescription, MetaEntity.AdminContactEmail, MetaEntity.ThemeColor); } async Task OnSubmit() { Model.Canonicalize(); await Meta.SetAsync(MetaEntity.InstanceName, Model.Name); await Meta.SetAsync(MetaEntity.InstanceDescription, Model.Description); await Meta.SetAsync(MetaEntity.AdminContactEmail, Model.AdminContact); await Meta.SetAsync(MetaEntity.ThemeColor, Model.ThemeColor); var ia = await SystemUser.GetInstanceActorAsync(); if (Model.IconFile != null) { var req = new DriveFileCreationRequest { Filename = Model.IconFile.Name, IsSensitive = false, MimeType = Model.IconFile.ContentType }; var file = await Drive.StoreFileAsync(Model.IconFile.OpenReadStream(), ia, req); await Meta.SetAsync(MetaEntity.IconFileId, file.Id); } if (Model.BannerFile != null) { var req = new DriveFileCreationRequest { Filename = Model.BannerFile.Name, IsSensitive = false, MimeType = Model.BannerFile.ContentType }; var file = await Drive.StoreFileAsync(Model.BannerFile.OpenReadStream(), ia, req); await Meta.SetAsync(MetaEntity.BannerFileId, file.Id); } ReloadPage(); } }