const express = require('express'); const { getConnection, getEmojis, addEmoji, getEmojiByName, deleteEmoji, searchEmojis } = require('../libs/mysql'); const { checkAuth } = require("../libs/middlewares") const multer = require('multer'); const rateLimit = require("express-rate-limit"); const slowDown = require("express-slow-down"); const fs = require('node:fs'); const path = require('node:path'); const limiter = rateLimit({ windowMs: 60 * 1000, max: 3, }); const speedLimiter = slowDown({ windowMs: 1 * 1000, delayAfter: 2, delayMs: () => 5000, }); const router = express.Router(); const upload = multer({ dest: 'data/emojis/' }) upload.limits = { fileSize: 1024 * 1024 * 1, files: 1, }; router.get('/', async (req, res) => { const { search } = req.query; const connection = await getConnection(); if (search || search === '') { const emojis = await searchEmojis(connection, search); connection.end(); return res.send(emojis); } const emojis = await getEmojis(connection); connection.end(); res.send(emojis); }); router.post('/add', speedLimiter, limiter, upload.single("emoji"), checkAuth, async (req, res) => { const { name } = req.body; const file = req.file; if (!name || !file) { return res.status(400).send({ error: 'Invalid name or file' }); } const connection = await getConnection(); const emoji = await getEmojiByName(connection, name); if (emoji[0]) { connection.end(); fs.unlinkSync(`data/emojis/${file.filename}`); return res.status(400).send({ error: 'Emoji already exists' }); } if (!/^[a-zA-Z0-9-_]+$/.test(name)) { connection.end(); fs.unlinkSync(`data/emojis/${file.filename}`); return res.status(400).send({ error: 'Invalid name' }); } await addEmoji(connection, name, file.filename); connection.end(); req.sockets.emit({ type: 'new_emoji' }); res.send({ message: "Emoji added" }); }); router.get('/:name', async (req, res) => { const { name } = req.params; const connection = await getConnection(); const emoji = await getEmojiByName(connection, name); connection.end(); if (!emoji[0]) { return res.status(404).send({ error: 'Emoji not found' }); } if (!fs.existsSync(`data/emojis/${emoji[0].file}`)) { return res.sendFile(path.join(__dirname, `../images/default.png`), { headers: { 'Content-Type': 'image' } }); } res.sendFile(path.join(__dirname, `../data/emojis/${emoji[0].file}`), { headers: { 'Content-Type': 'image' } }); }); router.post('/:name/delete', checkAuth, async (req, res) => { const { name } = req.params; const user = req.user; const connection = await getConnection(); const emoji = await getEmojiByName(connection, name); if (!emoji[0]) { connection.end(); return res.status(404).send({ error: 'Emoji not found' }); } if (user.admin !== 1) { connection.end(); return res.status(401).send({ error: 'Unauthorized' }); } if (fs.existsSync(`data/emojis/${emoji[0].file}`)) { fs.unlinkSync(`data/emojis/${emoji[0].file}`); } await deleteEmoji(connection, emoji[0].id); connection.end(); req.sockets.emit({ type: 'delete_emoji', }); res.send({ message: "Emoji deleted" }); }); module.exports = router;