diff --git a/assets/openapi.json b/assets/openapi.json
index a06d0d78..ee3b8746 100644
--- a/assets/openapi.json
+++ b/assets/openapi.json
@@ -4647,7 +4647,7 @@
"name": {
"type": "string"
},
- "avatar": {
+ "icon": {
"type": "string",
"nullable": true
}
@@ -5696,6 +5696,9 @@
4
],
"type": "number"
+ },
+ "confirm_stranger_request": {
+ "type": "boolean"
}
}
},
diff --git a/assets/schemas.json b/assets/schemas.json
index f10afc4a..289dec60 100644
--- a/assets/schemas.json
+++ b/assets/schemas.json
@@ -4931,7 +4931,7 @@
"name": {
"type": "string"
},
- "avatar": {
+ "icon": {
"type": [
"null",
"string"
@@ -6051,6 +6051,9 @@
4
],
"type": "number"
+ },
+ "confirm_stranger_request": {
+ "type": "boolean"
}
},
"additionalProperties": false,
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 a817335d..2959c71b 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 b0f8f209..072fba4b 100644
--- a/extra/admin-api/Spacebar.AdminApi/Program.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Program.cs
@@ -36,6 +36,7 @@ builder.Services.AddScoped<SpacebarAspNetAuthenticationService>();
// builder.Services.AddSingleton<RabbitMQConfiguration>();
// builder.Services.AddSingleton<RabbitMQService>();
// builder.Services.AddSingleton<ISpacebarReplication, RabbitMqSpacebarReplication>();
+builder.Services.AddSingleton<UnixSocketConfiguration>();
builder.Services.AddSingleton<ISpacebarReplication, UnixSocketSpacebarReplication>();
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 00000000..6206a6c4
--- /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<GuildMembersController> 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 00000000..d5303569
--- /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 00000000..47a516a0
--- /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 {
+ /// <summary>
+ /// Data URI encoded image
+ /// </summary>
+ [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 4695b7ab..d6bb0d96 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<SpacebarDbContext>(options => {
builder.Services.AddSingleton<SpacebarAuthenticationConfiguration>();
builder.Services.AddScoped<SpacebarAuthenticationService>();
builder.Services.AddScoped<SpacebarAspNetAuthenticationService>();
+builder.Services.AddScoped<TemplateImportService>();
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 00000000..ae7b86a2
--- /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<string> 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 3ce9862f..31035b78 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;
}
|