kuk329 / reservation

0 stars 0 forks source link

FollowService #3

Open smilejakdu opened 6 months ago

smilejakdu commented 6 months ago
package com.example.newsfeed_service.service;

import static com.example.newsfeed_service.common.response.BaseResponseStatus.FOLLOW_INVALID;
import static com.example.newsfeed_service.common.response.BaseResponseStatus.USERS_INVALID_EMAIL;
import static com.example.newsfeed_service.common.response.BaseResponseStatus.USERS_INVALID_ID;

import com.example.newsfeed_service.common.exceptions.BaseException;
import com.example.newsfeed_service.common.jwt.JWTUtil;
import com.example.newsfeed_service.domain.ActiveType;
import com.example.newsfeed_service.entity.Follow;
import com.example.newsfeed_service.entity.User;
import com.example.newsfeed_service.entity.User.State;
import com.example.newsfeed_service.entity.UserLog;
import com.example.newsfeed_service.repository.FeedRepository;
import com.example.newsfeed_service.repository.FollowRepository;
import com.example.newsfeed_service.repository.UserRepository;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Transactional
@RequiredArgsConstructor
@Service
public class FollowService {

    private final FollowRepository followRepository;
    private final UserRepository userRepository;
    private final JWTUtil jwtUtil;
    private final FeedRepository feedRepository;

    public String followOther(String userEmail, Long id) {

        String log;
        String message="";
        ActiveType activeType = null;

        // 토큰값으로 from 유저 확인
        User fromUser = userRepository.findByEmail(userEmail)
                .orElseThrow(() -> new BaseException(USERS_INVALID_EMAIL));

        // Id 값으로 to 유저 확인
        User toUser = userRepository.findByIdAndState(id, State.ACTIVE)
                .orElseThrow(() -> new BaseException(USERS_INVALID_ID));

        if (Objects.equals(fromUser.getId(), toUser.getId())) {
            throw new BaseException(FOLLOW_INVALID);
        }

        Optional<Follow> exist = followRepository.findByFromUserAndToUser(fromUser, toUser);

        if (exist.isPresent()) { // 이미 팔로우 했으면 취소 처리
            followRepository.delete(exist.get());
            log = fromUser.getName() + "님이 " + toUser.getName() + " 님을 팔로우 취소 했습니다.";
            message = "팔로우를 취소했습니다.";

            activeType = ActiveType.CANCEL_FOLLOW;

        } else {
            Follow follow = Follow.builder()
                    .toUser(toUser)
                    .fromUser(fromUser)
                    .build();

            followRepository.save(follow);

            log = fromUser.getName() + "님이 " + toUser.getName() + " 님을 팔로우 했습니다.";

            message = "해당 사용자를 팔로우했습니다.";

            activeType=ActiveType.FOLLOW;

        }

        UserLog userLog = UserLog.builder()
                .actor(fromUser)
                .recipient(fromUser)
                .log(log)
                .activeType(activeType)
                .build();
        feedRepository.save(userLog);

        return message;
    }
}

위에 코드 보시면 행동에 따라 메서드로 빼도 될것 같아요. 위의 코드는 통짜잖아요 메서드 빼게되면 접근 제한자를 사용해서 굳이 다른 곳에서 사용할 필요가 없는것들은 private 도 메서드 빼주시고 다른곳에서 불러와 지는것은 public 으로 두시면 될것 같아요

우리 접근 제한자 잘 배웠잖아요