mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-10-28 01:48:51 +05:00
add reactions
This commit is contained in:
16
src/index.js
16
src/index.js
@@ -248,16 +248,20 @@ const imagesRouter = require('./routes/images');
|
|||||||
const categoriesRouter = require('./routes/categories');
|
const categoriesRouter = require('./routes/categories');
|
||||||
const favoritesRouter = require('./routes/favorites');
|
const favoritesRouter = require('./routes/favorites');
|
||||||
const playersRouter = require('./routes/players');
|
const playersRouter = require('./routes/players');
|
||||||
|
const reactionsRouter = require('./routes/reactions');
|
||||||
require('./utils/cleanup');
|
require('./utils/cleanup');
|
||||||
const authRouter = require('./routes/auth');
|
const authRouter = require('./routes/auth');
|
||||||
|
const sessionRouter = require('./routes/session.routes');
|
||||||
|
|
||||||
app.use('/movies', moviesRouter);
|
app.use('/api/movies', moviesRouter);
|
||||||
app.use('/tv', tvRouter);
|
app.use('/api/tv', tvRouter);
|
||||||
app.use('/images', imagesRouter);
|
app.use('/api/images', imagesRouter);
|
||||||
app.use('/categories', categoriesRouter);
|
app.use('/api/categories', categoriesRouter);
|
||||||
app.use('/favorites', favoritesRouter);
|
app.use('/api/favorites', favoritesRouter);
|
||||||
app.use('/players', playersRouter);
|
app.use('/api/players', playersRouter);
|
||||||
|
app.use('/api/reactions', reactionsRouter);
|
||||||
app.use('/auth', authRouter);
|
app.use('/auth', authRouter);
|
||||||
|
app.use('/api/sessions', sessionRouter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @swagger
|
* @swagger
|
||||||
|
|||||||
81
src/routes/reactions.js
Normal file
81
src/routes/reactions.js
Normal 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;
|
||||||
Reference in New Issue
Block a user