diff --git a/src/main/java/life/mosu/mosuserver/application/faq/FaqAttachmentService.java b/src/main/java/life/mosu/mosuserver/application/faq/FaqAttachmentService.java index 2c03fed0..cf29aa60 100644 --- a/src/main/java/life/mosu/mosuserver/application/faq/FaqAttachmentService.java +++ b/src/main/java/life/mosu/mosuserver/application/faq/FaqAttachmentService.java @@ -3,7 +3,7 @@ import java.time.Duration; import java.util.List; import life.mosu.mosuserver.domain.faq.FaqAttachmentJpaEntity; -import life.mosu.mosuserver.domain.faq.FaqAttachmentRepository; +import life.mosu.mosuserver.domain.faq.FaqAttachmentJpaRepository; import life.mosu.mosuserver.domain.faq.FaqJpaEntity; import life.mosu.mosuserver.global.util.FileRequest; import life.mosu.mosuserver.infra.property.S3Properties; @@ -20,7 +20,7 @@ @RequiredArgsConstructor public class FaqAttachmentService implements AttachmentService { - private final FaqAttachmentRepository faqAttachmentRepository; + private final FaqAttachmentJpaRepository faqAttachmentJpaRepository; private final FileUploadHelper fileUploadHelper; private final S3Service s3Service; private final S3Properties s3Properties; @@ -31,7 +31,7 @@ public void createAttachment(List requests, FaqJpaEntity faqEntity) fileUploadHelper.saveAttachments( requests, faqEntity.getId(), - faqAttachmentRepository, + faqAttachmentJpaRepository, (req, id) -> req.toFaqAttachmentEntity( req.fileName(), req.s3Key(), @@ -43,15 +43,15 @@ public void createAttachment(List requests, FaqJpaEntity faqEntity) @Override public void deleteAttachment(FaqJpaEntity entity) { - List attachments = faqAttachmentRepository.findAllByFaqId( + List attachments = faqAttachmentJpaRepository.findAllByFaqId( entity.getId()); - faqAttachmentRepository.deleteAll(attachments); + faqAttachmentJpaRepository.deleteAll(attachments); } public List toAttachmentResponses(FaqJpaEntity faq) { - List attachments = faqAttachmentRepository.findAllByFaqId( + List attachments = faqAttachmentJpaRepository.findAllByFaqId( faq.getId()); return attachments.stream() diff --git a/src/main/java/life/mosu/mosuserver/application/faq/FaqService.java b/src/main/java/life/mosu/mosuserver/application/faq/FaqService.java index 3a2c3e8c..3fb1e030 100644 --- a/src/main/java/life/mosu/mosuserver/application/faq/FaqService.java +++ b/src/main/java/life/mosu/mosuserver/application/faq/FaqService.java @@ -2,7 +2,7 @@ import java.util.List; import life.mosu.mosuserver.domain.faq.FaqJpaEntity; -import life.mosu.mosuserver.domain.faq.FaqRepository; +import life.mosu.mosuserver.domain.faq.FaqJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; import life.mosu.mosuserver.presentation.faq.dto.FaqCreateRequest; @@ -21,13 +21,13 @@ @RequiredArgsConstructor public class FaqService { - private final FaqRepository faqRepository; + private final FaqJpaRepository faqJpaRepository; private final FaqAttachmentService attachmentService; @Transactional public void createFaq(FaqCreateRequest request) { - FaqJpaEntity faqEntity = faqRepository.save(request.toEntity()); + FaqJpaEntity faqEntity = faqJpaRepository.save(request.toEntity()); attachmentService.createAttachment(request.attachments(), faqEntity); } @@ -35,7 +35,7 @@ public void createFaq(FaqCreateRequest request) { @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) public List getFaqWithAttachments(int page, int size) { Pageable pageable = PageRequest.of(page, size, Sort.by("id")); - Page faqPage = faqRepository.findAll(pageable); + Page faqPage = faqJpaRepository.findAll(pageable); return faqPage.stream() .map(this::toFaqResponse) @@ -44,7 +44,7 @@ public List getFaqWithAttachments(int page, int size) { @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) public FaqResponse getFaqDetail(Long faqId) { - FaqJpaEntity faq = faqRepository.findById(faqId) + FaqJpaEntity faq = faqJpaRepository.findById(faqId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.FAQ_NOT_FOUND)); return toFaqResponse(faq); @@ -52,11 +52,11 @@ public FaqResponse getFaqDetail(Long faqId) { @Transactional public void update(FaqUpdateRequest request, Long faqId) { - FaqJpaEntity faqEntity = faqRepository.findById(faqId) + FaqJpaEntity faqEntity = faqJpaRepository.findById(faqId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.FAQ_NOT_FOUND)); faqEntity.update(request.question(), request.answer(), request.author()); - faqRepository.save(faqEntity); + faqJpaRepository.save(faqEntity); attachmentService.deleteAttachment(faqEntity); attachmentService.createAttachment(request.attachments(), faqEntity); @@ -65,9 +65,9 @@ public void update(FaqUpdateRequest request, Long faqId) { @Transactional public void deleteFaq(Long faqId) { - FaqJpaEntity faqEntity = faqRepository.findById(faqId) + FaqJpaEntity faqEntity = faqJpaRepository.findById(faqId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.FILE_NOT_FOUND)); - faqRepository.delete(faqEntity); + faqJpaRepository.delete(faqEntity); attachmentService.deleteAttachment(faqEntity); } diff --git a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerAttachmentService.java b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerAttachmentService.java index 3b81af73..0a64d546 100644 --- a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerAttachmentService.java +++ b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerAttachmentService.java @@ -3,7 +3,7 @@ import java.time.Duration; import java.util.List; import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerAttachmentEntity; -import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerAttachmentRepository; +import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerAttachmentJpaRepository; import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerJpaEntity; import life.mosu.mosuserver.global.util.FileRequest; import life.mosu.mosuserver.infra.property.S3Properties; @@ -20,7 +20,7 @@ public class InquiryAnswerAttachmentService implements AttachmentService { private final S3Properties s3Properties; - private final InquiryAnswerAttachmentRepository attachmentRepository; + private final InquiryAnswerAttachmentJpaRepository attachmentRepository; private final FileUploadHelper fileUploadHelper; private final S3Service s3Service; diff --git a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerService.java b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerService.java index 55256a40..fd95e8f1 100644 --- a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerService.java +++ b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAnswerService.java @@ -1,9 +1,9 @@ package life.mosu.mosuserver.application.inquiry; import life.mosu.mosuserver.domain.inquiry.InquiryJpaEntity; -import life.mosu.mosuserver.domain.inquiry.InquiryRepository; +import life.mosu.mosuserver.domain.inquiry.InquiryJpaRepository; import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerJpaEntity; -import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerRepository; +import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; import life.mosu.mosuserver.presentation.inquiry.dto.InquiryAnswerRequest; @@ -20,18 +20,18 @@ public class InquiryAnswerService { private final InquiryAnswerAttachmentService answerAttachmentService; - private final InquiryAnswerRepository inquiryAnswerRepository; - private final InquiryRepository inquiryRepository; + private final InquiryAnswerJpaRepository inquiryAnswerJpaRepository; + private final InquiryJpaRepository inquiryJpaRepository; @Transactional public void createInquiryAnswer(Long postId, InquiryAnswerRequest request) { InquiryJpaEntity inquiryEntity = getInquiryOrThrow(postId); - if (inquiryAnswerRepository.findByInquiryId(postId).isPresent()) { + if (inquiryAnswerJpaRepository.findByInquiryId(postId).isPresent()) { throw new CustomRuntimeException(ErrorCode.INQUIRY_ANSWER_ALREADY_EXISTS); } - InquiryAnswerJpaEntity answerEntity = inquiryAnswerRepository.save( + InquiryAnswerJpaEntity answerEntity = inquiryAnswerJpaRepository.save( request.toEntity(postId)); answerAttachmentService.createAttachment(request.attachments(), answerEntity); @@ -42,10 +42,10 @@ public void createInquiryAnswer(Long postId, InquiryAnswerRequest request) { public void deleteInquiryAnswer(Long postId) { InquiryJpaEntity inquiryEntity = getInquiryOrThrow(postId); - InquiryAnswerJpaEntity answerEntity = inquiryAnswerRepository.findByInquiryId(postId) + InquiryAnswerJpaEntity answerEntity = inquiryAnswerJpaRepository.findByInquiryId(postId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.INQUIRY_ANSWER_NOT_FOUND)); - inquiryAnswerRepository.delete(answerEntity); + inquiryAnswerJpaRepository.delete(answerEntity); answerAttachmentService.deleteAttachment(answerEntity); inquiryEntity.updateStatusToPending(); } @@ -53,7 +53,7 @@ public void deleteInquiryAnswer(Long postId) { @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) public InquiryDetailResponse.InquiryAnswerDetailResponse getInquiryAnswerDetail( Long inquiryId) { - return inquiryAnswerRepository.findByInquiryId(inquiryId) + return inquiryAnswerJpaRepository.findByInquiryId(inquiryId) .map(answer -> InquiryAnswerDetailResponse.of( answer, answerAttachmentService.toAttachmentResponses(answer) @@ -65,18 +65,18 @@ public InquiryDetailResponse.InquiryAnswerDetailResponse getInquiryAnswerDetail( public void updateInquiryAnswer(Long postId, InquiryAnswerUpdateRequest request) { InquiryJpaEntity inquiryEntity = getInquiryOrThrow(postId); - InquiryAnswerJpaEntity answerEntity = inquiryAnswerRepository.findByInquiryId(postId) + InquiryAnswerJpaEntity answerEntity = inquiryAnswerJpaRepository.findByInquiryId(postId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.INQUIRY_ANSWER_NOT_FOUND)); answerEntity.update(request.title(), request.content()); - inquiryAnswerRepository.save(answerEntity); + inquiryAnswerJpaRepository.save(answerEntity); answerAttachmentService.deleteAttachment(answerEntity); answerAttachmentService.createAttachment(request.attachments(), answerEntity); } private InquiryJpaEntity getInquiryOrThrow(Long postId) { - return inquiryRepository.findById(postId) + return inquiryJpaRepository.findById(postId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.INQUIRY_NOT_FOUND)); } diff --git a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAttachmentService.java b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAttachmentService.java index 2d913245..ee943dcb 100644 --- a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAttachmentService.java +++ b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryAttachmentService.java @@ -3,7 +3,7 @@ import java.time.Duration; import java.util.List; import life.mosu.mosuserver.domain.inquiry.InquiryAttachmentJpaEntity; -import life.mosu.mosuserver.domain.inquiry.InquiryAttachmentRepository; +import life.mosu.mosuserver.domain.inquiry.InquiryAttachmentJpaRepository; import life.mosu.mosuserver.domain.inquiry.InquiryJpaEntity; import life.mosu.mosuserver.global.util.FileRequest; import life.mosu.mosuserver.infra.property.S3Properties; @@ -18,7 +18,7 @@ @RequiredArgsConstructor public class InquiryAttachmentService implements AttachmentService { - private final InquiryAttachmentRepository inquiryAttachmentRepository; + private final InquiryAttachmentJpaRepository inquiryAttachmentJpaRepository; private final FileUploadHelper fileUploadHelper; private final S3Service s3Service; private final S3Properties s3Properties; @@ -28,7 +28,7 @@ public void createAttachment(List requests, InquiryJpaEntity inquir fileUploadHelper.saveAttachments( requests, inquiryEntity.getId(), - inquiryAttachmentRepository, + inquiryAttachmentJpaRepository, (req, id) -> req.toInquiryAttachmentEntity( req.fileName(), req.s3Key(), @@ -40,15 +40,15 @@ public void createAttachment(List requests, InquiryJpaEntity inquir @Override public void deleteAttachment(InquiryJpaEntity entity) { - List attachments = inquiryAttachmentRepository.findAllByInquiryId( + List attachments = inquiryAttachmentJpaRepository.findAllByInquiryId( entity.getId()); - inquiryAttachmentRepository.deleteAll(attachments); + inquiryAttachmentJpaRepository.deleteAll(attachments); } public List toAttachmentResponses( InquiryJpaEntity inquiry) { - List attachments = inquiryAttachmentRepository.findAllByInquiryId( + List attachments = inquiryAttachmentJpaRepository.findAllByInquiryId( inquiry.getId()); return attachments.stream() diff --git a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryService.java b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryService.java index a7b80fb6..4a552863 100644 --- a/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryService.java +++ b/src/main/java/life/mosu/mosuserver/application/inquiry/InquiryService.java @@ -1,9 +1,9 @@ package life.mosu.mosuserver.application.inquiry; import life.mosu.mosuserver.domain.inquiry.InquiryJpaEntity; -import life.mosu.mosuserver.domain.inquiry.InquiryRepository; +import life.mosu.mosuserver.domain.inquiry.InquiryJpaRepository; import life.mosu.mosuserver.domain.inquiry.InquiryStatus; -import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerRepository; +import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; import life.mosu.mosuserver.presentation.inquiry.dto.InquiryCreateRequest; @@ -22,13 +22,13 @@ public class InquiryService { private final InquiryAttachmentService inquiryAttachmentService; - private final InquiryRepository inquiryRepository; + private final InquiryJpaRepository inquiryJpaRepository; private final InquiryAnswerService inquiryAnswerService; - private final InquiryAnswerRepository inquiryAnswerRepository; + private final InquiryAnswerJpaRepository inquiryAnswerJpaRepository; @Transactional public void createInquiry(InquiryCreateRequest request) { - InquiryJpaEntity inquiryEntity = inquiryRepository.save(request.toEntity()); + InquiryJpaEntity inquiryEntity = inquiryJpaRepository.save(request.toEntity()); inquiryAttachmentService.createAttachment(request.attachments(), inquiryEntity); } @@ -39,7 +39,7 @@ public Page getInquiries( boolean asc, Pageable pageable) { - return inquiryRepository.searchInquiries(status, sortField, asc, pageable); + return inquiryJpaRepository.searchInquiries(status, sortField, asc, pageable); } @@ -54,13 +54,13 @@ public InquiryDetailResponse getInquiryDetail(Long postId) { public void deleteInquiry(Long postId) { InquiryJpaEntity inquiryEntity = getInquiryOrThrow(postId); - inquiryAnswerRepository.findByInquiryId(postId).ifPresent(answer -> { + inquiryAnswerJpaRepository.findByInquiryId(postId).ifPresent(answer -> { inquiryAnswerService.deleteInquiryAnswer(postId); }); inquiryAttachmentService.deleteAttachment(inquiryEntity); - inquiryRepository.delete(inquiryEntity); + inquiryJpaRepository.delete(inquiryEntity); } @@ -77,7 +77,7 @@ private InquiryDetailResponse toInquiryDetailResponse(InquiryJpaEntity inquiry) } private InquiryJpaEntity getInquiryOrThrow(Long postId) { - return inquiryRepository.findById(postId) + return inquiryJpaRepository.findById(postId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.INQUIRY_NOT_FOUND)); } diff --git a/src/main/java/life/mosu/mosuserver/application/notice/NoticeAttachmentService.java b/src/main/java/life/mosu/mosuserver/application/notice/NoticeAttachmentService.java index 77d0a5c8..6f03d6a7 100644 --- a/src/main/java/life/mosu/mosuserver/application/notice/NoticeAttachmentService.java +++ b/src/main/java/life/mosu/mosuserver/application/notice/NoticeAttachmentService.java @@ -3,7 +3,7 @@ import java.time.Duration; import java.util.List; import life.mosu.mosuserver.domain.notice.NoticeAttachmentJpaEntity; -import life.mosu.mosuserver.domain.notice.NoticeAttachmentRepository; +import life.mosu.mosuserver.domain.notice.NoticeAttachmentJpaRepository; import life.mosu.mosuserver.domain.notice.NoticeJpaEntity; import life.mosu.mosuserver.global.util.FileRequest; import life.mosu.mosuserver.infra.property.S3Properties; @@ -21,7 +21,7 @@ @RequiredArgsConstructor public class NoticeAttachmentService implements AttachmentService { - private final NoticeAttachmentRepository noticeAttachmentRepository; + private final NoticeAttachmentJpaRepository noticeAttachmentJpaRepository; private final FileUploadHelper fileUploadHelper; private final S3Service s3Service; private final S3Properties s3Properties; @@ -31,7 +31,7 @@ public void createAttachment(List requests, NoticeJpaEntity noticeE fileUploadHelper.saveAttachments( requests, noticeEntity.getId(), - noticeAttachmentRepository, + noticeAttachmentJpaRepository, (req, id) -> req.toNoticeAttachmentEntity( req.fileName(), req.s3Key(), @@ -43,14 +43,14 @@ public void createAttachment(List requests, NoticeJpaEntity noticeE @Override public void deleteAttachment(NoticeJpaEntity entity) { - List attachments = noticeAttachmentRepository.findAllByNoticeId( + List attachments = noticeAttachmentJpaRepository.findAllByNoticeId( entity.getId()); - noticeAttachmentRepository.deleteAll(attachments); + noticeAttachmentJpaRepository.deleteAll(attachments); } public List toAttachmentResponses(NoticeJpaEntity notice) { - List attachments = noticeAttachmentRepository.findAllByNoticeId( + List attachments = noticeAttachmentJpaRepository.findAllByNoticeId( notice.getId()); return attachments.stream() @@ -64,7 +64,7 @@ public List toAttachmentResponses(NoticeJpaEn public List toDetailAttResponses( NoticeJpaEntity notice) { - List attachments = noticeAttachmentRepository.findAllByNoticeId( + List attachments = noticeAttachmentJpaRepository.findAllByNoticeId( notice.getId()); return attachments.stream() diff --git a/src/main/java/life/mosu/mosuserver/application/notice/NoticeService.java b/src/main/java/life/mosu/mosuserver/application/notice/NoticeService.java index f2a387f6..3baab088 100644 --- a/src/main/java/life/mosu/mosuserver/application/notice/NoticeService.java +++ b/src/main/java/life/mosu/mosuserver/application/notice/NoticeService.java @@ -2,7 +2,7 @@ import java.util.List; import life.mosu.mosuserver.domain.notice.NoticeJpaEntity; -import life.mosu.mosuserver.domain.notice.NoticeRepository; +import life.mosu.mosuserver.domain.notice.NoticeJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; import life.mosu.mosuserver.presentation.notice.dto.NoticeCreateRequest; @@ -22,19 +22,19 @@ @RequiredArgsConstructor public class NoticeService { - private final NoticeRepository noticeRepository; + private final NoticeJpaRepository noticeJpaRepository; private final NoticeAttachmentService attachmentService; @Transactional public void createNotice(NoticeCreateRequest request) { - NoticeJpaEntity noticeEntity = noticeRepository.save(request.toEntity()); + NoticeJpaEntity noticeEntity = noticeJpaRepository.save(request.toEntity()); attachmentService.createAttachment(request.attachments(), noticeEntity); } @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) public List getNoticeWithAttachments(int page, int size) { Pageable pageable = PageRequest.of(page, size, Sort.by("id")); - Page noticePage = noticeRepository.findAll(pageable); + Page noticePage = noticeJpaRepository.findAll(pageable); return noticePage.stream() .map(this::toNoticeResponse) @@ -51,7 +51,7 @@ public NoticeDetailResponse getNoticeDetail(Long noticeId) { @Transactional public void deleteNotice(Long noticeId) { NoticeJpaEntity noticeEntity = getNoticeOrThrow(noticeId); - noticeRepository.delete(noticeEntity); + noticeJpaRepository.delete(noticeEntity); attachmentService.deleteAttachment(noticeEntity); } @@ -77,7 +77,7 @@ private NoticeDetailResponse toNoticeDetailResponse(NoticeJpaEntity notice) { } private NoticeJpaEntity getNoticeOrThrow(Long noticeId) { - return noticeRepository.findById(noticeId) + return noticeJpaRepository.findById(noticeId) .orElseThrow(() -> new CustomRuntimeException(ErrorCode.NOTICE_NOT_FOUND)); } diff --git a/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserService.java b/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserService.java index ab1ca68c..d8225795 100644 --- a/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserService.java +++ b/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserService.java @@ -42,17 +42,26 @@ public OAuth2User loadUser(final OAuth2UserRequest userRequest) } private UserJpaEntity updateOrWrite(final OAuthUserInfo info) { - return userRepository.findByLoginId(info.email()) + return userRepository.findByLoginId(info.email()) + .map(existingUser -> { + existingUser.updateOAuthUser(info.gender(), info.name(), + info.birthDay() != null ? info.birthDay() : LocalDate.of(1900, 1, 1)); + return existingUser; + }) .orElseGet(() -> { final UserJpaEntity newUser = UserJpaEntity.builder() .loginId(info.email()) - .gender(Gender.MALE) + .gender(info.gender() != null ? info.gender() : Gender.MALE) .name(info.name()) - .password("") - .birth(LocalDate.now()) - .userRole(UserRole.ROLE_USER) + .birth(info.birthDay() != null ? info.birthDay() + : LocalDate.of(1900, 1, 1)) + .userRole(UserRole.ROLE_PENDING) + .agreedToTermsOfService(true) + .agreedToPrivacyPolicy(true) + .agreedToMarketing(false) .build(); + return userRepository.save(newUser); }); } diff --git a/src/main/java/life/mosu/mosuserver/application/profile/ProfileService.java b/src/main/java/life/mosu/mosuserver/application/profile/ProfileService.java index 28b76020..5c79bb68 100644 --- a/src/main/java/life/mosu/mosuserver/application/profile/ProfileService.java +++ b/src/main/java/life/mosu/mosuserver/application/profile/ProfileService.java @@ -2,6 +2,8 @@ import life.mosu.mosuserver.domain.profile.ProfileJpaEntity; import life.mosu.mosuserver.domain.profile.ProfileJpaRepository; +import life.mosu.mosuserver.domain.user.UserJpaEntity; +import life.mosu.mosuserver.domain.user.UserJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; import life.mosu.mosuserver.presentation.profile.dto.EditProfileRequest; @@ -16,14 +18,19 @@ @RequiredArgsConstructor public class ProfileService { + private final UserJpaRepository userRepository; private final ProfileJpaRepository profileJpaRepository; @Transactional public void registerProfile(Long userId, ProfileRequest request) { + UserJpaEntity user = userRepository.findById(userId).orElseThrow( + () -> new CustomRuntimeException(ErrorCode.USER_NOT_FOUND, userId) + ); if (profileJpaRepository.existsByUserId(userId)) { throw new CustomRuntimeException(ErrorCode.PROFILE_ALREADY_EXISTS, userId); } + user.registerProfile(); ProfileJpaEntity profile = request.toEntity(userId); profileJpaRepository.save(profile); } diff --git a/src/main/java/life/mosu/mosuserver/application/user/UserService.java b/src/main/java/life/mosu/mosuserver/application/user/UserService.java new file mode 100644 index 00000000..11750587 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/user/UserService.java @@ -0,0 +1,22 @@ +package life.mosu.mosuserver.application.user; + +import life.mosu.mosuserver.domain.user.UserJpaEntity; +import life.mosu.mosuserver.domain.user.UserJpaRepository; +import life.mosu.mosuserver.global.exception.CustomRuntimeException; +import life.mosu.mosuserver.global.exception.ErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserJpaRepository userJpaRepository; + + public String getCustomerKey(Long userId) { + return userJpaRepository.findById(userId) + .map(UserJpaEntity::getCustomerKey) + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.USER_NOT_FOUND)); + } + +} diff --git a/src/main/java/life/mosu/mosuserver/domain/admin/ApplicationQueryRepositoryImpl.java b/src/main/java/life/mosu/mosuserver/domain/admin/ApplicationQueryRepositoryImpl.java index 984f0add..6628b528 100644 --- a/src/main/java/life/mosu/mosuserver/domain/admin/ApplicationQueryRepositoryImpl.java +++ b/src/main/java/life/mosu/mosuserver/domain/admin/ApplicationQueryRepositoryImpl.java @@ -192,13 +192,13 @@ private ApplicationListResponse mapToResponse(Tuple tuple, Set subjects tuple.get(payment.paymentKey), tuple.get(applicationSchool.examinationNumber), tuple.get(profile.userName), - tuple.get(profile.gender), + tuple.get(profile.gender).getGenderName(), tuple.get(profile.birth), tuple.get(profile.phoneNumber), tuple.get(application.guardianPhoneNumber), - tuple.get(profile.education), + tuple.get(profile.education).getEducationName(), tuple.get(profile.schoolInfo.schoolName), - tuple.get(profile.grade), + tuple.get(profile.grade).getGradeName(), lunchName, subjectNames, tuple.get(applicationSchool.schoolName), diff --git a/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java b/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java index 16c89e26..c75505bf 100644 --- a/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java +++ b/src/main/java/life/mosu/mosuserver/domain/application/Lunch.java @@ -16,4 +16,3 @@ public enum Lunch { private final String lunchName; } -//임의 구현 diff --git a/src/main/java/life/mosu/mosuserver/domain/event/EventJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/event/EventJpaEntity.java index b765cc46..36d2302c 100644 --- a/src/main/java/life/mosu/mosuserver/domain/event/EventJpaEntity.java +++ b/src/main/java/life/mosu/mosuserver/domain/event/EventJpaEntity.java @@ -33,25 +33,21 @@ public class EventJpaEntity extends BaseTimeEntity { @Column(name = "event_link") private String eventLink; - @Builder public EventJpaEntity( final String title, final DurationJpaVO duration, final String eventLink - ) { this.title = title; this.duration = duration; this.eventLink = eventLink; - } public void update(final String title, final DurationJpaVO duration, final String eventLink) { this.title = title; this.duration = duration; this.eventLink = eventLink; - } } diff --git a/src/main/java/life/mosu/mosuserver/domain/faq/FaqAttachmentRepository.java b/src/main/java/life/mosu/mosuserver/domain/faq/FaqAttachmentJpaRepository.java similarity index 65% rename from src/main/java/life/mosu/mosuserver/domain/faq/FaqAttachmentRepository.java rename to src/main/java/life/mosu/mosuserver/domain/faq/FaqAttachmentJpaRepository.java index d445a2a5..db805ce9 100644 --- a/src/main/java/life/mosu/mosuserver/domain/faq/FaqAttachmentRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/faq/FaqAttachmentJpaRepository.java @@ -3,6 +3,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -public interface FaqAttachmentRepository extends JpaRepository { +public interface FaqAttachmentJpaRepository extends JpaRepository { + List findAllByFaqId(Long faqId); -} +} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/domain/faq/FaqRepository.java b/src/main/java/life/mosu/mosuserver/domain/faq/FaqJpaRepository.java similarity index 57% rename from src/main/java/life/mosu/mosuserver/domain/faq/FaqRepository.java rename to src/main/java/life/mosu/mosuserver/domain/faq/FaqJpaRepository.java index 425e320c..080fb7f7 100644 --- a/src/main/java/life/mosu/mosuserver/domain/faq/FaqRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/faq/FaqJpaRepository.java @@ -3,5 +3,6 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface FaqRepository extends JpaRepository { +public interface FaqJpaRepository extends JpaRepository { + } diff --git a/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryAttachmentRepository.java b/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryAttachmentJpaRepository.java similarity index 82% rename from src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryAttachmentRepository.java rename to src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryAttachmentJpaRepository.java index b409d086..33c6b312 100644 --- a/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryAttachmentRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryAttachmentJpaRepository.java @@ -3,7 +3,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -public interface InquiryAttachmentRepository extends +public interface InquiryAttachmentJpaRepository extends JpaRepository { List findAllByInquiryId(Long id); diff --git a/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryRepository.java b/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryJpaRepository.java similarity index 63% rename from src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryRepository.java rename to src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryJpaRepository.java index 9dd40bac..208032f3 100644 --- a/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/inquiry/InquiryJpaRepository.java @@ -2,7 +2,7 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface InquiryRepository extends JpaRepository, +public interface InquiryJpaRepository extends JpaRepository, InquiryQueryRepository { } diff --git a/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerAttachmentRepository.java b/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerAttachmentJpaRepository.java similarity index 81% rename from src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerAttachmentRepository.java rename to src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerAttachmentJpaRepository.java index 580dcb05..e9b6cd16 100644 --- a/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerAttachmentRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerAttachmentJpaRepository.java @@ -3,7 +3,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -public interface InquiryAnswerAttachmentRepository extends +public interface InquiryAnswerAttachmentJpaRepository extends JpaRepository { List findAllByInquiryAnswerId(Long id); diff --git a/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerRepository.java b/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerJpaRepository.java similarity index 67% rename from src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerRepository.java rename to src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerJpaRepository.java index 8ee8c2f1..91a75bf5 100644 --- a/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/inquiryAnswer/InquiryAnswerJpaRepository.java @@ -3,7 +3,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface InquiryAnswerRepository extends JpaRepository { +public interface InquiryAnswerJpaRepository extends JpaRepository { Optional findByInquiryId(Long id); } diff --git a/src/main/java/life/mosu/mosuserver/domain/notice/NoticeAttachmentRepository.java b/src/main/java/life/mosu/mosuserver/domain/notice/NoticeAttachmentJpaRepository.java similarity index 63% rename from src/main/java/life/mosu/mosuserver/domain/notice/NoticeAttachmentRepository.java rename to src/main/java/life/mosu/mosuserver/domain/notice/NoticeAttachmentJpaRepository.java index de666beb..9a97e158 100644 --- a/src/main/java/life/mosu/mosuserver/domain/notice/NoticeAttachmentRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/notice/NoticeAttachmentJpaRepository.java @@ -3,7 +3,8 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -public interface NoticeAttachmentRepository extends JpaRepository { +public interface NoticeAttachmentJpaRepository extends + JpaRepository { List findAllByNoticeId(Long id); } diff --git a/src/main/java/life/mosu/mosuserver/domain/notice/NoticeRepository.java b/src/main/java/life/mosu/mosuserver/domain/notice/NoticeJpaRepository.java similarity index 56% rename from src/main/java/life/mosu/mosuserver/domain/notice/NoticeRepository.java rename to src/main/java/life/mosu/mosuserver/domain/notice/NoticeJpaRepository.java index 3fe628f9..675a303e 100644 --- a/src/main/java/life/mosu/mosuserver/domain/notice/NoticeRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/notice/NoticeJpaRepository.java @@ -2,6 +2,6 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface NoticeRepository extends JpaRepository { +public interface NoticeJpaRepository extends JpaRepository { } diff --git a/src/main/java/life/mosu/mosuserver/domain/serviceterm/ServiceTermAgreementJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/serviceterm/ServiceTermAgreementJpaEntity.java deleted file mode 100644 index 779f3cec..00000000 --- a/src/main/java/life/mosu/mosuserver/domain/serviceterm/ServiceTermAgreementJpaEntity.java +++ /dev/null @@ -1,30 +0,0 @@ -package life.mosu.mosuserver.domain.serviceterm; - -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Getter -@Table(name = "service_term_agreement") -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ServiceTermAgreementJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "user_id") - private Long userId; - - @Column(name = "service_term_id") - private Long tagId; - - @Column(name = "agreed") - private boolean agreed; - - @Column(name = "agreed_at") - private LocalDateTime agreedAt; -} diff --git a/src/main/java/life/mosu/mosuserver/domain/serviceterm/ServiceTermJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/serviceterm/ServiceTermJpaEntity.java deleted file mode 100644 index 1e58d0a3..00000000 --- a/src/main/java/life/mosu/mosuserver/domain/serviceterm/ServiceTermJpaEntity.java +++ /dev/null @@ -1,37 +0,0 @@ -package life.mosu.mosuserver.domain.serviceterm; - - -import jakarta.persistence.*; -import life.mosu.mosuserver.domain.base.BaseTimeEntity; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Table(name = "service_term") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -class ServiceTermJpaEntity extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "service_term_id") - private Long id; - - @Column(name = "service_term_tag") - private String tag; - - @Column(name = "required") - private boolean required; - - @Builder - public ServiceTermJpaEntity( - final String tag, - final boolean required - - ) { - this.tag = tag; - this.required = required; - } -} diff --git a/src/main/java/life/mosu/mosuserver/domain/user/UserJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/user/UserJpaEntity.java index 1586a0dc..ba26c741 100644 --- a/src/main/java/life/mosu/mosuserver/domain/user/UserJpaEntity.java +++ b/src/main/java/life/mosu/mosuserver/domain/user/UserJpaEntity.java @@ -1,5 +1,7 @@ package life.mosu.mosuserver.domain.user; +import static life.mosu.mosuserver.global.util.KeyGeneratorUtil.generateUUIDCustomerKey; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -59,21 +61,31 @@ public class UserJpaEntity extends BaseTimeEntity { @Enumerated(EnumType.STRING) private UserRole userRole; - @Builder public UserJpaEntity(String loginId, String password, Gender gender, String name, - LocalDate birth, - String customerKey, boolean agreedToTermsOfService, boolean agreedToPrivacyPolicy, + LocalDate birth, boolean agreedToTermsOfService, boolean agreedToPrivacyPolicy, boolean agreedToMarketing, UserRole userRole) { this.loginId = loginId; this.password = password; this.gender = gender; this.name = name; this.birth = birth; - this.customerKey = customerKey; + this.customerKey = generateUUIDCustomerKey(); this.agreedToTermsOfService = agreedToTermsOfService; this.agreedToPrivacyPolicy = agreedToPrivacyPolicy; this.agreedToMarketing = agreedToMarketing; this.userRole = userRole; } + + public void updateOAuthUser( + Gender gender, String name, + LocalDate birth) { + this.gender = gender; + this.name = name; + this.birth = birth; + } + + public void registerProfile() { + this.userRole = UserRole.ROLE_USER; + } } diff --git a/src/main/java/life/mosu/mosuserver/global/config/SecurityConfig.java b/src/main/java/life/mosu/mosuserver/global/config/SecurityConfig.java index f841e39c..6509761a 100644 --- a/src/main/java/life/mosu/mosuserver/global/config/SecurityConfig.java +++ b/src/main/java/life/mosu/mosuserver/global/config/SecurityConfig.java @@ -6,8 +6,6 @@ import life.mosu.mosuserver.global.handler.OAuth2LoginFailureHandler; import life.mosu.mosuserver.global.handler.OAuth2LoginSuccessHandler; import life.mosu.mosuserver.global.resolver.AuthorizationRequestRedirectResolver; -import life.mosu.mosuserver.presentation.oauth.AccessTokenFilter; -import life.mosu.mosuserver.presentation.oauth.TokenExceptionFilter; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -23,7 +21,6 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @@ -45,8 +42,7 @@ public class SecurityConfig { private final OAuth2LoginSuccessHandler loginSuccessHandler; private final OAuth2LoginFailureHandler loginFailureHandler; private final AuthenticationEntryPoint authenticationEntryPoint; - private final AccessTokenFilter accessTokenFilter; - private final TokenExceptionFilter tokenExceptionFilter; + private final AuthorizationRequestRedirectResolver authorizationRequestRedirectResolver; @@ -99,8 +95,6 @@ public SecurityFilterChain securityFilterChain(final HttpSecurity http) throws E .successHandler(loginSuccessHandler) .failureHandler(loginFailureHandler) ) - .addFilterBefore(accessTokenFilter, UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(tokenExceptionFilter, accessTokenFilter.getClass()) .logout(config -> config.logoutSuccessUrl("/")) .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(authenticationEntryPoint)); diff --git a/src/main/java/life/mosu/mosuserver/global/initializer/DatabaseInitializer.java b/src/main/java/life/mosu/mosuserver/global/initializer/DatabaseInitializer.java new file mode 100644 index 00000000..108149b4 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/global/initializer/DatabaseInitializer.java @@ -0,0 +1,244 @@ +package life.mosu.mosuserver.global.initializer; + +import jakarta.annotation.PostConstruct; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; +import life.mosu.mosuserver.domain.application.ApplicationJpaEntity; +import life.mosu.mosuserver.domain.application.ApplicationJpaRepository; +import life.mosu.mosuserver.domain.application.Lunch; +import life.mosu.mosuserver.domain.application.Subject; +import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; +import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaRepository; +import life.mosu.mosuserver.domain.event.DurationJpaVO; +import life.mosu.mosuserver.domain.event.EventJpaEntity; +import life.mosu.mosuserver.domain.event.EventJpaRepository; +import life.mosu.mosuserver.domain.inquiry.InquiryJpaEntity; +import life.mosu.mosuserver.domain.inquiry.InquiryJpaRepository; +import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerJpaEntity; +import life.mosu.mosuserver.domain.inquiryAnswer.InquiryAnswerJpaRepository; +import life.mosu.mosuserver.domain.notice.NoticeJpaEntity; +import life.mosu.mosuserver.domain.notice.NoticeJpaRepository; +import life.mosu.mosuserver.domain.profile.Education; +import life.mosu.mosuserver.domain.profile.Gender; +import life.mosu.mosuserver.domain.profile.Grade; +import life.mosu.mosuserver.domain.profile.ProfileJpaEntity; +import life.mosu.mosuserver.domain.profile.ProfileJpaRepository; +import life.mosu.mosuserver.domain.profile.SchoolInfoJpaVO; +import life.mosu.mosuserver.domain.school.AddressJpaVO; +import life.mosu.mosuserver.domain.school.Area; +import life.mosu.mosuserver.domain.school.SchoolJpaEntity; +import life.mosu.mosuserver.domain.school.SchoolJpaRepository; +import life.mosu.mosuserver.domain.user.UserJpaEntity; +import life.mosu.mosuserver.domain.user.UserJpaRepository; +import life.mosu.mosuserver.domain.user.UserRole; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class DatabaseInitializer { + + private final UserJpaRepository userRepository; + private final ProfileJpaRepository profileRepository; + private final SchoolJpaRepository schoolRepository; + private final ApplicationJpaRepository applicationRepository; + private final ApplicationSchoolJpaRepository applicationSchoolRepository; + private final InquiryJpaRepository inquiryJpaRepository; + private final NoticeJpaRepository noticeJpaRepository; + private final InquiryAnswerJpaRepository inquiryAnswerJpaRepository; + private final EventJpaRepository eventRepository; + private final PasswordEncoder passwordEncoder; + + @PostConstruct + public void init() { + if (userRepository.count() > 0 || schoolRepository.count() > 0) { + log.info("이미 더미 데이터가 존재하여 전체 초기화를 건너뜁니다."); + return; + } + + log.info("전체 더미 데이터 초기화를 시작합니다..."); + Random random = new Random(); + + List createdUsers = initializeUsersAndProfiles(random); + List createdSchools = initializeSchools(); + initializeApplications(createdUsers, createdSchools, random); + initializeBoardItems(createdUsers, random); + + log.info("모든 더미 데이터 초기화가 완료되었습니다."); + } + + private List initializeUsersAndProfiles(Random random) { + List createdUsers = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + UserJpaEntity user = UserJpaEntity.builder() + .loginId("user" + i) + .password(passwordEncoder.encode("password" + i + "!")) + .gender((i % 2 == 0) ? Gender.MALE : Gender.FEMALE) + .name((i % 2 == 0) ? "김철수" + i : "이영희" + i) + .birth(LocalDate.of(1990 + (i % 5), (i % 12) + 1, (i % 28) + 1)) + .agreedToTermsOfService(true) + .agreedToPrivacyPolicy(true) + .agreedToMarketing(random.nextBoolean()) + .userRole((i == 1) ? UserRole.ROLE_ADMIN : UserRole.ROLE_USER) + .build(); + userRepository.save(user); + createdUsers.add(user); + + ProfileJpaEntity profile = ProfileJpaEntity.builder() + .userId(user.getId()) + .userName(user.getName()) + .gender(user.getGender()) + .birth(user.getBirth()) + .phoneNumber("010-" + String.format("%04d", i) + "-" + String.format("%04d", + i + 1000)) + .email("user" + i + "@example.com") + .education(Education.values()[random.nextInt(Education.values().length)]) + .schoolInfo(new SchoolInfoJpaVO("모수대학교" + (i % 3 + 1), "123-23", "서울시 모수구 모수동")) + .grade(Grade.values()[random.nextInt(Grade.values().length)]) + .build(); + + profile.registerRecommenderPhoneNumber((i % 3 == 0) ? "010-1234-5678" : null); + profileRepository.save(profile); + } + log.info("User 및 Profile 데이터 {}건 생성 완료.", createdUsers.size()); + return createdUsers; + } + + private List initializeSchools() { + List schools = new ArrayList<>(List.of( + SchoolJpaEntity.builder() + .schoolName("모수고등학교") + .area(Area.DAECHI) + .address(new AddressJpaVO("06164", "서울특별시", "강남구 테헤란로 123")) + .examDate(LocalDate.of(2025, 11, 20)) + .capacity(300L) + .build(), + SchoolJpaEntity.builder() + .schoolName("대치고등학교") + .area(Area.DAECHI) + .address(new AddressJpaVO("06283", "서울특별시", "강남구 대치동 학원가 100")) + .examDate(LocalDate.of(2025, 12, 5)) + .capacity(150L) + .build(), + SchoolJpaEntity.builder() + .schoolName("부산명문고") + .area(Area.DAECHI) + .address(new AddressJpaVO("48057", "부산광역시", "해운대구 센텀시티로 50")) + .examDate(LocalDate.of(2025, 11, 25)) + .capacity(250L) + .build(), + SchoolJpaEntity.builder() + .schoolName("노원스터디센터") + .area(Area.NOWON) + .address(new AddressJpaVO("01777", "서울특별시", "노원구 동일로 1400")) + .examDate(LocalDate.of(2026, 1, 10)) + .capacity(80L) + .build() + )); + schoolRepository.saveAll(schools); + log.info("School 데이터 {}건 생성 완료.", schools.size()); + return schools; + } + + private void initializeApplications(List users, List schools, + Random random) { + for (int i = 0; i < users.size(); i++) { + UserJpaEntity user = users.get(i); + ApplicationJpaEntity application = applicationRepository.save( + ApplicationJpaEntity.builder() + .userId(user.getId()) + .guardianPhoneNumber("010-9876-" + String.format("%04d", 1000 + i)) + .agreedToNotices(true) + .agreedToRefundPolicy(true) + .build() + ); + + Collections.shuffle(schools); + int schoolsToApply = random.nextInt(2) + 2; + + for (int j = 0; j < Math.min(schoolsToApply, schools.size()); j++) { + SchoolJpaEntity school = schools.get(j); + Set subjects = new HashSet<>(); + subjects.add(Subject.values()[random.nextInt(Subject.values().length)]); + if (random.nextBoolean()) { + subjects.add(Subject.values()[random.nextInt(Subject.values().length)]); + } + + applicationSchoolRepository.save( + ApplicationSchoolJpaEntity.builder() + .userId(user.getId()) + .applicationId(application.getId()) + .schoolId(school.getId()) + .schoolName(school.getSchoolName()) + .area(school.getArea()) + .address(school.getAddress()) + .examDate(LocalDate.of(2025, 10, 20 + i)) + .lunch(Lunch.values()[random.nextInt(Lunch.values().length)]) + .examinationNumber( + String.format("EXAM-%d-%d", user.getId(), school.getId())) + .subjects(subjects) + .build() + ); + } + } + log.info("Application 및 ApplicationSchool 데이터 생성 완료."); + } + + private void initializeBoardItems(List users, Random random) { + for (int i = 1; i <= 10; i++) { + UserJpaEntity author = users.get(random.nextInt(users.size())); + noticeJpaRepository.save(NoticeJpaEntity.builder() + .title("공지사항 제목 " + i) + .content("이것은 " + i + "번째 공지사항의 내용입니다.") + .userId(author.getId()) + .author(author.getName()) + .build()); + } + + List inquiries = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + UserJpaEntity author = users.get(random.nextInt(users.size())); + inquiries.add(inquiryJpaRepository.save( + InquiryJpaEntity.builder() + .title("문의 제목 " + i) + .content("안녕하세요. " + i + "번째 문의 내용입니다.") + .userId(author.getId()) + .author(author.getName()) + .build()) + ); + } + + for (int i = 1; i <= 10; i++) { + InquiryJpaEntity inquiryToAnswer = inquiries.get(random.nextInt(inquiries.size())); + + UserJpaEntity answerer = users.get(random.nextInt(users.size())); + inquiryAnswerJpaRepository.save(InquiryAnswerJpaEntity.builder() + .title("Re: " + inquiryToAnswer.getTitle()) + .content("문의하신 내용에 대한 답변입니다. " + i + "번째 답변입니다.") + .inquiryId(inquiryToAnswer.getId()) + .userId(answerer.getId()) + .build()); + inquiryToAnswer.updateStatusToComplete(); + inquiryJpaRepository.save(inquiryToAnswer); + } + + for (int i = 1; i <= 10; i++) { + LocalDate startDate = LocalDate.now().plusDays(i * 2); + LocalDate endDate = startDate.plusDays(random.nextInt(7) + 3); + eventRepository.save(EventJpaEntity.builder() + .title("이벤트 제목 " + i) + .duration(new DurationJpaVO(startDate, endDate)) + .eventLink("https://example.com/event/" + i) + .build()); + } + log.info("Board(Notice, Inquiry, Event) 데이터 생성 완료."); + } +} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/global/initializer/SchoolInitializer.java b/src/main/java/life/mosu/mosuserver/global/initializer/SchoolInitializer.java deleted file mode 100644 index 57e3da44..00000000 --- a/src/main/java/life/mosu/mosuserver/global/initializer/SchoolInitializer.java +++ /dev/null @@ -1,65 +0,0 @@ -package life.mosu.mosuserver.global.initializer; - -import static life.mosu.mosuserver.domain.school.Area.DAECHI; -import static life.mosu.mosuserver.domain.school.Area.NOWON; - -import jakarta.annotation.PostConstruct; -import java.time.LocalDate; -import life.mosu.mosuserver.domain.school.AddressJpaVO; -import life.mosu.mosuserver.domain.school.SchoolJpaEntity; -import life.mosu.mosuserver.domain.school.SchoolJpaRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SchoolInitializer { - - private final SchoolJpaRepository schoolRepository; - - @PostConstruct - public void init() { - if (schoolRepository.count() > 0) { - log.info("이미 학교 더미 데이터가 존재하여 초기화를 건너뜁니다."); - return; - } - - SchoolJpaEntity school1 = SchoolJpaEntity.builder() - .schoolName("모수고등학교") - .area(DAECHI) - .address(new AddressJpaVO("06164", "서울특별시", "강남구 테헤란로 123")) - .examDate(LocalDate.of(2025, 11, 20)) - .capacity(300L) - .build(); - schoolRepository.save(school1); - - SchoolJpaEntity school2 = SchoolJpaEntity.builder() - .schoolName("대치고등학교") - .area(DAECHI) - .address(new AddressJpaVO("06283", "서울특별시", "강남구 대치동 학원가 100")) - .examDate(LocalDate.of(2025, 12, 5)) - .capacity(150L) - .build(); - schoolRepository.save(school2); - - SchoolJpaEntity school3 = SchoolJpaEntity.builder() - .schoolName("부산명문고") - .area(DAECHI) - .address(new AddressJpaVO("48057", "부산광역시", "해운대구 센텀시티로 50")) - .examDate(LocalDate.of(2025, 11, 25)) - .capacity(250L) - .build(); - schoolRepository.save(school3); - - SchoolJpaEntity school4 = SchoolJpaEntity.builder() - .schoolName("노원스터디센터") - .area(NOWON) - .address(new AddressJpaVO("01777", "서울특별시", "노원구 동일로 1400")) - .examDate(LocalDate.of(2026, 1, 10)) - .capacity(80L) - .build(); - schoolRepository.save(school4); - } -} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/global/initializer/UserAndProfileInitializer.java b/src/main/java/life/mosu/mosuserver/global/initializer/UserAndProfileInitializer.java deleted file mode 100644 index 1aef8164..00000000 --- a/src/main/java/life/mosu/mosuserver/global/initializer/UserAndProfileInitializer.java +++ /dev/null @@ -1,94 +0,0 @@ -package life.mosu.mosuserver.global.initializer; - -import static life.mosu.mosuserver.domain.user.UserRole.ROLE_ADMIN; -import static life.mosu.mosuserver.domain.user.UserRole.ROLE_USER; - -import jakarta.annotation.PostConstruct; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import life.mosu.mosuserver.domain.profile.Education; -import life.mosu.mosuserver.domain.profile.Gender; -import life.mosu.mosuserver.domain.profile.Grade; -import life.mosu.mosuserver.domain.profile.ProfileJpaEntity; -import life.mosu.mosuserver.domain.profile.ProfileJpaRepository; -import life.mosu.mosuserver.domain.profile.SchoolInfoJpaVO; -import life.mosu.mosuserver.domain.user.UserJpaEntity; -import life.mosu.mosuserver.domain.user.UserJpaRepository; -import life.mosu.mosuserver.domain.user.UserRole; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class UserAndProfileInitializer { - - private final UserJpaRepository userRepository; - private final ProfileJpaRepository profileRepository; - private final PasswordEncoder passwordEncoder; - - @PostConstruct - public void init() { - if (userRepository.count() > 0 || profileRepository.count() > 0) { - log.info("이미 더미 데이터가 존재하여 초기화를 건너뜝니다."); - return; - } - - List createdUsers = new ArrayList<>(); - Random random = new Random(); - - for (int i = 1; i <= 10; i++) { - String loginId = "user" + i; - String name = (i % 2 == 0) ? "김철수" + i : "이영희" + i; - Gender gender = (i % 2 == 0) ? Gender.MALE : Gender.FEMALE; - LocalDate birth = LocalDate.of(1990 + (i % 5), (i % 12) + 1, (i % 28) + 1); - String customerKey = "CK-" + i + "-" + System.currentTimeMillis(); - boolean agreedToMarketing = random.nextBoolean(); - UserRole userRole = (i == 1) ? ROLE_ADMIN : ROLE_USER; - - UserJpaEntity user = UserJpaEntity.builder() - .loginId(loginId) - .password(passwordEncoder.encode("password" + i + "!")) - .gender(gender) - .name(name) - .birth(birth) - .customerKey(customerKey) - .agreedToTermsOfService(true) - .agreedToPrivacyPolicy(true) - .agreedToMarketing(agreedToMarketing) - .userRole(userRole) - .build(); - - createdUsers.add(userRepository.save(user)); - - String phoneNumber = - "010-" + String.format("%04d", i) + "-" + String.format("%04d", i + 1000); - String email = "user" + i + "@example.com"; - Education education = Education.values()[random.nextInt(Education.values().length)]; - Grade grade = Grade.values()[random.nextInt(Grade.values().length)]; - SchoolInfoJpaVO schoolInfo = new SchoolInfoJpaVO(("모수대학교" + (i % 3 + 1)), "123-23", - "서울시 모수구 모수동"); - String recommenderPhoneNumber = (i % 3 == 0) ? "010-1234-5678" : null; - - ProfileJpaEntity profile = ProfileJpaEntity.builder() - .userId(user.getId()) - .userName(user.getName()) - .gender(user.getGender()) - .birth(user.getBirth()) - .phoneNumber(phoneNumber) - .email(email) - .education(education) - .schoolInfo(schoolInfo) - .grade(grade) - .build(); - - profile.registerRecommenderPhoneNumber(recommenderPhoneNumber); - - profileRepository.save(profile); - } - } -} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/global/util/KeyGeneratorUtil.java b/src/main/java/life/mosu/mosuserver/global/util/KeyGeneratorUtil.java new file mode 100644 index 00000000..c349d1f5 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/global/util/KeyGeneratorUtil.java @@ -0,0 +1,10 @@ +package life.mosu.mosuserver.global.util; + +import java.util.UUID; + +public class KeyGeneratorUtil { + + public static String generateUUIDCustomerKey() { + return UUID.randomUUID().toString(); + } +} diff --git a/src/main/java/life/mosu/mosuserver/infra/config/SwaggerConfig.java b/src/main/java/life/mosu/mosuserver/infra/config/SwaggerConfig.java index ecfb9b75..2bb157c0 100644 --- a/src/main/java/life/mosu/mosuserver/infra/config/SwaggerConfig.java +++ b/src/main/java/life/mosu/mosuserver/infra/config/SwaggerConfig.java @@ -18,7 +18,9 @@ public OpenAPI customOpenAPI() { .version("1.0.0") ).servers(List.of( new Server().url("https://api.mosuedu.com/api/v1") - .description("MOSU SERVER") + .description("MOSU SERVER"), + new Server().url("http://localhost:8080/api/v1") + .description("Local Development Server") )); } } \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/admin/dto/ApplicationListResponse.java b/src/main/java/life/mosu/mosuserver/presentation/admin/dto/ApplicationListResponse.java index 99f4a04c..96890175 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/admin/dto/ApplicationListResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/admin/dto/ApplicationListResponse.java @@ -6,9 +6,6 @@ import java.util.Set; import life.mosu.mosuserver.domain.payment.PaymentMethod; import life.mosu.mosuserver.domain.payment.PaymentStatus; -import life.mosu.mosuserver.domain.profile.Education; -import life.mosu.mosuserver.domain.profile.Gender; -import life.mosu.mosuserver.domain.profile.Grade; import life.mosu.mosuserver.presentation.applicationschool.dto.AdmissionTicketResponse; @Schema(description = "관리자 신청 목록 응답 DTO") @@ -23,8 +20,8 @@ public record ApplicationListResponse( @Schema(description = "수험자 이름", example = "홍길동") String name, - @Schema(description = "성별", example = "MALE") - Gender gender, + @Schema(description = "성별", example = "남성") + String gender, @Schema(description = "생년월일", example = "2005-05-10") LocalDate birth, @@ -35,14 +32,14 @@ public record ApplicationListResponse( @Schema(description = "보호자 전화번호", example = "010-9876-5432") String guardianPhoneNumber, - @Schema(description = "학력 (예: ENROLLED, GRADUATED)", example = "GRADUATED") - Education educationLevel, + @Schema(description = "학력 (예: 재학생, 졸업생)", example = "재학생") + String educationLevel, @Schema(description = "학교명", example = "대치중학교") String schoolName, - @Schema(description = "학년", example = "HIGH_3") - Grade grade, + @Schema(description = "학년", example = "고등학교 1학년") + String grade, @Schema(description = "도시락 신청 여부", example = "NONE") String lunch, diff --git a/src/main/java/life/mosu/mosuserver/presentation/admin/dto/StudentListResponse.java b/src/main/java/life/mosu/mosuserver/presentation/admin/dto/StudentListResponse.java index c5de4fa0..3dd6bb93 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/admin/dto/StudentListResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/admin/dto/StudentListResponse.java @@ -23,7 +23,7 @@ public record StudentListResponse( @Schema(description = "학교명", example = "서울고등학교") String schoolName, - @Schema(description = "학년", example = "HIGH_1") + @Schema(description = "학년", example = "고등학교 1학년") String grade, @Schema(description = "시험 응시 횟수", example = "2") diff --git a/src/main/java/life/mosu/mosuserver/presentation/oauth/AccessTokenFilter.java b/src/main/java/life/mosu/mosuserver/presentation/oauth/AccessTokenFilter.java index 4fba5227..721c944f 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/oauth/AccessTokenFilter.java +++ b/src/main/java/life/mosu/mosuserver/presentation/oauth/AccessTokenFilter.java @@ -1,64 +1,64 @@ -package life.mosu.mosuserver.presentation.oauth; - -import static org.springframework.http.HttpHeaders.AUTHORIZATION; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; -import life.mosu.mosuserver.application.auth.AccessTokenService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; -import org.springframework.util.ObjectUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -@Component -@RequiredArgsConstructor -public class AccessTokenFilter extends OncePerRequestFilter { - - private static final String TOKEN_PREFIX = "Bearer "; - private final AccessTokenService accessTokenService; - - @Value("${endpoints.reissue}") - private String reissueEndpoint; - - @Override - protected void doFilterInternal( - final HttpServletRequest request, - final HttpServletResponse response, - final FilterChain filterChain - ) throws ServletException, IOException { - if (request.getRequestURI().equals(reissueEndpoint)) { - filterChain.doFilter(request, response); - return; - } - - if (request.getRequestURI().startsWith("/api/v1/oauth2")) { - filterChain.doFilter(request, response); - return; - } - - final String accessToken = resolveToken(request); - if (accessToken != null) { - setAuthentication(accessToken); - } - filterChain.doFilter(request, response); - } - - private void setAuthentication(final String accessToken) { - final Authentication authentication = accessTokenService.getAuthentication(accessToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - - private String resolveToken(final HttpServletRequest request) { - final String token = request.getHeader(AUTHORIZATION); - if (ObjectUtils.isEmpty(token) || !token.startsWith(TOKEN_PREFIX)) { - return null; - } - return token.substring(TOKEN_PREFIX.length()); - } -} \ No newline at end of file +//package life.mosu.mosuserver.presentation.oauth; +// +//import static org.springframework.http.HttpHeaders.AUTHORIZATION; +// +//import jakarta.servlet.FilterChain; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import life.mosu.mosuserver.application.auth.AccessTokenService; +//import lombok.RequiredArgsConstructor; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.security.core.Authentication; +//import org.springframework.security.core.context.SecurityContextHolder; +//import org.springframework.stereotype.Component; +//import org.springframework.util.ObjectUtils; +//import org.springframework.web.filter.OncePerRequestFilter; +// +//@Component +//@RequiredArgsConstructor +//public class AccessTokenFilter extends OncePerRequestFilter { +// +// private static final String TOKEN_PREFIX = "Bearer "; +// private final AccessTokenService accessTokenService; +// +// @Value("${endpoints.reissue}") +// private String reissueEndpoint; +// +// @Override +// protected void doFilterInternal( +// final HttpServletRequest request, +// final HttpServletResponse response, +// final FilterChain filterChain +// ) throws ServletException, IOException { +// if (request.getRequestURI().equals(reissueEndpoint)) { +// filterChain.doFilter(request, response); +// return; +// } +// +// if (request.getRequestURI().startsWith("/api/v1/oauth2")) { +// filterChain.doFilter(request, response); +// return; +// } +// +// final String accessToken = resolveToken(request); +// if (accessToken != null) { +// setAuthentication(accessToken); +// } +// filterChain.doFilter(request, response); +// } +// +// private void setAuthentication(final String accessToken) { +// final Authentication authentication = accessTokenService.getAuthentication(accessToken); +// SecurityContextHolder.getContext().setAuthentication(authentication); +// } +// +// private String resolveToken(final HttpServletRequest request) { +// final String token = request.getHeader(AUTHORIZATION); +// if (ObjectUtils.isEmpty(token) || !token.startsWith(TOKEN_PREFIX)) { +// return null; +// } +// return token.substring(TOKEN_PREFIX.length()); +// } +//} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/oauth/OAuthController.java b/src/main/java/life/mosu/mosuserver/presentation/oauth/OAuthController.java index 83bd7868..937dc88c 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/oauth/OAuthController.java +++ b/src/main/java/life/mosu/mosuserver/presentation/oauth/OAuthController.java @@ -1,15 +1,14 @@ package life.mosu.mosuserver.presentation.oauth; -import static life.mosu.mosuserver.global.resolver.AuthorizationRequestRedirectResolver.REDIRECT_PARAM_KEY; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.view.RedirectView; import org.springframework.web.util.UriComponentsBuilder; @Slf4j @@ -18,16 +17,30 @@ @RequestMapping("/oauth") public class OAuthController { - @GetMapping("/login/{registrationId}") - public RedirectView login( - @PathVariable String registrationId, - @RequestParam(REDIRECT_PARAM_KEY) String redirect + @GetMapping("/authorize-code") + public ResponseEntity handleOAuthCodeFromFrontend( + @RequestParam String code, + @RequestParam(required = false) String state ) { - final String url = UriComponentsBuilder - .fromPath("/api/v1/oauth2/authorization/{registrationId}") - .queryParam(REDIRECT_PARAM_KEY, redirect) - .buildAndExpand(registrationId) + UriComponentsBuilder uriBuilder = UriComponentsBuilder + .fromPath("/api/v1/oauth2/callback/kakao") + .queryParam("code", code); + + if (state != null && !state.isEmpty()) { + uriBuilder.queryParam("state", state); + } + + String redirectUrl = UriComponentsBuilder.newInstance() + .scheme("http") + .host("localhost") + .port(8080) + .path(uriBuilder.toUriString()) + .build() .toUriString(); - return new RedirectView(url); + + log.info("클라이언트를 Spring Security OAuth2 콜백 URL로 리다이렉트합니다: {}", redirectUrl); + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.LOCATION, redirectUrl); + return new ResponseEntity<>(headers, HttpStatus.FOUND); } } \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/oauth/TokenExceptionFilter.java b/src/main/java/life/mosu/mosuserver/presentation/oauth/TokenExceptionFilter.java index 9ab1d00c..ba755c58 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/oauth/TokenExceptionFilter.java +++ b/src/main/java/life/mosu/mosuserver/presentation/oauth/TokenExceptionFilter.java @@ -1,29 +1,29 @@ -package life.mosu.mosuserver.presentation.oauth; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; -import life.mosu.mosuserver.global.exception.CustomRuntimeException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -@Component -@RequiredArgsConstructor -public class TokenExceptionFilter extends OncePerRequestFilter { - - @Override - protected void doFilterInternal( - final HttpServletRequest request, - final HttpServletResponse response, - final FilterChain filterChain - ) throws ServletException, IOException { - try { - filterChain.doFilter(request, response); - } catch (CustomRuntimeException exception) { - response.sendError(exception.getStatus().value(), exception.getMessage()); - } - } -} \ No newline at end of file +//package life.mosu.mosuserver.presentation.oauth; +// +//import jakarta.servlet.FilterChain; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import life.mosu.mosuserver.global.exception.CustomRuntimeException; +//import lombok.RequiredArgsConstructor; +//import org.springframework.stereotype.Component; +//import org.springframework.web.filter.OncePerRequestFilter; +// +//@Component +//@RequiredArgsConstructor +//public class TokenExceptionFilter extends OncePerRequestFilter { +// +// @Override +// protected void doFilterInternal( +// final HttpServletRequest request, +// final HttpServletResponse response, +// final FilterChain filterChain +// ) throws ServletException, IOException { +// try { +// filterChain.doFilter(request, response); +// } catch (CustomRuntimeException exception) { +// response.sendError(exception.getStatus().value(), exception.getMessage()); +// } +// } +//} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/profile/dto/ProfileDetailResponse.java b/src/main/java/life/mosu/mosuserver/presentation/profile/dto/ProfileDetailResponse.java index c21fb599..9d44fd36 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/profile/dto/ProfileDetailResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/profile/dto/ProfileDetailResponse.java @@ -2,9 +2,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; -import life.mosu.mosuserver.domain.profile.Education; -import life.mosu.mosuserver.domain.profile.Gender; -import life.mosu.mosuserver.domain.profile.Grade; import life.mosu.mosuserver.domain.profile.ProfileJpaEntity; @Schema(description = "프로필 상세 응답 DTO") @@ -19,8 +16,8 @@ public record ProfileDetailResponse( @Schema(description = "생년월일", example = "2005-05-10") LocalDate birth, - @Schema(description = "성별", example = "MALE") - Gender gender, + @Schema(description = "성별", example = "남성") + String gender, @Schema(description = "휴대폰 번호", example = "010-1234-5678") String phoneNumber, @@ -29,13 +26,13 @@ public record ProfileDetailResponse( String email, @Schema(description = "학력 (예: ENROLLED, GRADUATED)", example = "ENROLLED") - Education education, + String education, @Schema(description = "학교 정보") SchoolInfoResponse schoolInfo, @Schema(description = "학년", example = "HIGH_1") - Grade grade + String grade ) { @@ -44,12 +41,12 @@ public static ProfileDetailResponse from(ProfileJpaEntity profile) { profile.getId(), profile.getUserName(), profile.getBirth(), - profile.getGender(), + profile.getGender().getGenderName(), profile.getPhoneNumber(), profile.getEmail(), - profile.getEducation(), + profile.getEducation().getEducationName(), SchoolInfoResponse.from(profile.getSchoolInfo()), - profile.getGrade() + profile.getGrade().getGradeName() ); } } diff --git a/src/main/java/life/mosu/mosuserver/presentation/user/CustomerKeyResponse.java b/src/main/java/life/mosu/mosuserver/presentation/user/CustomerKeyResponse.java new file mode 100644 index 00000000..129fcd42 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/presentation/user/CustomerKeyResponse.java @@ -0,0 +1,10 @@ +package life.mosu.mosuserver.presentation.user; + +public record CustomerKeyResponse( + String customerKey +) { + + public static CustomerKeyResponse from(String customerKey) { + return new CustomerKeyResponse(customerKey); + } +} diff --git a/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java b/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java new file mode 100644 index 00000000..75af5568 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java @@ -0,0 +1,30 @@ +package life.mosu.mosuserver.presentation.user; + +import life.mosu.mosuserver.application.user.UserService; +import life.mosu.mosuserver.global.util.ApiResponseWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/user") +@RequiredArgsConstructor +public class UserController { + + private final UserService userService; + + @GetMapping("/customer-key") + public ResponseEntity> getCustomerKey( + @RequestParam Long userId + ) { + String customerKey = userService.getCustomerKey(userId); + + return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "CustomerKey 조회 성공", + CustomerKeyResponse.from(customerKey))); + } + +} diff --git a/src/test/java/life/mosu/mosuserver/FaqServiceTest.java b/src/test/java/life/mosu/mosuserver/FaqServiceTest.java index d26711fd..85924258 100644 --- a/src/test/java/life/mosu/mosuserver/FaqServiceTest.java +++ b/src/test/java/life/mosu/mosuserver/FaqServiceTest.java @@ -10,7 +10,7 @@ import life.mosu.mosuserver.application.faq.FaqAttachmentService; import life.mosu.mosuserver.application.faq.FaqService; import life.mosu.mosuserver.domain.faq.FaqJpaEntity; -import life.mosu.mosuserver.domain.faq.FaqRepository; +import life.mosu.mosuserver.domain.faq.FaqJpaRepository; import life.mosu.mosuserver.presentation.faq.dto.FaqCreateRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -22,7 +22,7 @@ public class FaqServiceTest { @Mock - private FaqRepository faqRepository; + private FaqJpaRepository faqJpaRepository; @Mock private FaqAttachmentService faqAttachmentService; @@ -32,7 +32,7 @@ public class FaqServiceTest { void setUp() { faqService = new FaqService( - faqRepository, + faqJpaRepository, faqAttachmentService ); } @@ -43,7 +43,7 @@ void setUp() { FaqCreateRequest request = mock(FaqCreateRequest.class); FaqJpaEntity savedEntity = mock(FaqJpaEntity.class); - when(faqRepository.save(any())).thenReturn(savedEntity); + when(faqJpaRepository.save(any())).thenReturn(savedEntity); when(request.toEntity()).thenReturn(savedEntity); when(savedEntity.getId()).thenReturn(1L); @@ -51,7 +51,7 @@ void setUp() { faqService.createFaq(request); // then - verify(faqRepository, atLeastOnce()).save(any()); + verify(faqJpaRepository, atLeastOnce()).save(any()); assertEquals(1L, savedEntity.getId()); } }