✨ Better joining and leaving
This commit is contained in:
parent
8d246a19ad
commit
a86a0fef37
@ -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
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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")]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user