// Copyright (C) 2021-present sam (starshines.gay) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . using Catalogger.Backend.Database.Models; using Dapper; using Remora.Rest.Core; namespace Catalogger.Backend.Database.Repositories; public class GuildRepository(ILogger logger, DatabaseConnection conn) : IDisposable, IAsyncDisposable { private readonly ILogger _logger = logger.ForContext(); public async Task GetAsync(Optional id) => await GetAsync(id.Value.Value); public async Task GetAsync(Snowflake id) => await GetAsync(id.Value); public async Task GetAsync(ulong id) { _logger.Debug("Getting guild config for {GuildId}", id); var guild = await conn.QueryFirstOrDefaultAsync( "select * from guilds where id = @Id", new { Id = id } ); if (guild == null) throw new CataloggerError("Guild not found, was not initialized during guild create"); return guild; } public async Task IsGuildKnown(ulong id) => await conn.ExecuteScalarAsync( "select exists(select id from guilds where id = @Id)", new { Id = id } ); public async Task AddGuildAsync(ulong id) => await conn.ExecuteAsync( """ insert into guilds (id, key_roles, banned_systems, channels) values (@Id, array[]::bigint[], array[]::text[], array[]::bigint[], @Channels) on conflict do nothing """, new { Id = id, Channels = new Guild.ChannelConfig() } ); public async Task BanSystemAsync(Snowflake guildId, string hid, Guid uuid) => await conn.ExecuteAsync( "update guilds set banned_systems = array_cat(banned_systems, @SystemIds) where id = @GuildId", new { GuildId = guildId.Value, SystemIds = (string[])[hid, uuid.ToString()] } ); public async Task UnbanSystemAsync(Snowflake guildId, string hid, Guid uuid) => await conn.ExecuteAsync( "update guilds set banned_systems = array_remove(array_remove(banned_systems, @Hid), @Uuid) where id = @Id", new { GuildId = guildId.Value, Hid = hid, Uuid = uuid.ToString(), } ); public async Task AddKeyRoleAsync(Snowflake guildId, Snowflake roleId) => await conn.ExecuteAsync( "update guilds set key_roles = array_append(key_roles, @RoleId) where id = @GuildId", new { GuildId = guildId.Value, RoleId = roleId.Value } ); public async Task RemoveKeyRoleAsync(Snowflake guildId, Snowflake roleId) => await conn.ExecuteAsync( "update guilds set key_roles = array_remove(key_roles, @RoleId) where id = @GuildId", new { GuildId = guildId.Value, RoleId = roleId.Value } ); public async Task UpdateChannelConfigAsync(Snowflake id, Guild.ChannelConfig config) => await conn.ExecuteAsync( "update guilds set channels = @Channels::jsonb where id = @Id", new { Id = id.Value, Channels = config } ); public void Dispose() { conn.Dispose(); GC.SuppressFinalize(this); } public async ValueTask DisposeAsync() { await conn.DisposeAsync(); GC.SuppressFinalize(this); } }