PublisherJoinService.java
package qwerty.chaekit.service.member.publisher;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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.publisher.PublisherProfileRepository;
import qwerty.chaekit.dto.member.LoginResponse;
import qwerty.chaekit.dto.member.PublisherJoinRequest;
import qwerty.chaekit.global.enums.ErrorCode;
import qwerty.chaekit.global.exception.BadRequestException;
import qwerty.chaekit.global.jwt.JwtUtil;
import qwerty.chaekit.service.member.MemberJoinHelper;
import qwerty.chaekit.service.member.token.RefreshTokenService;
@Service
@Transactional
@RequiredArgsConstructor
public class PublisherJoinService {
private final MemberJoinHelper memberJoinHelper;
private final PublisherProfileRepository publisherRepository;
private final JwtUtil jwtUtil;
private final RefreshTokenService refreshTokenService;
@Transactional
public LoginResponse join(PublisherJoinRequest request) {
String email = request.email();
String password = request.password();
String verificationCode = request.verificationCode();
String imageFileKey = memberJoinHelper.uploadProfileImage(request.profileImage());
validatePublisherName(request.publisherName());
Member member = memberJoinHelper.saveMemberWithVerificationCode(email, password, Role.ROLE_PUBLISHER, verificationCode);
PublisherProfile publisher = savePublisher(request, member, imageFileKey);
return toResponse(member, publisher);
}
private void validatePublisherName(String name) {
if (publisherRepository.existsByPublisherName(name)) {
throw new BadRequestException(ErrorCode.PUBLISHER_ALREADY_EXISTS);
}
}
private PublisherProfile savePublisher(PublisherJoinRequest request, Member member, String imageFileKey) {
return publisherRepository.save(PublisherProfile.builder()
.member(member)
.publisherName(request.publisherName())
.profileImageKey(imageFileKey)
.build());
}
private LoginResponse toResponse(Member member, PublisherProfile publisher) {
String accessToken = jwtUtil.createAccessToken(
member.getId(),
null,
publisher.getId(),
member.getEmail(),
Role.ROLE_PUBLISHER.name()
);
String refreshToken = refreshTokenService.issueRefreshToken(member.getId());
String profileImageUrl = memberJoinHelper.convertToPublicImageURL(publisher.getProfileImageKey());
return LoginResponse.builder()
.memberId(member.getId())
.publisherId(publisher.getId())
.refreshToken(refreshToken)
.accessToken(accessToken)
.email(member.getEmail())
.publisherName(publisher.getPublisherName())
.profileImageURL(profileImageUrl)
.role(Role.ROLE_PUBLISHER)
.build();
}
}