🐛 Add realm clean up after deleted
This commit is contained in:
		@@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Mvc;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using NodaTime;
 | 
			
		||||
using Google.Protobuf.WellKnownTypes;
 | 
			
		||||
using Microsoft.AspNetCore.Http.HttpResults;
 | 
			
		||||
 | 
			
		||||
namespace DysonNetwork.Sphere.Realm;
 | 
			
		||||
 | 
			
		||||
@@ -260,16 +261,16 @@ public class RealmController(
 | 
			
		||||
        // }
 | 
			
		||||
        // else
 | 
			
		||||
        // {
 | 
			
		||||
            var total = await query.CountAsync();
 | 
			
		||||
            Response.Headers["X-Total"] = total.ToString();
 | 
			
		||||
        var total = await query.CountAsync();
 | 
			
		||||
        Response.Headers["X-Total"] = total.ToString();
 | 
			
		||||
 | 
			
		||||
            var members = await query
 | 
			
		||||
                .OrderBy(m => m.CreatedAt)
 | 
			
		||||
                .Skip(offset)
 | 
			
		||||
                .Take(take)
 | 
			
		||||
                .ToListAsync();
 | 
			
		||||
        var members = await query
 | 
			
		||||
            .OrderBy(m => m.CreatedAt)
 | 
			
		||||
            .Skip(offset)
 | 
			
		||||
            .Take(take)
 | 
			
		||||
            .ToListAsync();
 | 
			
		||||
 | 
			
		||||
            return Ok(await rs.LoadMemberAccounts(members));
 | 
			
		||||
        return Ok(await rs.LoadMemberAccounts(members));
 | 
			
		||||
        // }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -374,6 +375,7 @@ public class RealmController(
 | 
			
		||||
            if (pictureResult is null) return BadRequest("Invalid picture id, unable to find the file on cloud.");
 | 
			
		||||
            realm.Picture = CloudFileReferenceObject.FromProtoValue(pictureResult);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (request.BackgroundId is not null)
 | 
			
		||||
        {
 | 
			
		||||
            var backgroundResult = await files.GetFileAsync(new GetFileRequest { Id = request.BackgroundId });
 | 
			
		||||
@@ -670,6 +672,8 @@ public class RealmController(
 | 
			
		||||
    {
 | 
			
		||||
        if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized();
 | 
			
		||||
 | 
			
		||||
        var transaction = await db.Database.BeginTransactionAsync();
 | 
			
		||||
 | 
			
		||||
        var realm = await db.Realms
 | 
			
		||||
            .Where(r => r.Slug == slug)
 | 
			
		||||
            .FirstOrDefaultAsync();
 | 
			
		||||
@@ -678,8 +682,37 @@ public class RealmController(
 | 
			
		||||
        if (!await rs.IsMemberWithRole(realm.Id, Guid.Parse(currentUser.Id), RealmMemberRole.Owner))
 | 
			
		||||
            return StatusCode(403, "Only the owner can delete this realm.");
 | 
			
		||||
 | 
			
		||||
        db.Realms.Remove(realm);
 | 
			
		||||
        await db.SaveChangesAsync();
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            var chats = await db.ChatRooms
 | 
			
		||||
                .Where(c => c.RealmId == realm.Id)
 | 
			
		||||
                .Select(c => c.Id)
 | 
			
		||||
                .ToListAsync();
 | 
			
		||||
            
 | 
			
		||||
            db.Realms.Remove(realm);
 | 
			
		||||
            await db.SaveChangesAsync();
 | 
			
		||||
 | 
			
		||||
            var now = SystemClock.Instance.GetCurrentInstant();
 | 
			
		||||
            await db.RealmMembers
 | 
			
		||||
                .Where(m => m.RealmId == realm.Id)
 | 
			
		||||
                .ExecuteUpdateAsync(m => m.SetProperty(m => m.DeletedAt, now));
 | 
			
		||||
            await db.ChatRooms
 | 
			
		||||
                .Where(c => c.RealmId == realm.Id)
 | 
			
		||||
                .ExecuteUpdateAsync(c => c.SetProperty(c => c.DeletedAt, now));
 | 
			
		||||
            await db.ChatMessages
 | 
			
		||||
                .Where(m => chats.Contains(m.ChatRoomId))
 | 
			
		||||
                .ExecuteUpdateAsync(m => m.SetProperty(m => m.DeletedAt, now));
 | 
			
		||||
            await db.ChatMembers
 | 
			
		||||
                .Where(m => chats.Contains(m.ChatRoomId))
 | 
			
		||||
                .ExecuteUpdateAsync(m => m.SetProperty(m => m.DeletedAt, now));
 | 
			
		||||
            await db.SaveChangesAsync();
 | 
			
		||||
            await transaction.CommitAsync();
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception)
 | 
			
		||||
        {
 | 
			
		||||
            await transaction.RollbackAsync();
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _ = als.CreateActionLogAsync(new CreateActionLogRequest
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user