feat(guild): join_request_accept + reject_join_request
This commit is contained in:
@@ -327,11 +327,40 @@ public sealed class GuildService : IGuildService
|
||||
return GuildOpResult.Ok;
|
||||
}
|
||||
|
||||
public Task<GuildOpResult> AcceptJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
|
||||
=> throw new NotImplementedException();
|
||||
public async Task<GuildOpResult> AcceptJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
|
||||
{
|
||||
var m = await _members.GetMembershipAsync(callerViewerId, ct);
|
||||
if (m is null) return new(GuildOpResultCode.NotInGuild);
|
||||
if (m.Role != GuildRole.Leader) return new(GuildOpResultCode.PermissionDenied);
|
||||
|
||||
public Task<GuildOpResult> RejectJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
|
||||
=> throw new NotImplementedException();
|
||||
var req = await _joinRequests.GetAsync(m.GuildId, applicantViewerId, ct);
|
||||
if (req is null) return new(GuildOpResultCode.JoinRequestNotFound);
|
||||
if (req.Status != GuildJoinRequestStatus.Pending) return new(GuildOpResultCode.JoinRequestAlreadyResolved);
|
||||
|
||||
var cfg = _config.Get<GuildConfig>();
|
||||
var memberCount = await _members.CountByGuildAsync(m.GuildId, ct);
|
||||
if (memberCount >= cfg.MaxMemberNum) return new(GuildOpResultCode.MemberCapReached);
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
await _joinRequests.UpdateStatusAsync(m.GuildId, applicantViewerId, GuildJoinRequestStatus.Accepted, now, ct);
|
||||
await CommitJoinAsync(applicantViewerId, m.GuildId, now, ct);
|
||||
return GuildOpResult.Ok;
|
||||
}
|
||||
|
||||
public async Task<GuildOpResult> RejectJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
|
||||
{
|
||||
var m = await _members.GetMembershipAsync(callerViewerId, ct);
|
||||
if (m is null) return new(GuildOpResultCode.NotInGuild);
|
||||
if (m.Role != GuildRole.Leader) return new(GuildOpResultCode.PermissionDenied);
|
||||
|
||||
var req = await _joinRequests.GetAsync(m.GuildId, applicantViewerId, ct);
|
||||
if (req is null) return new(GuildOpResultCode.JoinRequestNotFound);
|
||||
if (req.Status != GuildJoinRequestStatus.Pending) return new(GuildOpResultCode.JoinRequestAlreadyResolved);
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
await _joinRequests.UpdateStatusAsync(m.GuildId, applicantViewerId, GuildJoinRequestStatus.Rejected, now, ct);
|
||||
return GuildOpResult.Ok;
|
||||
}
|
||||
|
||||
public Task<GuildOpResult> LeaveAsync(long viewerId, CancellationToken ct = default)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
Reference in New Issue
Block a user