Select Git revision
friendService.js
friendService.js 8.40 KiB
// services/friendService.js
const { Op } = require('sequelize');
const { Friend,User} = require('../models');
const sequelize = require('../config/sequelize');
// DTO 임포트
const FriendResponseDTO = require('../dtos/FriendResponseDTO');
const FriendListDTO = require('../dtos/FriendListDTO');
class FriendService {
/**
* User 존재 여부 유효성 검사
* @param {number} userId - 검사할 사용자 ID
* @returns {Promise<User>} - 유효한 사용자 객체
* @throws {Error} - 사용자가 존재하지 않을 경우
*/
async validUser(userId) {
const user = await User.findByPk(userId);
if (!user) {
throw new Error('User not found');
}
return user;
}
/**
* 친구 요청 보내기
* @param {number} userId - 친구 요청을 보내는 사용자 ID
* @param {number} friendId - 친구 요청을 받는 사용자 ID
* @returns {Promise<FriendResponseDTO>} - 생성된 친구 요청 DTO
* @throws {Error} - 유효하지 않은 요청일 경우
*/
async sendFriendRequest(userId, friendId) {
await this.validUser(userId);
await this.validUser(friendId);
if (userId === friendId) {
throw new Error('Cannot send friend request to yourself');
}
// 기존 친구 관계 확인 (이미 친구인 경우)
const existingFriend = await Friend.findOne({
where: {
[Op.or]: [
{ requester_id: userId, receiver_id: friendId },
{ requester_id: friendId, receiver_id: userId },
],
status: 'ACCEPTED',
},
});
if (existingFriend) {
throw new Error('Friend request already exists');
}
try {
const friendRequest = await Friend.create({
requester_id: userId,
receiver_id: friendId,
status: 'PENDING'
});
// DTO로 변환하여 반환
const friendRequestWithDetails = await Friend.findByPk(friendRequest.id, {
include: [
{ model: User, as: 'requester', attributes: ['id', 'name', 'email'] },
{ model: User, as: 'receiver', attributes: ['id', 'name', 'email'] }
]
});