feat: freeze config backup model

the database model will probably change in the future, but backups should
keep the same model even when that happens.
This commit is contained in:
sam 2024-11-14 02:45:20 +01:00
parent cbb07f9cc3
commit d48ab7e16e
Signed by: sam
GPG key ID: 5F3C3C1B3166639D
2 changed files with 117 additions and 21 deletions

View file

@ -36,10 +36,7 @@ public partial class GuildsController
[Authorize] [Authorize]
[HttpPost("config")] [HttpPost("config")]
public async Task<IActionResult> ImportConfigAsync( public async Task<IActionResult> ImportConfigAsync(string id, [FromBody] ConfigExport export)
string id,
[FromBody] GuildConfigExport export
)
{ {
var (guildId, _) = await ParseGuildAsync(id); var (guildId, _) = await ParseGuildAsync(id);
if (export.Id != guildId.Value) if (export.Id != guildId.Value)
@ -56,7 +53,7 @@ public partial class GuildsController
await guildRepository.ImportConfigAsync( await guildRepository.ImportConfigAsync(
guildId.Value, guildId.Value,
export.Channels, export.Channels.ToGuildConfig(),
export.BannedSystems, export.BannedSystems,
export.KeyRoles export.KeyRoles
); );
@ -86,32 +83,19 @@ public partial class GuildsController
return NoContent(); return NoContent();
} }
private async Task<GuildConfigExport> ToExport(Database.Models.Guild config) private async Task<ConfigExport> ToExport(Database.Models.Guild config)
{ {
var id = DiscordSnowflake.New(config.Id); var id = DiscordSnowflake.New(config.Id);
var invites = await inviteRepository.GetGuildInvitesAsync(id); var invites = await inviteRepository.GetGuildInvitesAsync(id);
var watchlist = await watchlistRepository.GetGuildWatchlistAsync(id); var watchlist = await watchlistRepository.GetGuildWatchlistAsync(id);
return new GuildConfigExport( return new ConfigExport(
config.Id, config.Id,
config.Channels, ChannelsBackup.FromGuildConfig(config.Channels),
config.BannedSystems, config.BannedSystems,
config.KeyRoles, config.KeyRoles,
invites.Select(i => new InviteExport(i.Code, i.Name)), invites.Select(i => new InviteExport(i.Code, i.Name)),
watchlist.Select(w => new WatchlistExport(w.UserId, w.AddedAt, w.ModeratorId, w.Reason)) watchlist.Select(w => new WatchlistExport(w.UserId, w.AddedAt, w.ModeratorId, w.Reason))
); );
} }
public record GuildConfigExport(
ulong Id,
Database.Models.Guild.ChannelConfig Channels,
string[] BannedSystems,
ulong[] KeyRoles,
IEnumerable<InviteExport> Invites,
IEnumerable<WatchlistExport> Watchlist
);
public record InviteExport(string Code, string Name);
public record WatchlistExport(ulong UserId, Instant AddedAt, ulong ModeratorId, string Reason);
} }

View file

@ -0,0 +1,112 @@
using NodaTime;
namespace Catalogger.Backend.Database.Models;
public record ConfigExport(
ulong Id,
ChannelsBackup Channels,
string[] BannedSystems,
ulong[] KeyRoles,
IEnumerable<InviteExport> Invites,
IEnumerable<WatchlistExport> Watchlist
);
public record InviteExport(string Code, string Name);
public record WatchlistExport(ulong UserId, Instant AddedAt, ulong ModeratorId, string Reason);
public class ChannelsBackup
{
public List<ulong> IgnoredChannels { get; init; } = [];
public List<ulong> IgnoredUsers { get; init; } = [];
public Dictionary<ulong, List<ulong>> IgnoredUsersPerChannel { get; init; } = [];
public Dictionary<ulong, ulong> Redirects { get; init; } = [];
public ulong GuildUpdate { get; init; }
public ulong GuildEmojisUpdate { get; init; }
public ulong GuildRoleCreate { get; init; }
public ulong GuildRoleUpdate { get; init; }
public ulong GuildRoleDelete { get; init; }
public ulong ChannelCreate { get; init; }
public ulong ChannelUpdate { get; init; }
public ulong ChannelDelete { get; init; }
public ulong GuildMemberAdd { get; init; }
public ulong GuildMemberUpdate { get; init; }
public ulong GuildKeyRoleUpdate { get; init; }
public ulong GuildMemberNickUpdate { get; init; }
public ulong GuildMemberAvatarUpdate { get; init; }
public ulong GuildMemberTimeout { get; init; }
public ulong GuildMemberRemove { get; init; }
public ulong GuildMemberKick { get; init; }
public ulong GuildBanAdd { get; init; }
public ulong GuildBanRemove { get; init; }
public ulong InviteCreate { get; init; }
public ulong InviteDelete { get; init; }
public ulong MessageUpdate { get; init; }
public ulong MessageDelete { get; init; }
public ulong MessageDeleteBulk { get; init; }
public Guild.ChannelConfig ToGuildConfig() =>
new()
{
IgnoredChannels = IgnoredChannels,
IgnoredUsers = IgnoredUsers,
IgnoredUsersPerChannel = IgnoredUsersPerChannel,
Redirects = Redirects,
GuildUpdate = GuildUpdate,
GuildEmojisUpdate = GuildEmojisUpdate,
GuildRoleCreate = GuildRoleCreate,
GuildRoleUpdate = GuildRoleUpdate,
GuildRoleDelete = GuildRoleDelete,
ChannelCreate = ChannelCreate,
ChannelUpdate = ChannelUpdate,
ChannelDelete = ChannelDelete,
GuildMemberAdd = GuildMemberAdd,
GuildMemberUpdate = GuildMemberUpdate,
GuildKeyRoleUpdate = GuildKeyRoleUpdate,
GuildMemberNickUpdate = GuildMemberNickUpdate,
GuildMemberAvatarUpdate = GuildMemberAvatarUpdate,
GuildMemberTimeout = GuildMemberTimeout,
GuildMemberRemove = GuildMemberRemove,
GuildMemberKick = GuildMemberKick,
GuildBanAdd = GuildBanAdd,
GuildBanRemove = GuildBanRemove,
InviteCreate = InviteCreate,
InviteDelete = InviteDelete,
MessageUpdate = MessageUpdate,
MessageDelete = MessageDelete,
MessageDeleteBulk = MessageDeleteBulk,
};
public static ChannelsBackup FromGuildConfig(Guild.ChannelConfig channels) =>
new()
{
IgnoredChannels = channels.IgnoredChannels,
IgnoredUsers = channels.IgnoredUsers,
IgnoredUsersPerChannel = channels.IgnoredUsersPerChannel,
Redirects = channels.Redirects,
GuildUpdate = channels.GuildUpdate,
GuildEmojisUpdate = channels.GuildEmojisUpdate,
GuildRoleCreate = channels.GuildRoleCreate,
GuildRoleUpdate = channels.GuildRoleUpdate,
GuildRoleDelete = channels.GuildRoleDelete,
ChannelCreate = channels.ChannelCreate,
ChannelUpdate = channels.ChannelUpdate,
ChannelDelete = channels.ChannelDelete,
GuildMemberAdd = channels.GuildMemberAdd,
GuildMemberUpdate = channels.GuildMemberUpdate,
GuildKeyRoleUpdate = channels.GuildKeyRoleUpdate,
GuildMemberNickUpdate = channels.GuildMemberNickUpdate,
GuildMemberAvatarUpdate = channels.GuildMemberAvatarUpdate,
GuildMemberTimeout = channels.GuildMemberTimeout,
GuildMemberRemove = channels.GuildMemberRemove,
GuildMemberKick = channels.GuildMemberKick,
GuildBanAdd = channels.GuildBanAdd,
GuildBanRemove = channels.GuildBanRemove,
InviteCreate = channels.InviteCreate,
InviteDelete = channels.InviteDelete,
MessageUpdate = channels.MessageUpdate,
MessageDelete = channels.MessageDelete,
MessageDeleteBulk = channels.MessageDeleteBulk,
};
}