diff --git a/assets/openapi.json b/assets/openapi.json index a06d0d782..ee3b87461 100644 Binary files a/assets/openapi.json and b/assets/openapi.json differ diff --git a/assets/schemas.json b/assets/schemas.json index f10afc4a4..289dec600 100644 Binary files a/assets/schemas.json and b/assets/schemas.json differ diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs index a817335dd..2959c71b9 100644 --- a/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs +++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs @@ -34,7 +34,7 @@ public class UnixSocketSpacebarReplication(UnixSocketConfiguration conf) : ISpac public class UnixSocketConfiguration { public UnixSocketConfiguration(IConfiguration config) { - config.GetRequiredSection("UnixSocketReplication").Bind(this); + config.GetRequiredSection("Spacebar").GetRequiredSection("UnixSocketReplication").Bind(this); } public string SocketDir { get; set; } = null!; diff --git a/extra/admin-api/Spacebar.AdminApi/Program.cs b/extra/admin-api/Spacebar.AdminApi/Program.cs index b0f8f2090..072fba4b8 100644 --- a/extra/admin-api/Spacebar.AdminApi/Program.cs +++ b/extra/admin-api/Spacebar.AdminApi/Program.cs @@ -36,6 +36,7 @@ builder.Services.AddScoped(); // builder.Services.AddSingleton(); // builder.Services.AddSingleton(); // builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddRequestTimeouts(x => { diff --git a/extra/admin-api/Spacebar.UApi/Controllers/GuildTemplatesController.cs b/extra/admin-api/Spacebar.UApi/Controllers/GuildTemplatesController.cs new file mode 100644 index 000000000..6206a6c40 --- /dev/null +++ b/extra/admin-api/Spacebar.UApi/Controllers/GuildTemplatesController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; +using Spacebar.Interop.Authentication.AspNetCore; +using Spacebar.Models.Db.Contexts; +using Spacebar.UApi.Models; +using Spacebar.UApi.Services; + +namespace Spacebar.UApi.Controllers; + +[ApiController] +public class GuildTemplatesController(ILogger logger, SpacebarDbContext db, SpacebarAspNetAuthenticationService authService, TemplateImportService importService) : ControllerBase { + [HttpPost("/api/v10/guilds/templates/{templateId}")] + public async Task UseTemplate(string templateId, UseGuildTemplateRequest request) { + var user = await authService.GetCurrentUserAsync(Request); + await importService.CreateGuildFromTemplateById(templateId, request, user); + } +} \ No newline at end of file diff --git a/extra/admin-api/Spacebar.UApi/Models/GuildTemplate.cs b/extra/admin-api/Spacebar.UApi/Models/GuildTemplate.cs new file mode 100644 index 000000000..d53035692 --- /dev/null +++ b/extra/admin-api/Spacebar.UApi/Models/GuildTemplate.cs @@ -0,0 +1,73 @@ +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; + +namespace Spacebar.UApi.Models; + +// TODO: real schemas +public class GuildTemplate { + [JsonPropertyName("code")] + public string Code { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("description")] + public string Description { get; set; } + + [JsonPropertyName("usage_count")] + public int UsageCount { get; set; } + + [JsonPropertyName("creator_id")] + public string CreatorId { get; set; } + + [JsonPropertyName("creator")] + public JsonObject Creator { get; set; } + + [JsonPropertyName("created_at")] + public DateTimeOffset CreatedAt { get; set; } + + [JsonPropertyName("updated_at")] + public DateTimeOffset UpdatedAt { get; set; } + + [JsonPropertyName("source_guild_id")] + public string SourceGuildId { get; set; } + + [JsonPropertyName("serialized_source_guild")] + public SerializedSourceGuild SerializedSourceGuild { get; set; } +} + +public class SerializedSourceGuild { } + +public class GuildTemplateRole { + [JsonPropertyName("id")] + public int Id { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("permissions")] + public string Permissions { get; set; } + + // "color" ignored for now - is deprecated anyhow + [JsonPropertyName("colors")] + public RoleColors Colors { get; set; } + + [JsonPropertyName("hoist")] + public bool Hoist { get; set; } + + [JsonPropertyName("mentionable")] + public bool Mentionable { get; set; } + + // [JsonPropertyName("icon")] +} + +public class RoleColors { + [JsonPropertyName("primary_color")] + public int PrimaryColor { get; set; } + + [JsonPropertyName("secondary_color")] + public int? SecondaryColor { get; set; } + + [JsonPropertyName("tertiary_color")] + public int TertiaryColor { get; set; } +} \ No newline at end of file diff --git a/extra/admin-api/Spacebar.UApi/Models/UseGuildTemplateRequest.cs b/extra/admin-api/Spacebar.UApi/Models/UseGuildTemplateRequest.cs new file mode 100644 index 000000000..47a516a04 --- /dev/null +++ b/extra/admin-api/Spacebar.UApi/Models/UseGuildTemplateRequest.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Serialization; + +namespace Spacebar.UApi.Models; + +public class UseGuildTemplateRequest { + /// + /// Data URI encoded image + /// + [JsonPropertyName("icon")] + public string? Icon { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } +} \ No newline at end of file diff --git a/extra/admin-api/Spacebar.UApi/Program.cs b/extra/admin-api/Spacebar.UApi/Program.cs index 4695b7abc..d6bb0d96e 100644 --- a/extra/admin-api/Spacebar.UApi/Program.cs +++ b/extra/admin-api/Spacebar.UApi/Program.cs @@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore; using Spacebar.Interop.Authentication; using Spacebar.Interop.Authentication.AspNetCore; using Spacebar.Models.Db.Contexts; +using Spacebar.UApi.Services; var builder = WebApplication.CreateBuilder(args); if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("APPSETTINGS_PATH"))) @@ -32,6 +33,7 @@ builder.Services.AddDbContextPool(options => { builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); diff --git a/extra/admin-api/Spacebar.UApi/Services/TemplateImportService.cs b/extra/admin-api/Spacebar.UApi/Services/TemplateImportService.cs new file mode 100644 index 000000000..ae7b86a2c --- /dev/null +++ b/extra/admin-api/Spacebar.UApi/Services/TemplateImportService.cs @@ -0,0 +1,13 @@ +using Spacebar.Models.Db.Contexts; +using Spacebar.Models.Db.Models; +using Spacebar.UApi.Models; + +namespace Spacebar.UApi.Services; + +public class TemplateImportService(SpacebarDbContext db) { + public async Task CreateGuildFromTemplateById(string templateId, UseGuildTemplateRequest request, User user) { + return ""; + } + + public async Task<> +} \ No newline at end of file diff --git a/src/schemas/uncategorised/GuildTemplateCreateSchema.ts b/src/schemas/uncategorised/GuildTemplateCreateSchema.ts index 3ce9862f0..31035b784 100644 --- a/src/schemas/uncategorised/GuildTemplateCreateSchema.ts +++ b/src/schemas/uncategorised/GuildTemplateCreateSchema.ts @@ -18,5 +18,5 @@ export interface GuildTemplateCreateSchema { name: string; - avatar?: string | null; + icon?: string | null; }