diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ISpacebarReplication.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ISpacebarReplication.cs
new file mode 100644
index 0000000..95ee07f
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ISpacebarReplication.cs
@@ -0,0 +1,6 @@
+namespace Spacebar.Interop.Replication.Abstractions;
+
+public interface ISpacebarReplication {
+ public Task InitializeAsync();
+ public Task SendAsync(ReplicationMessage message);
+}
\ No newline at end of file
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs
new file mode 100644
index 0000000..99b8a12
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs
@@ -0,0 +1,26 @@
+using System.Text.Json.Serialization;
+
+namespace Spacebar.Interop.Replication.Abstractions;
+
+public class ReplicationMessage {
+ [JsonPropertyName("channel_id")]
+ public string? ChannelId { get; set; }
+
+ [JsonPropertyName("guild_id")]
+ public string? GuildId { get; set; }
+
+ [JsonPropertyName("user_id")]
+ public string? UserId { get; set; }
+
+ [JsonPropertyName("created_at")]
+ public DateTime? CreatedAt { get; set; }
+
+ [JsonPropertyName("event")]
+ public string Event { get; set; } = null!;
+
+ [JsonPropertyName("origin")]
+ public string? Origin { get; set; }
+
+ [JsonPropertyName("data")]
+ public object Payload { get; set; } = null!;
+}
\ No newline at end of file
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/Spacebar.Interop.Replication.Abstractions.csproj b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/Spacebar.Interop.Replication.Abstractions.csproj
new file mode 100644
index 0000000..237d661
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/Spacebar.Interop.Replication.Abstractions.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/deps.json b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/deps.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/deps.json
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMQConfiguration.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMQConfiguration.cs
new file mode 100644
index 0000000..78a9add
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMQConfiguration.cs
@@ -0,0 +1,17 @@
+using Microsoft.Extensions.Configuration;
+
+namespace Spacebar.RabbitMqUtilities;
+
+public class RabbitMQConfiguration {
+ public RabbitMQConfiguration(IConfiguration configuration) {
+ configuration.GetRequiredSection("RabbitMQ").Bind(this);
+ }
+ public required string Host { get; set; }
+ public required string Username { get; set; }
+ public required string Password { get; set; }
+ public required string Port { get; set; }
+
+ public string ToConnectionString() {
+ return $"amqp://{Username}:{Password}@{Host}:{Port}";
+ }
+}
\ No newline at end of file
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMQService.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMQService.cs
new file mode 100644
index 0000000..0eab6f9
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMQService.cs
@@ -0,0 +1,21 @@
+using RabbitMQ.Client;
+
+namespace Spacebar.RabbitMqUtilities;
+
+public interface IRabbitMQService {
+ Task CreateChannel();
+}
+
+public class RabbitMQService(RabbitMQConfiguration config) : IRabbitMQService {
+ public async Task CreateChannel() {
+ var connection = new ConnectionFactory {
+ UserName = config.Username,
+ Password = config.Password,
+ HostName = config.Host,
+ // DispatchConsumersAsync = true
+ };
+
+ var channel = await connection.CreateConnectionAsync();
+ return channel;
+ }
+}
\ No newline at end of file
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMqSpacebarReplication.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMqSpacebarReplication.cs
new file mode 100644
index 0000000..f979d92
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/RabbitMqSpacebarReplication.cs
@@ -0,0 +1,43 @@
+using ArcaneLibs.Extensions;
+using RabbitMQ.Client;
+using Spacebar.Interop.Replication.Abstractions;
+
+namespace Spacebar.Interop.Replication.RabbitMq;
+
+public class RabbitMqSpacebarReplication : ISpacebarReplication {
+ private IConnection _mqConnection = null!;
+ private IChannel _mqChannel = null!;
+ private bool _isInitialised;
+
+ public async Task InitializeAsync() {
+ lock (this) {
+ if (_isInitialised) return;
+ _isInitialised = true;
+ }
+
+ var factory = new ConnectionFactory {
+ Uri = new Uri("amqp://guest:guest@127.0.0.1/")
+ };
+ _mqConnection = await factory.CreateConnectionAsync();
+ _mqChannel = await _mqConnection.CreateChannelAsync();
+ }
+
+ public async Task SendAsync(ReplicationMessage message) {
+ var exchangeId = message.GuildId ?? message.ChannelId ?? message.UserId ?? "global";
+ await _mqChannel.ExchangeDeclareAsync(exchange: exchangeId, type: ExchangeType.Fanout, durable: false);
+ var props = new BasicProperties() { Type = message.Event };
+ var publishSuccess = false;
+ var body = message.Payload.ToJson().AsBytes().ToArray(); // TODO: byte array payloads etc someday?
+
+ do {
+ try {
+ await _mqChannel.BasicPublishAsync(exchange: exchangeId, routingKey: "", mandatory: true, basicProperties: props, body: body);
+ publishSuccess = true;
+ }
+ catch (Exception e) {
+ Console.WriteLine($"[RabbitMQ] Error publishing {message.Event}: {e.Message}");
+ await Task.Delay(10);
+ }
+ } while (!publishSuccess);
+ }
+}
\ No newline at end of file
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/Spacebar.Interop.Replication.RabbitMq.csproj b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/Spacebar.Interop.Replication.RabbitMq.csproj
new file mode 100644
index 0000000..ea3a407
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/Spacebar.Interop.Replication.RabbitMq.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/deps.json b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/deps.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.RabbitMq/deps.json
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/Spacebar.Interop.Replication.UnixSocket.csproj b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/Spacebar.Interop.Replication.UnixSocket.csproj
new file mode 100644
index 0000000..81f042e
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/Spacebar.Interop.Replication.UnixSocket.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs
new file mode 100644
index 0000000..a817335
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/UnixSocketSpacebarReplication.cs
@@ -0,0 +1,41 @@
+using System.Net.Sockets;
+using System.Text.Json;
+using Microsoft.Extensions.Configuration;
+using Spacebar.Interop.Replication.Abstractions;
+
+namespace Spacebar.Interop.Replication.UnixSocket;
+
+public class UnixSocketSpacebarReplication(UnixSocketConfiguration conf) : ISpacebarReplication {
+ private readonly Dictionary _sockets = new();
+
+ public async Task InitializeAsync() {
+ var fsw = new FileSystemWatcher(conf.SocketDir);
+ fsw.EnableRaisingEvents = true;
+ fsw.Created += (s, e) => {
+ Console.WriteLine($"Socket created: {e.FullPath}");
+ var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
+ var ep = new UnixDomainSocketEndPoint(e.FullPath);
+ socket.Connect(ep);
+ _sockets[e.Name] = socket;
+ };
+ }
+
+ public async Task SendAsync(ReplicationMessage message) {
+ // message format: [uint32be length][payload]
+ var payload = JsonSerializer.SerializeToUtf8Bytes(message);
+ byte[] formattedPayload = [..BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(payload.Length)), ..payload];
+
+ Parallel.ForEach(_sockets, skv => {
+ lock (skv.Value)
+ skv.Value.SendAsync(formattedPayload);
+ });
+ }
+}
+
+public class UnixSocketConfiguration {
+ public UnixSocketConfiguration(IConfiguration config) {
+ config.GetRequiredSection("UnixSocketReplication").Bind(this);
+ }
+
+ public string SocketDir { get; set; } = null!;
+}
\ No newline at end of file
diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/deps.json b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/deps.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.UnixSocket/deps.json
diff --git a/extra/admin-api/Models/Spacebar.Models.Db/Spacebar.Models.Db.csproj b/extra/admin-api/Models/Spacebar.Models.Db/Spacebar.Models.Db.csproj
index 2d1dcaf..0ef7499 100644
--- a/extra/admin-api/Models/Spacebar.Models.Db/Spacebar.Models.Db.csproj
+++ b/extra/admin-api/Models/Spacebar.Models.Db/Spacebar.Models.Db.csproj
@@ -7,8 +7,11 @@
-
-
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/extra/admin-api/Spacebar.AdminApi/Controllers/ConfigController.cs b/extra/admin-api/Spacebar.AdminApi/Controllers/ConfigController.cs
index 9976e0f..fc0a189 100644
--- a/extra/admin-api/Spacebar.AdminApi/Controllers/ConfigController.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Controllers/ConfigController.cs
@@ -1,19 +1,20 @@
using System.Text.Json.Nodes;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
+using Spacebar.Interop.Replication.Abstractions;
using Spacebar.AdminApi.Extensions;
using Spacebar.Models.AdminApi;
using Spacebar.AdminApi.Services;
using Spacebar.Models.Db.Contexts;
using Spacebar.Models.Db.Models;
-using Spacebar.RabbitMqUtilities;
using Spacebar.ConfigModel.Extensions;
namespace Spacebar.AdminApi.Controllers;
[ApiController]
[Route("/Configuration")]
-public class ConfigController(ILogger logger, SpacebarDbContext db, RabbitMQService mq, IServiceProvider sp, AuthenticationService auth) : ControllerBase {
+public class ConfigController(ILogger logger, SpacebarDbContext db, IServiceProvider sp, AuthenticationService auth, ISpacebarReplication replication)
+ : ControllerBase {
private readonly ILogger _logger = logger;
[HttpGet]
@@ -45,16 +46,24 @@
await scopedDb.SaveChangesAsync();
});
await Task.WhenAll(tasks);
- // TODO: rabbitmq
+ await replication.SendAsync(new() {
+ Event = "SB_RELOAD_CONFIG",
+ GuildId = "0",
+ Origin = "Admin API (POST /Configuration)",
+ });
return Ok();
}
-
+
[HttpPost]
public async Task ReloadConfig() {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
- // TODO: rabbitmq
+ await replication.SendAsync(new() {
+ Event = "SB_RELOAD_CONFIG",
+ GuildId = "0",
+ Origin = "Admin API (POST /Configuration/ReloadConfig)",
+ });
return Ok();
}
diff --git a/extra/admin-api/Spacebar.AdminApi/Controllers/GuildController.cs b/extra/admin-api/Spacebar.AdminApi/Controllers/GuildController.cs
index a7a623f..dc2f582 100644
--- a/extra/admin-api/Spacebar.AdminApi/Controllers/GuildController.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Controllers/GuildController.cs
@@ -1,25 +1,30 @@
-using ArcaneLibs.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
-using RabbitMQ.Client;
+using Spacebar.Interop.Replication.Abstractions;
using Spacebar.AdminApi.Extensions;
using Spacebar.Models.AdminApi;
using Spacebar.AdminApi.Services;
using Spacebar.Models.Db.Contexts;
using Spacebar.Models.Db.Models;
-using Spacebar.RabbitMqUtilities;
namespace Spacebar.AdminApi.Controllers;
[ApiController]
[Route("/Guilds")]
-public class GuildController(ILogger logger, Configuration config, RabbitMQConfiguration amqpConfig, SpacebarDbContext db, RabbitMQService mq, IServiceProvider sp, AuthenticationService auth) : ControllerBase {
+public class GuildController(
+ ILogger logger,
+ Configuration config,
+ SpacebarDbContext db,
+ IServiceProvider sp,
+ AuthenticationService auth,
+ ISpacebarReplication replication
+) : ControllerBase {
private readonly ILogger _logger = logger;
[HttpGet]
public async IAsyncEnumerable Get() {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
-
+
var results = db.Guilds.Select(x => new GuildModel {
Id = x.Id,
AfkChannelId = x.AfkChannelId,
@@ -74,22 +79,22 @@
yield return result;
}
}
-
+
[HttpPost("{id}/force_join")]
public async Task ForceJoinGuild([FromBody] ForceJoinRequest request, string id) {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
-
+
var guild = await db.Guilds.FindAsync(id);
if (guild == null) {
return NotFound(new { entity = "Guild", id, message = "Guild not found" });
}
-
+
var userId = request.UserId ?? config.OverrideUid ?? (await auth.GetCurrentUser(Request)).Id;
var user = await db.Users.FindAsync(userId);
if (user == null) {
return NotFound(new { entity = "User", id = userId, message = "User not found" });
}
-
+
var member = await db.Members.SingleOrDefaultAsync(m => m.GuildId == id && m.Id == userId);
if (member is null) {
member = new Member {
@@ -105,13 +110,14 @@
db.Guilds.Update(guild);
await db.SaveChangesAsync();
}
-
+
if (request.MakeOwner) {
guild.OwnerId = userId;
db.Guilds.Update(guild);
await db.SaveChangesAsync();
- } else if (request.MakeAdmin) {
- var roles = await db.Roles.Where(r => r.GuildId == id).OrderBy(x=>x.Position).ToListAsync();
+ }
+ else if (request.MakeAdmin) {
+ var roles = await db.Roles.Where(r => r.GuildId == id).OrderBy(x => x.Position).ToListAsync();
var adminRole = roles.FirstOrDefault(r => r.Permissions == "8" || r.Permissions == "9"); // Administrator
if (adminRole == null) {
adminRole = new Role {
@@ -120,7 +126,7 @@
Name = "Instance administrator",
Color = 0,
Hoist = false,
- Position = roles.Max(x=>x.Position) + 1,
+ Position = roles.Max(x => x.Position) + 1,
Permissions = "8", // Administrator
Managed = false,
Mentionable = false
@@ -135,16 +141,16 @@
await db.SaveChangesAsync();
}
}
-
+
// TODO: gateway events
-
+
return Ok(new { entity = "Guild", id, message = "Guild join forced" });
}
[HttpGet("{id}/delete")]
public async IAsyncEnumerable DeleteUser(string id, [FromQuery] int messageDeleteChunkSize = 100) {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
-
+
var user = await db.Users.FindAsync(id);
if (user == null) {
Console.WriteLine($"User {id} not found");
@@ -159,12 +165,6 @@
db.Users.Update(user);
await db.SaveChangesAsync();
- var factory = new ConnectionFactory {
- Uri = new Uri("amqp://guest:guest@127.0.0.1/")
- };
- await using var mqConnection = await factory.CreateConnectionAsync();
- await using var mqChannel = await mqConnection.CreateChannelAsync();
-
var messages = db.Messages
.AsNoTracking()
.Where(m => m.AuthorId == id);
@@ -178,7 +178,7 @@
messages_per_channel = channels.ToDictionary(c => c.ChannelId, c => messages.Count(m => m.ChannelId == c.ChannelId))
});
var results = channels
- .Select(ctx => DeleteMessagesForChannel(ctx.GuildId, ctx.ChannelId!, id, mqChannel, messageDeleteChunkSize))
+ .Select(ctx => DeleteMessagesForChannel(ctx.GuildId, ctx.ChannelId!, id, messageDeleteChunkSize))
.ToList();
var a = AggregateAsyncEnumerablesWithoutOrder(results);
await foreach (var result in a) {
@@ -192,15 +192,12 @@
private async IAsyncEnumerable DeleteMessagesForChannel(
// context
string? guildId, string channelId, string authorId,
- // connections
- IChannel mqChannel,
// options
int messageDeleteChunkSize = 100
) {
{
await using var ctx = sp.CreateAsyncScope();
await using var _db = ctx.ServiceProvider.GetRequiredService();
- await mqChannel.ExchangeDeclareAsync(exchange: channelId!, type: ExchangeType.Fanout, durable: false);
var messagesInChannel = _db.Messages.AsNoTracking().Count(m => m.AuthorId == authorId && m.ChannelId == channelId && m.GuildId == guildId);
var remaining = messagesInChannel;
while (true) {
@@ -218,22 +215,16 @@
break;
}
- var props = new BasicProperties() { Type = "MESSAGE_BULK_DELETE" };
- var publishSuccess = false;
- do {
- try {
- await mqChannel.BasicPublishAsync(exchange: channelId!, routingKey: "", mandatory: true, basicProperties: props, body: new {
- ids = messageIds,
- channel_id = channelId,
- guild_id = guildId,
- }.ToJson().AsBytes().ToArray());
- publishSuccess = true;
- }
- catch (Exception e) {
- Console.WriteLine($"[RabbitMQ] Error publishing bulk delete: {e.Message}");
- await Task.Delay(10);
- }
- } while (!publishSuccess);
+ await replication.SendAsync(new() {
+ ChannelId = channelId,
+ Event = "MESSAGE_BULK_DELETE",
+ Payload = new {
+ ids = messageIds,
+ channel_id = channelId,
+ guild_id = guildId,
+ },
+ Origin = "Admin API (GuildController.DeleteUser)",
+ });
yield return new("BULK_DELETED", new {
channel_id = channelId,
@@ -297,27 +288,4 @@
}
}
}
-
- // {
- // "op": 0,
- // "t": "GUILD_ROLE_UPDATE",
- // "d": {
- // "guild_id": "1006649183970562092",
- // "role": {
- // "id": "1006706520514028812",
- // "guild_id": "1006649183970562092",
- // "color": 16711680,
- // "hoist": true,
- // "managed": false,
- // "mentionable": true,
- // "name": "Adminstrator",
- // "permissions": "9",
- // "position": 5,
- // "unicode_emoji": "💖",
- // "flags": 0
- // }
- // },
- // "s": 38
- // }
-
}
\ No newline at end of file
diff --git a/extra/admin-api/Spacebar.AdminApi/Controllers/Media/StickerController.cs b/extra/admin-api/Spacebar.AdminApi/Controllers/Media/StickerController.cs
index 1e2ec3c..efb8cb8 100644
--- a/extra/admin-api/Spacebar.AdminApi/Controllers/Media/StickerController.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Controllers/Media/StickerController.cs
@@ -4,23 +4,21 @@
using Spacebar.Models.AdminApi;
using Spacebar.AdminApi.Services;
using Spacebar.Models.Db.Contexts;
-using Spacebar.Models.Db.Models;
-using Spacebar.RabbitMqUtilities;
namespace Spacebar.AdminApi.Controllers.Media;
[ApiController]
[Route("/media/sticker")]
-public class StickerController(ILogger logger, SpacebarDbContext db, RabbitMQService mq, AuthenticationService auth, IServiceProvider sp) : ControllerBase {
+public class StickerController(ILogger logger, SpacebarDbContext db, AuthenticationService auth) : ControllerBase {
[HttpGet("")]
public async IAsyncEnumerable GetStickers() {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
-
- // var db2 = sp.CreateScope().ServiceProvider.GetService();
+
var stickers = db.Stickers
.AsNoTracking()
.IgnoreAutoIncludes()
.AsAsyncEnumerable();
+
await foreach (var sticker in stickers) {
yield return new() {
Id = sticker.Id,
diff --git a/extra/admin-api/Spacebar.AdminApi/Controllers/Media/UserMediaController.cs b/extra/admin-api/Spacebar.AdminApi/Controllers/Media/UserMediaController.cs
index 052776d..46a73e5 100644
--- a/extra/admin-api/Spacebar.AdminApi/Controllers/Media/UserMediaController.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Controllers/Media/UserMediaController.cs
@@ -5,17 +5,16 @@
using Spacebar.AdminApi.Services;
using Spacebar.Models.Db.Contexts;
using Spacebar.Models.Db.Models;
-using Spacebar.RabbitMqUtilities;
namespace Spacebar.AdminApi.Controllers.Media;
[ApiController]
[Route("/media/user")]
-public class UserMediaController(ILogger logger, SpacebarDbContext db, RabbitMQService mq, AuthenticationService auth, IServiceProvider sp) : ControllerBase {
+public class UserMediaController(ILogger logger, SpacebarDbContext db, AuthenticationService auth, IServiceProvider sp) : ControllerBase {
[HttpGet("{userId}/attachments")]
public async IAsyncEnumerable GetAttachmentsByUser(string userId) {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
-
+
var db2 = sp.CreateScope().ServiceProvider.GetService();
var attachments = db.Attachments
// .IgnoreAutoIncludes()
diff --git a/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs b/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs
index 331b3cd..7d3a974 100644
--- a/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Controllers/UserController.cs
@@ -3,13 +3,12 @@
using ArcaneLibs.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
-using RabbitMQ.Client;
+using Spacebar.Interop.Replication.Abstractions;
using Spacebar.AdminApi.Extensions;
using Spacebar.Models.AdminApi;
using Spacebar.AdminApi.Services;
using Spacebar.Models.Db.Contexts;
using Spacebar.Models.Db.Models;
-using Spacebar.RabbitMqUtilities;
namespace Spacebar.AdminApi.Controllers;
@@ -18,13 +17,11 @@
public class UserController(
ILogger logger,
Configuration config,
- RabbitMQConfiguration amqpConfig,
SpacebarDbContext db,
- RabbitMQService mq,
IServiceProvider sp,
- AuthenticationService auth) : ControllerBase {
- private readonly ILogger _logger = logger;
-
+ AuthenticationService auth,
+ ISpacebarReplication replication
+) : ControllerBase {
[HttpGet]
public async IAsyncEnumerable Get() {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
@@ -80,87 +77,6 @@
}
}
- [HttpGet("meow")]
- public async Task Meow() {
- (await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
- Console.WriteLine("meow");
-
- ConnectionFactory factory = new ConnectionFactory();
- factory.Uri = new Uri("amqp://guest:guest@127.0.0.1/");
- using var connection = await factory.CreateConnectionAsync();
- using var channel = await connection.CreateChannelAsync();
-
- // await using var channel = mq.CreateChannel();
- // var channel2 = await channel.CreateChannelAsync();
-
- var body =
- $$"""
- {
- "id": "{{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}}",
- "channel_id": "1322343566206308390",
- "guild_id": "1322343566084673571",
- "author": {
- "username": "test",
- "discriminator": "9177",
- "id": "1322329228934500382",
- "public_flags": 0,
- "avatar": null,
- "accent_color": null,
- "banner": null,
- "bio": "",
- "bot": false,
- "premium_since": "2024-12-27T22:24:15.867Z",
- "premium_type": 2,
- "theme_colors": null,
- "pronouns": null,
- "badge_ids": null
- },
- "member": {
- "index": 2,
- "id": "1322329228934500382",
- "guild_id": "1322343566084673571",
- "nick": null,
- "joined_at": "2024-12-27T23:21:14.396Z",
- "premium_since": null,
- "deaf": false,
- "mute": false,
- "pending": false,
- "last_message_id": "1322346635635753061",
- "joined_by": null,
- "avatar": null,
- "banner": null,
- "bio": "",
- "theme_colors": null,
- "pronouns": null,
- "communication_disabled_until": null,
- "roles": []
- },
- "content": "{{Random.Shared.NextInt64()}}",
- "timestamp": "{{DateTime.UtcNow:O}}",
- "edited_timestamp": null,
- "tts": false,
- "mention_everyone": false,
- "mentions": [],
- "mention_roles": [],
- "attachments": [],
- "embeds": [],
- "reactions": [],
- "nonce": "{{Random.Shared.NextInt64()}}",
- "pinned": false,
- "type": 0
- }
- """
- .AsBytes().ToArray();
-
- await channel.ExchangeDeclareAsync(exchange: "1322343566206308390", type: ExchangeType.Fanout, durable: false);
- var props = new BasicProperties() { Type = "MESSAGE_CREATE" };
- await channel.BasicPublishAsync(exchange: "1322343566206308390", routingKey: "", mandatory: true, basicProperties: props, body: body);
-
- await channel.CloseAsync();
- await connection.CloseAsync();
- Console.WriteLine("meowww");
- }
-
[HttpGet("{id}/delete")]
public async IAsyncEnumerable DeleteUser(string id, [FromQuery] int messageDeleteChunkSize = 100) {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
@@ -179,12 +95,6 @@
db.Users.Update(user);
await db.SaveChangesAsync();
- var factory = new ConnectionFactory {
- Uri = new Uri("amqp://guest:guest@127.0.0.1/")
- };
- await using var mqConnection = await factory.CreateConnectionAsync();
- await using var mqChannel = await mqConnection.CreateChannelAsync();
-
var messages = db.Messages
.AsNoTracking()
.Where(m => m.AuthorId == id);
@@ -199,7 +109,7 @@
});
if (messages.Any()) {
var results = channels
- .Select(ctx => DeleteMessagesForChannel(ctx.GuildId, ctx.ChannelId!, id, mqChannel, messageDeleteChunkSize))
+ .Select(ctx => DeleteMessagesForChannel(ctx.GuildId, ctx.ChannelId!, id, messageDeleteChunkSize))
.ToList();
var a = AggregateAsyncEnumerablesWithoutOrder(results);
await foreach (var result in a) {
@@ -216,15 +126,12 @@
private async IAsyncEnumerable DeleteMessagesForChannel(
// context
string? guildId, string channelId, string authorId,
- // connections
- IChannel mqChannel,
// options
int messageDeleteChunkSize = 100
) {
{
await using var ctx = sp.CreateAsyncScope();
await using var _db = ctx.ServiceProvider.GetRequiredService();
- await mqChannel.ExchangeDeclareAsync(exchange: channelId!, type: ExchangeType.Fanout, durable: false);
var messagesInChannel = _db.Messages.AsNoTracking().Count(m => m.AuthorId == authorId && m.ChannelId == channelId && m.GuildId == guildId);
var remaining = messagesInChannel;
while (true) {
@@ -242,22 +149,16 @@
break;
}
- var props = new BasicProperties() { Type = "MESSAGE_BULK_DELETE" };
- var publishSuccess = false;
- do {
- try {
- await mqChannel.BasicPublishAsync(exchange: channelId!, routingKey: "", mandatory: true, basicProperties: props, body: new {
- ids = messageIds,
- channel_id = channelId,
- guild_id = guildId,
- }.ToJson().AsBytes().ToArray());
- publishSuccess = true;
- }
- catch (Exception e) {
- Console.WriteLine($"[RabbitMQ] Error publishing bulk delete: {e.Message}");
- await Task.Delay(10);
- }
- } while (!publishSuccess);
+ await replication.SendAsync(new() {
+ Event = "MESSAGE_BULK_DELETE",
+ ChannelId = channelId,
+ Payload = new {
+ channel_id = channelId,
+ guild_id = guildId,
+ ids = messageIds,
+ },
+ Origin = "AdminApi/DeleteMessagesForChannel"
+ });
yield return new("BULK_DELETED", new {
channel_id = channelId,
@@ -473,21 +374,12 @@
public async IAsyncEnumerable Test() {
(await auth.GetCurrentUser(Request)).GetRights().AssertHasAllRights(SpacebarRights.Rights.OPERATOR);
- var factory = new ConnectionFactory {
- Uri = new Uri(amqpConfig.ToConnectionString())
- };
- await using var mqConnection = await factory.CreateConnectionAsync();
- await using var mqChannel = await mqConnection.CreateChannelAsync();
-
var guildId = "1006649183970562092";
// var roleId = "1006706520514028812"; //Administrator
var roleId = "1391303296148639051"; //Spacebar Maintainer
// int color = 16711680; //Administrator
int color = 99839; //Spacebar Maintainer
- await mqChannel.ExchangeDeclareAsync(exchange: guildId, type: ExchangeType.Fanout, durable: false);
-
- var props = new BasicProperties() { Type = "GUILD_ROLE_UPDATE" };
int framerate = 30;
float delay = 1000f / framerate;
var secondsPerRotation = 6.243f;
@@ -499,32 +391,27 @@
while (true) {
var clr = re.Next();
color = clr.r << 16 | clr.g << 8 | clr.b;
- var publishSuccess = false;
- do {
- try {
- await mqChannel.BasicPublishAsync(exchange: guildId, routingKey: "", mandatory: false, basicProperties: props, body: new {
+ await replication.SendAsync(new() {
+ Event = "GUILD_ROLE_UPDATE",
+ GuildId = guildId,
+ Origin = "Admin API (GET /users/test)",
+ Payload = new {
+ guild_id = guildId,
+ role = new {
+ id = roleId,
guild_id = guildId,
- role = new {
- id = roleId,
- guild_id = guildId,
- color,
- hoist = false,
- managed = false,
- mentionable = true,
- name = "Spacebar Maintainer",
- permissions = "8",
- position = 5,
- unicode_emoji = "",
- flags = 0
- }
- }.ToJson().AsBytes().ToArray());
- publishSuccess = true;
+ color,
+ hoist = false,
+ managed = false,
+ mentionable = true,
+ name = "Spacebar Maintainer",
+ permissions = "8",
+ position = 5,
+ unicode_emoji = "",
+ flags = 0
+ }
}
- catch (Exception e) {
- Console.WriteLine($"[RabbitMQ] Error publishing bulk delete: {e.Message}");
- await Task.Delay(10);
- }
- } while (!publishSuccess);
+ });
yield return $"{clr.r:X2} {clr.g:X2} {clr.b:X2} | {color:X8} | {sw.Elapsed} (waiting {Math.Max(0, (int)delay - (int)sw.ElapsedMilliseconds)} out of {delay} ms)";
await Task.Delay(Math.Max(0, (int)delay - (int)sw.ElapsedMilliseconds));
diff --git a/extra/admin-api/Spacebar.AdminApi/Program.cs b/extra/admin-api/Spacebar.AdminApi/Program.cs
index c1c77f5..96da16b 100644
--- a/extra/admin-api/Spacebar.AdminApi/Program.cs
+++ b/extra/admin-api/Spacebar.AdminApi/Program.cs
@@ -1,10 +1,11 @@
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http.Timeouts;
using Microsoft.EntityFrameworkCore;
+using Spacebar.Interop.Replication.Abstractions;
using Spacebar.AdminApi.Middleware;
using Spacebar.AdminApi.Services;
+using Spacebar.Interop.Replication.UnixSocket;
using Spacebar.Models.Db.Contexts;
-using Spacebar.RabbitMqUtilities;
var builder = WebApplication.CreateBuilder(args);
@@ -30,8 +31,10 @@
});
builder.Services.AddScoped();
builder.Services.AddScoped();
-builder.Services.AddSingleton();
-builder.Services.AddSingleton();
+// builder.Services.AddSingleton();
+// builder.Services.AddSingleton();
+// builder.Services.AddSingleton();
+builder.Services.AddSingleton();
builder.Services.AddRequestTimeouts(x => {
x.DefaultPolicy = new RequestTimeoutPolicy {
diff --git a/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj b/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj
index fcb21fe..53b438f 100644
--- a/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj
+++ b/extra/admin-api/Spacebar.AdminApi/Spacebar.AdminApi.csproj
@@ -9,16 +9,16 @@
-
-
+
+
+
-
diff --git a/extra/admin-api/Spacebar.AdminApi/deps.json b/extra/admin-api/Spacebar.AdminApi/deps.json
index a5502b0..9e71f43 100644
--- a/extra/admin-api/Spacebar.AdminApi/deps.json
+++ b/extra/admin-api/Spacebar.AdminApi/deps.json
@@ -16,8 +16,8 @@
},
{
"pname": "Microsoft.AspNetCore.OpenApi",
- "version": "10.0.1",
- "hash": "sha256-O31K6+++fM7XWd0JGrzmzLrtydYGiI4efzv+WqAdnQA="
+ "version": "10.0.2",
+ "hash": "sha256-FU57fPXL4NUDRqi+rLresi4yKttv1KcAnLuEdPCyTos="
},
{
"pname": "Microsoft.Build",
@@ -146,8 +146,8 @@
},
{
"pname": "Microsoft.Extensions.Configuration",
- "version": "10.0.1",
- "hash": "sha256-7xdHie4uHwoGZz5yUT4vWg2EWvkLvsSzItWCoqm4dTM="
+ "version": "10.0.2",
+ "hash": "sha256-dBJAKDyp/sm+ZSMQfH0+4OH8Jnv1s20aHlWS6HNnH+c="
},
{
"pname": "Microsoft.Extensions.Configuration.Abstractions",
@@ -155,9 +155,14 @@
"hash": "sha256-s4PDp+vtzdxKIxnOT3+dDRoTDopyl8kqmmw4KDnkOtQ="
},
{
+ "pname": "Microsoft.Extensions.Configuration.Abstractions",
+ "version": "10.0.2",
+ "hash": "sha256-P+0kaDGO+xB9KxF9eWHDJ4hzi05sUGM/uMNEX5NdBTE="
+ },
+ {
"pname": "Microsoft.Extensions.Configuration.Binder",
- "version": "10.0.1",
- "hash": "sha256-fiqTHE6EfaUXICaVrWzQEU/K6GjQNac6yRNErig6wRk="
+ "version": "10.0.2",
+ "hash": "sha256-resI9gIxHh2cc+258/i+TjW8xxzKf4ZBTLIcWAMEYz0="
},
{
"pname": "Microsoft.Extensions.DependencyInjection",
@@ -231,6 +236,11 @@
},
{
"pname": "Microsoft.Extensions.Primitives",
+ "version": "10.0.2",
+ "hash": "sha256-8Ccrjjv9cFVf9RyCc7GS/Byt8+DXdSNea0UX3A5BEdA="
+ },
+ {
+ "pname": "Microsoft.Extensions.Primitives",
"version": "9.0.0",
"hash": "sha256-ZNLusK1CRuq5BZYZMDqaz04PIKScE2Z7sS2tehU7EJs="
},
@@ -290,11 +300,6 @@
"hash": "sha256-XIJxnTMektQVP1qtslEIGbmBGrIQsvjQjCMRTs9UIbg="
},
{
- "pname": "RabbitMQ.Client",
- "version": "7.2.0",
- "hash": "sha256-NkEb2ey0jo/OAeaVOUwIeSbeplqkOsgv1+ys8ZQgemQ="
- },
- {
"pname": "System.CodeDom",
"version": "6.0.0",
"hash": "sha256-uPetUFZyHfxjScu5x4agjk9pIhbCkt5rG4Axj25npcQ="
@@ -415,11 +420,6 @@
"hash": "sha256-BFrA9ottmQtLIAiKiGRbfSUpzNJwuaOCeFRDN4Z0ku0="
},
{
- "pname": "System.Threading.RateLimiting",
- "version": "8.0.0",
- "hash": "sha256-KOEWEt6ZthvZHJ2Wp70d9nBhBrPqobGQDi2twlKYh/w="
- },
- {
"pname": "System.Windows.Extensions",
"version": "9.0.0",
"hash": "sha256-RErD+Ju15qtnwdwB7E0SjjJGAnhXwJyC7UPcl24Z3Vs="
diff --git a/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj b/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj
index cd53bbb..35d71d4 100644
--- a/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj
+++ b/extra/admin-api/Spacebar.Cdn/Spacebar.Cdn.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/extra/admin-api/Spacebar.Cdn/deps.json b/extra/admin-api/Spacebar.Cdn/deps.json
new file mode 100644
index 0000000..6d30f6b
--- /dev/null
+++ b/extra/admin-api/Spacebar.Cdn/deps.json
@@ -0,0 +1,387 @@
+[
+ {
+ "pname": "ArcaneLibs",
+ "version": "1.0.0-preview.20251207-164820",
+ "hash": "sha256-Bz+w3kWgoN9ufy8PyJpb+nFCKCN48rsjeAh6hO6Ekas="
+ },
+ {
+ "pname": "Humanizer.Core",
+ "version": "2.14.1",
+ "hash": "sha256-EXvojddPu+9JKgOG9NSQgUTfWq1RpOYw7adxDPKDJ6o="
+ },
+ {
+ "pname": "Magick.NET-Q16-HDRI-OpenMP-x64",
+ "version": "14.10.1",
+ "hash": "sha256-noJZiBphzbdeiz/ntemosD6dYMk+UYHk+h/tQmIyXVE="
+ },
+ {
+ "pname": "Magick.NET.Core",
+ "version": "14.10.1",
+ "hash": "sha256-Qg7x5eX0ZQ3oXkcamS/qE/HgmTNQ+Dppyi6exerwgkI="
+ },
+ {
+ "pname": "Microsoft.AspNetCore.OpenApi",
+ "version": "10.0.2",
+ "hash": "sha256-FU57fPXL4NUDRqi+rLresi4yKttv1KcAnLuEdPCyTos="
+ },
+ {
+ "pname": "Microsoft.Build",
+ "version": "17.7.2",
+ "hash": "sha256-k35nFdPxC8t0zAltVSmAJtsepp/ubNIjPOsJ6k8jSqM="
+ },
+ {
+ "pname": "Microsoft.Build.Framework",
+ "version": "17.14.28",
+ "hash": "sha256-7RzEyIipumafwLW1xN1q23114NafG6PT0+RADElNsiM="
+ },
+ {
+ "pname": "Microsoft.Build.Framework",
+ "version": "17.7.2",
+ "hash": "sha256-fNWmVQYFTJDveAGmxEdNqJRAczV6+Ep8RA8clKBJFqw="
+ },
+ {
+ "pname": "Microsoft.Build.Tasks.Core",
+ "version": "17.14.28",
+ "hash": "sha256-M9zRXYijH2HtLlRXbrUK1a1LQ9zkT+DC9ZmMiiVZwv0="
+ },
+ {
+ "pname": "Microsoft.Build.Tasks.Core",
+ "version": "17.7.2",
+ "hash": "sha256-OrV/qWgZHzGlNUmaSfX5wDBcmg1aQeF3/OUHpSH+uZU="
+ },
+ {
+ "pname": "Microsoft.Build.Utilities.Core",
+ "version": "17.14.28",
+ "hash": "sha256-VFfO+UpyTpw2X/qiCCOCYzvMLuu7B+XVSSpJZQLkPzU="
+ },
+ {
+ "pname": "Microsoft.Build.Utilities.Core",
+ "version": "17.7.2",
+ "hash": "sha256-oatF0KfuP1nb4+OLNKg2/R/ZLO4EiACaO5leaxMEY4A="
+ },
+ {
+ "pname": "Microsoft.CodeAnalysis.Analyzers",
+ "version": "3.11.0",
+ "hash": "sha256-hQ2l6E6PO4m7i+ZsfFlEx+93UsLPo4IY3wDkNG11/Sw="
+ },
+ {
+ "pname": "Microsoft.CodeAnalysis.Common",
+ "version": "4.14.0",
+ "hash": "sha256-ne/zxH3GqoGB4OemnE8oJElG5mai+/67ASaKqwmL2BE="
+ },
+ {
+ "pname": "Microsoft.CodeAnalysis.CSharp",
+ "version": "4.14.0",
+ "hash": "sha256-5Mzj3XkYYLkwDWh17r1NEXSbXwwWYQPiOmkSMlgo1JY="
+ },
+ {
+ "pname": "Microsoft.CodeAnalysis.CSharp.Workspaces",
+ "version": "4.14.0",
+ "hash": "sha256-aNbV1a0yYBs0fpQawG6LXcbyoE8en+YFSpV5vcYE4J4="
+ },
+ {
+ "pname": "Microsoft.CodeAnalysis.Workspaces.Common",
+ "version": "4.14.0",
+ "hash": "sha256-0YfeaJe01WBUm9avy4a8FacQJXA1NkpnDpiXu4yz88I="
+ },
+ {
+ "pname": "Microsoft.CodeAnalysis.Workspaces.MSBuild",
+ "version": "4.14.0",
+ "hash": "sha256-5SJfpRqzqCK0UbkmAaJpA/r1XJb0YAriMMeQHYC4d+o="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore",
+ "version": "10.0.0",
+ "hash": "sha256-xfgrlxhtOkQwF5Q7j8gSm41URJiH8IuJ/T/Dh88++hE="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore",
+ "version": "10.0.1",
+ "hash": "sha256-IxA+/nDA6hZkUm9bDT6bRu8+9qeHA3gbTvIhR9Ncg4w="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Abstractions",
+ "version": "10.0.0",
+ "hash": "sha256-UDgZbRQcGPaKsE53EH6bvJiv+Q4KSxAbnsVhTVFGG4Q="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Abstractions",
+ "version": "10.0.1",
+ "hash": "sha256-FMGXhAAgcVSedV0/GmUVqAwoiRzFJil9mQYr6eNgowg="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Analyzers",
+ "version": "10.0.0",
+ "hash": "sha256-7Q0jYJO50cqGI+u6gLpootbB8GZvgsgtg0F9FZI1jig="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Analyzers",
+ "version": "10.0.1",
+ "hash": "sha256-O949vr98WoSRXtiIo0ZI6dz2cibIBKbiuC+mQOe9bV4="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Design",
+ "version": "10.0.1",
+ "hash": "sha256-GGNZIGNEMhSGaMRFkRN4bOuCUBs5YVnX8klXarm319U="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Relational",
+ "version": "10.0.0",
+ "hash": "sha256-vOP2CE5YA551BlpbOuIy6RuAiAEPEpCVS1cEE33/zN4="
+ },
+ {
+ "pname": "Microsoft.EntityFrameworkCore.Relational",
+ "version": "10.0.1",
+ "hash": "sha256-zLgxr/iW9HP8Fip1IDgr7X0Ar8OWKDvVmoEt65gG6VY="
+ },
+ {
+ "pname": "Microsoft.Extensions.Caching.Abstractions",
+ "version": "10.0.1",
+ "hash": "sha256-qVLAEqxPK/dNq+z1a6D9NqdcSg/18sfzZhlBWMkqV/A="
+ },
+ {
+ "pname": "Microsoft.Extensions.Caching.Memory",
+ "version": "10.0.0",
+ "hash": "sha256-AMgDSm1k6q0s17spGtyR5q8nAqUFDOxl/Fe38f9M+d4="
+ },
+ {
+ "pname": "Microsoft.Extensions.Caching.Memory",
+ "version": "10.0.1",
+ "hash": "sha256-Qb7xK6VEZDas0lJFaW1suKdFjtkSYwLHHxkQEfWIU2A="
+ },
+ {
+ "pname": "Microsoft.Extensions.Configuration.Abstractions",
+ "version": "10.0.1",
+ "hash": "sha256-s4PDp+vtzdxKIxnOT3+dDRoTDopyl8kqmmw4KDnkOtQ="
+ },
+ {
+ "pname": "Microsoft.Extensions.DependencyInjection",
+ "version": "10.0.1",
+ "hash": "sha256-RKOB+zPrtQNUbJY/1jR54rKOM8KHPgynPExxugku3I8="
+ },
+ {
+ "pname": "Microsoft.Extensions.DependencyInjection",
+ "version": "9.0.0",
+ "hash": "sha256-dAH52PPlTLn7X+1aI/7npdrDzMEFPMXRv4isV1a+14k="
+ },
+ {
+ "pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
+ "version": "10.0.1",
+ "hash": "sha256-zNUpau51ds7iQTaSUTFtyTHIUoinYc129W50CnufMdQ="
+ },
+ {
+ "pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
+ "version": "9.0.0",
+ "hash": "sha256-CncVwkKZ5CsIG2O0+OM9qXuYXh3p6UGyueTHSLDVL+c="
+ },
+ {
+ "pname": "Microsoft.Extensions.DependencyModel",
+ "version": "10.0.1",
+ "hash": "sha256-XIj2jEURe25YA4RhBSuCqQpic0YP+TZaO/dbBPCjad8="
+ },
+ {
+ "pname": "Microsoft.Extensions.Logging",
+ "version": "10.0.0",
+ "hash": "sha256-P+zPAadLL63k/GqK34/qChqQjY9aIRxZfxlB9lqsSrs="
+ },
+ {
+ "pname": "Microsoft.Extensions.Logging",
+ "version": "10.0.1",
+ "hash": "sha256-zuLP3SIpCToMOlIPOEv3Kq8y/minecd8k8GSkxFo13E="
+ },
+ {
+ "pname": "Microsoft.Extensions.Logging",
+ "version": "9.0.0",
+ "hash": "sha256-kR16c+N8nQrWeYLajqnXPg7RiXjZMSFLnKLEs4VfjcM="
+ },
+ {
+ "pname": "Microsoft.Extensions.Logging.Abstractions",
+ "version": "10.0.0",
+ "hash": "sha256-BnhgGZc01HwTSxogavq7Ueq4V7iMA3wPnbfRwQ4RhGk="
+ },
+ {
+ "pname": "Microsoft.Extensions.Logging.Abstractions",
+ "version": "10.0.1",
+ "hash": "sha256-NRk0feNE1fgi/hyO0AVDbSGJQRT+9yte6Lpm4Hz/2Bs="
+ },
+ {
+ "pname": "Microsoft.Extensions.Logging.Abstractions",
+ "version": "9.0.0",
+ "hash": "sha256-iBTs9twjWXFeERt4CErkIIcoJZU1jrd1RWCI8V5j7KU="
+ },
+ {
+ "pname": "Microsoft.Extensions.Options",
+ "version": "10.0.1",
+ "hash": "sha256-vBiSS1vqAC7eDrpJNT4H3A9qLikCSAepnNRbry0mKnk="
+ },
+ {
+ "pname": "Microsoft.Extensions.Options",
+ "version": "9.0.0",
+ "hash": "sha256-DT5euAQY/ItB5LPI8WIp6Dnd0lSvBRP35vFkOXC68ck="
+ },
+ {
+ "pname": "Microsoft.Extensions.Primitives",
+ "version": "10.0.1",
+ "hash": "sha256-EXmukq09erT4s+miQpBSYy3IY4HxxKlwEPL43/KoyEc="
+ },
+ {
+ "pname": "Microsoft.Extensions.Primitives",
+ "version": "9.0.0",
+ "hash": "sha256-ZNLusK1CRuq5BZYZMDqaz04PIKScE2Z7sS2tehU7EJs="
+ },
+ {
+ "pname": "Microsoft.NET.StringTools",
+ "version": "17.14.28",
+ "hash": "sha256-UzREyvDxkiOQ4cEOQ5UCjkwXGrldIDCcbefECTPGjXI="
+ },
+ {
+ "pname": "Microsoft.NET.StringTools",
+ "version": "17.7.2",
+ "hash": "sha256-hQE07TCgcQuyu9ZHVq2gPDb0+xe8ECJUdrgh17bJP4o="
+ },
+ {
+ "pname": "Microsoft.OpenApi",
+ "version": "2.0.0",
+ "hash": "sha256-8eiM3Mx4Hx1etx52RlczoHG2z9XIpWgu2LQtWSt086k="
+ },
+ {
+ "pname": "Mono.TextTemplating",
+ "version": "3.0.0",
+ "hash": "sha256-VlgGDvgNZb7MeBbIZ4DE2Nn/j2aD9k6XqNHnASUSDr0="
+ },
+ {
+ "pname": "Newtonsoft.Json",
+ "version": "13.0.3",
+ "hash": "sha256-hy/BieY4qxBWVVsDqqOPaLy1QobiIapkbrESm6v2PHc="
+ },
+ {
+ "pname": "Npgsql",
+ "version": "10.0.0",
+ "hash": "sha256-UVKz9dH/rVCCbMyFdqA31RYpht1XgDRLIqUy0Dp9ACQ="
+ },
+ {
+ "pname": "Npgsql.EntityFrameworkCore.PostgreSQL",
+ "version": "10.0.0",
+ "hash": "sha256-XIJxnTMektQVP1qtslEIGbmBGrIQsvjQjCMRTs9UIbg="
+ },
+ {
+ "pname": "System.CodeDom",
+ "version": "6.0.0",
+ "hash": "sha256-uPetUFZyHfxjScu5x4agjk9pIhbCkt5rG4Axj25npcQ="
+ },
+ {
+ "pname": "System.CodeDom",
+ "version": "7.0.0",
+ "hash": "sha256-7IPt39cY+0j0ZcRr/J45xPtEjnSXdUJ/5ai3ebaYQiE="
+ },
+ {
+ "pname": "System.CodeDom",
+ "version": "9.0.0",
+ "hash": "sha256-578lcBgswW0eM16r0EnJzfGodPx86RxxFoZHc2PSzsw="
+ },
+ {
+ "pname": "System.Composition",
+ "version": "9.0.0",
+ "hash": "sha256-FehOkQ2u1p8mQ0/wn3cZ+24HjhTLdck8VZYWA1CcgbM="
+ },
+ {
+ "pname": "System.Composition.AttributedModel",
+ "version": "9.0.0",
+ "hash": "sha256-a7y7H6zj+kmYkllNHA402DoVfY9IaqC3Ooys8Vzl24M="
+ },
+ {
+ "pname": "System.Composition.Convention",
+ "version": "9.0.0",
+ "hash": "sha256-tw4vE5JRQ60ubTZBbxoMPhtjOQCC3XoDFUH7NHO7o8U="
+ },
+ {
+ "pname": "System.Composition.Hosting",
+ "version": "9.0.0",
+ "hash": "sha256-oOxU+DPEEfMCuNLgW6wSkZp0JY5gYt44FJNnWt+967s="
+ },
+ {
+ "pname": "System.Composition.Runtime",
+ "version": "9.0.0",
+ "hash": "sha256-AyIe+di1TqwUBbSJ/sJ8Q8tzsnTN+VBdJw4K8xZz43s="
+ },
+ {
+ "pname": "System.Composition.TypedParts",
+ "version": "9.0.0",
+ "hash": "sha256-F5fpTUs3Rr7yP/NyIzr+Xn5NdTXXp8rrjBnF9UBBUog="
+ },
+ {
+ "pname": "System.Configuration.ConfigurationManager",
+ "version": "7.0.0",
+ "hash": "sha256-SgBexTTjRn23uuXvkzO0mz0qOfA23MiS4Wv+qepMLZE="
+ },
+ {
+ "pname": "System.Configuration.ConfigurationManager",
+ "version": "9.0.0",
+ "hash": "sha256-+pLnTC0YDP6Kjw5DVBiFrV/Q3x5is/+6N6vAtjvhVWk="
+ },
+ {
+ "pname": "System.Diagnostics.EventLog",
+ "version": "9.0.0",
+ "hash": "sha256-tPvt6yoAp56sK/fe+/ei8M65eavY2UUhRnbrREj/Ems="
+ },
+ {
+ "pname": "System.Formats.Nrbf",
+ "version": "9.0.0",
+ "hash": "sha256-c4qf6CocQUZB0ySGQd8s15PXY7xfrjQqMGXxkwytKyw="
+ },
+ {
+ "pname": "System.Reflection.MetadataLoadContext",
+ "version": "7.0.0",
+ "hash": "sha256-VYl6SFD130K9Aw4eJH16ApJ9Sau4Xu0dcxEip2veuTI="
+ },
+ {
+ "pname": "System.Resources.Extensions",
+ "version": "9.0.0",
+ "hash": "sha256-y2gLEMuAy6QfEyNJxABC/ayMWGnwlpX735jsUQLktho="
+ },
+ {
+ "pname": "System.Security.Cryptography.Pkcs",
+ "version": "7.0.0",
+ "hash": "sha256-3J3vL9hcKSuZjT2GKappa2A9p2xJm1nH2asTNAl8ZCA="
+ },
+ {
+ "pname": "System.Security.Cryptography.Pkcs",
+ "version": "7.0.2",
+ "hash": "sha256-qS5Z/Yo8J+f3ExVX5Qkcpj1Z57oUZqz5rWa1h5bVpl8="
+ },
+ {
+ "pname": "System.Security.Cryptography.Pkcs",
+ "version": "9.0.0",
+ "hash": "sha256-AjG14mGeSc2Ka4QSelGBM1LrGBW3VJX60lnihKyJjGY="
+ },
+ {
+ "pname": "System.Security.Cryptography.ProtectedData",
+ "version": "9.0.0",
+ "hash": "sha256-gPgPU7k/InTqmXoRzQfUMEKL3QuTnOKowFqmXTnWaBQ="
+ },
+ {
+ "pname": "System.Security.Cryptography.Xml",
+ "version": "7.0.1",
+ "hash": "sha256-CH8+JVC8LyCSW75/6ZQ7ecMbSOAE1c16z4dG8JTp01w="
+ },
+ {
+ "pname": "System.Security.Cryptography.Xml",
+ "version": "9.0.0",
+ "hash": "sha256-SQJWwAFrJUddEU6JiZB52FM9tGjRlJAYH8oYVzG5IJU="
+ },
+ {
+ "pname": "System.Security.Permissions",
+ "version": "7.0.0",
+ "hash": "sha256-DOFoX+AKRmrkllykHheR8FfUXYx/Ph+I/HYuReQydXI="
+ },
+ {
+ "pname": "System.Security.Permissions",
+ "version": "9.0.0",
+ "hash": "sha256-BFrA9ottmQtLIAiKiGRbfSUpzNJwuaOCeFRDN4Z0ku0="
+ },
+ {
+ "pname": "System.Windows.Extensions",
+ "version": "9.0.0",
+ "hash": "sha256-RErD+Ju15qtnwdwB7E0SjjJGAnhXwJyC7UPcl24Z3Vs="
+ }
+]
diff --git a/extra/admin-api/SpacebarAdminAPI.sln b/extra/admin-api/SpacebarAdminAPI.sln
index 1edb84d..3ec737f 100644
--- a/extra/admin-api/SpacebarAdminAPI.sln
+++ b/extra/admin-api/SpacebarAdminAPI.sln
@@ -7,8 +7,6 @@
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utilities", "Utilities", "{04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.RabbitMqUtilities", "Utilities\Spacebar.RabbitMqUtilities\Spacebar.RabbitMqUtilities.csproj", "{F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.AdminApiTest", "Utilities\Spacebar.AdminApiTest\Spacebar.AdminApiTest.csproj", "{374314B2-7149-4316-8750-4E1E7BF6C3B4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.AdminApi.TestClient", "Utilities\Spacebar.AdminApi.TestClient\Spacebar.AdminApi.TestClient.csproj", "{498DAD05-336E-4851-ABD8-4E7CCA8312B0}"
@@ -31,6 +29,14 @@
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.Models.AdminApi", "Models\Spacebar.Models.AdminApi\Spacebar.Models.AdminApi.csproj", "{F13D96E4-9C85-4853-B812-7FD35620382C}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{16DBEA54-D51A-4D91-84DF-C701B6B4786F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.Interop.Replication.Abstractions", "Interop\Spacebar.Interop.Replication.Abstractions\Spacebar.Interop.Replication.Abstractions.csproj", "{6F2A4C4B-8EAA-4469-9320-B52C23D9640F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.Interop.Replication.RabbitMq", "Interop\Spacebar.Interop.Replication.RabbitMq\Spacebar.Interop.Replication.RabbitMq.csproj", "{2FAE6018-CF95-4B44-A7F7-D6FAF596076D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spacebar.Interop.Replication.UnixSocket", "Interop\Spacebar.Interop.Replication.UnixSocket\Spacebar.Interop.Replication.UnixSocket.csproj", "{2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -53,18 +59,6 @@
{00E58C53-0AC1-4113-8CCF-D299861EA8D3}.Release|x64.Build.0 = Release|Any CPU
{00E58C53-0AC1-4113-8CCF-D299861EA8D3}.Release|x86.ActiveCfg = Release|Any CPU
{00E58C53-0AC1-4113-8CCF-D299861EA8D3}.Release|x86.Build.0 = Release|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Debug|x64.Build.0 = Debug|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Debug|x86.Build.0 = Debug|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Release|Any CPU.Build.0 = Release|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Release|x64.ActiveCfg = Release|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Release|x64.Build.0 = Release|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Release|x86.ActiveCfg = Release|Any CPU
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2}.Release|x86.Build.0 = Release|Any CPU
{374314B2-7149-4316-8750-4E1E7BF6C3B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{374314B2-7149-4316-8750-4E1E7BF6C3B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{374314B2-7149-4316-8750-4E1E7BF6C3B4}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -185,12 +179,47 @@
{F13D96E4-9C85-4853-B812-7FD35620382C}.Release|x64.Build.0 = Release|Any CPU
{F13D96E4-9C85-4853-B812-7FD35620382C}.Release|x86.ActiveCfg = Release|Any CPU
{F13D96E4-9C85-4853-B812-7FD35620382C}.Release|x86.Build.0 = Release|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Debug|x64.Build.0 = Debug|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Debug|x86.Build.0 = Debug|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Release|x64.ActiveCfg = Release|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Release|x64.Build.0 = Release|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Release|x86.ActiveCfg = Release|Any CPU
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F}.Release|x86.Build.0 = Release|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Debug|x64.Build.0 = Debug|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Debug|x86.Build.0 = Debug|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Release|x64.ActiveCfg = Release|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Release|x64.Build.0 = Release|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Release|x86.ActiveCfg = Release|Any CPU
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D}.Release|x86.Build.0 = Release|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Debug|x64.Build.0 = Debug|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Debug|x86.Build.0 = Debug|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Release|x64.ActiveCfg = Release|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Release|x64.Build.0 = Release|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Release|x86.ActiveCfg = Release|Any CPU
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {F4E179D1-A3EB-4A1D-9C11-E7019F4B1EE2} = {04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}
{374314B2-7149-4316-8750-4E1E7BF6C3B4} = {04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}
{498DAD05-336E-4851-ABD8-4E7CCA8312B0} = {04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}
{BCC6501C-16A7-4787-BA47-52DAE06718A8} = {04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}
@@ -200,5 +229,8 @@
{BCE9DADB-4274-4190-8EA7-54F3EF6D5ECF} = {04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}
{9AABE503-5D27-4D7F-8A01-4430422C4284} = {04787943-EBB6-4DE4-96D5-4CFB4A2CEE99}
{F13D96E4-9C85-4853-B812-7FD35620382C} = {259D1A9B-2927-4571-A366-68C3BB30C2B2}
+ {6F2A4C4B-8EAA-4469-9320-B52C23D9640F} = {16DBEA54-D51A-4D91-84DF-C701B6B4786F}
+ {2FAE6018-CF95-4B44-A7F7-D6FAF596076D} = {16DBEA54-D51A-4D91-84DF-C701B6B4786F}
+ {2D8F75C2-C4DC-4DBC-A880-5BF021D637E5} = {16DBEA54-D51A-4D91-84DF-C701B6B4786F}
EndGlobalSection
EndGlobal
diff --git a/extra/admin-api/Utilities/ConfigTest/ConfigTest.csproj b/extra/admin-api/Utilities/ConfigTest/ConfigTest.csproj
index fecd9f3..98895a1 100644
--- a/extra/admin-api/Utilities/ConfigTest/ConfigTest.csproj
+++ b/extra/admin-api/Utilities/ConfigTest/ConfigTest.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Spacebar.AdminApi.TestClient.csproj b/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Spacebar.AdminApi.TestClient.csproj
index 5926a35..552dbd3 100644
--- a/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Spacebar.AdminApi.TestClient.csproj
+++ b/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Spacebar.AdminApi.TestClient.csproj
@@ -21,9 +21,9 @@
-
-
-
+
+
+
@@ -38,7 +38,6 @@
-
diff --git a/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/Spacebar.CleanSettingsRows.csproj b/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/Spacebar.CleanSettingsRows.csproj
index aa33dc2..4bd3d7d 100644
--- a/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/Spacebar.CleanSettingsRows.csproj
+++ b/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/Spacebar.CleanSettingsRows.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/deps.json b/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/deps.json
index e8ea72e..e69de29 100644
--- a/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/deps.json
+++ b/extra/admin-api/Utilities/Spacebar.CleanSettingsRows/deps.json
@@ -1,467 +0,0 @@
-[
- {
- "pname": "Humanizer.Core",
- "version": "2.14.1",
- "hash": "sha256-EXvojddPu+9JKgOG9NSQgUTfWq1RpOYw7adxDPKDJ6o="
- },
- {
- "pname": "Microsoft.Build",
- "version": "17.7.2",
- "hash": "sha256-k35nFdPxC8t0zAltVSmAJtsepp/ubNIjPOsJ6k8jSqM="
- },
- {
- "pname": "Microsoft.Build.Framework",
- "version": "17.14.28",
- "hash": "sha256-7RzEyIipumafwLW1xN1q23114NafG6PT0+RADElNsiM="
- },
- {
- "pname": "Microsoft.Build.Framework",
- "version": "17.7.2",
- "hash": "sha256-fNWmVQYFTJDveAGmxEdNqJRAczV6+Ep8RA8clKBJFqw="
- },
- {
- "pname": "Microsoft.Build.Tasks.Core",
- "version": "17.14.28",
- "hash": "sha256-M9zRXYijH2HtLlRXbrUK1a1LQ9zkT+DC9ZmMiiVZwv0="
- },
- {
- "pname": "Microsoft.Build.Tasks.Core",
- "version": "17.7.2",
- "hash": "sha256-OrV/qWgZHzGlNUmaSfX5wDBcmg1aQeF3/OUHpSH+uZU="
- },
- {
- "pname": "Microsoft.Build.Utilities.Core",
- "version": "17.14.28",
- "hash": "sha256-VFfO+UpyTpw2X/qiCCOCYzvMLuu7B+XVSSpJZQLkPzU="
- },
- {
- "pname": "Microsoft.Build.Utilities.Core",
- "version": "17.7.2",
- "hash": "sha256-oatF0KfuP1nb4+OLNKg2/R/ZLO4EiACaO5leaxMEY4A="
- },
- {
- "pname": "Microsoft.CodeAnalysis.Analyzers",
- "version": "3.11.0",
- "hash": "sha256-hQ2l6E6PO4m7i+ZsfFlEx+93UsLPo4IY3wDkNG11/Sw="
- },
- {
- "pname": "Microsoft.CodeAnalysis.Common",
- "version": "4.14.0",
- "hash": "sha256-ne/zxH3GqoGB4OemnE8oJElG5mai+/67ASaKqwmL2BE="
- },
- {
- "pname": "Microsoft.CodeAnalysis.CSharp",
- "version": "4.14.0",
- "hash": "sha256-5Mzj3XkYYLkwDWh17r1NEXSbXwwWYQPiOmkSMlgo1JY="
- },
- {
- "pname": "Microsoft.CodeAnalysis.CSharp.Workspaces",
- "version": "4.14.0",
- "hash": "sha256-aNbV1a0yYBs0fpQawG6LXcbyoE8en+YFSpV5vcYE4J4="
- },
- {
- "pname": "Microsoft.CodeAnalysis.Workspaces.Common",
- "version": "4.14.0",
- "hash": "sha256-0YfeaJe01WBUm9avy4a8FacQJXA1NkpnDpiXu4yz88I="
- },
- {
- "pname": "Microsoft.CodeAnalysis.Workspaces.MSBuild",
- "version": "4.14.0",
- "hash": "sha256-5SJfpRqzqCK0UbkmAaJpA/r1XJb0YAriMMeQHYC4d+o="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore",
- "version": "10.0.0",
- "hash": "sha256-xfgrlxhtOkQwF5Q7j8gSm41URJiH8IuJ/T/Dh88++hE="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore",
- "version": "10.0.1",
- "hash": "sha256-IxA+/nDA6hZkUm9bDT6bRu8+9qeHA3gbTvIhR9Ncg4w="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Abstractions",
- "version": "10.0.0",
- "hash": "sha256-UDgZbRQcGPaKsE53EH6bvJiv+Q4KSxAbnsVhTVFGG4Q="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-FMGXhAAgcVSedV0/GmUVqAwoiRzFJil9mQYr6eNgowg="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Analyzers",
- "version": "10.0.0",
- "hash": "sha256-7Q0jYJO50cqGI+u6gLpootbB8GZvgsgtg0F9FZI1jig="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Analyzers",
- "version": "10.0.1",
- "hash": "sha256-O949vr98WoSRXtiIo0ZI6dz2cibIBKbiuC+mQOe9bV4="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Design",
- "version": "10.0.1",
- "hash": "sha256-GGNZIGNEMhSGaMRFkRN4bOuCUBs5YVnX8klXarm319U="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Relational",
- "version": "10.0.0",
- "hash": "sha256-vOP2CE5YA551BlpbOuIy6RuAiAEPEpCVS1cEE33/zN4="
- },
- {
- "pname": "Microsoft.EntityFrameworkCore.Relational",
- "version": "10.0.1",
- "hash": "sha256-zLgxr/iW9HP8Fip1IDgr7X0Ar8OWKDvVmoEt65gG6VY="
- },
- {
- "pname": "Microsoft.Extensions.Caching.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-qVLAEqxPK/dNq+z1a6D9NqdcSg/18sfzZhlBWMkqV/A="
- },
- {
- "pname": "Microsoft.Extensions.Caching.Memory",
- "version": "10.0.0",
- "hash": "sha256-AMgDSm1k6q0s17spGtyR5q8nAqUFDOxl/Fe38f9M+d4="
- },
- {
- "pname": "Microsoft.Extensions.Caching.Memory",
- "version": "10.0.1",
- "hash": "sha256-Qb7xK6VEZDas0lJFaW1suKdFjtkSYwLHHxkQEfWIU2A="
- },
- {
- "pname": "Microsoft.Extensions.Configuration",
- "version": "10.0.1",
- "hash": "sha256-7xdHie4uHwoGZz5yUT4vWg2EWvkLvsSzItWCoqm4dTM="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-s4PDp+vtzdxKIxnOT3+dDRoTDopyl8kqmmw4KDnkOtQ="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.Binder",
- "version": "10.0.1",
- "hash": "sha256-fiqTHE6EfaUXICaVrWzQEU/K6GjQNac6yRNErig6wRk="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.CommandLine",
- "version": "10.0.1",
- "hash": "sha256-u70gHmAKAlbP2jbsSDLKCNt6Yqfcrl5wSpQ+3/FduFs="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.EnvironmentVariables",
- "version": "10.0.1",
- "hash": "sha256-mslRDdtsV4C5t3k6WYxxH2nzT+FAmdT+fTUM/QBcahM="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.FileExtensions",
- "version": "10.0.1",
- "hash": "sha256-DFIwBSRkFtjPzbsTgHzAaJ6dSIHA8avQx7sRLZ6W64A="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.Json",
- "version": "10.0.1",
- "hash": "sha256-l1eDnd0rvV4bhGYrtxOLnrbTiP5juSyfrG51k5G3lQA="
- },
- {
- "pname": "Microsoft.Extensions.Configuration.UserSecrets",
- "version": "10.0.1",
- "hash": "sha256-gHzqwu06nfKftexrQaIexa3PiZI1eYkxkO0X+nkGKX0="
- },
- {
- "pname": "Microsoft.Extensions.DependencyInjection",
- "version": "10.0.1",
- "hash": "sha256-RKOB+zPrtQNUbJY/1jR54rKOM8KHPgynPExxugku3I8="
- },
- {
- "pname": "Microsoft.Extensions.DependencyInjection",
- "version": "9.0.0",
- "hash": "sha256-dAH52PPlTLn7X+1aI/7npdrDzMEFPMXRv4isV1a+14k="
- },
- {
- "pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-zNUpau51ds7iQTaSUTFtyTHIUoinYc129W50CnufMdQ="
- },
- {
- "pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
- "version": "9.0.0",
- "hash": "sha256-CncVwkKZ5CsIG2O0+OM9qXuYXh3p6UGyueTHSLDVL+c="
- },
- {
- "pname": "Microsoft.Extensions.DependencyModel",
- "version": "10.0.1",
- "hash": "sha256-XIj2jEURe25YA4RhBSuCqQpic0YP+TZaO/dbBPCjad8="
- },
- {
- "pname": "Microsoft.Extensions.Diagnostics",
- "version": "10.0.1",
- "hash": "sha256-MoBF0X5AVT0xORvhNvpc9DA5dSOJhjrfGeWDvEJQOoc="
- },
- {
- "pname": "Microsoft.Extensions.Diagnostics.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-tEt6VaaDR7bICKHiCp0l2Cmz8u+FCYORLVNAaJymGM8="
- },
- {
- "pname": "Microsoft.Extensions.FileProviders.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-IYtaZ5nssj9RPHL+DODXt9Z2IvTtj8rKuLQuyoMqo+w="
- },
- {
- "pname": "Microsoft.Extensions.FileProviders.Physical",
- "version": "10.0.1",
- "hash": "sha256-HdzR2Nz8Qna8IDA2kPhEbBwfn3JZ1gxcPGxza7hH1GQ="
- },
- {
- "pname": "Microsoft.Extensions.FileSystemGlobbing",
- "version": "10.0.1",
- "hash": "sha256-R9f52Tn3DyktDD5UtWj80Ee3nEXMo0BR+66b/8NxaV8="
- },
- {
- "pname": "Microsoft.Extensions.Hosting",
- "version": "10.0.1",
- "hash": "sha256-e1BztWxT+PUJ0PCrMfHl+ZTrPhrX5+xsV8j9jhQ4W3M="
- },
- {
- "pname": "Microsoft.Extensions.Hosting.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-2t+yF23Ac9MvytZK8hym+aUYynuAFZVdKdcRVvVsdXo="
- },
- {
- "pname": "Microsoft.Extensions.Logging",
- "version": "10.0.0",
- "hash": "sha256-P+zPAadLL63k/GqK34/qChqQjY9aIRxZfxlB9lqsSrs="
- },
- {
- "pname": "Microsoft.Extensions.Logging",
- "version": "10.0.1",
- "hash": "sha256-zuLP3SIpCToMOlIPOEv3Kq8y/minecd8k8GSkxFo13E="
- },
- {
- "pname": "Microsoft.Extensions.Logging",
- "version": "9.0.0",
- "hash": "sha256-kR16c+N8nQrWeYLajqnXPg7RiXjZMSFLnKLEs4VfjcM="
- },
- {
- "pname": "Microsoft.Extensions.Logging.Abstractions",
- "version": "10.0.0",
- "hash": "sha256-BnhgGZc01HwTSxogavq7Ueq4V7iMA3wPnbfRwQ4RhGk="
- },
- {
- "pname": "Microsoft.Extensions.Logging.Abstractions",
- "version": "10.0.1",
- "hash": "sha256-NRk0feNE1fgi/hyO0AVDbSGJQRT+9yte6Lpm4Hz/2Bs="
- },
- {
- "pname": "Microsoft.Extensions.Logging.Abstractions",
- "version": "9.0.0",
- "hash": "sha256-iBTs9twjWXFeERt4CErkIIcoJZU1jrd1RWCI8V5j7KU="
- },
- {
- "pname": "Microsoft.Extensions.Logging.Configuration",
- "version": "10.0.1",
- "hash": "sha256-/7ywcFsEmmQzWEcIvxoGAYHF0oDSXV/LTDAiW/MNQtg="
- },
- {
- "pname": "Microsoft.Extensions.Logging.Console",
- "version": "10.0.1",
- "hash": "sha256-m/E02c5NSCYyH4THNKxpnsi3Kp8gqOi2aPrfXx7sQ9s="
- },
- {
- "pname": "Microsoft.Extensions.Logging.Debug",
- "version": "10.0.1",
- "hash": "sha256-IxuAcBxnUDfrb/diCXWC4wDA1Wa6QhCy3oinGIdfe1I="
- },
- {
- "pname": "Microsoft.Extensions.Logging.EventLog",
- "version": "10.0.1",
- "hash": "sha256-ZFhS/nxyEeHjg58P4gLZgEGEB++A2RCTYu2CS2zkYQ4="
- },
- {
- "pname": "Microsoft.Extensions.Logging.EventSource",
- "version": "10.0.1",
- "hash": "sha256-NNIBY/yokZGmvcj+IgBttuAIk8JbjH8pocjPg9gEEOM="
- },
- {
- "pname": "Microsoft.Extensions.Options",
- "version": "10.0.1",
- "hash": "sha256-vBiSS1vqAC7eDrpJNT4H3A9qLikCSAepnNRbry0mKnk="
- },
- {
- "pname": "Microsoft.Extensions.Options",
- "version": "9.0.0",
- "hash": "sha256-DT5euAQY/ItB5LPI8WIp6Dnd0lSvBRP35vFkOXC68ck="
- },
- {
- "pname": "Microsoft.Extensions.Options.ConfigurationExtensions",
- "version": "10.0.1",
- "hash": "sha256-1CNSVXZ3RAH4vzbYDqcQHl9c/YBhuSfrFUXCLIx5/rY="
- },
- {
- "pname": "Microsoft.Extensions.Primitives",
- "version": "10.0.1",
- "hash": "sha256-EXmukq09erT4s+miQpBSYy3IY4HxxKlwEPL43/KoyEc="
- },
- {
- "pname": "Microsoft.Extensions.Primitives",
- "version": "9.0.0",
- "hash": "sha256-ZNLusK1CRuq5BZYZMDqaz04PIKScE2Z7sS2tehU7EJs="
- },
- {
- "pname": "Microsoft.NET.StringTools",
- "version": "17.14.28",
- "hash": "sha256-UzREyvDxkiOQ4cEOQ5UCjkwXGrldIDCcbefECTPGjXI="
- },
- {
- "pname": "Microsoft.NET.StringTools",
- "version": "17.7.2",
- "hash": "sha256-hQE07TCgcQuyu9ZHVq2gPDb0+xe8ECJUdrgh17bJP4o="
- },
- {
- "pname": "Mono.TextTemplating",
- "version": "3.0.0",
- "hash": "sha256-VlgGDvgNZb7MeBbIZ4DE2Nn/j2aD9k6XqNHnASUSDr0="
- },
- {
- "pname": "Newtonsoft.Json",
- "version": "13.0.3",
- "hash": "sha256-hy/BieY4qxBWVVsDqqOPaLy1QobiIapkbrESm6v2PHc="
- },
- {
- "pname": "Npgsql",
- "version": "10.0.0",
- "hash": "sha256-UVKz9dH/rVCCbMyFdqA31RYpht1XgDRLIqUy0Dp9ACQ="
- },
- {
- "pname": "Npgsql.EntityFrameworkCore.PostgreSQL",
- "version": "10.0.0",
- "hash": "sha256-XIJxnTMektQVP1qtslEIGbmBGrIQsvjQjCMRTs9UIbg="
- },
- {
- "pname": "System.CodeDom",
- "version": "6.0.0",
- "hash": "sha256-uPetUFZyHfxjScu5x4agjk9pIhbCkt5rG4Axj25npcQ="
- },
- {
- "pname": "System.CodeDom",
- "version": "7.0.0",
- "hash": "sha256-7IPt39cY+0j0ZcRr/J45xPtEjnSXdUJ/5ai3ebaYQiE="
- },
- {
- "pname": "System.CodeDom",
- "version": "9.0.0",
- "hash": "sha256-578lcBgswW0eM16r0EnJzfGodPx86RxxFoZHc2PSzsw="
- },
- {
- "pname": "System.Composition",
- "version": "9.0.0",
- "hash": "sha256-FehOkQ2u1p8mQ0/wn3cZ+24HjhTLdck8VZYWA1CcgbM="
- },
- {
- "pname": "System.Composition.AttributedModel",
- "version": "9.0.0",
- "hash": "sha256-a7y7H6zj+kmYkllNHA402DoVfY9IaqC3Ooys8Vzl24M="
- },
- {
- "pname": "System.Composition.Convention",
- "version": "9.0.0",
- "hash": "sha256-tw4vE5JRQ60ubTZBbxoMPhtjOQCC3XoDFUH7NHO7o8U="
- },
- {
- "pname": "System.Composition.Hosting",
- "version": "9.0.0",
- "hash": "sha256-oOxU+DPEEfMCuNLgW6wSkZp0JY5gYt44FJNnWt+967s="
- },
- {
- "pname": "System.Composition.Runtime",
- "version": "9.0.0",
- "hash": "sha256-AyIe+di1TqwUBbSJ/sJ8Q8tzsnTN+VBdJw4K8xZz43s="
- },
- {
- "pname": "System.Composition.TypedParts",
- "version": "9.0.0",
- "hash": "sha256-F5fpTUs3Rr7yP/NyIzr+Xn5NdTXXp8rrjBnF9UBBUog="
- },
- {
- "pname": "System.Configuration.ConfigurationManager",
- "version": "7.0.0",
- "hash": "sha256-SgBexTTjRn23uuXvkzO0mz0qOfA23MiS4Wv+qepMLZE="
- },
- {
- "pname": "System.Configuration.ConfigurationManager",
- "version": "9.0.0",
- "hash": "sha256-+pLnTC0YDP6Kjw5DVBiFrV/Q3x5is/+6N6vAtjvhVWk="
- },
- {
- "pname": "System.Diagnostics.EventLog",
- "version": "10.0.1",
- "hash": "sha256-Yn8jT9uKNnknLsSvtV9hyqfz/5x/aKnZt6XtfQOIdVM="
- },
- {
- "pname": "System.Diagnostics.EventLog",
- "version": "9.0.0",
- "hash": "sha256-tPvt6yoAp56sK/fe+/ei8M65eavY2UUhRnbrREj/Ems="
- },
- {
- "pname": "System.Formats.Nrbf",
- "version": "9.0.0",
- "hash": "sha256-c4qf6CocQUZB0ySGQd8s15PXY7xfrjQqMGXxkwytKyw="
- },
- {
- "pname": "System.Reflection.MetadataLoadContext",
- "version": "7.0.0",
- "hash": "sha256-VYl6SFD130K9Aw4eJH16ApJ9Sau4Xu0dcxEip2veuTI="
- },
- {
- "pname": "System.Resources.Extensions",
- "version": "9.0.0",
- "hash": "sha256-y2gLEMuAy6QfEyNJxABC/ayMWGnwlpX735jsUQLktho="
- },
- {
- "pname": "System.Security.Cryptography.Pkcs",
- "version": "7.0.0",
- "hash": "sha256-3J3vL9hcKSuZjT2GKappa2A9p2xJm1nH2asTNAl8ZCA="
- },
- {
- "pname": "System.Security.Cryptography.Pkcs",
- "version": "7.0.2",
- "hash": "sha256-qS5Z/Yo8J+f3ExVX5Qkcpj1Z57oUZqz5rWa1h5bVpl8="
- },
- {
- "pname": "System.Security.Cryptography.Pkcs",
- "version": "9.0.0",
- "hash": "sha256-AjG14mGeSc2Ka4QSelGBM1LrGBW3VJX60lnihKyJjGY="
- },
- {
- "pname": "System.Security.Cryptography.ProtectedData",
- "version": "9.0.0",
- "hash": "sha256-gPgPU7k/InTqmXoRzQfUMEKL3QuTnOKowFqmXTnWaBQ="
- },
- {
- "pname": "System.Security.Cryptography.Xml",
- "version": "7.0.1",
- "hash": "sha256-CH8+JVC8LyCSW75/6ZQ7ecMbSOAE1c16z4dG8JTp01w="
- },
- {
- "pname": "System.Security.Cryptography.Xml",
- "version": "9.0.0",
- "hash": "sha256-SQJWwAFrJUddEU6JiZB52FM9tGjRlJAYH8oYVzG5IJU="
- },
- {
- "pname": "System.Security.Permissions",
- "version": "7.0.0",
- "hash": "sha256-DOFoX+AKRmrkllykHheR8FfUXYx/Ph+I/HYuReQydXI="
- },
- {
- "pname": "System.Security.Permissions",
- "version": "9.0.0",
- "hash": "sha256-BFrA9ottmQtLIAiKiGRbfSUpzNJwuaOCeFRDN4Z0ku0="
- },
- {
- "pname": "System.Windows.Extensions",
- "version": "9.0.0",
- "hash": "sha256-RErD+Ju15qtnwdwB7E0SjjJGAnhXwJyC7UPcl24Z3Vs="
- }
-]
diff --git a/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/RabbitMQConfiguration.cs b/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/RabbitMQConfiguration.cs
deleted file mode 100644
index 78a9add..0000000
--- a/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/RabbitMQConfiguration.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using Microsoft.Extensions.Configuration;
-
-namespace Spacebar.RabbitMqUtilities;
-
-public class RabbitMQConfiguration {
- public RabbitMQConfiguration(IConfiguration configuration) {
- configuration.GetRequiredSection("RabbitMQ").Bind(this);
- }
- public required string Host { get; set; }
- public required string Username { get; set; }
- public required string Password { get; set; }
- public required string Port { get; set; }
-
- public string ToConnectionString() {
- return $"amqp://{Username}:{Password}@{Host}:{Port}";
- }
-}
\ No newline at end of file
diff --git a/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/RabbitMQService.cs b/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/RabbitMQService.cs
deleted file mode 100644
index 0eab6f9..0000000
--- a/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/RabbitMQService.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using RabbitMQ.Client;
-
-namespace Spacebar.RabbitMqUtilities;
-
-public interface IRabbitMQService {
- Task CreateChannel();
-}
-
-public class RabbitMQService(RabbitMQConfiguration config) : IRabbitMQService {
- public async Task CreateChannel() {
- var connection = new ConnectionFactory {
- UserName = config.Username,
- Password = config.Password,
- HostName = config.Host,
- // DispatchConsumersAsync = true
- };
-
- var channel = await connection.CreateConnectionAsync();
- return channel;
- }
-}
\ No newline at end of file
diff --git a/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/Spacebar.RabbitMqUtilities.csproj b/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/Spacebar.RabbitMqUtilities.csproj
deleted file mode 100644
index cbf71a9..0000000
--- a/extra/admin-api/Utilities/Spacebar.RabbitMqUtilities/Spacebar.RabbitMqUtilities.csproj
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- net10.0
- preview
- enable
- enable
-
-
-
-
-
-
-
-
-
-
diff --git a/extra/admin-api/outputs.nix b/extra/admin-api/outputs.nix
index e39739e..20ae962 100644
--- a/extra/admin-api/outputs.nix
+++ b/extra/admin-api/outputs.nix
@@ -64,11 +64,25 @@
proj = self.packages.${system};
in
{
- Spacebar-Models-Db = makeNupkg {
- name = "Spacebar.Models.Db";
- projectFile = "Models/Spacebar.Models.Db/Spacebar.Models.Db.csproj";
- nugetDeps = Models/Spacebar.Models.Db/deps.json;
+ # Interop
+ Spacebar-Interop-Replication-Abstractions = makeNupkg {
+ name = "Spacebar.Interop.Replication.Abstractions";
+ projectFile = "Interop/Spacebar.Interop.Replication.Abstractions/Spacebar.Interop.Replication.Abstractions.csproj";
};
+ Spacebar-Interop-Replication-RabbitMq = makeNupkg {
+ name = "Spacebar.Interop.Replication.RabbitMq";
+ projectFile = "Interop/Spacebar.Interop.Replication.RabbitMq/Spacebar.Interop.Replication.RabbitMq.csproj";
+ nugetDeps = Interop/Spacebar.Interop.Replication.RabbitMq/deps.json;
+ projectReferences = [ proj.Spacebar-Interop-Replication-Abstractions ];
+ };
+ Spacebar-Interop-Replication-UnixSocket = makeNupkg {
+ name = "Spacebar.Interop.Replication.UnixSocket";
+ projectFile = "Interop/Spacebar.Interop.Replication.UnixSocket/Spacebar.Interop.Replication.UnixSocket.csproj";
+ nugetDeps = Interop/Spacebar.Interop.Replication.UnixSocket/deps.json;
+ projectReferences = [ proj.Spacebar-Interop-Replication-Abstractions ];
+ };
+
+ # Models
Spacebar-Models-AdminApi = makeNupkg {
name = "Spacebar.Models.AdminApi";
projectFile = "Models/Spacebar.Models.AdminApi/Spacebar.Models.AdminApi.csproj";
@@ -77,6 +91,13 @@
name = "Spacebar.Models.Config";
projectFile = "Models/Spacebar.Models.Config/Spacebar.Models.Config.csproj";
};
+ Spacebar-Models-Db = makeNupkg {
+ name = "Spacebar.Models.Db";
+ projectFile = "Models/Spacebar.Models.Db/Spacebar.Models.Db.csproj";
+ nugetDeps = Models/Spacebar.Models.Db/deps.json;
+ };
+
+ # Utilities
Spacebar-CleanSettingsRows = makeNupkg {
name = "Spacebar.CleanSettingsRows";
projectFile = "Utilities/Spacebar.CleanSettingsRows/Spacebar.CleanSettingsRows.csproj";
@@ -84,6 +105,8 @@
packNupkg = false;
projectReferences = [ proj.Spacebar-Models-Db ];
};
+
+ # Main projects
Spacebar-AdminApi = makeNupkg {
name = "Spacebar.AdminApi";
nugetDeps = Spacebar.AdminApi/deps.json;
@@ -93,6 +116,14 @@
proj.Spacebar-Models-Db
];
};
+ Spacebar-Cdn = makeNupkg {
+ name = "Spacebar.Cdn";
+ nugetDeps = Spacebar.Cdn/deps.json;
+ packNupkg = false;
+ projectReferences = [
+ proj.Spacebar-Models-Db
+ ];
+ };
# Spacebar-AdminApi-TestClient = makeNupkg {
# name = "Spacebar.AdminApi.TestClient";
# projectFile = "Utilities/Spacebar.AdminApi.TestClient/Spacebar.AdminApi.TestClient.csproj";
diff --git a/extra/admin-api/update-deps.cs b/extra/admin-api/update-deps.cs
new file mode 100755
index 0000000..0922725
--- /dev/null
+++ b/extra/admin-api/update-deps.cs
@@ -0,0 +1,61 @@
+#! /usr/bin/env dotnet
+#:property Nullable=enable
+#:property PublishAOT=false
+#:package ArcaneLibs@1.0.0-preview.20251207*
+
+using ArcaneLibs;
+using ArcaneLibs.Extensions;
+using System.Text.Json;
+
+ProjectDef[] projects = [
+ new("Spacebar-Models-AdminApi", "Models/Spacebar-Models-AdminApi"),
+ new("Spacebar-Models-Config", "Models/Spacebar-Models-Config"),
+ new("Spacebar-Models-Db", "Models/Spacebar-Models-Db"),
+ new("Spacebar-Interop-Replication-Abstractions", "Interop/Spacebar-Interop-Replication-Abstractions"),
+ new("Spacebar-Interop-Replication-RabbitMq", "Interop/Spacebar-Interop-Replication-RabbitMq"),
+ new("Spacebar-Interop-Replication-UnixSocket", "Interop/Spacebar-Interop-Replication-UnixSocket"),
+ new("Spacebar-CleanSettingsRows", "Utilities/Spacebar-CleanSettingsRows"),
+ new("Spacebar-AdminApi", "Spacebar-AdminApi"),
+ new("Spacebar-Cdn", "Spacebar-Cdn"),
+];
+
+Console.WriteLine("==> Getting outputs...");
+var outs = JsonSerializer.Deserialize(Util.GetCommandOutputSync("nix", $"eval --json .#packages.x86_64-linux --apply builtins.attrNames", silent: true, stderr: false));
+Console.WriteLine("==> Updating project dependencies...");
+
+
+// foreach (var proj in projects) {
+// Console.WriteLine(ConsoleUtils.ColoredString($" ==> Updating {proj.NixName} ({proj.Path})", 0x80, 0x80, 0xff));
+// Console.Write(ConsoleUtils.ColoredString($" ==> Getting project files... ", 0x80, 0xff, 0xff));
+// var projectFiles = JsonSerializer.Deserialize(Util.GetCommandOutputSync("nix", $"eval --json .#packages.x86_64-linux.{proj.NixName}.dotnetProjectFiles", silent: true, stderr: false));
+// Console.WriteLine(ConsoleUtils.ColoredString($"{string.Join(", ", projectFiles)}", 0x80, 0xff, 0xff));
+// if (projectFiles.Length != 1) throw new Exception("Invalid project file count?");
+// // Util.RunCommandSync("nix", $"build .#{proj.NixName}.passthru.fetch-deps");
+// // await Task.Delay(250);
+// }
+
+foreach (var outp in outs) {
+ Console.WriteLine(ConsoleUtils.ColoredString($" ==> Updating {outp}...", 0x80, 0x80, 0xff));
+ Console.Write(ConsoleUtils.ColoredString($" ==> Getting project files... ", 0x80, 0xff, 0xff));
+ var projectFiles = JsonSerializer.Deserialize(Util.GetCommandOutputSync("nix", $"eval --json .#packages.x86_64-linux.{outp}.dotnetProjectFiles", silent: true, stderr: false));
+ Console.WriteLine(ConsoleUtils.ColoredString($"{string.Join(", ", projectFiles)}", 0x80, 0xff, 0xff));
+ if (projectFiles.Length != 1) throw new Exception("Invalid project file count?");
+
+ var nugetDepsFilePath = Path.Combine(Path.GetDirectoryName(projectFiles[0]), "deps.json");
+ Console.WriteLine(ConsoleUtils.ColoredString($" ==> {nugetDepsFilePath} exists: {File.Exists(nugetDepsFilePath)}", 0x80, 0xff, 0xff));
+ if (!File.Exists(nugetDepsFilePath)) {
+ Console.WriteLine(ConsoleUtils.ColoredString($" ==> No NuGet deps file, skipping!", 0xff, 0x80, 0x80));
+ continue;
+ }
+
+ Console.WriteLine(ConsoleUtils.ColoredString($" ==> Building fetch-deps script...", 0x80, 0xff, 0x80));
+ Util.RunCommandSync("nix", $"build .#{outp}.passthru.fetch-deps");
+
+ Console.WriteLine(ConsoleUtils.ColoredString($" ==> Running fetch-deps script...", 0x80, 0xff, 0x80));
+ Util.RunCommandSync("./result", nugetDepsFilePath);
+ // await Task.Delay(250);
+}
+
+
+
+public record ProjectDef(string NixName, string Path);