diff --git a/src/GmRelay.DiscordBot/Infrastructure/Discord/DiscordPermissionChecker.cs b/src/GmRelay.DiscordBot/Infrastructure/Discord/DiscordPermissionChecker.cs new file mode 100644 index 0000000..d9b745b --- /dev/null +++ b/src/GmRelay.DiscordBot/Infrastructure/Discord/DiscordPermissionChecker.cs @@ -0,0 +1,32 @@ +namespace GmRelay.DiscordBot.Infrastructure.Discord; + +public sealed class DiscordPermissionChecker +{ + private const ulong AdministratorPermission = 0x8; + + public bool CanManageSchedule( + ulong guildOwnerId, + ulong userId, + IEnumerable userRoles, + IEnumerable dbManagerUserIds) + { + if (userId == guildOwnerId) + return true; + + if (dbManagerUserIds.Contains(userId)) + return true; + + return false; + } + + public bool CanManageSchedule(ulong guildOwnerId, ulong userId, IEnumerable dbManagerUserIds, ulong resolvedPermissions) + { + if (userId == guildOwnerId) + return true; + + if (dbManagerUserIds.Contains(userId)) + return true; + + return (resolvedPermissions & AdministratorPermission) == AdministratorPermission; + } +} diff --git a/tests/GmRelay.Bot.Tests/Discord/DiscordPermissionCheckerTests.cs b/tests/GmRelay.Bot.Tests/Discord/DiscordPermissionCheckerTests.cs new file mode 100644 index 0000000..64815fa --- /dev/null +++ b/tests/GmRelay.Bot.Tests/Discord/DiscordPermissionCheckerTests.cs @@ -0,0 +1,59 @@ +using GmRelay.DiscordBot.Infrastructure.Discord; + +namespace GmRelay.Bot.Tests.Discord; + +public sealed class DiscordPermissionCheckerTests +{ + [Fact] + public void CanManageSchedule_WhenUserIsGuildOwner_ReturnsTrue() + { + var checker = new DiscordPermissionChecker(); + var result = checker.CanManageSchedule( + guildOwnerId: 123456789ul, + userId: 123456789ul, + userRoles: Array.Empty(), + dbManagerUserIds: Array.Empty()); + + Assert.True(result); + } + + [Fact] + public void CanManageSchedule_WhenUserHasAdministratorPermission_ReturnsTrue() + { + var checker = new DiscordPermissionChecker(); + var result = checker.CanManageSchedule( + guildOwnerId: 123456789ul, + userId: 987654321ul, + dbManagerUserIds: Array.Empty(), + resolvedPermissions: 0x8); // Administrator + + Assert.True(result); + } + + [Fact] + public void CanManageSchedule_WhenUserIsDbManager_ReturnsTrue() + { + var checker = new DiscordPermissionChecker(); + var managerId = 555ul; + var result = checker.CanManageSchedule( + guildOwnerId: 123456789ul, + userId: managerId, + userRoles: Array.Empty(), + dbManagerUserIds: new[] { managerId }); + + Assert.True(result); + } + + [Fact] + public void CanManageSchedule_WhenRegularUser_ReturnsFalse() + { + var checker = new DiscordPermissionChecker(); + var result = checker.CanManageSchedule( + guildOwnerId: 123456789ul, + userId: 111ul, + userRoles: Array.Empty(), + dbManagerUserIds: new[] { 222ul }); + + Assert.False(result); + } +}