๐ Task TODOLIST
- [x] user Table์์ user ์ ๋ณด(user Id) ๊ฐ์ ธ์์ chatting๊ณผ ์ฐ๊ฒฐ์ํค๊ธฐ
- [x] RLS ์ถ๊ฐํ์ฌ ๋ด๊ฐ ์ด ๊ธ๋ง ์ญ์ ํ ์ ์๋๋ก
- [x] ์ฑํ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ + Realtime์ผ๋ก ์ญ์ ๊ตฌ๋ ํ๊ธฐ
1. user Table์์ user ์ ๋ณด(user Id) ๊ฐ์ ธ์์ chatting๊ณผ ์ฐ๊ฒฐ์ํค๊ธฐ
๋จผ์ SQL์ ์ผ์ข ์ธ progreSQL์ ์ ๊ณตํ๋ Supabse์์
์ฑํ ์ ์ฐ์ด๋ message table์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด ์ค send_from ์ด๋ผ๋ ์ปฌ๋ผ์ user table์ user_id์์ ๊ฐ์ ธ์์ผ ํ๊ธฐ ๋๋ฌธ์ foreign Key๋ก ๋ฑ๋กํ๋ค.
user ํ ์ด๋ธ์์ ํด๋น ์ ์ ์ ์ ๋ณด๊ฐ update ๋๊ฑฐ๋ delete ๋ ์ ๊ฐ์ด ๋ฐ์๋๊ธฐ๋ฅผ ์ํด์ Cascade๋ก ๋ฌถ์ด์คฌ๋ค.
2. RLS ์ถ๊ฐํ์ฌ ๋ด๊ฐ ์ด ๊ธ๋ง deleteํ ์ ์๋๋ก
3. ์ฑํ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ + Realtime์ผ๋ก ์ญ์ ๊ตฌ๋ ํ๊ธฐ
const ChatDeleteDropDown = ({ msg }: { msg: Message }) => {
const handleDeleteMsg = async (key: string) => {
if (key === 'delete') {
const { error: messageTableErr } = await clientSupabase
.from('messages')
.delete()
.eq('message_id', msg?.message_id);
messageTableErr && alert('์ฑํ
์ญ์ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ต๋๋ค.');
}
};
const useDeleteMsg = () => {
const { mutate: deleteMsg } = useMutation({
mutationFn: (key: string) => handleDeleteMsg(key)
});
return { mutate: deleteMsg };
};
const { mutate: deleteMsg } = useDeleteMsg();
return (
<Dropdown>
<DropdownTrigger>
<button>
<CiMenuKebab className="my-auto w-6 h-6 rotate-90" />
</button>
</DropdownTrigger>
<DropdownMenu aria-label="Static Actions" onAction={(key) => deleteMsg(String(key))}>
<DropdownItem key="delete" className="text-danger" color="danger">
Delete
</DropdownItem>
</DropdownMenu>
</Dropdown>
);
useEffect(() => {
if (roomId && chatRoomId) {
const channel = clientSupabase
.channel(chatRoomId)
.on(
'postgres_changes',
{ event: 'DELETE', schema: 'public', table: 'messages', filter: `chatting_room_id=eq.${chatRoomId}` },
async (payload) => {
if (payload) {
await queryClient.invalidateQueries({ queryKey: [MSGS_QUERY_KEY, chatRoomId] });
messages &&
queryClient.setQueryData(
[MSGS_QUERY_KEY, chatRoomId],
messages.filter((msg) => msg.message_id !== payload.old.message_id)
);
}
}
)
.subscribe();
return () => {
clientSupabase.removeChannel(channel);
};
}
}, [messages, isScrolling, roomId, chatRoomId]);
- ์ฑํ ์ด ์ญ์ ๋๋ ๊ฒ์ ์ค์๊ฐ์ผ๋ก ๊ตฌ๋ ํ ์์ ์ด๋ผ messages table์ ๊ตฌ๋ ํ๋,
ํ์ฌ ์ํด์๋ ์ฑํ ๋ฐฉ์ ํด๋นํ๋ ๋ฉ์ธ์ง๋ค๋ง ๊ตฌ๋ ํ๊ณ (filter: `chatting_room_id=eq.${chatRoomId}`)
๋ฉ์ธ์ง๋ค ์ค ์ญ์ ๋ ๋ฉ์ธ์ง๋ฅผ ์ ์ธํ ๊ฒ๋ง ๋ณด์ด๋๋ก setQueryData() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2024.04.05 TIL #Tanstack_Query #prefetch #dehydration (0) | 2024.05.03 |
---|---|
2024.04.04 TIL #์ฑํ #์ด์ ๋ฉ์ธ์ง _๋๋ณด๊ธฐ (0) | 2024.05.03 |
2024.04.02 TIL #์ฑํ ์ฐฝ ๋ง๋ค๊ธฐ #Supabse_realtime (0) | 2024.05.02 |
2024.04.01 TIL #ํธ๋ฌ๋ธ์ํ #supabase_realtime_vs_React-Query #์๋ก๊ณ ์นจ (0) | 2024.04.02 |
2024.03.29 TIL #indexOf_vs_findIndex #๋ฌธ์์ด๋๋๊ธฐ_ํ๋ก๊ทธ๋๋จธ์ค (0) | 2024.03.30 |