add: added mentions

This commit is contained in:
Lukian 2025-04-05 17:33:23 +02:00
parent dfb6639ecf
commit 6c8f354bf6
9 changed files with 208 additions and 9 deletions

View file

@ -1,5 +1,5 @@
const express = require('express');
const { getConnection, getChannels, getChannel, addChannel, getMessages, getMessage, addMessage, deleteMessage, getLastMessages } = require('../libs/mysql');
const { getConnection, getChannels, getChannel, addChannel, getMessages, getMessage, addMessage, deleteMessage, addMention, getMentions, getUserByUsername, deleMentions } = require('../libs/mysql');
const { checkAuth } = require('../libs/middlewares');
const router = express.Router();
@ -32,6 +32,16 @@ router.get('/:name/messages', async (req, res) => {
return res.send('No channel found');
}
const messages = await getMessages(connection, channel[0].id);
for (const message of messages) {
if (message.content.includes('@')) {
const mentions = await getMentions(connection, message.id);
message.mentions = mentions;
} else {
message.mentions = [];
}
}
connection.end();
res.send(messages);
});
@ -54,7 +64,19 @@ router.post('/:name/messages/send', async (req, res) => {
return res.send('No channel found');
}
await addMessage(connection, channel[0].id, user.id, message.replace("\"", "'"));
const sent_message = await addMessage(connection, channel[0].id, user.id, message.replace("\"", "'"));
const message_id = sent_message.insertId;
for (const word of message.split(' ')) {
if (word.startsWith('@')) {
const username = word.substring(1);
const mentionedUser = await getUserByUsername(connection, username);
if (mentionedUser[0]) {
await addMention(connection, message_id, mentionedUser[0].id);
}
}
}
connection.end();
res.send({ message: 'Message sent' });
});
@ -89,6 +111,7 @@ router.post('/:name/messages/delete', async (req, res) => {
}
await deleteMessage(connection, message_id);
await deleMentions(connection, message_id);
connection.end();
res.send({ message: 'Message deleted' });
});

View file

@ -1,12 +1,22 @@
const express = require('express');
const jwt = require('jsonwebtoken');
const { getConnection, getLastMessages } = require('../libs/mysql');
const { getConnection, getLastMessages, getMentions } = require('../libs/mysql');
const router = express.Router();
router.get('/', async (req, res) => {
const connection = await getConnection();
const messages = await getLastMessages(connection);
for (const message of messages) {
if (message.content.includes('@')) {
const mentions = await getMentions(connection, message.id);
message.mentions = mentions;
} else {
message.mentions = [];
}
}
connection.end();
res.send(messages);
});

14
back/api/searchuser.js Normal file
View file

@ -0,0 +1,14 @@
const express = require('express');
const { getConnection, searchUser } = require('../libs/mysql');
const router = express.Router();
router.get('/', async (req, res) => {
const { search } = req.query;
const connection = await getConnection();
const users = await searchUser(connection, search);
connection.end();
res.send(users);
});
module.exports = router;

View file

@ -1,5 +1,5 @@
const express = require('express');
const { getConnection, getUserByUsername, getUserLastMessages } = require('../libs/mysql');
const { getConnection, getUserByUsername, getUserLastMessages, getMentions } = require('../libs/mysql');
const router = express.Router();
@ -19,6 +19,16 @@ router.get('/:username/lastmessages', async (req, res) => {
const username = req.params.username;
const connection = await getConnection();
const messages = await getUserLastMessages(connection, username);
for (const message of messages) {
if (message.content.includes('@')) {
const mentions = await getMentions(connection, message.id);
message.mentions = mentions;
} else {
message.mentions = [];
}
}
connection.end();
res.send(messages);
});

View file

@ -24,6 +24,21 @@ function getUser(connection, id) {
});
}
function searchUser(connection, search) {
return new Promise((resolve, reject) => {
connection.query(
`SELECT * FROM users WHERE username LIKE ? LIMIT 5`,
[`%${search}%`], // Use parameterized query
(error, result) => {
if (error) {
reject(new Error(error));
}
resolve(result);
}
);
});
}
function getUserByUsername(connection, username) {
return new Promise((resolve, reject) => {
connection.query(
@ -248,9 +263,57 @@ function deleteMessage(connection, message_id) {
});
}
function addMention(connection, message_id, user_id) {
return new Promise((resolve, reject) => {
connection.query(
`INSERT INTO mentions (message_id, user_id) VALUES (?, ?)`,
[message_id, user_id], // Use parameterized query
(error, result) => {
if (error) {
reject(new Error(error));
}
resolve(result);
}
);
});
}
function getMentions(connection, message_id) {
return new Promise((resolve, reject) => {
connection.query(
`SELECT users.username FROM mentions
JOIN users ON mentions.user_id = users.id
WHERE message_id = ?`,
[message_id], // Use parameterized query
(error, result) => {
if (error) {
reject(new Error(error));
}
resolve(result);
}
);
});
}
function deleMentions(connection, message_id) {
return new Promise((resolve, reject) => {
connection.query(
`DELETE FROM mentions WHERE message_id = ?`,
[message_id], // Use parameterized query
(error, result) => {
if (error) {
reject(new Error(error));
}
resolve(result);
}
);
});
}
module.exports = {
getConnection,
getUser,
searchUser,
getUserByUsername,
addUser,
getUserLastMessages,
@ -263,5 +326,8 @@ module.exports = {
getLastMessages,
getMessage,
addMessage,
deleteMessage
deleteMessage,
addMention,
getMentions,
deleMentions,
};