feat(discord): add DiscordPermissionChecker for session management rights
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -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<ulong> userRoles,
|
||||
IEnumerable<ulong> dbManagerUserIds)
|
||||
{
|
||||
if (userId == guildOwnerId)
|
||||
return true;
|
||||
|
||||
if (dbManagerUserIds.Contains(userId))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool CanManageSchedule(ulong guildOwnerId, ulong userId, IEnumerable<ulong> dbManagerUserIds, ulong resolvedPermissions)
|
||||
{
|
||||
if (userId == guildOwnerId)
|
||||
return true;
|
||||
|
||||
if (dbManagerUserIds.Contains(userId))
|
||||
return true;
|
||||
|
||||
return (resolvedPermissions & AdministratorPermission) == AdministratorPermission;
|
||||
}
|
||||
}
|
||||
@@ -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<ulong>(),
|
||||
dbManagerUserIds: Array.Empty<ulong>());
|
||||
|
||||
Assert.True(result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanManageSchedule_WhenUserHasAdministratorPermission_ReturnsTrue()
|
||||
{
|
||||
var checker = new DiscordPermissionChecker();
|
||||
var result = checker.CanManageSchedule(
|
||||
guildOwnerId: 123456789ul,
|
||||
userId: 987654321ul,
|
||||
dbManagerUserIds: Array.Empty<ulong>(),
|
||||
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<ulong>(),
|
||||
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<ulong>(),
|
||||
dbManagerUserIds: new[] { 222ul });
|
||||
|
||||
Assert.False(result);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user