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);