From a86a0fef377d53d54fc7967688048779a8e3050e Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 18 May 2025 20:52:22 +0800 Subject: [PATCH] :sparkles: Better joining and leaving --- DysonNetwork.Sphere/Account/Relationship.cs | 6 ++--- .../Chat/ChatRoomController.cs | 14 ++++++++--- DysonNetwork.Sphere/Realm/RealmController.cs | 25 +++++++++++++------ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/DysonNetwork.Sphere/Account/Relationship.cs b/DysonNetwork.Sphere/Account/Relationship.cs index 0dd6a0d..cc92f5f 100644 --- a/DysonNetwork.Sphere/Account/Relationship.cs +++ b/DysonNetwork.Sphere/Account/Relationship.cs @@ -4,9 +4,9 @@ namespace DysonNetwork.Sphere.Account; public enum RelationshipStatus { - Pending, - Friends, - Blocked + Friends = 100, + Pending = 0, + Blocked = -100 } public class Relationship : ModelBase diff --git a/DysonNetwork.Sphere/Chat/ChatRoomController.cs b/DysonNetwork.Sphere/Chat/ChatRoomController.cs index 246ca1e..5df6cb2 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomController.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomController.cs @@ -18,7 +18,8 @@ public class ChatRoomController( ChatRoomService crs, RealmService rs, ActionLogService als, - NotificationService nty + NotificationService nty, + RelationshipService rels ) : ControllerBase { [HttpGet("{id:guid}")] @@ -72,6 +73,9 @@ public class ChatRoomController( var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId); if (relatedUser is null) return BadRequest("Related user was not found"); + + if (await rels.HasRelationshipWithStatus(currentUser.Id, relatedUser.Id, RelationshipStatus.Blocked)) + return StatusCode(403, "You cannot create direct message with a user that blocked you."); // Check if DM already exists between these users var existingDm = await db.ChatRooms @@ -372,6 +376,9 @@ public class ChatRoomController( var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId); if (relatedUser is null) return BadRequest("Related user was not found"); + + if (await rels.HasRelationshipWithStatus(currentUser.Id, relatedUser.Id, RelationshipStatus.Blocked)) + return StatusCode(403, "You cannot invite a user that blocked you."); var chatRoom = await db.ChatRooms .Where(p => p.Id == roomId) @@ -402,14 +409,13 @@ public class ChatRoomController( return StatusCode(403, "You cannot invite member with higher permission than yours."); } - // Check if a user has previously left the chat var hasExistingMember = await db.ChatMembers .Where(m => m.AccountId == request.RelatedUserId) .Where(m => m.ChatRoomId == roomId) + .Where(m => m.LeaveAt == null) .AnyAsync(); - if (hasExistingMember) - return BadRequest("This user has been joined the chat or leave cannot be invited again."); + return BadRequest("This user has been joined the chat cannot be invited again."); var newMember = new ChatMember { diff --git a/DysonNetwork.Sphere/Realm/RealmController.cs b/DysonNetwork.Sphere/Realm/RealmController.cs index fb01faa..97a35ce 100644 --- a/DysonNetwork.Sphere/Realm/RealmController.cs +++ b/DysonNetwork.Sphere/Realm/RealmController.cs @@ -10,7 +10,7 @@ namespace DysonNetwork.Sphere.Realm; [ApiController] [Route("/realms")] -public class RealmController(AppDatabase db, RealmService rs, FileService fs, ActionLogService als) : Controller +public class RealmController(AppDatabase db, RealmService rs, FileService fs, RelationshipService rels, ActionLogService als) : Controller { [HttpGet("{slug}")] public async Task> GetRealm(string slug) @@ -76,6 +76,9 @@ public class RealmController(AppDatabase db, RealmService rs, FileService fs, Ac var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId); if (relatedUser is null) return BadRequest("Related user was not found"); + if (await rels.HasRelationshipWithStatus(currentUser.Id, relatedUser.Id, RelationshipStatus.Blocked)) + return StatusCode(403, "You cannot invite a user that blocked you."); + var realm = await db.Realms .Where(p => p.Slug == slug) .FirstOrDefaultAsync(); @@ -84,25 +87,33 @@ public class RealmController(AppDatabase db, RealmService rs, FileService fs, Ac if (!await rs.IsMemberWithRole(realm.Id, userId, request.Role)) return StatusCode(403, "You cannot invite member has higher permission than yours."); - var newMember = new RealmMember + var hasExistingMember = await db.RealmMembers + .Where(m => m.AccountId == request.RelatedUserId) + .Where(m => m.RealmId == realm.Id) + .Where(m => m.LeaveAt == null) + .AnyAsync(); + if (hasExistingMember) + return BadRequest("This user has been joined the realm or leave cannot be invited again."); + + var member = new RealmMember { AccountId = relatedUser.Id, RealmId = realm.Id, Role = request.Role, }; - db.RealmMembers.Add(newMember); + db.RealmMembers.Add(member); await db.SaveChangesAsync(); als.CreateActionLogFromRequest( ActionLogType.RealmInvite, - new Dictionary { { "realm_id", realm.Id }, { "account_id", newMember.AccountId } }, Request + new Dictionary { { "realm_id", realm.Id }, { "account_id", member.AccountId } }, Request ); - newMember.Account = relatedUser; - await rs.SendInviteNotify(newMember); + member.Account = relatedUser; + await rs.SendInviteNotify(member); - return Ok(newMember); + return Ok(member); } [HttpPost("invites/{slug}/accept")]