Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import com.ject.studytrip.auth.presentation.dto.request.KakaoSignupRequest;
import com.ject.studytrip.auth.presentation.dto.response.TokenResponse;
import com.ject.studytrip.member.application.service.MemberService;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.SocialProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.ject.studytrip.member.application.service;

import static io.jsonwebtoken.lang.Strings.hasText;

import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.MemberCategory;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.error.MemberErrorCode;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.MemberCategory;
import com.ject.studytrip.member.domain.model.SocialProvider;
import com.ject.studytrip.member.domain.policy.MemberPolicy;
import com.ject.studytrip.member.domain.repository.MemberRepository;
import com.ject.studytrip.member.factory.MemberFactory;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -36,33 +35,15 @@ public Member getMemberBySocialProviderAndSocialId(
@Transactional
public Member createMemberFromKakao(
String kakaoId, String email, String profileImage, String category, String nickname) {
validateNewMember(kakaoId);
MemberCategory parsedCategory = parseCategory(category);
validateMemberNickname(nickname);
Member member =
MemberFactory.fromKakao(kakaoId, email, profileImage, nickname, parsedCategory);
return memberRepository.save(member);
}
boolean exists =
memberRepository.existsBySocialProviderAndSocialId(SocialProvider.KAKAO, kakaoId);
MemberPolicy.validateNickname(nickname);
MemberPolicy.validateNewMember(exists);

private MemberCategory parseCategory(String category) {
try {
return MemberCategory.valueOf(category);
} catch (IllegalArgumentException | NullPointerException e) {
throw new CustomException(MemberErrorCode.MEMBER_CATEGORY_REQUIRED);
}
}

private void validateNewMember(String socialId) {
if (memberRepository
.findBySocialProviderAndSocialId(SocialProvider.KAKAO, socialId)
.isPresent()) {
throw new CustomException(MemberErrorCode.MEMBER_ALREADY_EXISTS);
}
}
MemberCategory memberCategory = MemberCategory.from(category);
Member member =
MemberFactory.fromKakao(kakaoId, email, profileImage, nickname, memberCategory);

private void validateMemberNickname(String nickname) {
if (!hasText(nickname)) {
throw new CustomException(MemberErrorCode.MEMBER_NICKNAME_REQUIRED);
}
return memberRepository.save(member);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public enum MemberErrorCode implements ErrorCode {
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "멤버를 찾을 수 없습니다."),
MEMBER_NEED_SIGNUP(HttpStatus.CONFLICT, "회원가입이 필요한 사용자입니다."),
MEMBER_ALREADY_EXISTS(HttpStatus.CONFLICT, "이미 가입된 사용자입니다."),
;
INVALID_MEMBER_CATEGORY(HttpStatus.BAD_REQUEST, "유효하지 않은 멤버 카테고리입니다.");

private final HttpStatus status;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ject.studytrip.member.domain.entity;
package com.ject.studytrip.member.domain.model;

import com.ject.studytrip.global.common.entity.BaseTimeEntity;
import jakarta.persistence.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.ject.studytrip.member.domain.model;

import static org.springframework.util.StringUtils.hasText;

import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.error.MemberErrorCode;

public enum MemberCategory {
STUDENT,
WORKER,
FREELANCER,
JOBSEEKER,
;

public static MemberCategory from(String category) {
if (!hasText(category)) {
throw new CustomException(MemberErrorCode.MEMBER_CATEGORY_REQUIRED);
}

try {
return MemberCategory.valueOf(category);
} catch (IllegalArgumentException e) {
throw new CustomException(MemberErrorCode.INVALID_MEMBER_CATEGORY);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ject.studytrip.member.domain.entity;
package com.ject.studytrip.member.domain.model;

public enum MemberRole {
ROLE_USER,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ject.studytrip.member.domain.entity;
package com.ject.studytrip.member.domain.model;

public enum SocialProvider {
KAKAO,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.ject.studytrip.member.domain.policy;

import static io.jsonwebtoken.lang.Strings.hasText;

import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.error.MemberErrorCode;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class MemberPolicy {

public static void validateNickname(String nickname) {
if (!hasText(nickname)) {
throw new CustomException(MemberErrorCode.MEMBER_NICKNAME_REQUIRED);
}
}

public static void validateNewMember(boolean exists) {
if (exists) {
throw new CustomException(MemberErrorCode.MEMBER_ALREADY_EXISTS);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.ject.studytrip.member.domain.repository;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.SocialProvider;
import java.util.Optional;

public interface MemberRepository {
Optional<Member> findBySocialProviderAndSocialId(
SocialProvider socialProvider, String socialId);

boolean existsBySocialProviderAndSocialId(SocialProvider socialProvider, String socialId);

Optional<Member> findById(Long id);

Member save(Member member);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.ject.studytrip.member.factory;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.MemberCategory;
import com.ject.studytrip.member.domain.entity.MemberRole;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.MemberCategory;
import com.ject.studytrip.member.domain.model.MemberRole;
import com.ject.studytrip.member.domain.model.SocialProvider;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.ject.studytrip.member.infra.jpa;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.SocialProvider;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberJpaRepository extends JpaRepository<Member, Long> {
Optional<Member> findBySocialProviderAndSocialId(
SocialProvider socialProvider, String socialId);

boolean existsBySocialProviderAndSocialId(SocialProvider socialProvider, String socialId);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ject.studytrip.member.infra.jpa;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.SocialProvider;
import com.ject.studytrip.member.domain.repository.MemberRepository;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
Expand All @@ -18,6 +18,12 @@ public Optional<Member> findBySocialProviderAndSocialId(
return memberJpaRepository.findBySocialProviderAndSocialId(socialProvider, socialId);
}

@Override
public boolean existsBySocialProviderAndSocialId(
SocialProvider socialProvider, String socialId) {
return memberJpaRepository.existsBySocialProviderAndSocialId(socialProvider, socialId);
}

@Override
public Optional<Member> findById(Long id) {
return memberJpaRepository.findById(id);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ject.studytrip.trip.application.facade;

import com.ject.studytrip.member.application.service.MemberService;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.stamp.application.dto.StampInfo;
import com.ject.studytrip.stamp.application.service.StampService;
import com.ject.studytrip.stamp.domain.model.Stamp;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ject.studytrip.trip.application.service;

import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.trip.domain.error.TripErrorCode;
import com.ject.studytrip.trip.domain.factory.TripFactory;
import com.ject.studytrip.trip.domain.model.Trip;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ject.studytrip.trip.domain.factory;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.trip.domain.model.Trip;
import com.ject.studytrip.trip.domain.model.TripCategory;
import java.time.LocalDate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static org.springframework.util.StringUtils.hasText;

import com.ject.studytrip.global.common.entity.BaseTimeEntity;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import jakarta.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

import com.ject.studytrip.BaseUnitTest;
import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.error.MemberErrorCode;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.SocialProvider;
import com.ject.studytrip.member.domain.repository.MemberRepository;
import com.ject.studytrip.member.fixture.MemberFixture;
import java.util.Optional;
Expand Down Expand Up @@ -109,8 +109,10 @@ void shouldReturnMemberWhenSocialIdExists() {
@DisplayName("이미 존재하는 멤버라면 예외가 발생한다.")
void shouldThrowExceptionWhenMemberAlreadyExists() {
// given
given(memberRepository.findBySocialProviderAndSocialId(SocialProvider.KAKAO, KAKAO_ID))
.willReturn(Optional.of(member));
given(
memberRepository.existsBySocialProviderAndSocialId(
SocialProvider.KAKAO, KAKAO_ID))
.willReturn(true);

// when & then
assertThatThrownBy(
Expand All @@ -127,13 +129,13 @@ void shouldThrowExceptionWhenMemberAlreadyExists() {
class CreateMemberFromKakao {

@Test
@DisplayName("카테고리가 유효하지 않으면 예외가 발생한다.")
void shouldThrowExceptionWhenCategoryIsInvalid() {
@DisplayName("카테고리가 비어 있으면 예외가 발생한다.")
void shouldThrowExceptionWhenCategoryIsBlank() {
// when & then
assertThatThrownBy(
() ->
memberService.createMemberFromKakao(
KAKAO_ID, EMAIL, PROFILE_IMAGE, "INVALID", NICKNAME))
KAKAO_ID, EMAIL, PROFILE_IMAGE, " ", NICKNAME))
.isInstanceOf(CustomException.class)
.hasMessage(MemberErrorCode.MEMBER_CATEGORY_REQUIRED.getMessage());
}
Expand All @@ -154,8 +156,10 @@ void shouldThrowExceptionWhenNicknameIsBlank() {
@DisplayName("모든 정보가 유효하면 Member를 생성하고 반환한다.")
void shouldCreateMemberWhenAllDataIsValid() {
// given
given(memberRepository.findBySocialProviderAndSocialId(SocialProvider.KAKAO, KAKAO_ID))
.willReturn(Optional.empty());
given(
memberRepository.existsBySocialProviderAndSocialId(
SocialProvider.KAKAO, KAKAO_ID))
.willReturn(false);
given(memberRepository.save(any(Member.class))).willReturn(member);

// when
Expand All @@ -171,8 +175,10 @@ void shouldCreateMemberWhenAllDataIsValid() {
@DisplayName("프로필 이미지가 없어도 Member를 생성하고 반환한다.")
void shouldCreateMemberWhenProfileImageIsNull() {
// given
given(memberRepository.findBySocialProviderAndSocialId(SocialProvider.KAKAO, KAKAO_ID))
.willReturn(Optional.empty());
given(
memberRepository.existsBySocialProviderAndSocialId(
SocialProvider.KAKAO, KAKAO_ID))
.willReturn(false);
given(memberRepository.save(any(Member.class))).willReturn(memberWithoutProfileImage);

// when
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.ject.studytrip.member.fixture;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.entity.MemberCategory;
import com.ject.studytrip.member.domain.entity.MemberRole;
import com.ject.studytrip.member.domain.entity.SocialProvider;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.model.MemberCategory;
import com.ject.studytrip.member.domain.model.MemberRole;
import com.ject.studytrip.member.domain.model.SocialProvider;
import org.springframework.test.util.ReflectionTestUtils;

public class MemberFixture {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ject.studytrip.member.helper;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.domain.repository.MemberRepository;
import com.ject.studytrip.member.fixture.MemberFixture;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import com.ject.studytrip.BaseUnitTest;
import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.fixture.MemberFixture;
import com.ject.studytrip.stamp.domain.error.StampErrorCode;
import com.ject.studytrip.stamp.domain.factory.StampFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import com.ject.studytrip.BaseUnitTest;
import com.ject.studytrip.global.exception.CustomException;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.fixture.MemberFixture;
import com.ject.studytrip.trip.domain.error.TripErrorCode;
import com.ject.studytrip.trip.domain.model.Trip;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ject.studytrip.trip.fixture;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.trip.domain.factory.TripFactory;
import com.ject.studytrip.trip.domain.model.Trip;
import com.ject.studytrip.trip.domain.model.TripCategory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ject.studytrip.trip.helper;

import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.trip.domain.model.Trip;
import com.ject.studytrip.trip.domain.model.TripCategory;
import com.ject.studytrip.trip.domain.repository.TripRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import com.ject.studytrip.auth.helper.TokenTestHelper;
import com.ject.studytrip.global.common.response.StandardResponse;
import com.ject.studytrip.global.exception.error.CommonErrorCode;
import com.ject.studytrip.member.domain.entity.Member;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.member.helper.MemberTestHelper;
import com.ject.studytrip.stamp.domain.error.StampErrorCode;
import com.ject.studytrip.stamp.fixture.CreateStampRequestFixture;
Expand Down