From 172c5dfeed73b2366c0efe9f0f9cc20e7d7ad909 Mon Sep 17 00:00:00 2001 From: Lukian Date: Wed, 9 Apr 2025 12:49:26 +0200 Subject: [PATCH] add: added channel purge button --- back/api/channels.js | 47 ++++++++++++++++++++++++++++++++- back/libs/mysql.js | 33 +++++++++++++++++++++++ front/src/pages/ChannelPage.tsx | 33 ++++++++++++----------- front/src/pages/Home.tsx | 2 +- front/src/pages/UserPage.tsx | 3 +-- 5 files changed, 98 insertions(+), 20 deletions(-) diff --git a/back/api/channels.js b/back/api/channels.js index ba88722..12c4914 100644 --- a/back/api/channels.js +++ b/back/api/channels.js @@ -1,5 +1,20 @@ const express = require('express'); -const { getConnection, getChannels, getChannel, addChannel, getMessages, getMessage, addMessage, deleteMessage, addMention, getMentions, getUserByUsername, deleMentions } = require('../libs/mysql'); +const { + getConnection, + getChannels, + getChannel, + addChannel, + getMessages, + getMessage, + addMessage, + deleteMessage, + addMention, + getMentions, + getUserByUsername, + deleMentions, + deleteChannelMentions, + deleteChannelMessages +} = require('../libs/mysql'); const { checkAuth } = require('../libs/middlewares'); const router = express.Router(); @@ -23,6 +38,36 @@ router.get('/:name', async (req, res) => { } }); +router.use('/:name/purge', checkAuth); +router.post('/:name/purge', async (req, res) => { + const name = req.params.name; + const user = req.user; + + const connection = await getConnection(); + + const channel = await getChannel(connection, name); + if (!channel[0]) { + connection.end(); + return res.status(400).send({ error: 'No channel found' }); + } + + if (user.admin !== 1) { + connection.end(); + return res.status(401).send({ error: 'Unauthorized' }); + } + + await deleteChannelMentions(connection, channel[0].id); + await deleteChannelMessages(connection, channel[0].id); + connection.end(); + + req.sockets.emit({ + type: 'purge_channel', + channel_id: channel[0].id, + }); + + res.send({ message: 'Channel purged' }); +}); + router.get('/:name/messages', async (req, res) => { const name = req.params.name; const connection = await getConnection(); diff --git a/back/libs/mysql.js b/back/libs/mysql.js index 1f99fa8..73905a9 100644 --- a/back/libs/mysql.js +++ b/back/libs/mysql.js @@ -280,6 +280,21 @@ function deleteMessage(connection, message_id) { }); } +function deleteChannelMessages(connection, channel_id) { + return new Promise((resolve, reject) => { + connection.query( + `DELETE FROM messages WHERE channel_id = ?`, + [channel_id], // Use parameterized query + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + } + ); + }); +} + function addMention(connection, message_id, user_id) { return new Promise((resolve, reject) => { connection.query( @@ -327,6 +342,22 @@ function deleMentions(connection, message_id) { }); } +function deleteChannelMentions(connection, channel_id) { + return new Promise((resolve, reject) => { + connection.query( + `DELETE FROM mentions WHERE message_id IN + (SELECT id FROM messages WHERE channel_id = ?)`, + [channel_id], // Use parameterized query + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + } + ); + }); +} + module.exports = { getConnection, getUser, @@ -345,7 +376,9 @@ module.exports = { getMessage, addMessage, deleteMessage, + deleteChannelMessages, addMention, getMentions, deleMentions, + deleteChannelMentions, }; diff --git a/front/src/pages/ChannelPage.tsx b/front/src/pages/ChannelPage.tsx index 26a8d2e..b9f4332 100644 --- a/front/src/pages/ChannelPage.tsx +++ b/front/src/pages/ChannelPage.tsx @@ -23,13 +23,8 @@ export default function ChannelPage({socket}: {socket: WebSocket}) { axios .post(`/api/channels/${name}/messages/send`, { token, message}) .then(() => { - axios - .get(`/api/channels/${name}/messages`) - .then((res) => { - setMessages(res.data); - setMessage(""); - } - ); + setMessage(""); + setSearchedUsers([]); }) .catch((err) => { console.error(err.response); @@ -39,19 +34,20 @@ export default function ChannelPage({socket}: {socket: WebSocket}) { function deleteMessage(message_id: number) { axios .post(`/api/channels/${name}/messages/delete`, { token, message_id }) - .then(() => { - axios - .get(`/api/channels/${name}/messages`) - .then((res) => { - setMessages(res.data); - } - ); - }) .catch((err) => { console.error(err.response); }); } + function purgeChannel() { + axios + .post(`/api/channels/${name}/purge`, { token }) + .catch((err) => { + console.error(err.response); + } + ); + } + useEffect(() => { const localToken = localStorage.getItem("token"); if (localToken) { @@ -73,7 +69,7 @@ export default function ChannelPage({socket}: {socket: WebSocket}) { useEffect(() => { socket.addEventListener('message', function (event) { const data = JSON.parse(event.data); - if ((data.type === "new_message" || data.type === "delete_message") && data.channel_id === channel?.id) { + if ((data.type === "new_message" || data.type === "delete_message" || data.type === "purge_channel") && data.channel_id === channel?.id) { axios .get(`/api/channels/${name}/messages`).then((res) => { setMessages(res.data) @@ -123,6 +119,11 @@ export default function ChannelPage({socket}: {socket: WebSocket}) { {channel.name.toLowerCase().includes("cat") && ( cat )} + {user?.admin && ( + + )} {token ? (
{ diff --git a/front/src/pages/UserPage.tsx b/front/src/pages/UserPage.tsx index 0ac1b01..f2b5985 100644 --- a/front/src/pages/UserPage.tsx +++ b/front/src/pages/UserPage.tsx @@ -47,8 +47,7 @@ export default function UserPage({socket}: {socket: WebSocket}) { useEffect(() => { socket.addEventListener('message', function (event) { const data = JSON.parse(event.data); - if ((data.type === "new_message" || data.type === "delete_message") && data.user_id === pageUser?.id) { - console.log("new message"); + if (((data.type === "new_message" || data.type === "delete_message") && data.user_id === pageUser?.id) || data.type === "purge_channel") { axios .get(`/api/users/${username}/lastmessages`) .then((res) => {