LoginResponseFactory.java

package qwerty.chaekit.global.security.util;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import qwerty.chaekit.domain.ebook.credit.wallet.CreditWalletRepository;
import qwerty.chaekit.domain.member.Member;
import qwerty.chaekit.domain.member.enums.Role;
import qwerty.chaekit.domain.member.publisher.PublisherProfile;
import qwerty.chaekit.domain.member.user.UserProfile;
import qwerty.chaekit.dto.member.LoginResponse;
import qwerty.chaekit.global.jwt.JwtUtil;
import qwerty.chaekit.global.security.model.CustomUserDetails;
import qwerty.chaekit.service.member.token.RefreshTokenService;
import qwerty.chaekit.service.util.FileService;

@Component
@RequiredArgsConstructor
public class LoginResponseFactory {
    private final JwtUtil jwtUtil;
    private final RefreshTokenService refreshTokenService;
    private final FileService fileService;
    private final CreditWalletRepository creditWalletRepository;

    public LoginResponse createLoginResponse(CustomUserDetails customUserDetails) {
        Member member = customUserDetails.member();
        if (member == null) {
            throw new IllegalArgumentException("Member details are required to create a login response.");
        }
        
        UserProfile user = customUserDetails.user();
        PublisherProfile publisher = customUserDetails.publisher();
        String profileImageKey = null;
        Long memberId = member.getId();
        Long publisherId = null;
        Long userId = null;
        if (publisher != null) {
            profileImageKey = publisher.getProfileImageKey();
            publisherId = publisher.getId();
        }
        if (user != null) {
            profileImageKey = user.getProfileImageKey();
            userId = user.getId();
        }

        String profileImageURL = fileService.convertToPublicImageURL(profileImageKey);
        Role role = member.getRole();

        String refreshToken = refreshTokenService.issueRefreshToken(memberId);
        String accessToken = jwtUtil.createAccessToken(memberId, userId, publisherId, member.getEmail(), role.name());
        boolean firstPaymentBenefit = creditWalletRepository.existsByUserAndPaymentTransactionsEmpty(user);

        return LoginResponse.builder()
                .refreshToken(refreshToken)
                .accessToken(accessToken)
                .memberId(member.getId())
                .email(member.getEmail())
                .userId(user != null ? user.getId() : null)
                .nickname(user != null ? user.getNickname() : null)
                .publisherId(publisher != null ? publisher.getId() : null)
                .publisherName(publisher != null ? publisher.getPublisherName() : null)
                .profileImageURL(profileImageURL)
                .role(role)
                .firstPaymentBenefit(firstPaymentBenefit)
                .build();
    }
}