🐛 Fix members related operations

This commit is contained in:
2025-10-03 17:07:57 +08:00
parent 7a5f410e36
commit 2e5ef8ff94
2 changed files with 93 additions and 22 deletions

View File

@@ -645,14 +645,37 @@ public class ChatRoomController(
return StatusCode(403, "You cannot invite member with higher permission than yours."); return StatusCode(403, "You cannot invite member with higher permission than yours.");
} }
var hasExistingMember = await db.ChatMembers var existingMember = await db.ChatMembers
.Where(m => m.AccountId == request.RelatedUserId) .Where(m => m.AccountId == request.RelatedUserId)
.Where(m => m.ChatRoomId == roomId) .Where(m => m.ChatRoomId == roomId)
.Where(m => m.JoinedAt != null && m.LeaveAt == null) .FirstOrDefaultAsync();
.AnyAsync(); if (existingMember != null)
if (hasExistingMember) {
if (existingMember.LeaveAt == null)
return BadRequest("This user has been joined the chat cannot be invited again."); return BadRequest("This user has been joined the chat cannot be invited again.");
existingMember.LeaveAt = null;
existingMember.JoinedAt = null;
db.ChatMembers.Update(existingMember);
await db.SaveChangesAsync();
await _SendInviteNotify(existingMember, currentUser);
_ = als.CreateActionLogAsync(new CreateActionLogRequest
{
Action = "chatrooms.invite",
Meta =
{
{ "chatroom_id", Google.Protobuf.WellKnownTypes.Value.ForString(chatRoom.Id.ToString()) },
{ "account_id", Google.Protobuf.WellKnownTypes.Value.ForString(relatedUser.Id.ToString()) }
},
AccountId = currentUser.Id,
UserAgent = Request.Headers.UserAgent,
IpAddress = Request.HttpContext.Connection.RemoteIpAddress?.ToString()
});
return Ok(existingMember);
}
var newMember = new SnChatMember var newMember = new SnChatMember
{ {
AccountId = Guid.Parse(relatedUser.Id), AccountId = Guid.Parse(relatedUser.Id),
@@ -934,15 +957,15 @@ public class ChatRoomController(
if (existingMember != null) if (existingMember != null)
{ {
if (existingMember.LeaveAt == null) if (existingMember.LeaveAt == null)
{ return BadRequest("You are already a member of this chat room.");
existingMember.LeaveAt = null; existingMember.LeaveAt = null;
db.Update(existingMember); db.Update(existingMember);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
_ = crs.PurgeRoomMembersCache(roomId); _ = crs.PurgeRoomMembersCache(roomId);
return Ok(existingMember); return Ok(existingMember);
} }
return BadRequest("You are already a member of this chat room.");
}
var newMember = new SnChatMember var newMember = new SnChatMember
{ {

View File

@@ -42,8 +42,7 @@ public class RealmController(
var members = await db.RealmMembers var members = await db.RealmMembers
.Where(m => m.AccountId == accountId) .Where(m => m.AccountId == accountId)
.Where(m => m.JoinedAt != null) .Where(m => m.JoinedAt != null && m.LeaveAt == null)
.Where(m => m.LeaveAt == null)
.Include(e => e.Realm) .Include(e => e.Realm)
.Select(m => m.Realm) .Select(m => m.Realm)
.ToListAsync(); .ToListAsync();
@@ -102,14 +101,38 @@ public class RealmController(
if (!await rs.IsMemberWithRole(realm.Id, accountId, request.Role)) if (!await rs.IsMemberWithRole(realm.Id, accountId, request.Role))
return StatusCode(403, "You cannot invite member has higher permission than yours."); return StatusCode(403, "You cannot invite member has higher permission than yours.");
var hasExistingMember = await db.RealmMembers var existingMember = await db.RealmMembers
.Where(m => m.AccountId == Guid.Parse(relatedUser.Id)) .Where(m => m.AccountId == Guid.Parse(relatedUser.Id))
.Where(m => m.RealmId == realm.Id) .Where(m => m.RealmId == realm.Id)
.Where(m => m.JoinedAt != null && m.LeaveAt == null) .FirstOrDefaultAsync();
.AnyAsync(); if (existingMember != null)
if (hasExistingMember) {
if (existingMember.LeaveAt == null)
return BadRequest("This user already in the realm cannot be invited again."); return BadRequest("This user already in the realm cannot be invited again.");
existingMember.LeaveAt = null;
existingMember.JoinedAt = null;
db.RealmMembers.Update(existingMember);
await db.SaveChangesAsync();
await rs.SendInviteNotify(existingMember);
_ = als.CreateActionLogAsync(new CreateActionLogRequest
{
Action = "realms.members.invite",
Meta =
{
{ "realm_id", Value.ForString(realm.Id.ToString()) },
{ "account_id", Value.ForString(existingMember.AccountId.ToString()) },
{ "role", Value.ForNumber(request.Role) }
},
AccountId = currentUser.Id,
UserAgent = Request.Headers.UserAgent.ToString(),
IpAddress = Request.HttpContext.Connection.RemoteIpAddress?.ToString() ?? ""
});
return Ok(existingMember);
}
var member = new SnRealmMember var member = new SnRealmMember
{ {
AccountId = Guid.Parse(relatedUser.Id), AccountId = Guid.Parse(relatedUser.Id),
@@ -556,11 +579,36 @@ public class RealmController(
return StatusCode(403, "Only community realms can be joined without invitation."); return StatusCode(403, "Only community realms can be joined without invitation.");
var existingMember = await db.RealmMembers var existingMember = await db.RealmMembers
.Where(m => m.AccountId == Guid.Parse(currentUser.Id) && m.RealmId == realm.Id && m.JoinedAt != null && m.LeaveAt == null) .Where(m => m.AccountId == Guid.Parse(currentUser.Id) && m.RealmId == realm.Id)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (existingMember is not null) if (existingMember is not null)
{
if (existingMember.LeaveAt == null)
return BadRequest("You are already a member of this realm."); return BadRequest("You are already a member of this realm.");
existingMember.LeaveAt = null;
existingMember.JoinedAt = SystemClock.Instance.GetCurrentInstant();
db.Update(existingMember);
await db.SaveChangesAsync();
_ = als.CreateActionLogAsync(new CreateActionLogRequest
{
Action = "realms.members.join",
Meta =
{
{ "realm_id", Value.ForString(realm.Id.ToString()) },
{ "account_id", Value.ForString(currentUser.Id) },
{ "is_community", Value.ForBool(realm.IsCommunity) }
},
AccountId = currentUser.Id,
UserAgent = Request.Headers.UserAgent.ToString(),
IpAddress = Request.HttpContext.Connection.RemoteIpAddress?.ToString() ?? ""
});
return Ok(existingMember);
}
var member = new SnRealmMember var member = new SnRealmMember
{ {
AccountId = Guid.Parse(currentUser.Id), AccountId = Guid.Parse(currentUser.Id),