tanuki-s-forum/back/api/emojis.js

125 lines
No EOL
3.4 KiB
JavaScript

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;