Files
2026-03-26 22:46:03 +01:00

74 lines
3.4 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
module.exports = (sequelize) => {
const { User, Friendship, FriendRequest } = sequelize.models;
// POST /api/friend-requests
router.post('/', async (req, res) => {
try {
const { identifier } = req.body;
const toUser = await User.findOne({ where: { [Op.or]: [{ email: identifier }, { name: identifier }] } });
if (!toUser) return res.status(404).json({ message: 'Utente non trovato.' });
if (toUser.id === req.userId) return res.status(400).json({ message: 'Non puoi aggiungere te stesso.'});
const user1Id = Math.min(req.userId, toUser.id);
const user2Id = Math.max(req.userId, toUser.id);
const friendshipExists = await Friendship.findOne({ where: { user1Id, user2Id } });
if (friendshipExists) return res.status(400).json({ message: 'Siete già amici.'});
const requestExists = await FriendRequest.findOne({
where: { [Op.or]: [{ fromUserId: req.userId, toUserId: toUser.id }, { fromUserId: toUser.id, toUserId: req.userId }] }
});
if (requestExists) return res.status(400).json({ message: 'Richiesta già inviata.'});
const friendRequest = await FriendRequest.create({ fromUserId: req.userId, toUserId: toUser.id });
const populatedReq = await FriendRequest.findByPk(friendRequest.id, {
include: [{ model: User, as: 'fromUser' }, { model: User, as: 'toUser' }]
});
res.status(201).json(populatedReq);
} catch (error) {
res.status(400).json({ message: 'Error sending friend request', error: error.message });
}
});
// POST /api/friend-requests/:id/accept
router.post('/:id/accept', async (req, res) => {
const t = await sequelize.transaction();
try {
const request = await FriendRequest.findByPk(req.params.id, { transaction: t });
if (!request || request.toUserId !== req.userId) {
await t.rollback();
return res.status(404).json({ message: 'Request not found or not for you.' });
}
const user1Id = Math.min(request.fromUserId, request.toUserId);
const user2Id = Math.max(request.fromUserId, request.toUserId);
await Friendship.create({ user1Id, user2Id }, { transaction: t });
await request.destroy({ transaction: t });
await t.commit();
const newFriend = await User.findByPk(request.fromUserId);
res.status(200).json({ message: 'Friend request accepted', newFriend });
} catch (error) {
await t.rollback();
res.status(400).json({ message: 'Error accepting friend request', error: error.message });
}
});
// DELETE /api/friend-requests/:id
router.delete('/:id', async (req, res) => {
try {
const count = await FriendRequest.destroy({ where: { id: req.params.id } });
if (count === 0) return res.status(404).json({ message: 'Request not found.' });
res.status(200).json({ message: 'Friend request cancelled/declined.' });
} catch (error) {
res.status(400).json({ message: 'Error deleting friend request', error: error.message });
}
});
return router;
};