diff --git a/back/api/channels.js b/back/api/channels.js index 1f1c17e..6dbceab 100644 --- a/back/api/channels.js +++ b/back/api/channels.js @@ -16,6 +16,13 @@ const { const rateLimit = require("express-rate-limit"); const slowDown = require("express-slow-down"); const { checkAuth } = require('../libs/middlewares'); +const multer = require('multer'); + +const upload = multer({ dest: 'data/attachements/' }) +upload.limits = { + fileSize: 1024 * 1024 * 5, + files: 1, +}; const limiter = rateLimit({ windowMs: 1 * 1000, @@ -156,7 +163,7 @@ router.get('/:name/messages', async (req, res) => { res.send(messages); }); -router.post('/:name/messages/send', speedLimiter, limiter, checkAuth, async (req, res) => { +router.post('/:name/messages/send', speedLimiter, limiter, upload.single("attachement"), checkAuth, async (req, res) => { const { message } = req.body; const name = req.params.name; const user = req.user; diff --git a/back/api/messages.js b/back/api/messages.js index 70bd6d9..d692a67 100644 --- a/back/api/messages.js +++ b/back/api/messages.js @@ -7,7 +7,6 @@ const { addMention, getMentions, getUserByUsername, - setHasReplies, addReply, getMessageReplies } = require('../libs/mysql'); @@ -91,7 +90,6 @@ router.post('/:message_id/reply', speedLimiter, limiter, checkAuth, async (req, const channel = await getChannel(connection, originalMessage[0].channel_name); const sent_message = await addReply(connection, channel[0].id, user.id, message.replace("\"", "'"), message_id); - await setHasReplies(connection, message_id, true); const new_message_id = sent_message.insertId; for (const word of message.split(' ')) { diff --git a/back/libs/mysql.js b/back/libs/mysql.js index 61ed50a..4f48ab5 100644 --- a/back/libs/mysql.js +++ b/back/libs/mysql.js @@ -338,11 +338,15 @@ function deleteChannelMessages(connection, channel_id) { function getMessages(connection, channel_id, limit) { return new Promise((resolve, reject) => { connection.query( - `SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies - FROM messages + `SELECT messages.id, messages.user_id, username, messages.content, messages.date, channels.name AS channel_name, (mentions.id IS NOT NULL) as has_mentions, (reply.id IS NOT NULL) as has_replies, (attachments.id IS NOT NULL) as has_attachments + FROM messages JOIN users ON messages.user_id = users.id JOIN channels ON messages.channel_id = channels.id - WHERE channel_id = ? AND reply_to_id IS NULL + LEFT JOIN mentions ON messages.id = mentions.message_id + LEFT JOIN messages as reply ON messages.id = reply.reply_to_id + LEFT JOIN attachments ON messages.id = attachments.message_id + WHERE messages.channel_id = ? AND messages.reply_to_id IS NULL + GROUP BY messages.id ORDER BY date DESC LIMIT ?`, [channel_id, limit], @@ -359,11 +363,15 @@ function getMessages(connection, channel_id, limit) { function getMessage(connection, message_id) { return new Promise((resolve, reject) => { connection.query( - `SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies - FROM messages + `SELECT messages.id, messages.user_id, username, messages.content, messages.date, channels.name AS channel_name, (mentions.id IS NOT NULL) as has_mentions, (reply.id IS NOT NULL) as has_replies, (attachments.id IS NOT NULL) as has_attachments + FROM messages JOIN users ON messages.user_id = users.id JOIN channels ON messages.channel_id = channels.id - WHERE messages.id = ?`, + LEFT JOIN mentions ON messages.id = mentions.message_id + LEFT JOIN messages as reply ON messages.id = reply.reply_to_id + LEFT JOIN attachments ON messages.id = attachments.message_id + WHERE messages.id = ? + GROUP BY messages.id`, [message_id], (error, result) => { if (error) { @@ -378,11 +386,16 @@ function getMessage(connection, message_id) { function getLastMessages(connection) { return new Promise((resolve, reject) => { connection.query( - `SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies - FROM messages + `SELECT messages.id, messages.user_id, username, messages.content, messages.date, channels.name AS channel_name, (mentions.id IS NOT NULL) as has_mentions, (reply.id IS NOT NULL) as has_replies, (attachments.id IS NOT NULL) as has_attachments + FROM messages JOIN users ON messages.user_id = users.id - JOIN channels ON messages.channel_id = channels.id - ORDER BY date DESC LIMIT 5`, + JOIN channels ON messages.channel_id = channels.id + LEFT JOIN mentions ON messages.id = mentions.message_id + LEFT JOIN messages as reply ON messages.id = reply.reply_to_id + LEFT JOIN attachments ON messages.id = attachments.message_id + GROUP BY messages.id + ORDER BY date DESC + LIMIT 5`, (error, result) => { if (error) { reject(new Error(error)); @@ -396,12 +409,17 @@ function getLastMessages(connection) { function getUserLastMessages(connection, username) { return new Promise((resolve, reject) => { connection.query( - `SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies - FROM messages + `SELECT messages.id, messages.user_id, username, messages.content, messages.date, channels.name AS channel_name, (mentions.id IS NOT NULL) as has_mentions, (reply.id IS NOT NULL) as has_replies, (attachments.id IS NOT NULL) as has_attachments + FROM messages JOIN users ON messages.user_id = users.id JOIN channels ON messages.channel_id = channels.id + LEFT JOIN mentions ON messages.id = mentions.message_id + LEFT JOIN messages as reply ON messages.id = reply.reply_to_id + LEFT JOIN attachments ON messages.id = attachments.message_id WHERE username = ? - ORDER BY date DESC LIMIT 5`, + GROUP BY messages.id + ORDER BY date DESC + LIMIT 5`, [username], (error, result) => { if (error) { @@ -416,11 +434,16 @@ function getUserLastMessages(connection, username) { function getMessageReplies(connection, message_id) { return new Promise((resolve, reject) => { connection.query( - `SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies - FROM messages + `SELECT messages.id, messages.user_id, username, messages.content, messages.date, channels.name AS channel_name, (mentions.id IS NOT NULL) as has_mentions, (reply.id IS NOT NULL) as has_replies, (attachments.id IS NOT NULL) as has_attachments + FROM messages JOIN users ON messages.user_id = users.id JOIN channels ON messages.channel_id = channels.id - WHERE reply_to_id = ?`, + LEFT JOIN mentions ON messages.id = mentions.message_id + LEFT JOIN messages as reply ON messages.id = reply.reply_to_id + LEFT JOIN attachments ON messages.id = attachments.message_id + WHERE messages.reply_to_id = ? + GROUP BY messages.id + ORDER BY date DESC`, [message_id], (error, result) => { if (error) { @@ -432,21 +455,6 @@ function getMessageReplies(connection, message_id) { }); } -function setHasReplies(connection, message_id, has_replies) { - return new Promise((resolve, reject) => { - connection.query( - `UPDATE messages SET has_replies = ? WHERE id = ?`, - [has_replies, message_id], - (error, result) => { - if (error) { - reject(new Error(error)); - } - resolve(result); - } - ); - }); -} - // +---------------------------+ // | Mentions | // +---------------------------+ @@ -576,6 +584,54 @@ function searchEmojis(connection, search) { }); } +// +---------------------------+ +// | Attachemnts | +// +---------------------------+ + +function addAttachment(connection, message_id, file_name) { + return new Promise((resolve, reject) => { + connection.query( + `INSERT INTO attachments (message_id, file_name) VALUES (?, ?)`, + [message_id, file_name], + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + } + ); + }); +} + +function deleteUnusedAttachments(connection) { + return new Promise((resolve, reject) => { + connection.query( + `DELETE FROM attachments WHERE message_id IS NULL`, + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + } + ); + }); +} + +function getMessageAttachments(connection, message_id) { + return new Promise((resolve, reject) => { + connection.query( + `SELECT * FROM attachments WHERE message_id = ?`, + [message_id], + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + } + ); + }); +} + module.exports = { getConnection, @@ -606,7 +662,6 @@ module.exports = { getUserLastMessages, getLastMessages, getMessageReplies, - setHasReplies, addMention, getMentions, diff --git a/front/src/pages/CreateEmoji.tsx b/front/src/pages/CreateEmoji.tsx index fe0a678..9fdd062 100644 --- a/front/src/pages/CreateEmoji.tsx +++ b/front/src/pages/CreateEmoji.tsx @@ -64,7 +64,7 @@ export default function CreateEmoji() { value={name} onChange={(e) => setName(e.target.value)} /> - + diff --git a/front/src/pages/EditProfile.tsx b/front/src/pages/EditProfile.tsx index 29d32c7..85cc118 100644 --- a/front/src/pages/EditProfile.tsx +++ b/front/src/pages/EditProfile.tsx @@ -106,7 +106,7 @@ export default function EditProfile() {

Edit Profile Picture

- +