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