const { NotFoundError, DatabaseError } = require('../../shared/errors'); const { Op } = require('sequelize'); class FriendRequestsRepository { constructor({ sequelize }) { this.sequelize = sequelize; this.FriendRequest = sequelize.models.FriendRequest; this.User = sequelize.models.User; } async findById(id) { try { const request = await this.FriendRequest.findByPk(id, { include: [ { model: this.User, as: 'fromUser' }, { model: this.User, as: 'toUser' }, ], }); if (!request) { throw new NotFoundError('Friend request not found'); } return request; } catch (error) { if (error instanceof NotFoundError) throw error; throw new DatabaseError(`Failed to fetch friend request with id ${id}`, error); } } async findPendingByUserId(userId) { try { return await this.FriendRequest.findAll({ where: { toUserId: userId, status: 'PENDING', }, include: [ { model: this.User, as: 'fromUser' }, { model: this.User, as: 'toUser' }, ], }); } catch (error) { throw new DatabaseError( `Failed to fetch pending requests for user ${userId}`, error ); } } async findExisting(fromUserId, toUserId) { try { return await this.FriendRequest.findOne({ where: { [Op.or]: [ { fromUserId, toUserId }, { fromUserId: toUserId, toUserId: fromUserId }, ], status: 'PENDING', }, }); } catch (error) { throw new DatabaseError('Failed to check existing friend request', error); } } async create(fromUserId, toUserId) { try { return await this.FriendRequest.create({ fromUserId, toUserId, status: 'PENDING', }); } catch (error) { throw new DatabaseError('Failed to create friend request', error); } } async updateStatus(id, status) { try { const request = await this.findById(id); return await request.update({ status }); } catch (error) { if (error instanceof NotFoundError) throw error; throw new DatabaseError('Failed to update friend request status', error); } } async delete(id) { try { const request = await this.findById(id); await request.destroy(); return true; } catch (error) { if (error instanceof NotFoundError) throw error; throw new DatabaseError('Failed to delete friend request', error); } } } module.exports = FriendRequestsRepository;