feat: orphaned data cleanup, file deletion on message/account removal, and group DM improvements

- Add fileCleanup utility to delete uploaded files from disk on message/account deletion
- Add migration to clean orphaned DM channels, attachments, reactions, read states, and stale moderator refs
- Add FK constraints on dm_message_id in attachments and dm_reactions schema
- Make bans.bannedBy and voiceRestrictions.moderatorId nullable for deleted moderators
- Transfer group DM ownership on member leave or account deletion
- Fully clean up orphaned DM channels (zero members) including files
- Add "Leave Group" context menu for group DMs in ChannelSidebar
- Add leaveDm action to spaceStore
This commit is contained in:
Jannis Braun
2026-03-11 16:54:34 +01:00
parent 8c8767ba2c
commit 1889d45a07
8 changed files with 328 additions and 14 deletions
+10
View File
@@ -46,6 +46,7 @@ interface SpaceState {
addDmMember: (dmChannelId: string, user: User) => void;
removeDmMember: (dmChannelId: string, userId: string) => void;
closeDm: (id: string) => Promise<void>;
leaveDm: (id: string) => Promise<void>;
loadSpaces: () => Promise<void>;
loadSpaceDetail: (spaceId: string) => Promise<void>;
loadDmChannels: () => Promise<void>;
@@ -130,6 +131,15 @@ export const useSpaceStore = create<SpaceState>((set, get) => ({
}));
},
leaveDm: async (id) => {
const origin = get().channelOriginMap.get(id) || '';
const targetApi = getApiForOrigin(origin);
await targetApi.dm.leave(id);
set((state) => ({
dmChannels: state.dmChannels.filter(c => c.id !== id)
}));
},
loadSpaces: async () => {
try {
const spaces =await api.spaces.list();