Skip to content

Commit

Permalink
GETP-201 refactor: auth 컴포넌트의 application 모듈 분리 (#134)
Browse files Browse the repository at this point in the history
  • Loading branch information
scv1702 committed Aug 21, 2024
1 parent fe1f682 commit afdb2ce
Show file tree
Hide file tree
Showing 30 changed files with 61 additions and 106 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package es.princip.getp.api.controller.auth;

import es.princip.getp.api.controller.auth.dto.request.LoginRequest;
import es.princip.getp.api.controller.auth.dto.response.Token;
import es.princip.getp.api.controller.ApiResponse;
import es.princip.getp.api.controller.ApiResponse.ApiSuccessResult;
import es.princip.getp.domain.auth.application.AuthService;
import es.princip.getp.api.controller.auth.dto.request.LoginRequest;
import es.princip.getp.api.controller.auth.dto.response.Token;
import es.princip.getp.application.auth.service.AuthService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import es.princip.getp.api.controller.CommandMapper;
import es.princip.getp.api.controller.auth.dto.request.ServiceTermAgreementRequest;
import es.princip.getp.api.controller.auth.dto.request.SignUpRequest;
import es.princip.getp.domain.auth.application.command.SignUpCommand;
import es.princip.getp.application.auth.command.SignUpCommand;
import es.princip.getp.domain.member.model.ServiceTermAgreementData;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import es.princip.getp.api.controller.ApiResponse.ApiSuccessResult;
import es.princip.getp.api.controller.auth.dto.request.EmailVerificationCodeRequest;
import es.princip.getp.api.controller.auth.dto.request.SignUpRequest;
import es.princip.getp.domain.auth.application.SignUpService;
import es.princip.getp.application.auth.service.SignUpService;
import es.princip.getp.domain.member.model.Email;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import es.princip.getp.api.security.exception.ExpiredTokenException;
import es.princip.getp.api.security.exception.InvalidTokenException;
import es.princip.getp.domain.auth.application.AccessTokenService;
import es.princip.getp.application.auth.service.AccessTokenService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.application.command;
package es.princip.getp.application.auth.command;

import es.princip.getp.domain.member.model.Email;
import es.princip.getp.domain.member.model.MemberType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.exception;
package es.princip.getp.application.auth.exception;

import es.princip.getp.common.exception.BusinessLogicException;
import es.princip.getp.common.exception.ErrorDescription;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.exception;
package es.princip.getp.application.auth.exception;

import es.princip.getp.common.exception.ErrorDescription;
import es.princip.getp.common.exception.ExternalApiErrorException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.exception;
package es.princip.getp.application.auth.exception;

import es.princip.getp.common.exception.BusinessLogicException;
import es.princip.getp.common.exception.ErrorDescription;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.exception;
package es.princip.getp.application.auth.exception;

import es.princip.getp.common.exception.BusinessLogicException;
import es.princip.getp.common.exception.ErrorDescription;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.exception;
package es.princip.getp.application.auth.exception;

import es.princip.getp.common.exception.ErrorDescription;
import es.princip.getp.common.exception.NotFoundException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package es.princip.getp.domain.auth.infra;
package es.princip.getp.application.auth.infra;

import es.princip.getp.domain.auth.application.VerificationCodeSender;
import es.princip.getp.domain.auth.exception.FailedVerificationCodeSendingException;
import es.princip.getp.application.auth.exception.FailedVerificationCodeSendingException;
import es.princip.getp.application.auth.service.VerificationCodeSender;
import es.princip.getp.domain.member.model.Email;
import es.princip.getp.mail.EmailSender;
import es.princip.getp.mail.command.SendMailCommand;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.application.member.port.out.LoadMemberPort;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.api.controller.auth.dto.request.LoginRequest;
import es.princip.getp.api.controller.auth.dto.response.Token;
import es.princip.getp.api.security.details.PrincipalDetails;
import es.princip.getp.domain.auth.exception.IncorrectEmailOrPasswordException;
import es.princip.getp.application.auth.exception.IncorrectEmailOrPasswordException;
import es.princip.getp.domain.member.model.Member;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package es.princip.getp.domain.auth.domain;
package es.princip.getp.application.auth.service;

import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.TimeToLive;

import java.time.LocalDateTime;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

@Getter
@RedisHash(value = "email_verification")
@EqualsAndHashCode(exclude = "expiration")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class EmailVerification {

Expand All @@ -36,22 +37,4 @@ public EmailVerification(String email, String verificationCode, Long expiration)
public boolean verify(String verificationCode) {
return this.verificationCode.equals(verificationCode);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof EmailVerification that)) {
return false;
}
return Objects.equals(email, that.email) &&
Objects.equals(verificationCode,that.verificationCode) &&
Objects.equals(createdAt, that.createdAt);
}

@Override
public int hashCode() {
return Objects.hash(email, verificationCode, createdAt);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.domain;
package es.princip.getp.application.auth.service;

import org.springframework.data.keyvalue.repository.KeyValueRepository;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.api.security.details.PrincipalDetails;
import es.princip.getp.api.security.exception.ExpiredTokenException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.domain;
package es.princip.getp.application.auth.service;

import lombok.Getter;
import org.springframework.data.annotation.Id;
Expand All @@ -11,6 +11,7 @@
@Getter
@RedisHash(value = "token_verification")
public class RefreshToken {

@Id
private Long memberId;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.domain;
package es.princip.getp.application.auth.service;

import org.springframework.data.keyvalue.repository.KeyValueRepository;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.api.security.exception.InvalidTokenException;
import es.princip.getp.application.member.port.out.LoadMemberPort;
import es.princip.getp.domain.auth.domain.RefreshToken;
import es.princip.getp.domain.auth.domain.RefreshTokenRepository;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.application.auth.command.SignUpCommand;
import es.princip.getp.application.auth.exception.DuplicatedEmailException;
import es.princip.getp.application.member.port.out.CheckMemberPort;
import es.princip.getp.application.member.port.out.SaveMemberPort;
import es.princip.getp.application.serviceTerm.port.out.CheckServiceTermPort;
import es.princip.getp.application.serviceTerm.port.out.LoadServiceTermPort;
import es.princip.getp.domain.auth.application.command.SignUpCommand;
import es.princip.getp.domain.auth.exception.DuplicatedEmailException;
import es.princip.getp.domain.member.model.Email;
import es.princip.getp.domain.member.model.Member;
import es.princip.getp.domain.member.model.ServiceTermAgreementData;
Expand All @@ -24,7 +24,7 @@
@RequiredArgsConstructor
public class SignUpService {

private final VerificationService emailVerificationService;
private final VerificationService verificationService;

private final LoadServiceTermPort loadServiceTermPort;
private final CheckServiceTermPort checkServiceTermPort;
Expand All @@ -38,12 +38,12 @@ public void sendEmailVerificationCodeForSignUp(final Email email) {
if (checkMemberPort.existsByEmail(email)) {
throw new DuplicatedEmailException();
}
emailVerificationService.sendVerificationCode(email);
verificationService.sendVerificationCode(email);
}

@Transactional
public void signUp(final SignUpCommand command) {
emailVerificationService.verifyEmail(command.email(), command.verificationCode());
verificationService.verifyEmail(command.email(), command.verificationCode());
if (checkMemberPort.existsByEmail(command.email())) {
throw new DuplicatedEmailException();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.api.controller.auth.dto.response.Token;
import es.princip.getp.domain.member.model.Member;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.domain.member.model.Email;

public interface VerificationCodeSender {

void send(Email email, String verificationCode);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package es.princip.getp.domain.auth.application;
package es.princip.getp.application.auth.service;

import es.princip.getp.application.auth.exception.IncorrectVerificationCodeException;
import es.princip.getp.application.auth.exception.NotFoundVerificationException;
import es.princip.getp.common.util.RandomUtil;
import es.princip.getp.domain.auth.domain.EmailVerification;
import es.princip.getp.domain.auth.domain.EmailVerificationRepository;
import es.princip.getp.domain.auth.exception.IncorrectVerificationCodeException;
import es.princip.getp.domain.auth.exception.NotFoundVerificationException;
import es.princip.getp.domain.member.model.Email;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import es.princip.getp.api.controller.ControllerTest;
import es.princip.getp.api.controller.auth.dto.request.LoginRequest;
import es.princip.getp.api.controller.auth.dto.response.Token;
import es.princip.getp.domain.auth.application.AuthService;
import es.princip.getp.application.auth.service.AuthService;
import jakarta.servlet.http.HttpServletRequest;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
Expand All @@ -28,13 +28,12 @@ class AuthControllerTest extends ControllerTest {
@Autowired
private AuthService authService;

@DisplayName("사용자는")
@Nested
class Login {

final LoginRequest request = new LoginRequest(EMAIL, PASSWORD);

@DisplayName("로그인을 할 수 있다.")
@DisplayName("사용자는 로그인을 할 수 있다.")
@Test
void login() throws Exception {
final Token token = new Token("Bearer", "${ACCESS_TOKEN}", "${REFRESH_TOKEN}");
Expand All @@ -61,11 +60,10 @@ void login() throws Exception {
}
}

@DisplayName("사용자는")
@Nested
class ReissueAccessToken {

@DisplayName("로그인 유지를 할 수 있다.")
@DisplayName("사용자는 로그인 유지를 할 수 있다.")
@Test
void reissueAccessToken() throws Exception {
final Token token = new Token("Bearer", "${ACCESS_TOKEN}", "${REFRESH_TOKEN}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import es.princip.getp.api.controller.auth.dto.request.EmailVerificationCodeRequest;
import es.princip.getp.api.controller.auth.dto.request.ServiceTermAgreementRequest;
import es.princip.getp.api.controller.auth.dto.request.SignUpRequest;
import es.princip.getp.domain.auth.application.SignUpService;
import es.princip.getp.domain.auth.application.command.SignUpCommand;
import es.princip.getp.application.auth.command.SignUpCommand;
import es.princip.getp.application.auth.service.SignUpService;
import es.princip.getp.domain.member.model.MemberType;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
Expand Down Expand Up @@ -38,33 +38,31 @@ class SignUpControllerTest extends ControllerTest {
private SignUpService signUpService;

@Nested
@DisplayName("사용자는")
class SendEmailVerificationCodeForSignUp {

private final EmailVerificationCodeRequest request = new EmailVerificationCodeRequest(EMAIL);

@DisplayName("회원 가입 시 이메일 인증을 해야 한다.")
@DisplayName("사용자는 회원 가입 시 이메일 인증을 해야 한다.")
@Test
void sendEmailVerificationCodeForSignUp() throws Exception {
mockMvc.perform(post("/auth/signup/email/send")
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isOk())
.andDo(
restDocs.document(
requestFields(
getDescriptor("email", "이메일", EmailVerificationCodeRequest.class)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isOk())
.andDo(
restDocs.document(
requestFields(
getDescriptor("email", "이메일", EmailVerificationCodeRequest.class)
)
)
)
)
.andDo(print());
.andDo(print());
}
}

@Nested
@DisplayName("사용자는")
class SignUp {

@DisplayName("회원 가입을 할 수 있다.")
@DisplayName("사용자는 회원 가입을 할 수 있다.")
@ParameterizedTest
@EnumSource(value = MemberType.class, names = { "ROLE_PEOPLE", "ROLE_CLIENT" })
void signUp(MemberType memberType) throws Exception {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package es.princip.getp.domain.auth.application;

import es.princip.getp.domain.auth.domain.EmailVerification;
import es.princip.getp.domain.auth.domain.EmailVerificationRepository;
import es.princip.getp.domain.auth.exception.IncorrectVerificationCodeException;
import es.princip.getp.domain.auth.exception.NotFoundVerificationException;
import es.princip.getp.application.auth.exception.IncorrectVerificationCodeException;
import es.princip.getp.application.auth.exception.NotFoundVerificationException;
import es.princip.getp.application.auth.service.EmailVerification;
import es.princip.getp.application.auth.service.EmailVerificationRepository;
import es.princip.getp.application.auth.service.VerificationCodeSender;
import es.princip.getp.application.auth.service.VerificationService;
import es.princip.getp.domain.member.model.Email;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
Expand Down
Loading

0 comments on commit afdb2ce

Please sign in to comment.