Skip to content
Snippets Groups Projects
Select Git revision
  • af05da72100f0da67c91b5891eccf44a42f92a91
  • master default protected
  • deploy
  • develop
4 results

friendService.js

Blame
  • 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'] }
                    ]
                });