add reactions

This commit is contained in:
2025-07-08 14:51:41 +03:00
parent 205d1e021c
commit f437caf35b
2 changed files with 91 additions and 6 deletions

View File

@@ -248,16 +248,20 @@ const imagesRouter = require('./routes/images');
const categoriesRouter = require('./routes/categories');
const favoritesRouter = require('./routes/favorites');
const playersRouter = require('./routes/players');
const reactionsRouter = require('./routes/reactions');
require('./utils/cleanup');
const authRouter = require('./routes/auth');
const sessionRouter = require('./routes/session.routes');
app.use('/movies', moviesRouter);
app.use('/tv', tvRouter);
app.use('/images', imagesRouter);
app.use('/categories', categoriesRouter);
app.use('/favorites', favoritesRouter);
app.use('/players', playersRouter);
app.use('/api/movies', moviesRouter);
app.use('/api/tv', tvRouter);
app.use('/api/images', imagesRouter);
app.use('/api/categories', categoriesRouter);
app.use('/api/favorites', favoritesRouter);
app.use('/api/players', playersRouter);
app.use('/api/reactions', reactionsRouter);
app.use('/auth', authRouter);
app.use('/api/sessions', sessionRouter);
/**
* @swagger

81
src/routes/reactions.js Normal file
View File

@@ -0,0 +1,81 @@
const { Router } = require('express');
const { getDb } = require('../db');
const authRequired = require('../middleware/auth');
const router = Router();
router.use(authRequired);
const CUB_API_URL = 'https://cub.rip/api';
const VALID_REACTIONS = ['fire', 'nice', 'think', 'bore', 'shit'];
// Получить реакцию текущего пользователя для медиа
router.get('/:mediaId', async (req, res) => {
try {
const db = await getDb();
const { mediaId } = req.params;
const userId = req.user.id;
const reaction = await db.collection('reactions').findOne({ userId, mediaId });
res.json(reaction);
} catch (err) {
console.error('Get user reaction error:', err);
res.status(500).json({ error: 'Failed to get user reaction' });
}
});
// Добавить, обновить или удалить реакцию
router.post('/', async (req, res) => {
try {
const db = await getDb();
const { mediaId, type } = req.body;
const userId = req.user.id;
if (!mediaId || !type) {
return res.status(400).json({ error: 'mediaId and type are required' });
}
if (!VALID_REACTIONS.includes(type)) {
return res.status(400).json({ error: 'Invalid reaction type' });
}
const existingReaction = await db.collection('reactions').findOne({ userId, mediaId });
if (existingReaction) {
// Если реакция та же - удаляем (пользователь "отжал" кнопку)
if (existingReaction.type === type) {
await db.collection('reactions').deleteOne({ _id: existingReaction._id });
// Не вызываем CUB API, так как у него нет эндпоинта для удаления
return res.status(204).send();
} else {
// Если реакция другая - обновляем
await db.collection('reactions').updateOne(
{ _id: existingReaction._id },
{ $set: { type, createdAt: new Date() } }
);
// Вызываем CUB API для новой реакции
await fetch(`${CUB_API_URL}/reactions/add/${mediaId}/${type}`);
const updatedReaction = await db.collection('reactions').findOne({ _id: existingReaction._id });
return res.json(updatedReaction);
}
} else {
// Если реакции нет - создаем новую
const newReaction = {
userId,
mediaId,
type,
createdAt: new Date()
};
const result = await db.collection('reactions').insertOne(newReaction);
// Вызываем CUB API
await fetch(`${CUB_API_URL}/reactions/add/${mediaId}/${type}`);
const insertedDoc = await db.collection('reactions').findOne({ _id: result.insertedId });
return res.status(201).json(insertedDoc);
}
} catch (err) {
console.error('Set reaction error:', err);
res.status(500).json({ error: 'Failed to set reaction' });
}
});
module.exports = router;