Better joining and leaving

This commit is contained in:
LittleSheep 2025-05-18 20:52:22 +08:00
parent 8d246a19ad
commit a86a0fef37
3 changed files with 31 additions and 14 deletions

View File

@ -4,9 +4,9 @@ namespace DysonNetwork.Sphere.Account;
public enum RelationshipStatus public enum RelationshipStatus
{ {
Pending, Friends = 100,
Friends, Pending = 0,
Blocked Blocked = -100
} }
public class Relationship : ModelBase public class Relationship : ModelBase

View File

@ -18,7 +18,8 @@ public class ChatRoomController(
ChatRoomService crs, ChatRoomService crs,
RealmService rs, RealmService rs,
ActionLogService als, ActionLogService als,
NotificationService nty NotificationService nty,
RelationshipService rels
) : ControllerBase ) : ControllerBase
{ {
[HttpGet("{id:guid}")] [HttpGet("{id:guid}")]
@ -72,6 +73,9 @@ public class ChatRoomController(
var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId); var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId);
if (relatedUser is null) if (relatedUser is null)
return BadRequest("Related user was not found"); 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 // Check if DM already exists between these users
var existingDm = await db.ChatRooms var existingDm = await db.ChatRooms
@ -372,6 +376,9 @@ public class ChatRoomController(
var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId); var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId);
if (relatedUser is null) return BadRequest("Related user was not found"); 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 var chatRoom = await db.ChatRooms
.Where(p => p.Id == roomId) .Where(p => p.Id == roomId)
@ -402,14 +409,13 @@ 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.");
} }
// Check if a user has previously left the chat
var hasExistingMember = await db.ChatMembers var hasExistingMember = 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.LeaveAt == null)
.AnyAsync(); .AnyAsync();
if (hasExistingMember) 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 var newMember = new ChatMember
{ {

View File

@ -10,7 +10,7 @@ namespace DysonNetwork.Sphere.Realm;
[ApiController] [ApiController]
[Route("/realms")] [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}")] [HttpGet("{slug}")]
public async Task<ActionResult<Realm>> GetRealm(string slug) public async Task<ActionResult<Realm>> 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); var relatedUser = await db.Accounts.FindAsync(request.RelatedUserId);
if (relatedUser is null) return BadRequest("Related user was not found"); 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 var realm = await db.Realms
.Where(p => p.Slug == slug) .Where(p => p.Slug == slug)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
@ -84,25 +87,33 @@ public class RealmController(AppDatabase db, RealmService rs, FileService fs, Ac
if (!await rs.IsMemberWithRole(realm.Id, userId, request.Role)) if (!await rs.IsMemberWithRole(realm.Id, userId, 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 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, AccountId = relatedUser.Id,
RealmId = realm.Id, RealmId = realm.Id,
Role = request.Role, Role = request.Role,
}; };
db.RealmMembers.Add(newMember); db.RealmMembers.Add(member);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
als.CreateActionLogFromRequest( als.CreateActionLogFromRequest(
ActionLogType.RealmInvite, ActionLogType.RealmInvite,
new Dictionary<string, object> { { "realm_id", realm.Id }, { "account_id", newMember.AccountId } }, Request new Dictionary<string, object> { { "realm_id", realm.Id }, { "account_id", member.AccountId } }, Request
); );
newMember.Account = relatedUser; member.Account = relatedUser;
await rs.SendInviteNotify(newMember); await rs.SendInviteNotify(member);
return Ok(newMember); return Ok(member);
} }
[HttpPost("invites/{slug}/accept")] [HttpPost("invites/{slug}/accept")]