diff --git a/src/main/java/com/ftm/server/web/controller/auth/UserLoginController.java b/src/main/java/com/ftm/server/adapter/in/web/auth/controller/GeneralLoginController.java similarity index 50% rename from src/main/java/com/ftm/server/web/controller/auth/UserLoginController.java rename to src/main/java/com/ftm/server/adapter/in/web/auth/controller/GeneralLoginController.java index 6837602..9b3da2b 100644 --- a/src/main/java/com/ftm/server/web/controller/auth/UserLoginController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/controller/GeneralLoginController.java @@ -1,12 +1,12 @@ -package com.ftm.server.web.controller.auth; +package com.ftm.server.adapter.in.web.auth.controller; -import com.ftm.server.application.dto.command.UserLoginCommand; -import com.ftm.server.application.usecase.auth.UserLoginUseCase; +import com.ftm.server.adapter.in.web.auth.dto.request.GeneralLoginRequest; +import com.ftm.server.adapter.in.web.auth.dto.response.GeneralLoginResponse; +import com.ftm.server.application.command.auth.GeneralLoginCommand; +import com.ftm.server.application.port.in.auth.GeneralLoginUseCase; +import com.ftm.server.application.vo.auth.AuthenticatedUserVo; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; -import com.ftm.server.domain.vo.UserSummaryVo; -import com.ftm.server.web.dto.request.UserLoginRequest; -import com.ftm.server.web.dto.response.UserLoginResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -18,17 +18,18 @@ @RestController @RequiredArgsConstructor -public class UserLoginController { +public class GeneralLoginController { - private final UserLoginUseCase loginUseCase; + private final GeneralLoginUseCase generalLoginUseCase; @PostMapping("/api/auth/login") - public ResponseEntity> login( - @RequestBody UserLoginRequest request, + public ResponseEntity> login( + @RequestBody GeneralLoginRequest request, HttpServletRequest req, HttpServletResponse res) { - UserSummaryVo vo = loginUseCase.login(UserLoginCommand.from(request), req, res); + AuthenticatedUserVo vo = + generalLoginUseCase.execute(GeneralLoginCommand.from(request), req, res); return ResponseEntity.status(HttpStatus.OK) - .body(ApiResponse.success(SuccessResponseCode.OK, UserLoginResponse.from(vo))); + .body(ApiResponse.success(SuccessResponseCode.OK, GeneralLoginResponse.from(vo))); } } diff --git a/src/main/java/com/ftm/server/web/controller/auth/KakaoLoginController.java b/src/main/java/com/ftm/server/adapter/in/web/auth/controller/KakaoLoginController.java similarity index 63% rename from src/main/java/com/ftm/server/web/controller/auth/KakaoLoginController.java rename to src/main/java/com/ftm/server/adapter/in/web/auth/controller/KakaoLoginController.java index eb55fb0..cfa551f 100644 --- a/src/main/java/com/ftm/server/web/controller/auth/KakaoLoginController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/controller/KakaoLoginController.java @@ -1,18 +1,19 @@ -package com.ftm.server.web.controller.auth; +package com.ftm.server.adapter.in.web.auth.controller; -import static com.ftm.server.common.consts.StaticConsts.*; +import static com.ftm.server.common.consts.StaticConsts.PENDING_SOCIAL_USER_SESSION_KEY; +import static com.ftm.server.common.consts.StaticConsts.PENDING_SOCIAL_USER_SESSION_TTL; -import com.ftm.server.application.dto.command.KakaoAuthCommand; -import com.ftm.server.application.usecase.auth.KakaoLoginUseCase; +import com.ftm.server.adapter.in.web.auth.dto.request.KakaoLoginRequest; +import com.ftm.server.adapter.in.web.auth.dto.response.SocialLoginResponse; +import com.ftm.server.application.command.auth.KakaoLoginCommand; +import com.ftm.server.application.port.in.auth.KakaoLoginUseCase; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; +import com.ftm.server.application.vo.auth.PendingSocialUserVo; +import com.ftm.server.application.vo.auth.SocialLoginOutcomeVo; +import com.ftm.server.application.vo.auth.SocialLoginSuccessVo; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; import com.ftm.server.domain.enums.SocialProvider; -import com.ftm.server.domain.vo.PendingSocialUserVo; -import com.ftm.server.domain.vo.SocialLoginOutcomeVo; -import com.ftm.server.domain.vo.SocialLoginSuccessVo; -import com.ftm.server.infrastructure.security.AuthenticationService; -import com.ftm.server.web.dto.request.KakaoLoginRequest; -import com.ftm.server.web.dto.response.SocialLoginResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @@ -29,29 +30,30 @@ public class KakaoLoginController { private final KakaoLoginUseCase kakaoLoginUseCase; - private final AuthenticationService authenticationService; + private final SecurityAuthenticationPort securityAuthenticationPort; @PostMapping("/api/auth/login/kakao") public ResponseEntity> kakaoLogin( @RequestBody KakaoLoginRequest request, HttpServletRequest req, HttpServletResponse res) { - SocialLoginOutcomeVo result = kakaoLoginUseCase.kakaoLogin(KakaoAuthCommand.from(request)); + SocialLoginOutcomeVo result = kakaoLoginUseCase.execute(KakaoLoginCommand.from(request)); // 가입된 유저인 경우 로그인 처리 if (result.isRegistered()) { SocialLoginSuccessVo loginUser = (SocialLoginSuccessVo) result; Authentication auth = - authenticationService.createAuthenticationFromSocial(loginUser.getUser()); - authenticationService.saveAuthenticatedSession(auth, req, res); + securityAuthenticationPort.createAuthenticationFromSocial(loginUser.getUser()); + securityAuthenticationPort.saveAuthenticatedSession(auth, req, res); return ResponseEntity.status(HttpStatus.OK) .body( ApiResponse.success( SuccessResponseCode.OK, SocialLoginResponse.from( - SocialProvider.KAKAO, loginUser.getUserSummaryVo()))); + SocialProvider.KAKAO, + loginUser.getAuthenticatedUserVo()))); } // 가입이 필요한 유저인 경우 diff --git a/src/main/java/com/ftm/server/web/controller/auth/LogoutController.java b/src/main/java/com/ftm/server/adapter/in/web/auth/controller/LogoutController.java similarity index 94% rename from src/main/java/com/ftm/server/web/controller/auth/LogoutController.java rename to src/main/java/com/ftm/server/adapter/in/web/auth/controller/LogoutController.java index 5b6cd94..ebb3808 100644 --- a/src/main/java/com/ftm/server/web/controller/auth/LogoutController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/controller/LogoutController.java @@ -1,4 +1,4 @@ -package com.ftm.server.web.controller.auth; +package com.ftm.server.adapter.in.web.auth.controller; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; diff --git a/src/main/java/com/ftm/server/web/dto/request/UserLoginRequest.java b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/request/GeneralLoginRequest.java similarity index 63% rename from src/main/java/com/ftm/server/web/dto/request/UserLoginRequest.java rename to src/main/java/com/ftm/server/adapter/in/web/auth/dto/request/GeneralLoginRequest.java index 752daf6..29b8365 100644 --- a/src/main/java/com/ftm/server/web/dto/request/UserLoginRequest.java +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/request/GeneralLoginRequest.java @@ -1,11 +1,11 @@ -package com.ftm.server.web.dto.request; +package com.ftm.server.adapter.in.web.auth.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor -public class UserLoginRequest { +public class GeneralLoginRequest { private final String email; private final String password; diff --git a/src/main/java/com/ftm/server/web/dto/request/KakaoLoginRequest.java b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/request/KakaoLoginRequest.java similarity index 74% rename from src/main/java/com/ftm/server/web/dto/request/KakaoLoginRequest.java rename to src/main/java/com/ftm/server/adapter/in/web/auth/dto/request/KakaoLoginRequest.java index 4692182..927c079 100644 --- a/src/main/java/com/ftm/server/web/dto/request/KakaoLoginRequest.java +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/request/KakaoLoginRequest.java @@ -1,4 +1,4 @@ -package com.ftm.server.web.dto.request; +package com.ftm.server.adapter.in.web.auth.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/ftm/server/adapter/in/web/auth/dto/response/GeneralLoginResponse.java b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/response/GeneralLoginResponse.java new file mode 100644 index 0000000..dd74829 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/response/GeneralLoginResponse.java @@ -0,0 +1,32 @@ +package com.ftm.server.adapter.in.web.auth.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ftm.server.application.vo.auth.AuthenticatedUserVo; +import java.time.LocalDateTime; +import lombok.Getter; + +@Getter +public class GeneralLoginResponse { + + private final Long id; + private final String nickname; + private final String profileImageUrl; + private final String mildLevelName; + private final String spicyLevelName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm", shape = JsonFormat.Shape.STRING) + private final LocalDateTime loginTime; + + GeneralLoginResponse(AuthenticatedUserVo authenticatedUserVo) { + this.id = authenticatedUserVo.getId(); + this.nickname = authenticatedUserVo.getNickname(); + this.profileImageUrl = authenticatedUserVo.getProfileImageUrl(); + this.mildLevelName = authenticatedUserVo.getMildLevelName(); + this.spicyLevelName = authenticatedUserVo.getSpicyLevelName(); + this.loginTime = LocalDateTime.now(); + } + + public static GeneralLoginResponse from(AuthenticatedUserVo authenticatedUserVo) { + return new GeneralLoginResponse(authenticatedUserVo); + } +} diff --git a/src/main/java/com/ftm/server/web/dto/response/SocialLoginResponse.java b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/response/SocialLoginResponse.java similarity index 50% rename from src/main/java/com/ftm/server/web/dto/response/SocialLoginResponse.java rename to src/main/java/com/ftm/server/adapter/in/web/auth/dto/response/SocialLoginResponse.java index 1de295d..ed3e07d 100644 --- a/src/main/java/com/ftm/server/web/dto/response/SocialLoginResponse.java +++ b/src/main/java/com/ftm/server/adapter/in/web/auth/dto/response/SocialLoginResponse.java @@ -1,8 +1,8 @@ -package com.ftm.server.web.dto.response; +package com.ftm.server.adapter.in.web.auth.dto.response; import com.fasterxml.jackson.annotation.JsonFormat; +import com.ftm.server.application.vo.auth.AuthenticatedUserVo; import com.ftm.server.domain.enums.SocialProvider; -import com.ftm.server.domain.vo.UserSummaryVo; import java.time.LocalDateTime; import lombok.Getter; @@ -19,18 +19,18 @@ public class SocialLoginResponse { @JsonFormat(pattern = "yyyy-MM-dd HH:mm", shape = JsonFormat.Shape.STRING) private final LocalDateTime loginTime; - SocialLoginResponse(SocialProvider socialProvider, UserSummaryVo userSummaryVo) { - this.id = userSummaryVo.getId(); - this.nickname = userSummaryVo.getNickname(); + SocialLoginResponse(SocialProvider socialProvider, AuthenticatedUserVo authenticatedUserVo) { + this.id = authenticatedUserVo.getId(); + this.nickname = authenticatedUserVo.getNickname(); this.socialProvider = socialProvider; - this.profileImageUrl = userSummaryVo.getProfileImageUrl(); - this.mildLevelName = userSummaryVo.getMildLevelName(); - this.spicyLevelName = userSummaryVo.getSpicyLevelName(); + this.profileImageUrl = authenticatedUserVo.getProfileImageUrl(); + this.mildLevelName = authenticatedUserVo.getMildLevelName(); + this.spicyLevelName = authenticatedUserVo.getSpicyLevelName(); this.loginTime = LocalDateTime.now(); } public static SocialLoginResponse from( - SocialProvider socialProvider, UserSummaryVo userSummaryVo) { - return new SocialLoginResponse(socialProvider, userSummaryVo); + SocialProvider socialProvider, AuthenticatedUserVo authenticatedUserVo) { + return new SocialLoginResponse(socialProvider, authenticatedUserVo); } } diff --git a/src/main/java/com/ftm/server/application/usecase/grooming/.gitkeep b/src/main/java/com/ftm/server/adapter/in/web/grooming/controller/.gitkeep similarity index 100% rename from src/main/java/com/ftm/server/application/usecase/grooming/.gitkeep rename to src/main/java/com/ftm/server/adapter/in/web/grooming/controller/.gitkeep diff --git a/src/main/java/com/ftm/server/application/usecase/post/.gitkeep b/src/main/java/com/ftm/server/adapter/in/web/grooming/dto/.gitkeep similarity index 100% rename from src/main/java/com/ftm/server/application/usecase/post/.gitkeep rename to src/main/java/com/ftm/server/adapter/in/web/grooming/dto/.gitkeep diff --git a/src/main/java/com/ftm/server/infrastructure/persistence/.gitkeep b/src/main/java/com/ftm/server/adapter/in/web/post/controller/.gitkeep similarity index 100% rename from src/main/java/com/ftm/server/infrastructure/persistence/.gitkeep rename to src/main/java/com/ftm/server/adapter/in/web/post/controller/.gitkeep diff --git a/src/main/java/com/ftm/server/web/controller/grooming/.gitkeep b/src/main/java/com/ftm/server/adapter/in/web/post/dto/.gitkeep similarity index 100% rename from src/main/java/com/ftm/server/web/controller/grooming/.gitkeep rename to src/main/java/com/ftm/server/adapter/in/web/post/dto/.gitkeep diff --git a/src/main/java/com/ftm/server/web/controller/user/EmailAuthenticationController.java b/src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailAuthenticationController.java similarity index 76% rename from src/main/java/com/ftm/server/web/controller/user/EmailAuthenticationController.java rename to src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailAuthenticationController.java index fe71227..fd1d51f 100644 --- a/src/main/java/com/ftm/server/web/controller/user/EmailAuthenticationController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailAuthenticationController.java @@ -1,10 +1,10 @@ -package com.ftm.server.web.controller.user; +package com.ftm.server.adapter.in.web.user.controller; -import com.ftm.server.application.dto.command.EmailAuthenticationCommand; -import com.ftm.server.application.usecase.user.EmailAuthenticationUseCase; +import com.ftm.server.adapter.in.web.user.dto.request.EmailAuthenticationRequest; +import com.ftm.server.application.command.user.EmailAuthenticationCommand; +import com.ftm.server.application.port.in.user.EmailAuthenticationUseCase; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; -import com.ftm.server.web.dto.request.EmailAuthenticationRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -22,7 +22,7 @@ public class EmailAuthenticationController { @PostMapping("/api/users/email/authentication") public ResponseEntity> emailAuthenticationCodeSender( @Valid @RequestBody EmailAuthenticationRequest request) { - emailAuthenticationUseCase.sendEmailAuthenticationCode( + emailAuthenticationUseCase.execute( EmailAuthenticationCommand.from(request)); // command 객체 전달 return ResponseEntity.status(HttpStatus.OK) .body(ApiResponse.success(SuccessResponseCode.OK)); diff --git a/src/main/java/com/ftm/server/web/controller/user/EmailCodeVerificationController.java b/src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailCodeVerificationController.java similarity index 77% rename from src/main/java/com/ftm/server/web/controller/user/EmailCodeVerificationController.java rename to src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailCodeVerificationController.java index 586e75c..0428d46 100644 --- a/src/main/java/com/ftm/server/web/controller/user/EmailCodeVerificationController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailCodeVerificationController.java @@ -1,11 +1,11 @@ -package com.ftm.server.web.controller.user; +package com.ftm.server.adapter.in.web.user.controller; -import com.ftm.server.application.dto.query.EmailCodeVerificationQuery; -import com.ftm.server.application.usecase.user.EmailCodeVerificationUseCase; +import com.ftm.server.adapter.in.web.user.dto.request.EmailCodeVerificationRequest; +import com.ftm.server.adapter.in.web.user.dto.response.EmailCodeVerificationResponse; +import com.ftm.server.application.port.in.user.EmailCodeVerificationUseCase; +import com.ftm.server.application.query.EmailCodeVerificationQuery; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; -import com.ftm.server.web.dto.request.EmailCodeVerificationRequest; -import com.ftm.server.web.dto.response.EmailCodeVerificationResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/ftm/server/web/controller/user/EmailDuplicationCheckController.java b/src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailDuplicationCheckController.java similarity index 81% rename from src/main/java/com/ftm/server/web/controller/user/EmailDuplicationCheckController.java rename to src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailDuplicationCheckController.java index 9e7e001..60e5965 100644 --- a/src/main/java/com/ftm/server/web/controller/user/EmailDuplicationCheckController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/controller/EmailDuplicationCheckController.java @@ -1,10 +1,10 @@ -package com.ftm.server.web.controller.user; +package com.ftm.server.adapter.in.web.user.controller; -import com.ftm.server.application.dto.query.FindByEmailQuery; -import com.ftm.server.application.usecase.user.EmailDuplicationCheckUseCase; +import com.ftm.server.adapter.in.web.user.dto.response.EmailDuplicationCheckResponse; +import com.ftm.server.application.port.in.user.EmailDuplicationCheckUseCase; +import com.ftm.server.application.query.FindByEmailQuery; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; -import com.ftm.server.web.dto.response.EmailDuplicationCheckResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -26,7 +26,7 @@ public ResponseEntity> emailDuplicati ApiResponse.success( SuccessResponseCode.OK, EmailDuplicationCheckResponse.from( - emailDuplicationCheckUseCase.emailDuplicationCheck( + emailDuplicationCheckUseCase.execute( FindByEmailQuery.of(email))))); } } diff --git a/src/main/java/com/ftm/server/web/controller/user/GeneralUserSignupController.java b/src/main/java/com/ftm/server/adapter/in/web/user/controller/GeneralUserSignupController.java similarity index 78% rename from src/main/java/com/ftm/server/web/controller/user/GeneralUserSignupController.java rename to src/main/java/com/ftm/server/adapter/in/web/user/controller/GeneralUserSignupController.java index d7ee6f6..26ac1a1 100644 --- a/src/main/java/com/ftm/server/web/controller/user/GeneralUserSignupController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/controller/GeneralUserSignupController.java @@ -1,10 +1,10 @@ -package com.ftm.server.web.controller.user; +package com.ftm.server.adapter.in.web.user.controller; -import com.ftm.server.application.dto.command.GeneralUserSignupCommand; -import com.ftm.server.application.usecase.user.GeneralUserSignupUseCase; +import com.ftm.server.adapter.in.web.user.dto.request.GeneralUserSignupRequest; +import com.ftm.server.application.command.user.GeneralUserSignupCommand; +import com.ftm.server.application.port.in.user.GeneralUserSignupUseCase; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; -import com.ftm.server.web.dto.request.GeneralUserSignupRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/ftm/server/web/controller/user/GetUserSignupOptionsController.java b/src/main/java/com/ftm/server/adapter/in/web/user/controller/GetUserSignupOptionsController.java similarity index 82% rename from src/main/java/com/ftm/server/web/controller/user/GetUserSignupOptionsController.java rename to src/main/java/com/ftm/server/adapter/in/web/user/controller/GetUserSignupOptionsController.java index 5fd8271..877f0a4 100644 --- a/src/main/java/com/ftm/server/web/controller/user/GetUserSignupOptionsController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/controller/GetUserSignupOptionsController.java @@ -1,9 +1,9 @@ -package com.ftm.server.web.controller.user; +package com.ftm.server.adapter.in.web.user.controller; -import com.ftm.server.application.usecase.user.GetUserSignupOptionsUseCase; +import com.ftm.server.adapter.in.web.user.dto.response.UserSignupOptionsResponse; +import com.ftm.server.application.port.in.user.GetUserSignupOptionsUseCase; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.SuccessResponseCode; -import com.ftm.server.web.dto.response.UserSignupOptionsResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/ftm/server/web/controller/user/SocialUserSignupController.java b/src/main/java/com/ftm/server/adapter/in/web/user/controller/SocialUserSignupController.java similarity index 74% rename from src/main/java/com/ftm/server/web/controller/user/SocialUserSignupController.java rename to src/main/java/com/ftm/server/adapter/in/web/user/controller/SocialUserSignupController.java index b240873..237400f 100644 --- a/src/main/java/com/ftm/server/web/controller/user/SocialUserSignupController.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/controller/SocialUserSignupController.java @@ -1,19 +1,19 @@ -package com.ftm.server.web.controller.user; +package com.ftm.server.adapter.in.web.user.controller; import static com.ftm.server.common.consts.StaticConsts.PENDING_SOCIAL_USER_SESSION_KEY; -import com.ftm.server.application.dto.command.SocialUserSignupCommand; -import com.ftm.server.application.usecase.user.SocialUserSignupUseCase; +import com.ftm.server.adapter.in.web.user.dto.request.SocialUserSignupRequest; +import com.ftm.server.adapter.in.web.user.dto.response.SocialUserSignupResponse; +import com.ftm.server.application.command.user.SocialUserSignupCommand; +import com.ftm.server.application.port.in.user.SocialUserSignupUseCase; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; +import com.ftm.server.application.vo.auth.PendingSocialUserVo; +import com.ftm.server.application.vo.user.SocialUserSignupSummaryVo; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.ApiResponse; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.common.response.enums.SuccessResponseCode; import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.vo.PendingSocialUserVo; -import com.ftm.server.domain.vo.SocialUserSignupSummaryVo; -import com.ftm.server.infrastructure.security.AuthenticationService; -import com.ftm.server.web.dto.request.SocialUserSignupRequest; -import com.ftm.server.web.dto.response.SocialUserSignupResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @@ -32,7 +32,7 @@ public class SocialUserSignupController { private final SocialUserSignupUseCase socialUserSignupUseCase; - private final AuthenticationService authenticationService; + private final SecurityAuthenticationPort securityAuthenticationPort; @PostMapping("api/users/social") public ResponseEntity> socialUserSignup( @@ -59,8 +59,8 @@ public ResponseEntity> socialUserSignup( session.invalidate(); // 인증 정보 저장 - Authentication auth = authenticationService.createAuthenticationFromSocial(user); - authenticationService.saveAuthenticatedSession(auth, req, res); + Authentication auth = securityAuthenticationPort.createAuthenticationFromSocial(user); + securityAuthenticationPort.saveAuthenticatedSession(auth, req, res); SocialUserSignupResponse response = SocialUserSignupResponse.from(summary); diff --git a/src/main/java/com/ftm/server/web/dto/request/EmailAuthenticationRequest.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/EmailAuthenticationRequest.java similarity index 84% rename from src/main/java/com/ftm/server/web/dto/request/EmailAuthenticationRequest.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/request/EmailAuthenticationRequest.java index 935873c..4b51724 100644 --- a/src/main/java/com/ftm/server/web/dto/request/EmailAuthenticationRequest.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/EmailAuthenticationRequest.java @@ -1,4 +1,4 @@ -package com.ftm.server.web.dto.request; +package com.ftm.server.adapter.in.web.user.dto.request; import jakarta.validation.constraints.Pattern; import lombok.Data; diff --git a/src/main/java/com/ftm/server/web/dto/request/EmailCodeVerificationRequest.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/EmailCodeVerificationRequest.java similarity index 78% rename from src/main/java/com/ftm/server/web/dto/request/EmailCodeVerificationRequest.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/request/EmailCodeVerificationRequest.java index 498fbcb..cb2a81f 100644 --- a/src/main/java/com/ftm/server/web/dto/request/EmailCodeVerificationRequest.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/EmailCodeVerificationRequest.java @@ -1,4 +1,4 @@ -package com.ftm.server.web.dto.request; +package com.ftm.server.adapter.in.web.user.dto.request; import jakarta.validation.constraints.NotBlank; import lombok.Data; diff --git a/src/main/java/com/ftm/server/web/dto/request/GeneralUserSignupRequest.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/GeneralUserSignupRequest.java similarity index 93% rename from src/main/java/com/ftm/server/web/dto/request/GeneralUserSignupRequest.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/request/GeneralUserSignupRequest.java index d6a4359..4c3658b 100644 --- a/src/main/java/com/ftm/server/web/dto/request/GeneralUserSignupRequest.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/GeneralUserSignupRequest.java @@ -1,4 +1,4 @@ -package com.ftm.server.web.dto.request; +package com.ftm.server.adapter.in.web.user.dto.request; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; diff --git a/src/main/java/com/ftm/server/web/dto/request/SocialUserSignupRequest.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/SocialUserSignupRequest.java similarity index 84% rename from src/main/java/com/ftm/server/web/dto/request/SocialUserSignupRequest.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/request/SocialUserSignupRequest.java index 70e6510..c924908 100644 --- a/src/main/java/com/ftm/server/web/dto/request/SocialUserSignupRequest.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/request/SocialUserSignupRequest.java @@ -1,4 +1,4 @@ -package com.ftm.server.web.dto.request; +package com.ftm.server.adapter.in.web.user.dto.request; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; diff --git a/src/main/java/com/ftm/server/web/dto/response/EmailCodeVerificationResponse.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/EmailCodeVerificationResponse.java similarity index 68% rename from src/main/java/com/ftm/server/web/dto/response/EmailCodeVerificationResponse.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/response/EmailCodeVerificationResponse.java index 118a5a1..034acd6 100644 --- a/src/main/java/com/ftm/server/web/dto/response/EmailCodeVerificationResponse.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/EmailCodeVerificationResponse.java @@ -1,6 +1,6 @@ -package com.ftm.server.web.dto.response; +package com.ftm.server.adapter.in.web.user.dto.response; -import com.ftm.server.domain.vo.EmailCodeVerificationVo; +import com.ftm.server.application.vo.user.EmailCodeVerificationVo; import lombok.Data; @Data diff --git a/src/main/java/com/ftm/server/web/dto/response/EmailDuplicationCheckResponse.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/EmailDuplicationCheckResponse.java similarity index 71% rename from src/main/java/com/ftm/server/web/dto/response/EmailDuplicationCheckResponse.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/response/EmailDuplicationCheckResponse.java index a94ad2e..7d7ccb2 100644 --- a/src/main/java/com/ftm/server/web/dto/response/EmailDuplicationCheckResponse.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/EmailDuplicationCheckResponse.java @@ -1,6 +1,6 @@ -package com.ftm.server.web.dto.response; +package com.ftm.server.adapter.in.web.user.dto.response; -import com.ftm.server.domain.vo.EmailDuplicationVo; +import com.ftm.server.application.vo.user.EmailDuplicationVo; import lombok.Data; @Data diff --git a/src/main/java/com/ftm/server/web/dto/response/SocialUserSignupResponse.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/SocialUserSignupResponse.java similarity index 88% rename from src/main/java/com/ftm/server/web/dto/response/SocialUserSignupResponse.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/response/SocialUserSignupResponse.java index f9faee6..3f1af44 100644 --- a/src/main/java/com/ftm/server/web/dto/response/SocialUserSignupResponse.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/SocialUserSignupResponse.java @@ -1,8 +1,8 @@ -package com.ftm.server.web.dto.response; +package com.ftm.server.adapter.in.web.user.dto.response; import com.fasterxml.jackson.annotation.JsonFormat; +import com.ftm.server.application.vo.user.SocialUserSignupSummaryVo; import com.ftm.server.domain.enums.SocialProvider; -import com.ftm.server.domain.vo.SocialUserSignupSummaryVo; import java.time.LocalDateTime; import lombok.Data; diff --git a/src/main/java/com/ftm/server/web/dto/response/UserSignupOptionsResponse.java b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/UserSignupOptionsResponse.java similarity index 87% rename from src/main/java/com/ftm/server/web/dto/response/UserSignupOptionsResponse.java rename to src/main/java/com/ftm/server/adapter/in/web/user/dto/response/UserSignupOptionsResponse.java index fafa00e..4711906 100644 --- a/src/main/java/com/ftm/server/web/dto/response/UserSignupOptionsResponse.java +++ b/src/main/java/com/ftm/server/adapter/in/web/user/dto/response/UserSignupOptionsResponse.java @@ -1,8 +1,8 @@ -package com.ftm.server.web.dto.response; +package com.ftm.server.adapter.in.web.user.dto.response; +import com.ftm.server.application.vo.user.UserSignupOptionsVo; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; -import com.ftm.server.domain.vo.UserSignupOptionsVo; import java.util.List; import lombok.Data; diff --git a/src/main/java/com/ftm/server/infrastructure/oauth/kakao/KakaoOAuthClient.java b/src/main/java/com/ftm/server/adapter/out/oauth/kakao/KakaoOAuthClientAdapter.java similarity index 83% rename from src/main/java/com/ftm/server/infrastructure/oauth/kakao/KakaoOAuthClient.java rename to src/main/java/com/ftm/server/adapter/out/oauth/kakao/KakaoOAuthClientAdapter.java index 9ef9fc8..11ffe2e 100644 --- a/src/main/java/com/ftm/server/infrastructure/oauth/kakao/KakaoOAuthClient.java +++ b/src/main/java/com/ftm/server/adapter/out/oauth/kakao/KakaoOAuthClientAdapter.java @@ -1,12 +1,14 @@ -package com.ftm.server.infrastructure.oauth.kakao; +package com.ftm.server.adapter.out.oauth.kakao; -import static com.ftm.server.common.consts.StaticConsts.*; +import static com.ftm.server.common.consts.StaticConsts.AUTHORIZATION_GRANT_TYPE; +import static com.ftm.server.common.consts.StaticConsts.AUTHORIZATION_HEADER_PREFIX; -import com.ftm.server.application.dto.command.KakaoAuthCommand; -import com.ftm.server.application.port.SocialAuthClientPort; -import com.ftm.server.common.annotation.InfraService; +import com.ftm.server.application.command.auth.KakaoLoginCommand; +import com.ftm.server.application.port.out.oauth.SocialOAuthClientPort; +import com.ftm.server.common.annotation.Adapter; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; +import com.ftm.server.infrastructure.oauth.kakao.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; @@ -17,15 +19,16 @@ import reactor.core.publisher.Mono; @Slf4j -@InfraService +@Adapter @RequiredArgsConstructor -public class KakaoOAuthClient implements SocialAuthClientPort { +public class KakaoOAuthClientAdapter + implements SocialOAuthClientPort { private final KakaoProperties kakaoProperties; private final WebClient webClient; @Override - public KakaoAuthUser authenticate(KakaoAuthCommand command) { + public KakaoAuthUser authenticate(KakaoLoginCommand command) { // Access Token 요청 KakaoTokenResponse token = getKakaoToken(command.getAuthorizationCode()); diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/adapter/auth/AuthDomainPersistenceAdapter.java b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/auth/AuthDomainPersistenceAdapter.java new file mode 100644 index 0000000..83763fb --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/auth/AuthDomainPersistenceAdapter.java @@ -0,0 +1,56 @@ +package com.ftm.server.adapter.out.persistence.adapter.auth; + +import com.ftm.server.adapter.out.persistence.mapper.UserImageMapper; +import com.ftm.server.adapter.out.persistence.mapper.UserMapper; +import com.ftm.server.adapter.out.persistence.repository.UserImageRepository; +import com.ftm.server.adapter.out.persistence.repository.UserRepository; +import com.ftm.server.application.port.out.persistence.auth.LoadUserForAuthPort; +import com.ftm.server.application.port.out.persistence.auth.LoadUserImageForAuthPort; +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.application.query.FindByIdQuery; +import com.ftm.server.application.query.FindBySocialValueQuery; +import com.ftm.server.application.query.FindByUserIdQuery; +import com.ftm.server.common.annotation.Adapter; +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.entity.UserImage; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Adapter +@RequiredArgsConstructor +@Slf4j +public class AuthDomainPersistenceAdapter implements LoadUserForAuthPort, LoadUserImageForAuthPort { + + // Repository + private final UserRepository userRepository; + private final UserImageRepository userImageRepository; + + // Mapper + private final UserMapper userMapper; + private final UserImageMapper userImageMapper; + + @Override + public Optional loadUserById(FindByIdQuery query) { + return userRepository.findById(query.getId()).map(userMapper::toDomainEntity); + } + + @Override + public Optional loadUserByEmail(FindByEmailQuery query) { + return userRepository.findByEmail(query.getEmail()).map(userMapper::toDomainEntity); + } + + @Override + public Optional loadUserBySocialProviderAndSocialId(FindBySocialValueQuery query) { + return userRepository + .findBySocialProviderAndSocialId(query.getSocialProvider(), query.getSocialId()) + .map(userMapper::toDomainEntity); + } + + @Override + public Optional loadUserImageByUserId(FindByUserIdQuery query) { + return userImageRepository + .findByUserId(query.getUserId()) + .map(userImageMapper::toDomainEntity); + } +} diff --git a/src/main/java/com/ftm/server/web/controller/post/.gitkeep b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/grooming/.gitkeep similarity index 100% rename from src/main/java/com/ftm/server/web/controller/post/.gitkeep rename to src/main/java/com/ftm/server/adapter/out/persistence/adapter/grooming/.gitkeep diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/adapter/post/.gitkeep b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/post/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/adapter/user/UserDomainPersistenceAdapterForAuthForAuth.java b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/user/UserDomainPersistenceAdapterForAuthForAuth.java new file mode 100644 index 0000000..775770e --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/user/UserDomainPersistenceAdapterForAuthForAuth.java @@ -0,0 +1,107 @@ +package com.ftm.server.adapter.out.persistence.adapter.user; + +import com.ftm.server.adapter.out.persistence.mapper.EmailVerificationLogsMapper; +import com.ftm.server.adapter.out.persistence.mapper.UserImageMapper; +import com.ftm.server.adapter.out.persistence.mapper.UserMapper; +import com.ftm.server.adapter.out.persistence.model.EmailVerificationLogsJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserImageJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.adapter.out.persistence.repository.EmailVerificationLogsRepository; +import com.ftm.server.adapter.out.persistence.repository.GroomingLevelRepository; +import com.ftm.server.adapter.out.persistence.repository.UserImageRepository; +import com.ftm.server.adapter.out.persistence.repository.UserRepository; +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; +import com.ftm.server.application.port.out.persistence.user.*; +import com.ftm.server.application.query.*; +import com.ftm.server.common.annotation.Adapter; +import com.ftm.server.domain.entity.EmailVerificationLogs; +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.entity.UserImage; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Adapter +@RequiredArgsConstructor +@Slf4j +public class UserDomainPersistenceAdapterForAuthForAuth + implements LoadEmailVerificationLogPort, + SaveEmailVerificationLogPort, + UpdateEmailVerificationLogPort, + CheckUserPort, + SaveUserPort, + SaveUserImagePort { + + // repository + private final EmailVerificationLogsRepository emailVerificationLogsRepository; + private final UserRepository userRepository; + private final GroomingLevelRepository groomingLevelRepository; + private final UserImageRepository userImageRepository; + + // mapper + private final EmailVerificationLogsMapper emailVerificationLogsMapper; + private final UserMapper userMapper; + private final UserImageMapper userImageMapper; + + @Override + public Optional loadEmailVerificationLogByEmail(FindByEmailQuery query) { + Optional emailVerificationLogsJpaEntity = + emailVerificationLogsRepository.findByEmail(query.getEmail()); + return emailVerificationLogsJpaEntity.map(emailVerificationLogsMapper::toDomainEntity); + } + + @Override + public Optional loadEmailVerificationLogByEmailAndCode( + EmailCodeVerificationQuery query) { + Optional emailVerificationLogsJpaEntity = + emailVerificationLogsRepository.findByVerificationCodeAndEmail( + query.getCode(), query.getEmail()); + return emailVerificationLogsJpaEntity.map(emailVerificationLogsMapper::toDomainEntity); + } + + @Override + public void saveEmailVerificationLogs(EmailVerificationLogCreationCommand command) { + emailVerificationLogsRepository.save( + emailVerificationLogsMapper.toJpaEntity(EmailVerificationLogs.from(command))); + } + + @Override + public void updateEmailVerificationLog(EmailVerificationLogs emailVerificationLogs) { + EmailVerificationLogsJpaEntity emailVerificationLogsJpaEntity = + emailVerificationLogsRepository.findById(emailVerificationLogs.getId()).get(); + emailVerificationLogsJpaEntity.updateFromDomainEntity(emailVerificationLogs); + } + + @Override + public Boolean checksUserByEmail(FindByEmailQuery query) { + return userRepository.existsByEmail(query.getEmail()); + } + + @Override + public User saveUser(User user) { + UserJpaEntity userJpaEntity = userMapper.toJpaEntity(user, null); + UserJpaEntity savedUser = userRepository.save(userJpaEntity); + return userMapper.toDomainEntity(savedUser); + } + + @Override + public void saveUserDefaultImage(UserImage userImage) { + UserJpaEntity userJpaEntity = userRepository.findById(userImage.getUserId()).get(); + UserImageJpaEntity userImageJpaEntity = + userImageMapper.toJpaEntity(userImage, userJpaEntity); + userImageRepository.save(userImageJpaEntity); + } + + @Override + public Boolean checksUserBySocialValue(FindBySocialValueQuery query) { + return userRepository.existsBySocialIdAndSocialProvider( + query.getSocialId(), query.getSocialProvider()); + } + + @Override + public User saveSocialUser(User user) { + UserJpaEntity userJpaEntity = userMapper.toJpaEntity(user, null); + UserJpaEntity savedUser = userRepository.save(userJpaEntity); + return userMapper.toDomainEntity(savedUser); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/BeautyProductMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/BeautyProductMapper.java new file mode 100644 index 0000000..66ac853 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/BeautyProductMapper.java @@ -0,0 +1,26 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.BeautyProductJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.BeautyProduct; + +@EntityMapper +public class BeautyProductMapper { + + public BeautyProduct toDomainEntity(BeautyProductJpaEntity jpaEntity) { + return BeautyProduct.of( + jpaEntity.getId(), + jpaEntity.getProductImageLink(), + jpaEntity.getBeautyProductCategory(), + jpaEntity.getBrand(), + jpaEntity.getName(), + jpaEntity.getRating(), + jpaEntity.getProductPageLink(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public BeautyProductJpaEntity toJpaEntity(BeautyProduct domainEntity) { + return BeautyProductJpaEntity.from(domainEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/BookmarkMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/BookmarkMapper.java new file mode 100644 index 0000000..cec4f15 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/BookmarkMapper.java @@ -0,0 +1,24 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.BookmarkJpaEntity; +import com.ftm.server.adapter.out.persistence.model.PostJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.Bookmark; + +@EntityMapper +public class BookmarkMapper { + + public Bookmark toDomainEntity(BookmarkJpaEntity jpaEntity) { + return Bookmark.of( + jpaEntity.getId(), + jpaEntity.getUser().getId(), + jpaEntity.getPost().getId(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public BookmarkJpaEntity toJpaEntity(UserJpaEntity userJpaEntity, PostJpaEntity postJpaEntity) { + return BookmarkJpaEntity.from(userJpaEntity, postJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/EmailVerificationLogsMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/EmailVerificationLogsMapper.java new file mode 100644 index 0000000..ca81404 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/EmailVerificationLogsMapper.java @@ -0,0 +1,26 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.EmailVerificationLogsJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.EmailVerificationLogs; + +@EntityMapper +public class EmailVerificationLogsMapper { + + public EmailVerificationLogs toDomainEntity(EmailVerificationLogsJpaEntity jpaEntity) { + + return EmailVerificationLogs.of( + jpaEntity.getId(), + jpaEntity.getEmail(), + jpaEntity.getVerificationCode(), + jpaEntity.getIsVerified(), + jpaEntity.getTrialNum(), + jpaEntity.getTokenIssuanceTime(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public EmailVerificationLogsJpaEntity toJpaEntity(EmailVerificationLogs domainEntity) { + return EmailVerificationLogsJpaEntity.from(domainEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingLevelMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingLevelMapper.java new file mode 100644 index 0000000..7dbb020 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingLevelMapper.java @@ -0,0 +1,25 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.GroomingLevelJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.GroomingLevel; + +@EntityMapper +public class GroomingLevelMapper { + + public GroomingLevel toDomainEntity(GroomingLevelJpaEntity jpaEntity) { + + return GroomingLevel.of( + jpaEntity.getId(), + jpaEntity.getMinScore(), + jpaEntity.getMaxScore(), + jpaEntity.getMildLevelName(), + jpaEntity.getSpicyLevelName(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public GroomingLevelJpaEntity toJpaEntity(GroomingLevel domainEntity) { + return GroomingLevelJpaEntity.from(domainEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestAnswerMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestAnswerMapper.java new file mode 100644 index 0000000..21aa789 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestAnswerMapper.java @@ -0,0 +1,26 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.GroomingTestAnswerJpaEntity; +import com.ftm.server.adapter.out.persistence.model.GroomingTestQuestionJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.GroomingTestAnswer; + +@EntityMapper +public class GroomingTestAnswerMapper { + + public GroomingTestAnswer toDomain(GroomingTestAnswerJpaEntity jpaEntity) { + return GroomingTestAnswer.of( + jpaEntity.getId(), + jpaEntity.getGroomingTestQuestion().getId(), + jpaEntity.getAnswer(), + jpaEntity.getScore(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public GroomingTestAnswerJpaEntity toJpaEntity( + GroomingTestAnswer domainEntity, + GroomingTestQuestionJpaEntity groomingTestQuestionJpaEntity) { + return GroomingTestAnswerJpaEntity.from(domainEntity, groomingTestQuestionJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestQuestionMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestQuestionMapper.java new file mode 100644 index 0000000..e0fa971 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestQuestionMapper.java @@ -0,0 +1,22 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.GroomingTestQuestionJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.GroomingTestQuestion; + +@EntityMapper +public class GroomingTestQuestionMapper { + + public GroomingTestQuestion toDomain(GroomingTestQuestionJpaEntity jpaEntity) { + return GroomingTestQuestion.of( + jpaEntity.getId(), + jpaEntity.getGroomingCategory(), + jpaEntity.getQuestion(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public GroomingTestQuestionJpaEntity toJpaEntity(GroomingTestQuestion domainEntity) { + return GroomingTestQuestionJpaEntity.from(domainEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestResultMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestResultMapper.java new file mode 100644 index 0000000..aa369a8 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/GroomingTestResultMapper.java @@ -0,0 +1,31 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.GroomingTestAnswerJpaEntity; +import com.ftm.server.adapter.out.persistence.model.GroomingTestQuestionJpaEntity; +import com.ftm.server.adapter.out.persistence.model.GroomingTestResultJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.GroomingTestResult; + +@EntityMapper +public class GroomingTestResultMapper { + + public GroomingTestResult toDomainEntity(GroomingTestResultJpaEntity jpaEntity) { + + return GroomingTestResult.of( + jpaEntity.getId(), + jpaEntity.getUser().getId(), + jpaEntity.getGroomingTestQuestion().getId(), + jpaEntity.getGroomingTestAnswer().getId(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public GroomingTestResultJpaEntity toJpaEntity( + UserJpaEntity userJpaEntity, + GroomingTestQuestionJpaEntity groomingTestQuestionJpaEntity, + GroomingTestAnswerJpaEntity groomingTestAnswerJpaEntity) { + return GroomingTestResultJpaEntity.from( + userJpaEntity, groomingTestQuestionJpaEntity, groomingTestAnswerJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostImageMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostImageMapper.java new file mode 100644 index 0000000..7997048 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostImageMapper.java @@ -0,0 +1,23 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.PostImageJpaEntity; +import com.ftm.server.adapter.out.persistence.model.PostJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.PostImage; + +@EntityMapper +public class PostImageMapper { + + public PostImage toDomainEntity(PostImageJpaEntity jpaEntity) { + return PostImage.of( + jpaEntity.getId(), + jpaEntity.getPost().getId(), + jpaEntity.getObjectKey(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public PostImageJpaEntity toJpaEntity(PostImage domainEntity, PostJpaEntity postJpaEntity) { + return PostImageJpaEntity.from(domainEntity, postJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostMapper.java new file mode 100644 index 0000000..930fc58 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostMapper.java @@ -0,0 +1,30 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.PostJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.Post; + +@EntityMapper +public class PostMapper { + + public Post toDomainEntity(PostJpaEntity jpaEntity) { + return Post.of( + jpaEntity.getId(), + jpaEntity.getUser().getId(), + jpaEntity.getTitle(), + jpaEntity.getContent(), + jpaEntity.getGroomingCategory(), + jpaEntity.getHashtags(), + jpaEntity.getViewCount(), + jpaEntity.getLikeCount(), + jpaEntity.getIsDeleted(), + jpaEntity.getDeletedAt(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public PostJpaEntity toJpaEntity(Post domainEntity, UserJpaEntity userJpaEntity) { + return PostJpaEntity.from(domainEntity, userJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostProductImageMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostProductImageMapper.java new file mode 100644 index 0000000..d0db3f4 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostProductImageMapper.java @@ -0,0 +1,24 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.PostProductImageJpaEntity; +import com.ftm.server.adapter.out.persistence.model.PostProductJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.PostProductImage; + +@EntityMapper +public class PostProductImageMapper { + + public PostProductImage toDomainEntity(PostProductImageJpaEntity jpaEntity) { + return PostProductImage.of( + jpaEntity.getId(), + jpaEntity.getPostProduct().getId(), + jpaEntity.getObjectKey(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public PostProductImageJpaEntity toJpaEntity( + PostProductImage domainEntity, PostProductJpaEntity postProductJpaEntity) { + return PostProductImageJpaEntity.from(domainEntity, postProductJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostProductMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostProductMapper.java new file mode 100644 index 0000000..09859dc --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/PostProductMapper.java @@ -0,0 +1,25 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.PostJpaEntity; +import com.ftm.server.adapter.out.persistence.model.PostProductJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.PostProduct; + +@EntityMapper +public class PostProductMapper { + + public PostProduct toDomainEntity(PostProductJpaEntity jpaEntity) { + return PostProduct.of( + jpaEntity.getId(), + jpaEntity.getPost().getId(), + jpaEntity.getName(), + jpaEntity.getBrand(), + jpaEntity.getHashtags(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public PostProductJpaEntity toJpaEntity(PostProduct domainEntity, PostJpaEntity postJpaEntity) { + return PostProductJpaEntity.from(domainEntity, postJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/UserImageMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/UserImageMapper.java new file mode 100644 index 0000000..ff5350c --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/UserImageMapper.java @@ -0,0 +1,23 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.UserImageJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.UserImage; + +@EntityMapper +public class UserImageMapper { + + public UserImage toDomainEntity(UserImageJpaEntity jpaEntity) { + return UserImage.of( + jpaEntity.getId(), + jpaEntity.getUser().getId(), + jpaEntity.getObjectKey(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public UserImageJpaEntity toJpaEntity(UserImage domainEntity, UserJpaEntity userJpaEntity) { + return UserImageJpaEntity.from(domainEntity, userJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/mapper/UserMapper.java b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/UserMapper.java new file mode 100644 index 0000000..fe139af --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/mapper/UserMapper.java @@ -0,0 +1,36 @@ +package com.ftm.server.adapter.out.persistence.mapper; + +import com.ftm.server.adapter.out.persistence.model.GroomingLevelJpaEntity; +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.common.annotation.EntityMapper; +import com.ftm.server.domain.entity.User; +import lombok.RequiredArgsConstructor; + +@EntityMapper +@RequiredArgsConstructor +public class UserMapper { + + public User toDomainEntity(UserJpaEntity jpaEntity) { + return User.of( + jpaEntity.getId(), + jpaEntity.getEmail(), + jpaEntity.getPassword(), + jpaEntity.getNickname(), + jpaEntity.getAgeGroup(), + jpaEntity.getSocialProvider(), + jpaEntity.getSocialId(), + jpaEntity.getGroomingScore(), + jpaEntity.getGroomingLevel() == null ? null : jpaEntity.getGroomingLevel().getId(), + jpaEntity.getRole(), + jpaEntity.getFavoriteHashtags(), + jpaEntity.getIsDeleted(), + jpaEntity.getDeletedAt(), + jpaEntity.getCreatedAt(), + jpaEntity.getUpdatedAt()); + } + + public UserJpaEntity toJpaEntity( + User domainEntity, GroomingLevelJpaEntity groomingLevelJpaEntity) { + return UserJpaEntity.from(domainEntity, groomingLevelJpaEntity); + } +} diff --git a/src/main/java/com/ftm/server/domain/entity/BaseEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/BaseTimeJpaEntity.java similarity index 74% rename from src/main/java/com/ftm/server/domain/entity/BaseEntity.java rename to src/main/java/com/ftm/server/adapter/out/persistence/model/BaseTimeJpaEntity.java index 7e03fce..8824fc0 100644 --- a/src/main/java/com/ftm/server/domain/entity/BaseEntity.java +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/BaseTimeJpaEntity.java @@ -1,6 +1,7 @@ -package com.ftm.server.domain.entity; +package com.ftm.server.adapter.out.persistence.model; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Getter; @@ -11,7 +12,7 @@ @MappedSuperclass @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public abstract class BaseEntity { +public abstract class BaseTimeJpaEntity { @CreationTimestamp @Column(name = "created_at", updatable = false) diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/BeautyProductJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/BeautyProductJpaEntity.java new file mode 100644 index 0000000..2d4364c --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/BeautyProductJpaEntity.java @@ -0,0 +1,64 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.BeautyProduct; +import com.ftm.server.domain.enums.BeautyProductCategory; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +@Entity +@Table(name = "beauty_product") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class BeautyProductJpaEntity extends BaseTimeJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "product_image_link") + private String productImageLink; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(name = "beauty_product_category", columnDefinition = "beauty_product_category") + private BeautyProductCategory beautyProductCategory; + + private String brand; + private String name; + private Double rating; + + @Column(name = "product_page_link") + private String productPageLink; + + @Builder(access = AccessLevel.PRIVATE) + private BeautyProductJpaEntity( + String productImageLink, + BeautyProductCategory beautyProductCategory, + String brand, + String name, + Double rating, + String productPageLink) { + this.productImageLink = productImageLink; + this.beautyProductCategory = beautyProductCategory; + this.brand = brand; + this.name = name; + this.rating = rating; + this.productPageLink = productPageLink; + } + + public static BeautyProductJpaEntity from(BeautyProduct beautyProduct) { + return BeautyProductJpaEntity.builder() + .productImageLink(beautyProduct.getProductImageLink()) + .beautyProductCategory(beautyProduct.getBeautyProductCategory()) + .brand(beautyProduct.getBrand()) + .name(beautyProduct.getName()) + .rating(beautyProduct.getRating()) + .productPageLink(beautyProduct.getProductPageLink()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/BookmarkJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/BookmarkJpaEntity.java new file mode 100644 index 0000000..9fc798d --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/BookmarkJpaEntity.java @@ -0,0 +1,35 @@ +package com.ftm.server.adapter.out.persistence.model; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "bookmark") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class BookmarkJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserJpaEntity user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id") + private PostJpaEntity post; + + @Builder(access = AccessLevel.PRIVATE) + private BookmarkJpaEntity(UserJpaEntity user, PostJpaEntity post) { + this.user = user; + this.post = post; + } + + public static BookmarkJpaEntity from(UserJpaEntity userJpaEntity, PostJpaEntity postJpaEntity) { + return BookmarkJpaEntity.builder().user(userJpaEntity).post(postJpaEntity).build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/EmailVerificationLogsJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/EmailVerificationLogsJpaEntity.java new file mode 100644 index 0000000..d1ff00d --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/EmailVerificationLogsJpaEntity.java @@ -0,0 +1,93 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; +import com.ftm.server.domain.entity.EmailVerificationLogs; +import jakarta.persistence.*; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "email_verification_logs") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class EmailVerificationLogsJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String email; + + @Column(name = "verification_code", nullable = false) + private String verificationCode; + + @Column(name = "is_verified", nullable = false) + private Boolean isVerified = false; + + @Column(name = "trial_num") + private Integer trialNum; + + @Column(name = "token_issuance_time") + private LocalDateTime tokenIssuanceTime; + + @Builder(access = AccessLevel.PRIVATE) + private EmailVerificationLogsJpaEntity( + String email, + String verificationCode, + Boolean isVerified, + Integer trialNum, + LocalDateTime tokenIssuanceTime) { + this.email = email; + this.verificationCode = verificationCode; + this.isVerified = isVerified; + this.trialNum = trialNum; + this.tokenIssuanceTime = tokenIssuanceTime; + } + + public static EmailVerificationLogsJpaEntity from(EmailVerificationLogs emailVerificationLogs) { + return EmailVerificationLogsJpaEntity.builder() + .email(emailVerificationLogs.getEmail()) + .verificationCode(emailVerificationLogs.getVerificationCode()) + .isVerified(emailVerificationLogs.getIsVerified()) + .trialNum(emailVerificationLogs.getTrialNum()) + .tokenIssuanceTime(emailVerificationLogs.getTokenIssuanceTime()) + .build(); + } + + public static EmailVerificationLogsJpaEntity from(EmailVerificationLogCreationCommand command) { + return EmailVerificationLogsJpaEntity.builder() + .email(command.getEmail()) + .verificationCode(command.getVerificationCode()) + .isVerified(false) + .trialNum(1) + .tokenIssuanceTime(LocalDateTime.now()) + .build(); + } + + public void updateVerificationStatus(String verificationCode) { + this.trialNum++; + this.verificationCode = verificationCode; + this.tokenIssuanceTime = LocalDateTime.now(); + } + + public void initializeVerificationStatus(String verificationCode) { + this.trialNum = 1; + this.verificationCode = verificationCode; + this.tokenIssuanceTime = LocalDateTime.now(); + } + + public void updateVerificationStatus(Boolean isVerified) { + this.isVerified = isVerified; + } + + public void updateFromDomainEntity(EmailVerificationLogs domainEntity) { + this.email = domainEntity.getEmail(); + this.verificationCode = domainEntity.getVerificationCode(); + this.isVerified = domainEntity.getIsVerified(); + this.trialNum = domainEntity.getTrialNum(); + this.tokenIssuanceTime = domainEntity.getTokenIssuanceTime(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingLevelJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingLevelJpaEntity.java new file mode 100644 index 0000000..0fc09d6 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingLevelJpaEntity.java @@ -0,0 +1,39 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.GroomingLevel; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "grooming_level") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroomingLevelJpaEntity extends BaseTimeJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Integer minScore; + private Integer maxScore; + private String mildLevelName; + private String spicyLevelName; + + @Builder(access = AccessLevel.PRIVATE) + private GroomingLevelJpaEntity( + Integer minScore, Integer maxScore, String mildLevelName, String spicyLevelName) { + this.minScore = minScore; + this.maxScore = maxScore; + this.mildLevelName = mildLevelName; + this.spicyLevelName = spicyLevelName; + } + + public static GroomingLevelJpaEntity from(GroomingLevel groomingLevel) { + return GroomingLevelJpaEntity.builder() + .minScore(groomingLevel.getMinScore()) + .maxScore(groomingLevel.getMaxScore()) + .mildLevelName(groomingLevel.getMildLevelName()) + .spicyLevelName(groomingLevel.getSpicyLevelName()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestAnswerJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestAnswerJpaEntity.java new file mode 100644 index 0000000..6cef31e --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestAnswerJpaEntity.java @@ -0,0 +1,46 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.GroomingTestAnswer; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "grooming_test_answer") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroomingTestAnswerJpaEntity extends BaseTimeJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "grooming_test_question_id") + private GroomingTestQuestionJpaEntity groomingTestQuestion; + + @Column(nullable = false) + private String answer; + + private Integer score; + + @Builder(access = AccessLevel.PRIVATE) + private GroomingTestAnswerJpaEntity( + GroomingTestQuestionJpaEntity groomingTestQuestion, String answer, Integer score) { + this.groomingTestQuestion = groomingTestQuestion; + this.answer = answer; + this.score = score; + } + + public static GroomingTestAnswerJpaEntity from( + GroomingTestAnswer groomingTestAnswer, + GroomingTestQuestionJpaEntity groomingTestQuestion) { + return GroomingTestAnswerJpaEntity.builder() + .groomingTestQuestion(groomingTestQuestion) + .answer(groomingTestAnswer.getAnswer()) + .score(groomingTestAnswer.getScore()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestQuestionJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestQuestionJpaEntity.java new file mode 100644 index 0000000..02b3d8a --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestQuestionJpaEntity.java @@ -0,0 +1,42 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.GroomingTestQuestion; +import com.ftm.server.domain.enums.GroomingCategory; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +@Entity +@Table(name = "grooming_test_question") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroomingTestQuestionJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(nullable = false, name = "grooming_category", columnDefinition = "grooming_category") + private GroomingCategory groomingCategory; + + @Column(nullable = false) + private String question; + + @Builder(access = AccessLevel.PRIVATE) + private GroomingTestQuestionJpaEntity(GroomingCategory groomingCategory, String question) { + this.groomingCategory = groomingCategory; + this.question = question; + } + + public static GroomingTestQuestionJpaEntity from(GroomingTestQuestion groomingTestQuestion) { + return GroomingTestQuestionJpaEntity.builder() + .groomingCategory(groomingTestQuestion.getGroomingCategory()) + .question(groomingTestQuestion.getQuestion()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestResultJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestResultJpaEntity.java new file mode 100644 index 0000000..c00f15f --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/GroomingTestResultJpaEntity.java @@ -0,0 +1,51 @@ +package com.ftm.server.adapter.out.persistence.model; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "grooming_test_result") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GroomingTestResultJpaEntity extends BaseTimeJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserJpaEntity user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "grooming_test_question_id") + private GroomingTestQuestionJpaEntity groomingTestQuestion; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "grooming_test_answer_id") + private GroomingTestAnswerJpaEntity groomingTestAnswer; + + @Builder(access = AccessLevel.PRIVATE) + private GroomingTestResultJpaEntity( + UserJpaEntity user, + GroomingTestQuestionJpaEntity groomingTestQuestion, + GroomingTestAnswerJpaEntity groomingTestAnswer) { + this.user = user; + this.groomingTestQuestion = groomingTestQuestion; + this.groomingTestAnswer = groomingTestAnswer; + } + + public static GroomingTestResultJpaEntity from( + UserJpaEntity userJpaEntity, + GroomingTestQuestionJpaEntity groomingTestQuestionJpaEntity, + GroomingTestAnswerJpaEntity groomingTestAnswerJpaEntity) { + return GroomingTestResultJpaEntity.builder() + .user(userJpaEntity) + .groomingTestQuestion(groomingTestQuestionJpaEntity) + .groomingTestAnswer(groomingTestAnswerJpaEntity) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/PostImageJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostImageJpaEntity.java new file mode 100644 index 0000000..49ad2ce --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostImageJpaEntity.java @@ -0,0 +1,37 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.PostImage; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "post_image") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostImageJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id") + private PostJpaEntity post; + + private String objectKey; + + @Builder(access = AccessLevel.PRIVATE) + private PostImageJpaEntity(PostJpaEntity post, String objectKey) { + this.post = post; + this.objectKey = objectKey; + } + + public static PostImageJpaEntity from(PostImage postImage, PostJpaEntity postJpaEntity) { + return PostImageJpaEntity.builder() + .post(postJpaEntity) + .objectKey(postImage.getObjectKey()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/PostJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostJpaEntity.java new file mode 100644 index 0000000..9f57156 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostJpaEntity.java @@ -0,0 +1,95 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.Post; +import com.ftm.server.domain.enums.GroomingCategory; +import com.ftm.server.domain.enums.HashTag; +import io.hypersistence.utils.hibernate.type.array.EnumArrayType; +import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType; +import jakarta.persistence.*; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.Type; +import org.hibernate.type.SqlTypes; + +@Entity +@Table(name = "post") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserJpaEntity user; + + @Column(nullable = false) + private String title; + + @Lob + @Column(nullable = false) + private String content; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(nullable = false, name = "grooming_category", columnDefinition = "grooming_category") + private GroomingCategory groomingCategory; + + @Type( + value = EnumArrayType.class, + parameters = + @org.hibernate.annotations.Parameter( + name = AbstractArrayType.SQL_ARRAY_TYPE, + value = "hashtag")) + @Column(name = "hashtags", columnDefinition = "hashtag[]") + private HashTag[] hashtags; + + private Integer viewCount = 0; + + private Integer likeCount = 0; + + private Boolean isDeleted = false; + + private LocalDateTime deletedAt; + + @Builder(access = AccessLevel.PRIVATE) + private PostJpaEntity( + UserJpaEntity user, + String title, + String content, + GroomingCategory groomingCategory, + HashTag[] hashtags, + Integer viewCount, + Integer likeCount, + Boolean isDeleted, + LocalDateTime deletedAt) { + this.user = user; + this.title = title; + this.content = content; + this.groomingCategory = groomingCategory; + this.hashtags = hashtags; + this.viewCount = viewCount; + this.likeCount = likeCount; + this.isDeleted = isDeleted; + this.deletedAt = deletedAt; + } + + public static PostJpaEntity from(Post post, UserJpaEntity userJpaEntity) { + return PostJpaEntity.builder() + .user(userJpaEntity) + .title(post.getTitle()) + .content(post.getContent()) + .groomingCategory(post.getGroomingCategory()) + .hashtags(post.getHashtags()) + .viewCount(post.getViewCount()) + .likeCount(post.getLikeCount()) + .isDeleted(post.getIsDeleted()) + .deletedAt(post.getDeletedAt()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/PostProductImageJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostProductImageJpaEntity.java new file mode 100644 index 0000000..d83af5f --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostProductImageJpaEntity.java @@ -0,0 +1,38 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.PostProductImage; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "post_product_image") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostProductImageJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_product_id") + private PostProductJpaEntity postProduct; + + private String objectKey; + + @Builder(access = AccessLevel.PRIVATE) + private PostProductImageJpaEntity(PostProductJpaEntity postProduct, String objectKey) { + this.postProduct = postProduct; + this.objectKey = objectKey; + } + + public static PostProductImageJpaEntity from( + PostProductImage postProductImage, PostProductJpaEntity postProductJpaEntity) { + return PostProductImageJpaEntity.builder() + .postProduct(postProductJpaEntity) + .objectKey(postProductImage.getObjectKey()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/PostProductJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostProductJpaEntity.java new file mode 100644 index 0000000..5bf240c --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/PostProductJpaEntity.java @@ -0,0 +1,59 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.PostProduct; +import com.ftm.server.domain.enums.HashTag; +import io.hypersistence.utils.hibernate.type.array.EnumArrayType; +import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Type; + +@Entity +@Table(name = "post_product") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostProductJpaEntity extends BaseTimeJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id") + private PostJpaEntity post; + + @Column(nullable = false) + private String name; + + private String brand; + + @Type( + value = EnumArrayType.class, + parameters = + @org.hibernate.annotations.Parameter( + name = AbstractArrayType.SQL_ARRAY_TYPE, + value = "hashtag")) + @Column(name = "hashtags", columnDefinition = "hashtag[]") + private HashTag[] hashtags; + + @Builder(access = AccessLevel.PRIVATE) + private PostProductJpaEntity( + PostJpaEntity post, String name, String brand, HashTag[] hashtags) { + this.post = post; + this.name = name; + this.brand = brand; + this.hashtags = hashtags; + } + + public static PostProductJpaEntity from(PostProduct postProduct, PostJpaEntity postJpaEntity) { + return PostProductJpaEntity.builder() + .post(postJpaEntity) + .name(postProduct.getName()) + .brand(postProduct.getBrand()) + .hashtags(postProduct.getHashTags()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/UserImageJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/UserImageJpaEntity.java new file mode 100644 index 0000000..d024d2e --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/UserImageJpaEntity.java @@ -0,0 +1,42 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.UserImage; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "user_image") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserImageJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserJpaEntity user; + + @Column(nullable = false) + private String objectKey = "default-image"; + + @Builder(access = AccessLevel.PRIVATE) + private UserImageJpaEntity(UserJpaEntity user, String objectKey) { + this.user = user; + this.objectKey = objectKey; + } + + public static UserImageJpaEntity from(UserImage userImage, UserJpaEntity userJpaEntity) { + return UserImageJpaEntity.builder() + .user(userJpaEntity) + .objectKey(userImage.getObjectKey()) + .build(); + } + + public static UserImageJpaEntity createUserImage(UserJpaEntity user) { + return UserImageJpaEntity.builder().user(user).objectKey("users/default-image.png").build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/model/UserJpaEntity.java b/src/main/java/com/ftm/server/adapter/out/persistence/model/UserJpaEntity.java new file mode 100644 index 0000000..d6923c1 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/model/UserJpaEntity.java @@ -0,0 +1,125 @@ +package com.ftm.server.adapter.out.persistence.model; + +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.enums.AgeGroup; +import com.ftm.server.domain.enums.HashTag; +import com.ftm.server.domain.enums.SocialProvider; +import com.ftm.server.domain.enums.UserRole; +import io.hypersistence.utils.hibernate.type.array.EnumArrayType; +import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType; +import jakarta.persistence.*; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.Type; +import org.hibernate.type.SqlTypes; + +@Entity +@Table(name = "users") +@Getter +@NoArgsConstructor +public class UserJpaEntity extends BaseTimeJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(unique = true) + private String email; + + private String password; + + @Column(nullable = false, unique = true) + private String nickname; + + @Column(name = "age_group", columnDefinition = "age_group") + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private AgeGroup ageGroup; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(name = "social_provider", columnDefinition = "social_provider") + private SocialProvider socialProvider; + + @Column(unique = true) + private String socialId; + + @Column(nullable = false) + private Integer groomingScore = 0; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "grooming_level_id") + private GroomingLevelJpaEntity groomingLevel; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(name = "role", columnDefinition = "role") + private UserRole role; + + @Type( + value = EnumArrayType.class, + parameters = { + @org.hibernate.annotations.Parameter( + name = AbstractArrayType.SQL_ARRAY_TYPE, + value = "hashtag" // PostgreSQL에서 정의된 ENUM 타입 이름 + ) + }) + @Column( + name = "favorite_hashtags", + columnDefinition = "hashtag[]" // PostgreSQL의 ENUM 배열 타입으로 지정 + ) + private HashTag[] favoriteHashtags; + + @Column(nullable = false) + private Boolean isDeleted = false; + + private LocalDateTime deletedAt; + + @Builder(access = AccessLevel.PRIVATE) + private UserJpaEntity( + String email, + String password, + String nickname, + AgeGroup ageGroup, + SocialProvider socialProvider, + String socialId, + Integer groomingScore, + GroomingLevelJpaEntity groomingLevel, + UserRole role, + HashTag[] favoriteHashtags, + Boolean isDeleted, + LocalDateTime deletedAt) { + this.email = email; + this.password = password; + this.nickname = nickname; + this.ageGroup = ageGroup; + this.socialProvider = socialProvider; + this.socialId = socialId; + this.groomingScore = groomingScore; + this.groomingLevel = groomingLevel; + this.role = role; + this.favoriteHashtags = favoriteHashtags; + this.isDeleted = isDeleted; + this.deletedAt = deletedAt; + } + + public static UserJpaEntity from(User user, GroomingLevelJpaEntity groomingLevel) { + return UserJpaEntity.builder() + .email(user.getEmail()) + .password(user.getPassword()) + .nickname(user.getNickname()) + .ageGroup(user.getAgeGroup()) + .socialProvider(user.getSocialProvider()) + .socialId(user.getSocialId()) + .groomingScore(user.getGroomingScore()) + .groomingLevel(groomingLevel) + .role(user.getRole()) + .favoriteHashtags(user.getFavoriteHashtags()) + .isDeleted(user.getIsDeleted()) + .deletedAt(user.getDeletedAt()) + .build(); + } +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/BeautyProductRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/BeautyProductRepository.java new file mode 100644 index 0000000..9e4f13c --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/BeautyProductRepository.java @@ -0,0 +1,6 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.BeautyProductJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BeautyProductRepository extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/BookmarkRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/BookmarkRepository.java new file mode 100644 index 0000000..3168682 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/BookmarkRepository.java @@ -0,0 +1,6 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.BookmarkJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BookmarkRepository extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/EmailVerificationLogsRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/EmailVerificationLogsRepository.java new file mode 100644 index 0000000..ea40898 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/EmailVerificationLogsRepository.java @@ -0,0 +1,19 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.EmailVerificationLogsJpaEntity; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EmailVerificationLogsRepository + extends JpaRepository { + + Optional findByEmail(String email); + + Optional findByVerificationCodeAndEmail( + String verificationCode, String email); + + Optional findByEmailAndIsVerified( + String email, Boolean isVerified); +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingLevelRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingLevelRepository.java new file mode 100644 index 0000000..ef562f9 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingLevelRepository.java @@ -0,0 +1,6 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.GroomingLevelJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GroomingLevelRepository extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestAnswerRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestAnswerRepository.java new file mode 100644 index 0000000..d74ff76 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestAnswerRepository.java @@ -0,0 +1,7 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.GroomingTestAnswerJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GroomingTestAnswerRepository + extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestQuestionRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestQuestionRepository.java new file mode 100644 index 0000000..ed9871e --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestQuestionRepository.java @@ -0,0 +1,7 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.GroomingTestQuestionJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GroomingTestQuestionRepository + extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestResultRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestResultRepository.java new file mode 100644 index 0000000..7457fcf --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/GroomingTestResultRepository.java @@ -0,0 +1,7 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.GroomingTestResultJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GroomingTestResultRepository + extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostImageRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostImageRepository.java new file mode 100644 index 0000000..70ad414 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostImageRepository.java @@ -0,0 +1,6 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.PostImageJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostImageRepository extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostProductImageRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostProductImageRepository.java new file mode 100644 index 0000000..159ff7b --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostProductImageRepository.java @@ -0,0 +1,7 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.PostProductImageJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostProductImageRepository + extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostProductRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostProductRepository.java new file mode 100644 index 0000000..6874c5b --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostProductRepository.java @@ -0,0 +1,6 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.PostProductJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostProductRepository extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostRepository.java new file mode 100644 index 0000000..cd44700 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/PostRepository.java @@ -0,0 +1,6 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.PostJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository extends JpaRepository {} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/UserImageRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/UserImageRepository.java new file mode 100644 index 0000000..9163c3a --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/UserImageRepository.java @@ -0,0 +1,10 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.UserImageJpaEntity; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserImageRepository extends JpaRepository { + + Optional findByUserId(Long userId); +} diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/repository/UserRepository.java b/src/main/java/com/ftm/server/adapter/out/persistence/repository/UserRepository.java new file mode 100644 index 0000000..a6341e3 --- /dev/null +++ b/src/main/java/com/ftm/server/adapter/out/persistence/repository/UserRepository.java @@ -0,0 +1,18 @@ +package com.ftm.server.adapter.out.persistence.repository; + +import com.ftm.server.adapter.out.persistence.model.UserJpaEntity; +import com.ftm.server.domain.enums.SocialProvider; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + + Boolean existsByEmail(String email); + + Optional findByEmail(String email); + + Optional findBySocialProviderAndSocialId( + SocialProvider socialProvider, String socialId); + + Boolean existsBySocialIdAndSocialProvider(String socialId, SocialProvider socialProvider); +} diff --git a/src/main/java/com/ftm/server/infrastructure/redis/RedisService.java b/src/main/java/com/ftm/server/adapter/out/redis/RedisAdapter.java similarity index 53% rename from src/main/java/com/ftm/server/infrastructure/redis/RedisService.java rename to src/main/java/com/ftm/server/adapter/out/redis/RedisAdapter.java index bd59d36..cf63feb 100644 --- a/src/main/java/com/ftm/server/infrastructure/redis/RedisService.java +++ b/src/main/java/com/ftm/server/adapter/out/redis/RedisAdapter.java @@ -1,15 +1,14 @@ -package com.ftm.server.infrastructure.redis; +package com.ftm.server.adapter.out.redis; -import com.ftm.server.application.port.RedisCachePort; -import com.ftm.server.application.port.RedisSessionPort; -import com.ftm.server.common.annotation.InfraService; +import com.ftm.server.application.port.out.redis.RedisSessionPort; +import com.ftm.server.common.annotation.Adapter; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; /** Redis Caching, Session 구현체 각 역할 별 레디스 조작 관리 (비즈니스 로직이 포함되면 안됨, 기술적인 로직만 수행) */ -@InfraService +@Adapter @RequiredArgsConstructor -public class RedisService implements RedisCachePort, RedisSessionPort { +public class RedisAdapter implements RedisSessionPort { private final RedisTemplate redisTemplate; } diff --git a/src/main/java/com/ftm/server/adapter/out/s3/.gitkeep b/src/main/java/com/ftm/server/adapter/out/s3/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/infrastructure/security/AuthenticationService.java b/src/main/java/com/ftm/server/adapter/out/security/SecurityAuthenticationAdapter.java similarity index 81% rename from src/main/java/com/ftm/server/infrastructure/security/AuthenticationService.java rename to src/main/java/com/ftm/server/adapter/out/security/SecurityAuthenticationAdapter.java index 7b3b2d8..2ce13c6 100644 --- a/src/main/java/com/ftm/server/infrastructure/security/AuthenticationService.java +++ b/src/main/java/com/ftm/server/adapter/out/security/SecurityAuthenticationAdapter.java @@ -1,9 +1,10 @@ -package com.ftm.server.infrastructure.security; +package com.ftm.server.adapter.out.security; -import com.ftm.server.application.dto.command.UserLoginCommand; -import com.ftm.server.application.port.AuthenticationPort; -import com.ftm.server.common.annotation.InfraService; +import com.ftm.server.application.command.auth.GeneralLoginCommand; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; +import com.ftm.server.common.annotation.Adapter; import com.ftm.server.domain.entity.User; +import com.ftm.server.infrastructure.security.UserPrincipal; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -18,9 +19,9 @@ import org.springframework.security.web.context.SecurityContextRepository; @Slf4j -@InfraService +@Adapter @RequiredArgsConstructor -public class AuthenticationService implements AuthenticationPort { +public class SecurityAuthenticationAdapter implements SecurityAuthenticationPort { private final AuthenticationManager authenticationManager; private final SecurityContextRepository securityContextRepository; @@ -29,13 +30,13 @@ public class AuthenticationService implements AuthenticationPort { // end::[]] @Override - public Authentication createAuthenticationFromCredentials(UserLoginCommand command) + public Authentication createAuthenticationFromCredentials(GeneralLoginCommand command) throws AuthenticationException { // 인증 토큰 생성 (입력받은 이메일과 비밀번호로 인증 시도용 토큰 생성) UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(command.getEmail(), command.getPassword()); - // 인증 수행 (UserPrincipalService 호출, PasswordEncoder 비밀번호 검증 포함) + // 인증 수행 (UserPrincipalAdapter 호출, PasswordEncoder 비밀번호 검증 포함) return authenticationManager.authenticate(token); } diff --git a/src/main/java/com/ftm/server/infrastructure/security/UserPrincipalService.java b/src/main/java/com/ftm/server/adapter/out/security/UserPrincipalAdapter.java similarity index 61% rename from src/main/java/com/ftm/server/infrastructure/security/UserPrincipalService.java rename to src/main/java/com/ftm/server/adapter/out/security/UserPrincipalAdapter.java index 6f6877a..3eed9b9 100644 --- a/src/main/java/com/ftm/server/infrastructure/security/UserPrincipalService.java +++ b/src/main/java/com/ftm/server/adapter/out/security/UserPrincipalAdapter.java @@ -1,26 +1,30 @@ -package com.ftm.server.infrastructure.security; +package com.ftm.server.adapter.out.security; -import com.ftm.server.application.port.repository.UserRepository; -import com.ftm.server.common.annotation.InfraService; +import com.ftm.server.application.port.out.persistence.auth.LoadUserForAuthPort; +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.common.annotation.Adapter; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.domain.entity.User; +import com.ftm.server.infrastructure.security.UserPrincipal; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; /** 시큐리티에서 유저 인증을 수행하고 컨텍스트에 저장할 인증 객체를 생성하는 서비스 */ -@InfraService +@Adapter @RequiredArgsConstructor -public class UserPrincipalService implements UserDetailsService { +public class UserPrincipalAdapter implements UserDetailsService { - private final UserRepository userRepository; + private final LoadUserForAuthPort loadUserForAuthPort; @Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { User saved = - userRepository.findByEmail(email).orElseThrow(() -> CustomException.USER_NOT_FOUND); + loadUserForAuthPort + .loadUserByEmail(FindByEmailQuery.of(email)) + .orElseThrow(() -> CustomException.USER_NOT_FOUND); // 탈퇴한 회원인 경우 인증 실패 예외 처리 if (saved.getIsDeleted() && saved.getDeletedAt() != null) { diff --git a/src/main/java/com/ftm/server/infrastructure/smtp/MailSenderService.java b/src/main/java/com/ftm/server/adapter/out/smtp/MailSenderAdapter.java similarity index 88% rename from src/main/java/com/ftm/server/infrastructure/smtp/MailSenderService.java rename to src/main/java/com/ftm/server/adapter/out/smtp/MailSenderAdapter.java index b05fb2c..3d98767 100644 --- a/src/main/java/com/ftm/server/infrastructure/smtp/MailSenderService.java +++ b/src/main/java/com/ftm/server/adapter/out/smtp/MailSenderAdapter.java @@ -1,7 +1,7 @@ -package com.ftm.server.infrastructure.smtp; +package com.ftm.server.adapter.out.smtp; -import com.ftm.server.application.port.MailSenderPort; -import com.ftm.server.common.annotation.InfraService; +import com.ftm.server.application.port.out.smtp.MailSenderPort; +import com.ftm.server.common.annotation.Adapter; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; import jakarta.mail.MessagingException; @@ -12,8 +12,8 @@ import org.springframework.mail.javamail.MimeMessageHelper; @RequiredArgsConstructor -@InfraService -public class MailSenderService implements MailSenderPort { +@Adapter +public class MailSenderAdapter implements MailSenderPort { private final JavaMailSender mailSender; diff --git a/src/main/java/com/ftm/server/application/command/auth/GeneralLoginCommand.java b/src/main/java/com/ftm/server/application/command/auth/GeneralLoginCommand.java new file mode 100644 index 0000000..0f151aa --- /dev/null +++ b/src/main/java/com/ftm/server/application/command/auth/GeneralLoginCommand.java @@ -0,0 +1,20 @@ +package com.ftm.server.application.command.auth; + +import com.ftm.server.adapter.in.web.auth.dto.request.GeneralLoginRequest; +import lombok.Getter; + +@Getter +public class GeneralLoginCommand { + + private final String email; + private final String password; + + private GeneralLoginCommand(String email, String password) { + this.email = email; + this.password = password; + } + + public static GeneralLoginCommand from(GeneralLoginRequest request) { + return new GeneralLoginCommand(request.getEmail(), request.getPassword()); + } +} diff --git a/src/main/java/com/ftm/server/application/command/auth/KakaoLoginCommand.java b/src/main/java/com/ftm/server/application/command/auth/KakaoLoginCommand.java new file mode 100644 index 0000000..72e4f13 --- /dev/null +++ b/src/main/java/com/ftm/server/application/command/auth/KakaoLoginCommand.java @@ -0,0 +1,16 @@ +package com.ftm.server.application.command.auth; + +import com.ftm.server.adapter.in.web.auth.dto.request.KakaoLoginRequest; +import lombok.Getter; + +@Getter +public class KakaoLoginCommand extends SocialLoginCommand { + + private KakaoLoginCommand(String authorizationCode) { + super(authorizationCode); + } + + public static KakaoLoginCommand from(KakaoLoginRequest request) { + return new KakaoLoginCommand(request.getAuthorizationCode()); + } +} diff --git a/src/main/java/com/ftm/server/application/command/auth/SocialLoginCommand.java b/src/main/java/com/ftm/server/application/command/auth/SocialLoginCommand.java new file mode 100644 index 0000000..fe9ea28 --- /dev/null +++ b/src/main/java/com/ftm/server/application/command/auth/SocialLoginCommand.java @@ -0,0 +1,13 @@ +package com.ftm.server.application.command.auth; + +import lombok.Getter; + +@Getter +public abstract class SocialLoginCommand { + + private final String authorizationCode; + + protected SocialLoginCommand(String authorizationCode) { + this.authorizationCode = authorizationCode; + } +} diff --git a/src/main/java/com/ftm/server/application/dto/command/EmailAuthenticationCommand.java b/src/main/java/com/ftm/server/application/command/user/EmailAuthenticationCommand.java similarity index 67% rename from src/main/java/com/ftm/server/application/dto/command/EmailAuthenticationCommand.java rename to src/main/java/com/ftm/server/application/command/user/EmailAuthenticationCommand.java index 451a6f6..6308c0e 100644 --- a/src/main/java/com/ftm/server/application/dto/command/EmailAuthenticationCommand.java +++ b/src/main/java/com/ftm/server/application/command/user/EmailAuthenticationCommand.java @@ -1,6 +1,6 @@ -package com.ftm.server.application.dto.command; +package com.ftm.server.application.command.user; -import com.ftm.server.web.dto.request.EmailAuthenticationRequest; +import com.ftm.server.adapter.in.web.user.dto.request.EmailAuthenticationRequest; import lombok.Data; @Data diff --git a/src/main/java/com/ftm/server/application/dto/command/EmailVerificationLogCreationCommand.java b/src/main/java/com/ftm/server/application/command/user/EmailVerificationLogCreationCommand.java similarity index 87% rename from src/main/java/com/ftm/server/application/dto/command/EmailVerificationLogCreationCommand.java rename to src/main/java/com/ftm/server/application/command/user/EmailVerificationLogCreationCommand.java index 92fc36c..f65926f 100644 --- a/src/main/java/com/ftm/server/application/dto/command/EmailVerificationLogCreationCommand.java +++ b/src/main/java/com/ftm/server/application/command/user/EmailVerificationLogCreationCommand.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.command; +package com.ftm.server.application.command.user; import lombok.Data; diff --git a/src/main/java/com/ftm/server/application/dto/command/GeneralUserCreationCommand.java b/src/main/java/com/ftm/server/application/command/user/GeneralUserCreationCommand.java similarity index 93% rename from src/main/java/com/ftm/server/application/dto/command/GeneralUserCreationCommand.java rename to src/main/java/com/ftm/server/application/command/user/GeneralUserCreationCommand.java index fd39ecf..d95b99d 100644 --- a/src/main/java/com/ftm/server/application/dto/command/GeneralUserCreationCommand.java +++ b/src/main/java/com/ftm/server/application/command/user/GeneralUserCreationCommand.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.command; +package com.ftm.server.application.command.user; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; diff --git a/src/main/java/com/ftm/server/application/dto/command/GeneralUserSignupCommand.java b/src/main/java/com/ftm/server/application/command/user/GeneralUserSignupCommand.java similarity index 81% rename from src/main/java/com/ftm/server/application/dto/command/GeneralUserSignupCommand.java rename to src/main/java/com/ftm/server/application/command/user/GeneralUserSignupCommand.java index 2df8461..dbb1250 100644 --- a/src/main/java/com/ftm/server/application/dto/command/GeneralUserSignupCommand.java +++ b/src/main/java/com/ftm/server/application/command/user/GeneralUserSignupCommand.java @@ -1,8 +1,8 @@ -package com.ftm.server.application.dto.command; +package com.ftm.server.application.command.user; +import com.ftm.server.adapter.in.web.user.dto.request.GeneralUserSignupRequest; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; -import com.ftm.server.web.dto.request.GeneralUserSignupRequest; import java.util.List; import lombok.Data; diff --git a/src/main/java/com/ftm/server/application/dto/command/SocialUserCreationCommand.java b/src/main/java/com/ftm/server/application/command/user/SocialUserCreationCommand.java similarity index 93% rename from src/main/java/com/ftm/server/application/dto/command/SocialUserCreationCommand.java rename to src/main/java/com/ftm/server/application/command/user/SocialUserCreationCommand.java index 5e72c4c..b8be279 100644 --- a/src/main/java/com/ftm/server/application/dto/command/SocialUserCreationCommand.java +++ b/src/main/java/com/ftm/server/application/command/user/SocialUserCreationCommand.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.command; +package com.ftm.server.application.command.user; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; diff --git a/src/main/java/com/ftm/server/application/dto/command/SocialUserSignupCommand.java b/src/main/java/com/ftm/server/application/command/user/SocialUserSignupCommand.java similarity index 77% rename from src/main/java/com/ftm/server/application/dto/command/SocialUserSignupCommand.java rename to src/main/java/com/ftm/server/application/command/user/SocialUserSignupCommand.java index 6159315..4976f18 100644 --- a/src/main/java/com/ftm/server/application/dto/command/SocialUserSignupCommand.java +++ b/src/main/java/com/ftm/server/application/command/user/SocialUserSignupCommand.java @@ -1,10 +1,10 @@ -package com.ftm.server.application.dto.command; +package com.ftm.server.application.command.user; +import com.ftm.server.adapter.in.web.user.dto.request.SocialUserSignupRequest; +import com.ftm.server.application.vo.auth.PendingSocialUserVo; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; import com.ftm.server.domain.enums.SocialProvider; -import com.ftm.server.domain.vo.PendingSocialUserVo; -import com.ftm.server.web.dto.request.SocialUserSignupRequest; import java.util.List; import lombok.Data; diff --git a/src/main/java/com/ftm/server/application/dto/command/KakaoAuthCommand.java b/src/main/java/com/ftm/server/application/dto/command/KakaoAuthCommand.java deleted file mode 100644 index 23598af..0000000 --- a/src/main/java/com/ftm/server/application/dto/command/KakaoAuthCommand.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ftm.server.application.dto.command; - -import com.ftm.server.web.dto.request.KakaoLoginRequest; -import lombok.Getter; - -@Getter -public class KakaoAuthCommand extends SocialAuthCommand { - - private KakaoAuthCommand(String authorizationCode) { - super(authorizationCode); - } - - public static KakaoAuthCommand from(KakaoLoginRequest request) { - return new KakaoAuthCommand(request.getAuthorizationCode()); - } -} diff --git a/src/main/java/com/ftm/server/application/dto/command/SocialAuthCommand.java b/src/main/java/com/ftm/server/application/dto/command/SocialAuthCommand.java deleted file mode 100644 index 18cb7e5..0000000 --- a/src/main/java/com/ftm/server/application/dto/command/SocialAuthCommand.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ftm.server.application.dto.command; - -import lombok.Getter; - -@Getter -public abstract class SocialAuthCommand { - - private final String authorizationCode; - - protected SocialAuthCommand(String authorizationCode) { - this.authorizationCode = authorizationCode; - } -} diff --git a/src/main/java/com/ftm/server/application/dto/command/UserLoginCommand.java b/src/main/java/com/ftm/server/application/dto/command/UserLoginCommand.java deleted file mode 100644 index 616a79c..0000000 --- a/src/main/java/com/ftm/server/application/dto/command/UserLoginCommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ftm.server.application.dto.command; - -import com.ftm.server.web.dto.request.UserLoginRequest; -import lombok.Getter; - -@Getter -public class UserLoginCommand { - - private final String email; - private final String password; - - private UserLoginCommand(String email, String password) { - this.email = email; - this.password = password; - } - - public static UserLoginCommand from(UserLoginRequest request) { - return new UserLoginCommand(request.getEmail(), request.getPassword()); - } -} diff --git a/src/main/java/com/ftm/server/application/port/RedisCachePort.java b/src/main/java/com/ftm/server/application/port/RedisCachePort.java deleted file mode 100644 index 9b0ce92..0000000 --- a/src/main/java/com/ftm/server/application/port/RedisCachePort.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.ftm.server.application.port; - -/** Redis Caching 관련 작업 Gateway */ -public interface RedisCachePort {} diff --git a/src/main/java/com/ftm/server/application/port/SocialAuthClientPort.java b/src/main/java/com/ftm/server/application/port/SocialAuthClientPort.java deleted file mode 100644 index 50769ed..0000000 --- a/src/main/java/com/ftm/server/application/port/SocialAuthClientPort.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ftm.server.application.port; - -import com.ftm.server.application.dto.command.SocialAuthCommand; -import com.ftm.server.infrastructure.oauth.SocialAuthUser; - -public interface SocialAuthClientPort { - - // OAuthClient 인증 (소셜 인증) - R authenticate(T command); -} diff --git a/src/main/java/com/ftm/server/application/port/in/auth/GeneralLoginUseCase.java b/src/main/java/com/ftm/server/application/port/in/auth/GeneralLoginUseCase.java new file mode 100644 index 0000000..5dd0783 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/auth/GeneralLoginUseCase.java @@ -0,0 +1,14 @@ +package com.ftm.server.application.port.in.auth; + +import com.ftm.server.application.command.auth.GeneralLoginCommand; +import com.ftm.server.application.vo.auth.AuthenticatedUserVo; +import com.ftm.server.common.annotation.UseCase; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@UseCase +public interface GeneralLoginUseCase { + + AuthenticatedUserVo execute( + GeneralLoginCommand command, HttpServletRequest req, HttpServletResponse res); +} diff --git a/src/main/java/com/ftm/server/application/port/in/auth/KakaoLoginUseCase.java b/src/main/java/com/ftm/server/application/port/in/auth/KakaoLoginUseCase.java new file mode 100644 index 0000000..20eca4d --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/auth/KakaoLoginUseCase.java @@ -0,0 +1,11 @@ +package com.ftm.server.application.port.in.auth; + +import com.ftm.server.application.command.auth.KakaoLoginCommand; +import com.ftm.server.application.vo.auth.SocialLoginOutcomeVo; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface KakaoLoginUseCase { + + SocialLoginOutcomeVo execute(KakaoLoginCommand command); +} diff --git a/src/main/java/com/ftm/server/application/port/in/grooming/.gitkeep b/src/main/java/com/ftm/server/application/port/in/grooming/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/port/in/post/.gitkeep b/src/main/java/com/ftm/server/application/port/in/post/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/port/in/user/EmailAuthenticationUseCase.java b/src/main/java/com/ftm/server/application/port/in/user/EmailAuthenticationUseCase.java new file mode 100644 index 0000000..c022d17 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/user/EmailAuthenticationUseCase.java @@ -0,0 +1,10 @@ +package com.ftm.server.application.port.in.user; + +import com.ftm.server.application.command.user.EmailAuthenticationCommand; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface EmailAuthenticationUseCase { + + void execute(EmailAuthenticationCommand command); +} diff --git a/src/main/java/com/ftm/server/application/port/in/user/EmailCodeVerificationUseCase.java b/src/main/java/com/ftm/server/application/port/in/user/EmailCodeVerificationUseCase.java new file mode 100644 index 0000000..91ab34f --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/user/EmailCodeVerificationUseCase.java @@ -0,0 +1,10 @@ +package com.ftm.server.application.port.in.user; + +import com.ftm.server.application.query.EmailCodeVerificationQuery; +import com.ftm.server.application.vo.user.EmailCodeVerificationVo; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface EmailCodeVerificationUseCase { + EmailCodeVerificationVo execute(EmailCodeVerificationQuery query); +} diff --git a/src/main/java/com/ftm/server/application/port/in/user/EmailDuplicationCheckUseCase.java b/src/main/java/com/ftm/server/application/port/in/user/EmailDuplicationCheckUseCase.java new file mode 100644 index 0000000..ac2c031 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/user/EmailDuplicationCheckUseCase.java @@ -0,0 +1,11 @@ +package com.ftm.server.application.port.in.user; + +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.application.vo.user.EmailDuplicationVo; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface EmailDuplicationCheckUseCase { + + EmailDuplicationVo execute(FindByEmailQuery query); +} diff --git a/src/main/java/com/ftm/server/application/port/in/user/GeneralUserSignupUseCase.java b/src/main/java/com/ftm/server/application/port/in/user/GeneralUserSignupUseCase.java new file mode 100644 index 0000000..141efed --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/user/GeneralUserSignupUseCase.java @@ -0,0 +1,9 @@ +package com.ftm.server.application.port.in.user; + +import com.ftm.server.application.command.user.GeneralUserSignupCommand; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface GeneralUserSignupUseCase { + void execute(GeneralUserSignupCommand command); +} diff --git a/src/main/java/com/ftm/server/application/port/in/user/GetUserSignupOptionsUseCase.java b/src/main/java/com/ftm/server/application/port/in/user/GetUserSignupOptionsUseCase.java new file mode 100644 index 0000000..762cf54 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/user/GetUserSignupOptionsUseCase.java @@ -0,0 +1,10 @@ +package com.ftm.server.application.port.in.user; + +import com.ftm.server.application.vo.user.UserSignupOptionsVo; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface GetUserSignupOptionsUseCase { + + UserSignupOptionsVo execute(); +} diff --git a/src/main/java/com/ftm/server/application/port/in/user/SocialUserSignupUseCase.java b/src/main/java/com/ftm/server/application/port/in/user/SocialUserSignupUseCase.java new file mode 100644 index 0000000..4f8183d --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/in/user/SocialUserSignupUseCase.java @@ -0,0 +1,11 @@ +package com.ftm.server.application.port.in.user; + +import com.ftm.server.application.command.user.SocialUserSignupCommand; +import com.ftm.server.application.vo.user.SocialUserSignupSummaryVo; +import com.ftm.server.common.annotation.UseCase; + +@UseCase +public interface SocialUserSignupUseCase { + + SocialUserSignupSummaryVo execute(SocialUserSignupCommand command); +} diff --git a/src/main/java/com/ftm/server/application/port/out/oauth/SocialOAuthClientPort.java b/src/main/java/com/ftm/server/application/port/out/oauth/SocialOAuthClientPort.java new file mode 100644 index 0000000..3825ac4 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/oauth/SocialOAuthClientPort.java @@ -0,0 +1,10 @@ +package com.ftm.server.application.port.out.oauth; + +import com.ftm.server.application.command.auth.SocialLoginCommand; +import com.ftm.server.infrastructure.oauth.SocialAuthUser; + +public interface SocialOAuthClientPort { + + // OAuthClient 인증 (소셜 인증) + R authenticate(T command); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/auth/LoadUserForAuthPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/auth/LoadUserForAuthPort.java new file mode 100644 index 0000000..f0e0b0a --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/auth/LoadUserForAuthPort.java @@ -0,0 +1,18 @@ +package com.ftm.server.application.port.out.persistence.auth; + +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.application.query.FindByIdQuery; +import com.ftm.server.application.query.FindBySocialValueQuery; +import com.ftm.server.common.annotation.Port; +import com.ftm.server.domain.entity.User; +import java.util.Optional; + +@Port +public interface LoadUserForAuthPort { + + Optional loadUserById(FindByIdQuery query); + + Optional loadUserByEmail(FindByEmailQuery query); + + Optional loadUserBySocialProviderAndSocialId(FindBySocialValueQuery query); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/auth/LoadUserImageForAuthPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/auth/LoadUserImageForAuthPort.java new file mode 100644 index 0000000..44c7383 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/auth/LoadUserImageForAuthPort.java @@ -0,0 +1,12 @@ +package com.ftm.server.application.port.out.persistence.auth; + +import com.ftm.server.application.query.FindByUserIdQuery; +import com.ftm.server.common.annotation.Port; +import com.ftm.server.domain.entity.UserImage; +import java.util.Optional; + +@Port +public interface LoadUserImageForAuthPort { + + Optional loadUserImageByUserId(FindByUserIdQuery query); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/grooming/.gitkeep b/src/main/java/com/ftm/server/application/port/out/persistence/grooming/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/post/.gitkeep b/src/main/java/com/ftm/server/application/port/out/persistence/post/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/user/CheckUserPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/user/CheckUserPort.java new file mode 100644 index 0000000..1aa8f4d --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/user/CheckUserPort.java @@ -0,0 +1,12 @@ +package com.ftm.server.application.port.out.persistence.user; + +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.application.query.FindBySocialValueQuery; +import com.ftm.server.common.annotation.Port; + +@Port +public interface CheckUserPort { + Boolean checksUserByEmail(FindByEmailQuery query); + + Boolean checksUserBySocialValue(FindBySocialValueQuery query); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/user/LoadEmailVerificationLogPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/user/LoadEmailVerificationLogPort.java new file mode 100644 index 0000000..0bee4be --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/user/LoadEmailVerificationLogPort.java @@ -0,0 +1,16 @@ +package com.ftm.server.application.port.out.persistence.user; + +import com.ftm.server.application.query.EmailCodeVerificationQuery; +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.common.annotation.Port; +import com.ftm.server.domain.entity.EmailVerificationLogs; +import java.util.Optional; + +@Port +public interface LoadEmailVerificationLogPort { + + Optional loadEmailVerificationLogByEmail(FindByEmailQuery query); + + Optional loadEmailVerificationLogByEmailAndCode( + EmailCodeVerificationQuery query); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveEmailVerificationLogPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveEmailVerificationLogPort.java new file mode 100644 index 0000000..43bb84c --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveEmailVerificationLogPort.java @@ -0,0 +1,9 @@ +package com.ftm.server.application.port.out.persistence.user; + +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; +import com.ftm.server.common.annotation.Port; + +@Port +public interface SaveEmailVerificationLogPort { + void saveEmailVerificationLogs(EmailVerificationLogCreationCommand command); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveUserImagePort.java b/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveUserImagePort.java new file mode 100644 index 0000000..9bcda1a --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveUserImagePort.java @@ -0,0 +1,9 @@ +package com.ftm.server.application.port.out.persistence.user; + +import com.ftm.server.common.annotation.Port; +import com.ftm.server.domain.entity.UserImage; + +@Port +public interface SaveUserImagePort { + void saveUserDefaultImage(UserImage userImage); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveUserPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveUserPort.java new file mode 100644 index 0000000..07f76af --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/user/SaveUserPort.java @@ -0,0 +1,9 @@ +package com.ftm.server.application.port.out.persistence.user; + +import com.ftm.server.domain.entity.User; + +public interface SaveUserPort { + User saveUser(User user); + + User saveSocialUser(User user); +} diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/user/UpdateEmailVerificationLogPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/user/UpdateEmailVerificationLogPort.java new file mode 100644 index 0000000..df377e7 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/user/UpdateEmailVerificationLogPort.java @@ -0,0 +1,9 @@ +package com.ftm.server.application.port.out.persistence.user; + +import com.ftm.server.common.annotation.Port; +import com.ftm.server.domain.entity.EmailVerificationLogs; + +@Port +public interface UpdateEmailVerificationLogPort { + void updateEmailVerificationLog(EmailVerificationLogs emailVerificationLogs); +} diff --git a/src/main/java/com/ftm/server/application/port/RedisSessionPort.java b/src/main/java/com/ftm/server/application/port/out/redis/RedisSessionPort.java similarity index 61% rename from src/main/java/com/ftm/server/application/port/RedisSessionPort.java rename to src/main/java/com/ftm/server/application/port/out/redis/RedisSessionPort.java index c721a96..75d4ce9 100644 --- a/src/main/java/com/ftm/server/application/port/RedisSessionPort.java +++ b/src/main/java/com/ftm/server/application/port/out/redis/RedisSessionPort.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.port; +package com.ftm.server.application.port.out.redis; /** Redis Session 작업 관련 Gateway */ public interface RedisSessionPort {} diff --git a/src/main/java/com/ftm/server/application/port/out/s3/.gitkeep b/src/main/java/com/ftm/server/application/port/out/s3/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/port/AuthenticationPort.java b/src/main/java/com/ftm/server/application/port/out/security/SecurityAuthenticationPort.java similarity index 72% rename from src/main/java/com/ftm/server/application/port/AuthenticationPort.java rename to src/main/java/com/ftm/server/application/port/out/security/SecurityAuthenticationPort.java index 8929afb..504cb3d 100644 --- a/src/main/java/com/ftm/server/application/port/AuthenticationPort.java +++ b/src/main/java/com/ftm/server/application/port/out/security/SecurityAuthenticationPort.java @@ -1,16 +1,16 @@ -package com.ftm.server.application.port; +package com.ftm.server.application.port.out.security; -import com.ftm.server.application.dto.command.UserLoginCommand; +import com.ftm.server.application.command.auth.GeneralLoginCommand; import com.ftm.server.domain.entity.User; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; /** 시큐리티 인증 관련 작업 Gateway */ -public interface AuthenticationPort { +public interface SecurityAuthenticationPort { // 일반 유저 인증 객체 생성 - Authentication createAuthenticationFromCredentials(UserLoginCommand command); + Authentication createAuthenticationFromCredentials(GeneralLoginCommand command); // 소셜 유저 인증 객체 생성 Authentication createAuthenticationFromSocial(User user); diff --git a/src/main/java/com/ftm/server/application/port/MailSenderPort.java b/src/main/java/com/ftm/server/application/port/out/smtp/MailSenderPort.java similarity index 62% rename from src/main/java/com/ftm/server/application/port/MailSenderPort.java rename to src/main/java/com/ftm/server/application/port/out/smtp/MailSenderPort.java index cf19bfb..38270a9 100644 --- a/src/main/java/com/ftm/server/application/port/MailSenderPort.java +++ b/src/main/java/com/ftm/server/application/port/out/smtp/MailSenderPort.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.port; +package com.ftm.server.application.port.out.smtp; public interface MailSenderPort { diff --git a/src/main/java/com/ftm/server/application/port/repository/EmailVerificationLogsRepository.java b/src/main/java/com/ftm/server/application/port/repository/EmailVerificationLogsRepository.java deleted file mode 100644 index 46864cc..0000000 --- a/src/main/java/com/ftm/server/application/port/repository/EmailVerificationLogsRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ftm.server.application.port.repository; - -import com.ftm.server.domain.entity.EmailVerificationLogs; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface EmailVerificationLogsRepository - extends JpaRepository { - - Optional findByEmail(String email); - - Optional findByVerificationCodeAndEmail( - String verificationCode, String email); - - Optional findByEmailAndIsVerified(String email, Boolean isVerified); -} diff --git a/src/main/java/com/ftm/server/application/port/repository/UserImageRepository.java b/src/main/java/com/ftm/server/application/port/repository/UserImageRepository.java deleted file mode 100644 index c3d828c..0000000 --- a/src/main/java/com/ftm/server/application/port/repository/UserImageRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ftm.server.application.port.repository; - -import com.ftm.server.domain.entity.UserImage; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserImageRepository extends JpaRepository { - - Optional findByUserId(Long userId); -} diff --git a/src/main/java/com/ftm/server/application/port/repository/UserRepository.java b/src/main/java/com/ftm/server/application/port/repository/UserRepository.java deleted file mode 100644 index 700ebc3..0000000 --- a/src/main/java/com/ftm/server/application/port/repository/UserRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ftm.server.application.port.repository; - -import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.enums.SocialProvider; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserRepository extends JpaRepository { - - Boolean existsByEmail(String email); - - Optional findByEmail(String email); - - Optional findBySocialProviderAndSocialId(SocialProvider socialProvider, String socialId); - - Boolean existsBySocialIdAndSocialProvider(String socialId, SocialProvider socialProvider); -} diff --git a/src/main/java/com/ftm/server/application/dto/query/EmailCodeVerificationQuery.java b/src/main/java/com/ftm/server/application/query/EmailCodeVerificationQuery.java similarity index 71% rename from src/main/java/com/ftm/server/application/dto/query/EmailCodeVerificationQuery.java rename to src/main/java/com/ftm/server/application/query/EmailCodeVerificationQuery.java index cf70458..5f1a1dc 100644 --- a/src/main/java/com/ftm/server/application/dto/query/EmailCodeVerificationQuery.java +++ b/src/main/java/com/ftm/server/application/query/EmailCodeVerificationQuery.java @@ -1,6 +1,6 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; -import com.ftm.server.web.dto.request.EmailCodeVerificationRequest; +import com.ftm.server.adapter.in.web.user.dto.request.EmailCodeVerificationRequest; import lombok.Data; @Data diff --git a/src/main/java/com/ftm/server/application/dto/query/FindByEmailQuery.java b/src/main/java/com/ftm/server/application/query/FindByEmailQuery.java similarity index 95% rename from src/main/java/com/ftm/server/application/dto/query/FindByEmailQuery.java rename to src/main/java/com/ftm/server/application/query/FindByEmailQuery.java index 11d26f1..6b773da 100644 --- a/src/main/java/com/ftm/server/application/dto/query/FindByEmailQuery.java +++ b/src/main/java/com/ftm/server/application/query/FindByEmailQuery.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; diff --git a/src/main/java/com/ftm/server/application/dto/query/FindByIdQuery.java b/src/main/java/com/ftm/server/application/query/FindByIdQuery.java similarity index 84% rename from src/main/java/com/ftm/server/application/dto/query/FindByIdQuery.java rename to src/main/java/com/ftm/server/application/query/FindByIdQuery.java index a13171a..8c085a6 100644 --- a/src/main/java/com/ftm/server/application/dto/query/FindByIdQuery.java +++ b/src/main/java/com/ftm/server/application/query/FindByIdQuery.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; import lombok.Getter; diff --git a/src/main/java/com/ftm/server/application/dto/query/FindBySocialValueQuery.java b/src/main/java/com/ftm/server/application/query/FindBySocialValueQuery.java similarity index 63% rename from src/main/java/com/ftm/server/application/dto/query/FindBySocialValueQuery.java rename to src/main/java/com/ftm/server/application/query/FindBySocialValueQuery.java index 40852be..ca48731 100644 --- a/src/main/java/com/ftm/server/application/dto/query/FindBySocialValueQuery.java +++ b/src/main/java/com/ftm/server/application/query/FindBySocialValueQuery.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; import com.ftm.server.domain.enums.SocialProvider; import lombok.Data; @@ -9,6 +9,11 @@ public class FindBySocialValueQuery { private final SocialProvider socialProvider; private final String socialId; + private FindBySocialValueQuery(SocialProvider socialProvider, String socialId) { + this.socialProvider = socialProvider; + this.socialId = socialId; + } + public static FindBySocialValueQuery of(SocialProvider socialProvider, String socialId) { return new FindBySocialValueQuery(socialProvider, socialId); } diff --git a/src/main/java/com/ftm/server/application/dto/query/FindByUserIdQuery.java b/src/main/java/com/ftm/server/application/query/FindByUserIdQuery.java similarity index 86% rename from src/main/java/com/ftm/server/application/dto/query/FindByUserIdQuery.java rename to src/main/java/com/ftm/server/application/query/FindByUserIdQuery.java index 2d0c165..41aa017 100644 --- a/src/main/java/com/ftm/server/application/dto/query/FindByUserIdQuery.java +++ b/src/main/java/com/ftm/server/application/query/FindByUserIdQuery.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; import lombok.Getter; diff --git a/src/main/java/com/ftm/server/application/dto/query/FindEmailVerificationLogsByEmailQuery.java b/src/main/java/com/ftm/server/application/query/FindEmailVerificationLogsByEmailQuery.java similarity index 85% rename from src/main/java/com/ftm/server/application/dto/query/FindEmailVerificationLogsByEmailQuery.java rename to src/main/java/com/ftm/server/application/query/FindEmailVerificationLogsByEmailQuery.java index fd48336..0abd1a7 100644 --- a/src/main/java/com/ftm/server/application/dto/query/FindEmailVerificationLogsByEmailQuery.java +++ b/src/main/java/com/ftm/server/application/query/FindEmailVerificationLogsByEmailQuery.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; import lombok.Data; diff --git a/src/main/java/com/ftm/server/application/dto/query/FindSocialUserQuery.java b/src/main/java/com/ftm/server/application/query/FindSocialUserQuery.java similarity index 92% rename from src/main/java/com/ftm/server/application/dto/query/FindSocialUserQuery.java rename to src/main/java/com/ftm/server/application/query/FindSocialUserQuery.java index 6a8337c..56fdac5 100644 --- a/src/main/java/com/ftm/server/application/dto/query/FindSocialUserQuery.java +++ b/src/main/java/com/ftm/server/application/query/FindSocialUserQuery.java @@ -1,4 +1,4 @@ -package com.ftm.server.application.dto.query; +package com.ftm.server.application.query; import com.ftm.server.domain.enums.SocialProvider; import lombok.Getter; diff --git a/src/main/java/com/ftm/server/application/service/EmailVerificationLogsService.java b/src/main/java/com/ftm/server/application/service/EmailVerificationLogsService.java deleted file mode 100644 index 78c2bc9..0000000 --- a/src/main/java/com/ftm/server/application/service/EmailVerificationLogsService.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ftm.server.application.service; - -import com.ftm.server.application.dto.command.EmailVerificationLogCreationCommand; -import com.ftm.server.application.dto.query.EmailCodeVerificationQuery; -import com.ftm.server.application.dto.query.FindByEmailQuery; -import com.ftm.server.application.dto.query.FindEmailVerificationLogsByEmailQuery; -import com.ftm.server.application.port.repository.EmailVerificationLogsRepository; -import com.ftm.server.domain.entity.EmailVerificationLogs; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class EmailVerificationLogsService { - private final EmailVerificationLogsRepository emailVerificationLogsRepository; - - public Optional findEmailVerificationLogsByEmail( - FindByEmailQuery query) { - return emailVerificationLogsRepository.findByEmail(query.getEmail()); - } - - public void saveEmailVerificationLogs(EmailVerificationLogCreationCommand command) { - emailVerificationLogsRepository.save(EmailVerificationLogs.from(command)); - } - - public Optional findByAuthenticationCode( - EmailCodeVerificationQuery query) { - return emailVerificationLogsRepository.findByVerificationCodeAndEmail( - query.getCode(), query.getEmail()); - } - - public Optional findVerifiedOneByEmail( - FindEmailVerificationLogsByEmailQuery query) { - return emailVerificationLogsRepository.findByEmailAndIsVerified(query.getEmail(), true); - } -} diff --git a/src/main/java/com/ftm/server/application/service/UserImageService.java b/src/main/java/com/ftm/server/application/service/UserImageService.java deleted file mode 100644 index b265208..0000000 --- a/src/main/java/com/ftm/server/application/service/UserImageService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.ftm.server.application.service; - -import com.ftm.server.application.dto.query.FindByUserIdQuery; -import com.ftm.server.application.port.repository.UserImageRepository; -import com.ftm.server.common.exception.CustomException; -import com.ftm.server.common.response.enums.ErrorResponseCode; -import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.entity.UserImage; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class UserImageService { - - private final UserImageRepository userImageRepository; - - public UserImage queryUserImageByUserId(FindByUserIdQuery query) { - return userImageRepository - .findByUserId(query.getUserId()) - .orElseThrow(() -> new CustomException(ErrorResponseCode.USER_IMAGE_NOT_FOUND)); - } - - public UserImage saveUserDefaultImage(User user) { - UserImage userImage = UserImage.createUserImage(user); - userImageRepository.save(userImage); - return userImage; - } -} diff --git a/src/main/java/com/ftm/server/application/service/UserService.java b/src/main/java/com/ftm/server/application/service/UserService.java deleted file mode 100644 index efdf6e2..0000000 --- a/src/main/java/com/ftm/server/application/service/UserService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.ftm.server.application.service; - -import com.ftm.server.application.dto.command.GeneralUserCreationCommand; -import com.ftm.server.application.dto.command.SocialUserCreationCommand; -import com.ftm.server.application.dto.query.FindByEmailQuery; -import com.ftm.server.application.dto.query.FindByIdQuery; -import com.ftm.server.application.dto.query.FindBySocialValueQuery; -import com.ftm.server.application.dto.query.FindSocialUserQuery; -import com.ftm.server.application.port.repository.UserRepository; -import com.ftm.server.common.exception.CustomException; -import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.vo.EmailDuplicationVo; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -@Slf4j -public class UserService { - - private final UserRepository userRepository; - - public EmailDuplicationVo isEmailDuplicated(FindByEmailQuery query) { - return EmailDuplicationVo.of(userRepository.existsByEmail(query.getEmail())); - } - - public User queryUser(FindByIdQuery query) { - return userRepository - .findById(query.getId()) - .orElseThrow(() -> CustomException.USER_NOT_FOUND); - } - - public Optional querySocialUser(FindSocialUserQuery query) { - return userRepository.findBySocialProviderAndSocialId( - query.getSocialProvider(), query.getSocialId()); - } - - public User createGeneralUser(GeneralUserCreationCommand command) { - User user = User.createGeneralUser(command); - userRepository.save(user); - return user; - } - - public User createSocialUser(SocialUserCreationCommand command) { - User user = User.createSocailUser(command); - userRepository.save(user); - return user; - } - - public Boolean userCheckBySocialValue(FindBySocialValueQuery query) { - return userRepository.existsBySocialIdAndSocialProvider( - query.getSocialId(), query.getSocialProvider()); - } - - public Boolean userCheckByEmail(FindByEmailQuery query) { - return userRepository.existsByEmail(query.getEmail()); - } -} diff --git a/src/main/java/com/ftm/server/application/service/auth/GeneralLoginService.java b/src/main/java/com/ftm/server/application/service/auth/GeneralLoginService.java new file mode 100644 index 0000000..05036c2 --- /dev/null +++ b/src/main/java/com/ftm/server/application/service/auth/GeneralLoginService.java @@ -0,0 +1,65 @@ +package com.ftm.server.application.service.auth; + +import com.ftm.server.application.command.auth.GeneralLoginCommand; +import com.ftm.server.application.port.in.auth.GeneralLoginUseCase; +import com.ftm.server.application.port.out.persistence.auth.LoadUserForAuthPort; +import com.ftm.server.application.port.out.persistence.auth.LoadUserImageForAuthPort; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; +import com.ftm.server.application.query.FindByIdQuery; +import com.ftm.server.application.query.FindByUserIdQuery; +import com.ftm.server.application.vo.auth.AuthenticatedUserVo; +import com.ftm.server.common.exception.CustomException; +import com.ftm.server.common.response.enums.ErrorResponseCode; +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.entity.UserImage; +import com.ftm.server.infrastructure.security.UserPrincipal; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GeneralLoginService implements GeneralLoginUseCase { + + private final SecurityAuthenticationPort securityAuthenticationPort; + private final LoadUserForAuthPort loadUserForAuthPort; + private final LoadUserImageForAuthPort loadUserImageForAuthPort; + + @Override + @Transactional + public AuthenticatedUserVo execute( + GeneralLoginCommand command, HttpServletRequest req, HttpServletResponse res) { + + // 인증을 수행하고 인증 객체 생성 (실패 시 예외 발생) + Authentication auth = createAuthenticationOrThrow(command); + UserPrincipal userPrincipal = (UserPrincipal) auth.getPrincipal(); + + User user = + loadUserForAuthPort + .loadUserById(FindByIdQuery.of(userPrincipal.getId())) + .orElseThrow(() -> CustomException.USER_NOT_FOUND); + + UserImage userImage = + loadUserImageForAuthPort + .loadUserImageByUserId(FindByUserIdQuery.of(user.getId())) + .orElseThrow( + () -> new CustomException(ErrorResponseCode.USER_IMAGE_NOT_FOUND)); + + // 인증 세션 등록 (시큐리티 컨텍스트 등록) + securityAuthenticationPort.saveAuthenticatedSession(auth, req, res); + + return AuthenticatedUserVo.of(user, userImage); + } + + private Authentication createAuthenticationOrThrow(GeneralLoginCommand command) { + try { + return securityAuthenticationPort.createAuthenticationFromCredentials(command); + } catch (AuthenticationException ex) { + throw new CustomException(ErrorResponseCode.INVALID_CREDENTIALS); + } + } +} diff --git a/src/main/java/com/ftm/server/application/service/auth/KakaoLoginService.java b/src/main/java/com/ftm/server/application/service/auth/KakaoLoginService.java new file mode 100644 index 0000000..ea22d9b --- /dev/null +++ b/src/main/java/com/ftm/server/application/service/auth/KakaoLoginService.java @@ -0,0 +1,59 @@ +package com.ftm.server.application.service.auth; + +import com.ftm.server.application.command.auth.KakaoLoginCommand; +import com.ftm.server.application.port.in.auth.KakaoLoginUseCase; +import com.ftm.server.application.port.out.oauth.SocialOAuthClientPort; +import com.ftm.server.application.port.out.persistence.auth.LoadUserForAuthPort; +import com.ftm.server.application.port.out.persistence.auth.LoadUserImageForAuthPort; +import com.ftm.server.application.query.FindBySocialValueQuery; +import com.ftm.server.application.query.FindByUserIdQuery; +import com.ftm.server.application.vo.auth.AuthenticatedUserVo; +import com.ftm.server.application.vo.auth.PendingSocialUserVo; +import com.ftm.server.application.vo.auth.SocialLoginOutcomeVo; +import com.ftm.server.application.vo.auth.SocialLoginSuccessVo; +import com.ftm.server.common.exception.CustomException; +import com.ftm.server.common.response.enums.ErrorResponseCode; +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.entity.UserImage; +import com.ftm.server.infrastructure.oauth.kakao.KakaoAuthUser; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class KakaoLoginService implements KakaoLoginUseCase { + + private final SocialOAuthClientPort kakaoOAuthClientPort; + private final LoadUserForAuthPort loadUserForAuthPort; + private final LoadUserImageForAuthPort loadUserImageForAuthPort; + + @Override + public SocialLoginOutcomeVo execute(KakaoLoginCommand command) { + + // 카카오 로그인 인증 API + KakaoAuthUser kakaoUser = kakaoOAuthClientPort.authenticate(command); + + Optional saved = + loadUserForAuthPort.loadUserBySocialProviderAndSocialId( + FindBySocialValueQuery.of( + kakaoUser.getSocialProvider(), kakaoUser.getSocialId())); + + // 가입된 회원인 경우 + if (saved.isPresent()) { + User user = saved.get(); + UserImage image = + loadUserImageForAuthPort + .loadUserImageByUserId(FindByUserIdQuery.of(user.getId())) + .orElseThrow( + () -> + new CustomException( + ErrorResponseCode.USER_IMAGE_NOT_FOUND)); + + return SocialLoginSuccessVo.from(user, AuthenticatedUserVo.of(user, image)); + } + + // 가입된 회원이 아닌 경우 + return PendingSocialUserVo.from(kakaoUser.getSocialProvider(), kakaoUser.getSocialId()); + } +} diff --git a/src/main/java/com/ftm/server/application/service/grooming/.gitkeep b/src/main/java/com/ftm/server/application/service/grooming/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/service/post/.gitkeep b/src/main/java/com/ftm/server/application/service/post/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/ftm/server/application/usecase/user/EmailAuthenticationUseCase.java b/src/main/java/com/ftm/server/application/service/user/EmailAuthenticationService.java similarity index 56% rename from src/main/java/com/ftm/server/application/usecase/user/EmailAuthenticationUseCase.java rename to src/main/java/com/ftm/server/application/service/user/EmailAuthenticationService.java index 027a4c9..67389b6 100644 --- a/src/main/java/com/ftm/server/application/usecase/user/EmailAuthenticationUseCase.java +++ b/src/main/java/com/ftm/server/application/service/user/EmailAuthenticationService.java @@ -1,11 +1,13 @@ -package com.ftm.server.application.usecase.user; - -import com.ftm.server.application.dto.command.EmailAuthenticationCommand; -import com.ftm.server.application.dto.command.EmailVerificationLogCreationCommand; -import com.ftm.server.application.dto.query.FindByEmailQuery; -import com.ftm.server.application.port.MailSenderPort; -import com.ftm.server.application.service.EmailVerificationLogsService; -import com.ftm.server.common.annotation.UseCase; +package com.ftm.server.application.service.user; + +import com.ftm.server.application.command.user.EmailAuthenticationCommand; +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; +import com.ftm.server.application.port.in.user.EmailAuthenticationUseCase; +import com.ftm.server.application.port.out.persistence.user.LoadEmailVerificationLogPort; +import com.ftm.server.application.port.out.persistence.user.SaveEmailVerificationLogPort; +import com.ftm.server.application.port.out.persistence.user.UpdateEmailVerificationLogPort; +import com.ftm.server.application.port.out.smtp.MailSenderPort; +import com.ftm.server.application.query.FindByEmailQuery; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.common.utils.RandomCodeCreator; @@ -15,39 +17,45 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; -@UseCase +@Service @RequiredArgsConstructor @Slf4j -public class EmailAuthenticationUseCase { +public class EmailAuthenticationService implements EmailAuthenticationUseCase { private final MailSenderPort mailSenderPort; - private final EmailVerificationLogsService emailVerificationLogsService; + private final LoadEmailVerificationLogPort loadEmailVerificationLogPort; + private final SaveEmailVerificationLogPort saveEmailVerificationLogPort; + private final UpdateEmailVerificationLogPort updateEmailVerificationLogPort; + @Override @Transactional - public void sendEmailAuthenticationCode(EmailAuthenticationCommand command) { + public void execute(EmailAuthenticationCommand command) { String authCode = RandomCodeCreator.generateAuthCode(); String email = command.getEmail(); Optional emailVerificationLogs = - emailVerificationLogsService.findEmailVerificationLogsByEmail( + loadEmailVerificationLogPort.loadEmailVerificationLogByEmail( FindByEmailQuery.of(email)); int MAX_TRIALS = 5; int BLOCK_MINUTES = 15; if (emailVerificationLogs.isEmpty()) { // 이메일 인증을 한번도 시도하지 않은 경우 log 새로 생성 - emailVerificationLogsService.saveEmailVerificationLogs( + saveEmailVerificationLogPort.saveEmailVerificationLogs( EmailVerificationLogCreationCommand.of(email, authCode)); } else if (emailVerificationLogs.get().getTrialNum() < MAX_TRIALS) { // 이메일 인증 시도를 한적 있으나 시도 횟수를 초과하지 않은 경우 log update emailVerificationLogs.get().updateVerificationStatus(authCode); + updateEmailVerificationLogPort.updateEmailVerificationLog(emailVerificationLogs.get()); } else if (emailVerificationLogs // 이메일 인증 시도 횟수를 초과했으나 마지막 시도 횟수로부터 15분 이상이 지난 경우 log 초기화 .get() .getTokenIssuanceTime() .isBefore(LocalDateTime.now().minusMinutes(BLOCK_MINUTES))) { emailVerificationLogs.get().initializeVerificationStatus(authCode); + updateEmailVerificationLogPort.updateEmailVerificationLog(emailVerificationLogs.get()); } else { // 이메일 인증 시도 횟수를 단순히 초과한 경우 throw new CustomException(ErrorResponseCode.EXCEED_NUMBER_OF_TRIAL); } diff --git a/src/main/java/com/ftm/server/application/service/user/EmailCodeVerificationService.java b/src/main/java/com/ftm/server/application/service/user/EmailCodeVerificationService.java new file mode 100644 index 0000000..ab0c6f9 --- /dev/null +++ b/src/main/java/com/ftm/server/application/service/user/EmailCodeVerificationService.java @@ -0,0 +1,35 @@ +package com.ftm.server.application.service.user; + +import com.ftm.server.application.port.in.user.EmailCodeVerificationUseCase; +import com.ftm.server.application.port.out.persistence.user.LoadEmailVerificationLogPort; +import com.ftm.server.application.port.out.persistence.user.UpdateEmailVerificationLogPort; +import com.ftm.server.application.query.EmailCodeVerificationQuery; +import com.ftm.server.application.vo.user.EmailCodeVerificationVo; +import com.ftm.server.domain.entity.EmailVerificationLogs; +import jakarta.transaction.Transactional; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class EmailCodeVerificationService implements EmailCodeVerificationUseCase { + + private final LoadEmailVerificationLogPort loadEmailVerificationLogPort; + private final UpdateEmailVerificationLogPort updateEmailVerificationLogPort; + + @Override + @Transactional + public EmailCodeVerificationVo execute(EmailCodeVerificationQuery query) { + + Optional emailVerificationLogs = + loadEmailVerificationLogPort.loadEmailVerificationLogByEmailAndCode(query); + + if (emailVerificationLogs.isEmpty()) { // 검증 코드가 일치하지 않음 + return EmailCodeVerificationVo.of(false); + } + emailVerificationLogs.get().updateVerificationStatus(true); // 검증 코드가 일치함 + updateEmailVerificationLogPort.updateEmailVerificationLog(emailVerificationLogs.get()); + return EmailCodeVerificationVo.of(true); + } +} diff --git a/src/main/java/com/ftm/server/application/service/user/EmailDuplicationCheckService.java b/src/main/java/com/ftm/server/application/service/user/EmailDuplicationCheckService.java new file mode 100644 index 0000000..ba96dc9 --- /dev/null +++ b/src/main/java/com/ftm/server/application/service/user/EmailDuplicationCheckService.java @@ -0,0 +1,20 @@ +package com.ftm.server.application.service.user; + +import com.ftm.server.application.port.in.user.EmailDuplicationCheckUseCase; +import com.ftm.server.application.port.out.persistence.user.CheckUserPort; +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.application.vo.user.EmailDuplicationVo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class EmailDuplicationCheckService implements EmailDuplicationCheckUseCase { + + private final CheckUserPort checkUserPort; + + @Override + public EmailDuplicationVo execute(FindByEmailQuery query) { + return EmailDuplicationVo.of(checkUserPort.checksUserByEmail(query)); + } +} diff --git a/src/main/java/com/ftm/server/application/service/user/GeneralUserSignupService.java b/src/main/java/com/ftm/server/application/service/user/GeneralUserSignupService.java new file mode 100644 index 0000000..8382306 --- /dev/null +++ b/src/main/java/com/ftm/server/application/service/user/GeneralUserSignupService.java @@ -0,0 +1,65 @@ +package com.ftm.server.application.service.user; + +import com.ftm.server.application.command.user.GeneralUserCreationCommand; +import com.ftm.server.application.command.user.GeneralUserSignupCommand; +import com.ftm.server.application.port.in.user.GeneralUserSignupUseCase; +import com.ftm.server.application.port.out.persistence.user.CheckUserPort; +import com.ftm.server.application.port.out.persistence.user.LoadEmailVerificationLogPort; +import com.ftm.server.application.port.out.persistence.user.SaveUserImagePort; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; +import com.ftm.server.application.query.FindByEmailQuery; +import com.ftm.server.common.exception.CustomException; +import com.ftm.server.common.response.enums.ErrorResponseCode; +import com.ftm.server.common.utils.RandomNickNameCreator; +import com.ftm.server.domain.entity.EmailVerificationLogs; +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.entity.UserImage; +import jakarta.transaction.Transactional; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GeneralUserSignupService implements GeneralUserSignupUseCase { + + // service + private final LoadEmailVerificationLogPort loadEmailVerificationLogPort; + private final CheckUserPort checksUserPort; + private final SaveUserPort saveUserPort; + private final SaveUserImagePort saveUserImagePort; + + // gateway + private final SecurityAuthenticationPort authenticationPort; + + @Transactional + @Override + public void execute(GeneralUserSignupCommand command) { + String email = command.getEmail(); + Optional emailVerificationLogs = + loadEmailVerificationLogPort.loadEmailVerificationLogByEmail( + FindByEmailQuery.of(email)); + + if (checksUserPort.checksUserByEmail(FindByEmailQuery.of(email))) { // 기존에 가입된 회원인지 검사 + throw new CustomException(ErrorResponseCode.USER_ALREADY_EXISTS); + } + + if (emailVerificationLogs.isEmpty()) { // 이메일 인증이 완료되지 않음. + throw new CustomException(ErrorResponseCode.EMAIL_NOT_VERIFIED); + } + + String nickname = RandomNickNameCreator.generateNickname(); // random 닉네임 생성 + + GeneralUserCreationCommand convertedCommand = + GeneralUserCreationCommand.of( + command.getEmail(), + authenticationPort.passwordEncode(command.getPassword()), + nickname, + command.getAge(), + command.getHashtags()); + + User user = saveUserPort.saveUser(User.createGeneralUser(convertedCommand)); + saveUserImagePort.saveUserDefaultImage(UserImage.createUserImage(user.getId())); + } +} diff --git a/src/main/java/com/ftm/server/application/usecase/user/GetUserSignupOptionsUseCase.java b/src/main/java/com/ftm/server/application/service/user/GetUserSignupOptionsService.java similarity index 64% rename from src/main/java/com/ftm/server/application/usecase/user/GetUserSignupOptionsUseCase.java rename to src/main/java/com/ftm/server/application/service/user/GetUserSignupOptionsService.java index 7203a67..cd557bc 100644 --- a/src/main/java/com/ftm/server/application/usecase/user/GetUserSignupOptionsUseCase.java +++ b/src/main/java/com/ftm/server/application/service/user/GetUserSignupOptionsService.java @@ -1,18 +1,20 @@ -package com.ftm.server.application.usecase.user; +package com.ftm.server.application.service.user; -import com.ftm.server.common.annotation.UseCase; +import com.ftm.server.adapter.in.web.user.dto.response.UserSignupOptionsResponse; +import com.ftm.server.application.port.in.user.GetUserSignupOptionsUseCase; +import com.ftm.server.application.vo.user.UserSignupOptionsVo; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; -import com.ftm.server.domain.vo.UserSignupOptionsVo; -import com.ftm.server.web.dto.response.UserSignupOptionsResponse; import java.util.Arrays; import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; -@UseCase +@Service @RequiredArgsConstructor -public class GetUserSignupOptionsUseCase { +public class GetUserSignupOptionsService implements GetUserSignupOptionsUseCase { + @Override public UserSignupOptionsVo execute() { List ages = Arrays.stream(AgeGroup.values()) diff --git a/src/main/java/com/ftm/server/application/service/user/SocialUserSignupService.java b/src/main/java/com/ftm/server/application/service/user/SocialUserSignupService.java new file mode 100644 index 0000000..66be805 --- /dev/null +++ b/src/main/java/com/ftm/server/application/service/user/SocialUserSignupService.java @@ -0,0 +1,54 @@ +package com.ftm.server.application.service.user; + +import com.ftm.server.application.command.user.SocialUserCreationCommand; +import com.ftm.server.application.command.user.SocialUserSignupCommand; +import com.ftm.server.application.port.in.user.SocialUserSignupUseCase; +import com.ftm.server.application.port.out.persistence.user.CheckUserPort; +import com.ftm.server.application.port.out.persistence.user.SaveUserImagePort; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; +import com.ftm.server.application.query.FindBySocialValueQuery; +import com.ftm.server.application.vo.user.SocialUserSignupSummaryVo; +import com.ftm.server.common.exception.CustomException; +import com.ftm.server.common.response.enums.ErrorResponseCode; +import com.ftm.server.common.utils.RandomNickNameCreator; +import com.ftm.server.domain.entity.User; +import com.ftm.server.domain.entity.UserImage; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class SocialUserSignupService implements SocialUserSignupUseCase { + + private final CheckUserPort checkUserPort; + private final SaveUserPort saveUserPort; + private final SaveUserImagePort saveUserImagePort; + + @Transactional + @Override + public SocialUserSignupSummaryVo execute(SocialUserSignupCommand command) { + + // 이미 가입된 회원인지 한번 더 확인 + if (checkUserPort.checksUserBySocialValue( + FindBySocialValueQuery.of(command.getSocialProvider(), command.getSocialId()))) { + throw new CustomException(ErrorResponseCode.USER_ALREADY_EXISTS); + } + + String nickname = RandomNickNameCreator.generateNickname(); + + SocialUserCreationCommand command1 = + SocialUserCreationCommand.of( + command.getSocialProvider(), + command.getSocialId(), + nickname, + command.getAge(), + command.getHashtags()); + + User user = saveUserPort.saveSocialUser(User.createSocailUser(command1)); + UserImage userImage = UserImage.createUserImage(user.getId()); + saveUserImagePort.saveUserDefaultImage(userImage); + + return SocialUserSignupSummaryVo.from(user, userImage.getObjectKey(), null); + } +} diff --git a/src/main/java/com/ftm/server/application/usecase/auth/KakaoLoginUseCase.java b/src/main/java/com/ftm/server/application/usecase/auth/KakaoLoginUseCase.java deleted file mode 100644 index 6b80f2b..0000000 --- a/src/main/java/com/ftm/server/application/usecase/auth/KakaoLoginUseCase.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ftm.server.application.usecase.auth; - -import com.ftm.server.application.dto.command.KakaoAuthCommand; -import com.ftm.server.application.dto.query.FindByUserIdQuery; -import com.ftm.server.application.dto.query.FindSocialUserQuery; -import com.ftm.server.application.port.SocialAuthClientPort; -import com.ftm.server.application.service.UserImageService; -import com.ftm.server.application.service.UserService; -import com.ftm.server.common.annotation.UseCase; -import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.entity.UserImage; -import com.ftm.server.domain.vo.PendingSocialUserVo; -import com.ftm.server.domain.vo.SocialLoginOutcomeVo; -import com.ftm.server.domain.vo.SocialLoginSuccessVo; -import com.ftm.server.domain.vo.UserSummaryVo; -import com.ftm.server.infrastructure.oauth.kakao.KakaoAuthUser; -import java.util.Optional; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class KakaoLoginUseCase { - - private final SocialAuthClientPort oAuthClientPort; - private final UserService userService; - private final UserImageService userImageService; - - public SocialLoginOutcomeVo kakaoLogin(KakaoAuthCommand command) { - // 카카오 인증 수행 - KakaoAuthUser kakaoUser = oAuthClientPort.authenticate(command); - - Optional saved = - userService.querySocialUser( - FindSocialUserQuery.of( - kakaoUser.getSocialProvider(), kakaoUser.getSocialId())); - - // 가입된 회원인 경우 - if (saved.isPresent()) { - User user = saved.get(); - UserImage image = - userImageService.queryUserImageByUserId(FindByUserIdQuery.of(user.getId())); - - return SocialLoginSuccessVo.from(user, UserSummaryVo.of(user, image)); - } - - // 가입된 회원이 아닌 경우 - return PendingSocialUserVo.from(kakaoUser.getSocialProvider(), kakaoUser.getSocialId()); - } -} diff --git a/src/main/java/com/ftm/server/application/usecase/auth/UserLoginUseCase.java b/src/main/java/com/ftm/server/application/usecase/auth/UserLoginUseCase.java deleted file mode 100644 index 61316fe..0000000 --- a/src/main/java/com/ftm/server/application/usecase/auth/UserLoginUseCase.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ftm.server.application.usecase.auth; - -import com.ftm.server.application.dto.command.UserLoginCommand; -import com.ftm.server.application.dto.query.FindByIdQuery; -import com.ftm.server.application.dto.query.FindByUserIdQuery; -import com.ftm.server.application.port.AuthenticationPort; -import com.ftm.server.application.service.UserImageService; -import com.ftm.server.application.service.UserService; -import com.ftm.server.common.annotation.UseCase; -import com.ftm.server.common.exception.CustomException; -import com.ftm.server.common.response.enums.ErrorResponseCode; -import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.entity.UserImage; -import com.ftm.server.domain.vo.UserSummaryVo; -import com.ftm.server.infrastructure.security.UserPrincipal; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.transaction.annotation.Transactional; - -@UseCase -@RequiredArgsConstructor -public class UserLoginUseCase { - - private final AuthenticationPort authenticationPort; - private final UserService userService; - private final UserImageService userImageService; - - @Transactional - public UserSummaryVo login( - UserLoginCommand command, HttpServletRequest req, HttpServletResponse res) { - - // 인증을 수행하고 인증 객체 생성 (실패 시 예외 발생) - Authentication auth = createAuthenticationOrThrow(command); - UserPrincipal userPrincipal = (UserPrincipal) auth.getPrincipal(); - - User user = userService.queryUser(FindByIdQuery.of(userPrincipal.getId())); - UserImage userImage = - userImageService.queryUserImageByUserId(FindByUserIdQuery.of(user.getId())); - - // 인증 세션 등록 (시큐리티 컨텍스트 등록) - authenticationPort.saveAuthenticatedSession(auth, req, res); - - return UserSummaryVo.of(user, userImage); - } - - private Authentication createAuthenticationOrThrow(UserLoginCommand command) { - try { - return authenticationPort.createAuthenticationFromCredentials(command); - } catch (AuthenticationException ex) { - throw new CustomException(ErrorResponseCode.INVALID_CREDENTIALS); - } - } -} diff --git a/src/main/java/com/ftm/server/application/usecase/user/EmailCodeVerificationUseCase.java b/src/main/java/com/ftm/server/application/usecase/user/EmailCodeVerificationUseCase.java deleted file mode 100644 index f131216..0000000 --- a/src/main/java/com/ftm/server/application/usecase/user/EmailCodeVerificationUseCase.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ftm.server.application.usecase.user; - -import com.ftm.server.application.dto.query.EmailCodeVerificationQuery; -import com.ftm.server.application.service.EmailVerificationLogsService; -import com.ftm.server.common.annotation.UseCase; -import com.ftm.server.domain.entity.EmailVerificationLogs; -import com.ftm.server.domain.vo.EmailCodeVerificationVo; -import jakarta.transaction.Transactional; -import java.util.Optional; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class EmailCodeVerificationUseCase { - - private final EmailVerificationLogsService emailVerificationLogsService; - - @Transactional - public EmailCodeVerificationVo execute(EmailCodeVerificationQuery query) { - - Optional emailVerificationLogs = - emailVerificationLogsService.findByAuthenticationCode(query); - - if (emailVerificationLogs.isEmpty()) { // 검증 코드가 일치하지 않음 - return EmailCodeVerificationVo.of(false); - } - emailVerificationLogs.get().updateVerificationStatus(true); // 검증 코드가 일치함 - return EmailCodeVerificationVo.of(true); - } -} diff --git a/src/main/java/com/ftm/server/application/usecase/user/EmailDuplicationCheckUseCase.java b/src/main/java/com/ftm/server/application/usecase/user/EmailDuplicationCheckUseCase.java deleted file mode 100644 index bb4af81..0000000 --- a/src/main/java/com/ftm/server/application/usecase/user/EmailDuplicationCheckUseCase.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.ftm.server.application.usecase.user; - -import com.ftm.server.application.dto.query.FindByEmailQuery; -import com.ftm.server.application.service.UserService; -import com.ftm.server.common.annotation.UseCase; -import com.ftm.server.domain.vo.EmailDuplicationVo; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class EmailDuplicationCheckUseCase { - - private final UserService userService; - - public EmailDuplicationVo emailDuplicationCheck(FindByEmailQuery query) { - return userService.isEmailDuplicated(query); - } -} diff --git a/src/main/java/com/ftm/server/application/usecase/user/GeneralUserSignupUseCase.java b/src/main/java/com/ftm/server/application/usecase/user/GeneralUserSignupUseCase.java deleted file mode 100644 index 6f348a8..0000000 --- a/src/main/java/com/ftm/server/application/usecase/user/GeneralUserSignupUseCase.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ftm.server.application.usecase.user; - -import com.ftm.server.application.dto.command.GeneralUserCreationCommand; -import com.ftm.server.application.dto.command.GeneralUserSignupCommand; -import com.ftm.server.application.dto.query.FindByEmailQuery; -import com.ftm.server.application.dto.query.FindEmailVerificationLogsByEmailQuery; -import com.ftm.server.application.port.AuthenticationPort; -import com.ftm.server.application.service.EmailVerificationLogsService; -import com.ftm.server.application.service.UserImageService; -import com.ftm.server.application.service.UserService; -import com.ftm.server.common.annotation.UseCase; -import com.ftm.server.common.exception.CustomException; -import com.ftm.server.common.response.enums.ErrorResponseCode; -import com.ftm.server.common.utils.RandomNickNameCreator; -import com.ftm.server.domain.entity.EmailVerificationLogs; -import com.ftm.server.domain.entity.User; -import java.util.Optional; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class GeneralUserSignupUseCase { - - // service - private final EmailVerificationLogsService emailVerificationLogsService; - private final UserService userService; - private final UserImageService userImageService; - - // gateway - private final AuthenticationPort authenticationPort; - - public void execute(GeneralUserSignupCommand command) { - String email = command.getEmail(); - Optional emailVerificationLogs = - emailVerificationLogsService.findVerifiedOneByEmail( - FindEmailVerificationLogsByEmailQuery.of(email)); - - if (userService.userCheckByEmail(FindByEmailQuery.of(email))) { // 기존에 가입된 회원인지 검사 - throw new CustomException(ErrorResponseCode.USER_ALREADY_EXISTS); - } - - if (emailVerificationLogs.isEmpty()) { // 이메일 인증이 완료되지 않음. - throw new CustomException(ErrorResponseCode.EMAIL_NOT_VERIFIED); - } - - String nickname = RandomNickNameCreator.generateNickname(); // random 닉네임 생성 - - GeneralUserCreationCommand convertedCommand = - GeneralUserCreationCommand.of( - command.getEmail(), - authenticationPort.passwordEncode(command.getPassword()), - nickname, - command.getAge(), - command.getHashtags()); - - User user = userService.createGeneralUser(convertedCommand); - userImageService.saveUserDefaultImage(user); - } -} diff --git a/src/main/java/com/ftm/server/application/usecase/user/SocialUserSignupUseCase.java b/src/main/java/com/ftm/server/application/usecase/user/SocialUserSignupUseCase.java deleted file mode 100644 index c5fe568..0000000 --- a/src/main/java/com/ftm/server/application/usecase/user/SocialUserSignupUseCase.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ftm.server.application.usecase.user; - -import com.ftm.server.application.dto.command.SocialUserCreationCommand; -import com.ftm.server.application.dto.command.SocialUserSignupCommand; -import com.ftm.server.application.dto.query.FindBySocialValueQuery; -import com.ftm.server.application.service.UserImageService; -import com.ftm.server.application.service.UserService; -import com.ftm.server.common.annotation.UseCase; -import com.ftm.server.common.exception.CustomException; -import com.ftm.server.common.response.enums.ErrorResponseCode; -import com.ftm.server.common.utils.RandomNickNameCreator; -import com.ftm.server.domain.entity.User; -import com.ftm.server.domain.entity.UserImage; -import com.ftm.server.domain.vo.SocialUserSignupSummaryVo; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class SocialUserSignupUseCase { - - private final UserService userService; - private final UserImageService userImageService; - - public SocialUserSignupSummaryVo execute(SocialUserSignupCommand command) { - - // 이미 가입된 회원인지 한번 더 확인 - if (userService.userCheckBySocialValue( - FindBySocialValueQuery.of(command.getSocialProvider(), command.getSocialId()))) { - throw new CustomException(ErrorResponseCode.USER_ALREADY_EXISTS); - } - - String nickname = RandomNickNameCreator.generateNickname(); - - SocialUserCreationCommand command1 = - SocialUserCreationCommand.of( - command.getSocialProvider(), - command.getSocialId(), - nickname, - command.getAge(), - command.getHashtags()); - - User user = userService.createSocialUser(command1); - - UserImage userImage = userImageService.saveUserDefaultImage(user); - - return SocialUserSignupSummaryVo.of(user, userImage.getObjectKey()); - } -} diff --git a/src/main/java/com/ftm/server/domain/vo/UserSummaryVo.java b/src/main/java/com/ftm/server/application/vo/auth/AuthenticatedUserVo.java similarity index 64% rename from src/main/java/com/ftm/server/domain/vo/UserSummaryVo.java rename to src/main/java/com/ftm/server/application/vo/auth/AuthenticatedUserVo.java index be07b64..d87d8b8 100644 --- a/src/main/java/com/ftm/server/domain/vo/UserSummaryVo.java +++ b/src/main/java/com/ftm/server/application/vo/auth/AuthenticatedUserVo.java @@ -1,4 +1,4 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.auth; import com.ftm.server.common.consts.PropertiesHolder; import com.ftm.server.domain.entity.GroomingLevel; @@ -7,7 +7,7 @@ import lombok.Getter; @Getter -public class UserSummaryVo { +public class AuthenticatedUserVo { private final Long id; private final String nickname; @@ -15,7 +15,7 @@ public class UserSummaryVo { private final String mildLevelName; private final String spicyLevelName; - private UserSummaryVo(User user, UserImage userImage, GroomingLevel groomingLevel) { + private AuthenticatedUserVo(User user, UserImage userImage, GroomingLevel groomingLevel) { this.id = user.getId(); this.nickname = user.getNickname(); this.profileImageUrl = @@ -27,7 +27,12 @@ private UserSummaryVo(User user, UserImage userImage, GroomingLevel groomingLeve this.spicyLevelName = groomingLevel != null ? groomingLevel.getSpicyLevelName() : null; } - public static UserSummaryVo of(User user, UserImage userImage) { - return new UserSummaryVo(user, userImage, user.getGroomingLevel()); + // public static AuthenticatedUserVo of(User user, UserImage userImage) { + // return new AuthenticatedUserVo(user, userImage, user.getGroomingLevel()); + // } + + // 추후 수정 필요 + public static AuthenticatedUserVo of(User user, UserImage userImage) { + return new AuthenticatedUserVo(user, userImage, null); } } diff --git a/src/main/java/com/ftm/server/domain/vo/PendingSocialUserVo.java b/src/main/java/com/ftm/server/application/vo/auth/PendingSocialUserVo.java similarity index 93% rename from src/main/java/com/ftm/server/domain/vo/PendingSocialUserVo.java rename to src/main/java/com/ftm/server/application/vo/auth/PendingSocialUserVo.java index a6a01d2..0ea1512 100644 --- a/src/main/java/com/ftm/server/domain/vo/PendingSocialUserVo.java +++ b/src/main/java/com/ftm/server/application/vo/auth/PendingSocialUserVo.java @@ -1,4 +1,4 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.auth; import com.ftm.server.domain.enums.SocialProvider; import lombok.Getter; diff --git a/src/main/java/com/ftm/server/domain/vo/SocialLoginOutcomeVo.java b/src/main/java/com/ftm/server/application/vo/auth/SocialLoginOutcomeVo.java similarity index 87% rename from src/main/java/com/ftm/server/domain/vo/SocialLoginOutcomeVo.java rename to src/main/java/com/ftm/server/application/vo/auth/SocialLoginOutcomeVo.java index 30e0aa2..7a284a3 100644 --- a/src/main/java/com/ftm/server/domain/vo/SocialLoginOutcomeVo.java +++ b/src/main/java/com/ftm/server/application/vo/auth/SocialLoginOutcomeVo.java @@ -1,4 +1,4 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.auth; import java.io.Serializable; import lombok.Getter; diff --git a/src/main/java/com/ftm/server/application/vo/auth/SocialLoginSuccessVo.java b/src/main/java/com/ftm/server/application/vo/auth/SocialLoginSuccessVo.java new file mode 100644 index 0000000..88abc53 --- /dev/null +++ b/src/main/java/com/ftm/server/application/vo/auth/SocialLoginSuccessVo.java @@ -0,0 +1,22 @@ +package com.ftm.server.application.vo.auth; + +import com.ftm.server.domain.entity.User; +import lombok.Getter; + +/** 가입된 유저라 로그인에 성공한 경우 VO */ +@Getter +public class SocialLoginSuccessVo extends SocialLoginOutcomeVo { + + private final User user; + private final AuthenticatedUserVo authenticatedUserVo; + + private SocialLoginSuccessVo(User user, AuthenticatedUserVo authenticatedUserVo) { + super(true); + this.user = user; + this.authenticatedUserVo = authenticatedUserVo; + } + + public static SocialLoginSuccessVo from(User user, AuthenticatedUserVo authenticatedUserVo) { + return new SocialLoginSuccessVo(user, authenticatedUserVo); + } +} diff --git a/src/main/java/com/ftm/server/domain/vo/EmailCodeVerificationVo.java b/src/main/java/com/ftm/server/application/vo/user/EmailCodeVerificationVo.java similarity index 84% rename from src/main/java/com/ftm/server/domain/vo/EmailCodeVerificationVo.java rename to src/main/java/com/ftm/server/application/vo/user/EmailCodeVerificationVo.java index 382232a..022e946 100644 --- a/src/main/java/com/ftm/server/domain/vo/EmailCodeVerificationVo.java +++ b/src/main/java/com/ftm/server/application/vo/user/EmailCodeVerificationVo.java @@ -1,4 +1,4 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.user; import lombok.Data; diff --git a/src/main/java/com/ftm/server/domain/vo/EmailDuplicationVo.java b/src/main/java/com/ftm/server/application/vo/user/EmailDuplicationVo.java similarity index 83% rename from src/main/java/com/ftm/server/domain/vo/EmailDuplicationVo.java rename to src/main/java/com/ftm/server/application/vo/user/EmailDuplicationVo.java index 67b9b3e..a802ff5 100644 --- a/src/main/java/com/ftm/server/domain/vo/EmailDuplicationVo.java +++ b/src/main/java/com/ftm/server/application/vo/user/EmailDuplicationVo.java @@ -1,4 +1,4 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.user; import lombok.Data; diff --git a/src/main/java/com/ftm/server/application/vo/user/SocialUserSignupSimpleVo.java b/src/main/java/com/ftm/server/application/vo/user/SocialUserSignupSimpleVo.java new file mode 100644 index 0000000..10eabe4 --- /dev/null +++ b/src/main/java/com/ftm/server/application/vo/user/SocialUserSignupSimpleVo.java @@ -0,0 +1,15 @@ +package com.ftm.server.application.vo.user; + +import com.ftm.server.domain.entity.GroomingLevel; +import com.ftm.server.domain.entity.User; +import lombok.Data; + +@Data +public class SocialUserSignupSimpleVo { + private final User user; + private final GroomingLevel groomingLevel; + + public static SocialUserSignupSimpleVo from(User user, GroomingLevel groomingLevel) { + return new SocialUserSignupSimpleVo(user, groomingLevel); + } +} diff --git a/src/main/java/com/ftm/server/domain/vo/SocialUserSignupSummaryVo.java b/src/main/java/com/ftm/server/application/vo/user/SocialUserSignupSummaryVo.java similarity index 69% rename from src/main/java/com/ftm/server/domain/vo/SocialUserSignupSummaryVo.java rename to src/main/java/com/ftm/server/application/vo/user/SocialUserSignupSummaryVo.java index dd85351..5c51bd2 100644 --- a/src/main/java/com/ftm/server/domain/vo/SocialUserSignupSummaryVo.java +++ b/src/main/java/com/ftm/server/application/vo/user/SocialUserSignupSummaryVo.java @@ -1,6 +1,7 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.user; import com.ftm.server.common.consts.PropertiesHolder; +import com.ftm.server.domain.entity.GroomingLevel; import com.ftm.server.domain.entity.User; import com.ftm.server.domain.enums.SocialProvider; import lombok.Data; @@ -15,12 +16,13 @@ public class SocialUserSignupSummaryVo { private final String mildLevelName; private final String spicyLevelName; - public static SocialUserSignupSummaryVo of(User user, String userImage) { + public static SocialUserSignupSummaryVo from( + User user, String userImage, GroomingLevel groomingLevel) { String mildLevelName = null; String spicyLevelName = null; - if (user.getGroomingLevel() != null) { - mildLevelName = user.getGroomingLevel().getMildLevelName(); - spicyLevelName = user.getGroomingLevel().getMildLevelName(); + if (groomingLevel != null) { + mildLevelName = groomingLevel.getMildLevelName(); + spicyLevelName = groomingLevel.getMildLevelName(); } return new SocialUserSignupSummaryVo( user, diff --git a/src/main/java/com/ftm/server/domain/vo/UserSignupOptionsVo.java b/src/main/java/com/ftm/server/application/vo/user/UserSignupOptionsVo.java similarity index 79% rename from src/main/java/com/ftm/server/domain/vo/UserSignupOptionsVo.java rename to src/main/java/com/ftm/server/application/vo/user/UserSignupOptionsVo.java index 826e1ca..309fa1d 100644 --- a/src/main/java/com/ftm/server/domain/vo/UserSignupOptionsVo.java +++ b/src/main/java/com/ftm/server/application/vo/user/UserSignupOptionsVo.java @@ -1,6 +1,6 @@ -package com.ftm.server.domain.vo; +package com.ftm.server.application.vo.user; -import com.ftm.server.web.dto.response.UserSignupOptionsResponse; +import com.ftm.server.adapter.in.web.user.dto.response.UserSignupOptionsResponse; import java.util.List; import lombok.Data; diff --git a/src/main/java/com/ftm/server/common/annotation/InfraService.java b/src/main/java/com/ftm/server/common/annotation/Adapter.java similarity index 77% rename from src/main/java/com/ftm/server/common/annotation/InfraService.java rename to src/main/java/com/ftm/server/common/annotation/Adapter.java index c00476a..1583e70 100644 --- a/src/main/java/com/ftm/server/common/annotation/InfraService.java +++ b/src/main/java/com/ftm/server/common/annotation/Adapter.java @@ -6,8 +6,8 @@ import java.lang.annotation.Target; import org.springframework.stereotype.Component; -/** 인프라스트럭처 계층 구현체 어노테이션 */ +/** 외부 시스템 구현체 계층 어노테이션 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Component -public @interface InfraService {} +public @interface Adapter {} diff --git a/src/main/java/com/ftm/server/common/annotation/EntityMapper.java b/src/main/java/com/ftm/server/common/annotation/EntityMapper.java new file mode 100644 index 0000000..58b0a0c --- /dev/null +++ b/src/main/java/com/ftm/server/common/annotation/EntityMapper.java @@ -0,0 +1,13 @@ +package com.ftm.server.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.stereotype.Component; + +/** 엔티티 매퍼 어노테이션 */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Component +public @interface EntityMapper {} diff --git a/src/main/java/com/ftm/server/common/annotation/Port.java b/src/main/java/com/ftm/server/common/annotation/Port.java new file mode 100644 index 0000000..e42e584 --- /dev/null +++ b/src/main/java/com/ftm/server/common/annotation/Port.java @@ -0,0 +1,11 @@ +package com.ftm.server.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** 외부 시스템 추상화 계층 어노테이션 */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Port {} diff --git a/src/main/java/com/ftm/server/common/annotation/UseCase.java b/src/main/java/com/ftm/server/common/annotation/UseCase.java index fbf4973..f251e28 100644 --- a/src/main/java/com/ftm/server/common/annotation/UseCase.java +++ b/src/main/java/com/ftm/server/common/annotation/UseCase.java @@ -4,10 +4,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.springframework.stereotype.Component; /** UseCase 어노테이션 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -@Component public @interface UseCase {} diff --git a/src/main/java/com/ftm/server/domain/entity/BaseTime.java b/src/main/java/com/ftm/server/domain/entity/BaseTime.java new file mode 100644 index 0000000..009358e --- /dev/null +++ b/src/main/java/com/ftm/server/domain/entity/BaseTime.java @@ -0,0 +1,14 @@ +package com.ftm.server.domain.entity; + +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public abstract class BaseTime { + + protected LocalDateTime createdAt; + protected LocalDateTime updatedAt; +} diff --git a/src/main/java/com/ftm/server/domain/entity/BeautyProduct.java b/src/main/java/com/ftm/server/domain/entity/BeautyProduct.java index 4802b86..85d99bc 100644 --- a/src/main/java/com/ftm/server/domain/entity/BeautyProduct.java +++ b/src/main/java/com/ftm/server/domain/entity/BeautyProduct.java @@ -1,52 +1,66 @@ package com.ftm.server.domain.entity; import com.ftm.server.domain.enums.BeautyProductCategory; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; -@Entity -@Table(name = "beauty_product") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class BeautyProduct extends BaseEntity { +public class BeautyProduct extends BaseTime { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - - @Column(name = "product_image_link") private String productImageLink; - - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) - @Column(name = "beauty_product_category", columnDefinition = "beauty_product_category") private BeautyProductCategory beautyProductCategory; - private String brand; private String name; private Double rating; - - @Column(name = "product_page_link") private String productPageLink; @Builder(access = AccessLevel.PRIVATE) private BeautyProduct( + Long id, String productImageLink, BeautyProductCategory beautyProductCategory, String brand, String name, Double rating, - String productPageLink) { + String productPageLink, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; this.productImageLink = productImageLink; this.beautyProductCategory = beautyProductCategory; this.brand = brand; this.name = name; this.rating = rating; this.productPageLink = productPageLink; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static BeautyProduct of( + Long id, + String productImageLink, + BeautyProductCategory beautyProductCategory, + String brand, + String name, + Double rating, + String productPageLink, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return BeautyProduct.builder() + .id(id) + .productImageLink(productImageLink) + .beautyProductCategory(beautyProductCategory) + .brand(brand) + .name(name) + .rating(rating) + .productPageLink(productPageLink) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/Bookmark.java b/src/main/java/com/ftm/server/domain/entity/Bookmark.java index 6978628..6966afd 100644 --- a/src/main/java/com/ftm/server/domain/entity/Bookmark.java +++ b/src/main/java/com/ftm/server/domain/entity/Bookmark.java @@ -1,31 +1,37 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "bookmark") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Bookmark extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; +public class Bookmark extends BaseTime { - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "post_id") - private Post post; + private Long id; + private Long userId; + private Long postId; @Builder(access = AccessLevel.PRIVATE) - private Bookmark(User user, Post post) { - this.user = user; - this.post = post; + private Bookmark( + Long id, Long userId, Long postId, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.userId = userId; + this.postId = postId; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static Bookmark of( + Long id, Long userId, Long postId, LocalDateTime createdAt, LocalDateTime updatedAt) { + return Bookmark.builder() + .id(id) + .userId(userId) + .postId(postId) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/EmailVerificationLogs.java b/src/main/java/com/ftm/server/domain/entity/EmailVerificationLogs.java index 15d7226..916b15a 100644 --- a/src/main/java/com/ftm/server/domain/entity/EmailVerificationLogs.java +++ b/src/main/java/com/ftm/server/domain/entity/EmailVerificationLogs.java @@ -1,49 +1,64 @@ package com.ftm.server.domain.entity; -import com.ftm.server.application.dto.command.EmailVerificationLogCreationCommand; -import jakarta.persistence.*; +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "email_verification_logs") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class EmailVerificationLogs extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +public class EmailVerificationLogs extends BaseTime { - @Column(nullable = false) + private Long id; private String email; - - @Column(name = "verification_code", nullable = false) private String verificationCode; - - @Column(name = "is_verified", nullable = false) private Boolean isVerified = false; - - @Column(name = "trial_num") private Integer trialNum; - - @Column(name = "token_issuance_time") private LocalDateTime tokenIssuanceTime; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; @Builder(access = AccessLevel.PRIVATE) private EmailVerificationLogs( + Long id, String email, String verificationCode, Boolean isVerified, Integer trialNum, - LocalDateTime tokenIssuanceTime) { + LocalDateTime tokenIssuanceTime, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; this.email = email; this.verificationCode = verificationCode; this.isVerified = isVerified; this.trialNum = trialNum; this.tokenIssuanceTime = tokenIssuanceTime; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static EmailVerificationLogs of( + Long id, + String email, + String verificationCode, + Boolean isVerified, + Integer trialNum, + LocalDateTime tokenIssuanceTime, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return EmailVerificationLogs.builder() + .id(id) + .email(email) + .verificationCode(verificationCode) + .isVerified(isVerified) + .trialNum(trialNum) + .tokenIssuanceTime(tokenIssuanceTime) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } public static EmailVerificationLogs from(EmailVerificationLogCreationCommand command) { diff --git a/src/main/java/com/ftm/server/domain/entity/GroomingLevel.java b/src/main/java/com/ftm/server/domain/entity/GroomingLevel.java index 22b5bfa..ac1009b 100644 --- a/src/main/java/com/ftm/server/domain/entity/GroomingLevel.java +++ b/src/main/java/com/ftm/server/domain/entity/GroomingLevel.java @@ -1,35 +1,55 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "grooming_level") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GroomingLevel extends BaseEntity { +public class GroomingLevel extends BaseTime { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private Integer minScore; - private Integer maxScore; - private String mildLevelName; - private String spicyLevelName; @Builder(access = AccessLevel.PRIVATE) private GroomingLevel( - Integer minScore, Integer maxScore, String mildLevelName, String spicyLevelName) { + Long id, + Integer minScore, + Integer maxScore, + String mildLevelName, + String spicyLevelName, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; this.minScore = minScore; this.maxScore = maxScore; this.mildLevelName = mildLevelName; this.spicyLevelName = spicyLevelName; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static GroomingLevel of( + Long id, + Integer minScore, + Integer maxScore, + String mildLevelName, + String spicyLevelName, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return GroomingLevel.builder() + .id(id) + .minScore(minScore) + .maxScore(maxScore) + .mildLevelName(mildLevelName) + .spicyLevelName(spicyLevelName) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/GroomingTestAnswer.java b/src/main/java/com/ftm/server/domain/entity/GroomingTestAnswer.java index 0c121e1..8bb1e19 100644 --- a/src/main/java/com/ftm/server/domain/entity/GroomingTestAnswer.java +++ b/src/main/java/com/ftm/server/domain/entity/GroomingTestAnswer.java @@ -1,35 +1,50 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "grooming_test_answer") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GroomingTestAnswer extends BaseEntity { +public class GroomingTestAnswer extends BaseTime { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "grooming_test_question_id") - private GroomingTestQuestion groomingTestQuestion; - - @Column(nullable = false) + private Long groomingTestQuestionId; private String answer; - private Integer score; @Builder(access = AccessLevel.PRIVATE) private GroomingTestAnswer( - GroomingTestQuestion groomingTestQuestion, String answer, Integer score) { - this.groomingTestQuestion = groomingTestQuestion; + Long id, + Long groomingTestQuestionId, + String answer, + Integer score, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.groomingTestQuestionId = groomingTestQuestionId; this.answer = answer; this.score = score; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static GroomingTestAnswer of( + Long id, + Long groomingTestQuestionId, + String answer, + Integer score, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return GroomingTestAnswer.builder() + .id(id) + .groomingTestQuestionId(groomingTestQuestionId) + .answer(answer) + .score(score) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/GroomingTestQuestion.java b/src/main/java/com/ftm/server/domain/entity/GroomingTestQuestion.java index fbe0fb0..545dc44 100644 --- a/src/main/java/com/ftm/server/domain/entity/GroomingTestQuestion.java +++ b/src/main/java/com/ftm/server/domain/entity/GroomingTestQuestion.java @@ -1,34 +1,46 @@ package com.ftm.server.domain.entity; import com.ftm.server.domain.enums.GroomingCategory; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; -@Entity -@Table(name = "grooming_test_question") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GroomingTestQuestion extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +public class GroomingTestQuestion extends BaseTime { - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) - @Column(nullable = false, name = "grooming_category", columnDefinition = "grooming_category") + private Long id; private GroomingCategory groomingCategory; - - @Column(nullable = false) private String question; @Builder(access = AccessLevel.PRIVATE) - private GroomingTestQuestion(GroomingCategory groomingCategory, String question) { + private GroomingTestQuestion( + Long id, + GroomingCategory groomingCategory, + String question, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; this.groomingCategory = groomingCategory; this.question = question; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static GroomingTestQuestion of( + Long id, + GroomingCategory groomingCategory, + String question, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return GroomingTestQuestion.builder() + .id(id) + .groomingCategory(groomingCategory) + .question(question) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/GroomingTestResult.java b/src/main/java/com/ftm/server/domain/entity/GroomingTestResult.java index 4d45c3c..339d007 100644 --- a/src/main/java/com/ftm/server/domain/entity/GroomingTestResult.java +++ b/src/main/java/com/ftm/server/domain/entity/GroomingTestResult.java @@ -1,40 +1,50 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "grooming_test_result") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GroomingTestResult extends BaseEntity { +public class GroomingTestResult extends BaseTime { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "grooming_test_answer_id") - private GroomingTestAnswer groomingTestAnswer; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "grooming_test_question_id") - private GroomingTestQuestion groomingTestQuestion; + private Long userId; + private Long groomingTestQuestionId; + private Long groomingTestAnswerId; @Builder(access = AccessLevel.PRIVATE) private GroomingTestResult( - User user, - GroomingTestAnswer groomingTestAnswer, - GroomingTestQuestion groomingTestQuestion) { - this.user = user; - this.groomingTestAnswer = groomingTestAnswer; - this.groomingTestQuestion = groomingTestQuestion; + Long id, + Long userId, + Long groomingTestAnswerId, + Long groomingTestQuestionId, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.userId = userId; + this.groomingTestQuestionId = groomingTestQuestionId; + this.groomingTestAnswerId = groomingTestAnswerId; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static GroomingTestResult of( + Long id, + Long userId, + Long groomingTestQuestionId, + Long groomingTestAnswerId, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return GroomingTestResult.builder() + .id(id) + .userId(userId) + .groomingTestQuestionId(groomingTestQuestionId) + .groomingTestAnswerId(groomingTestAnswerId) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/Post.java b/src/main/java/com/ftm/server/domain/entity/Post.java index cec0627..2017a04 100644 --- a/src/main/java/com/ftm/server/domain/entity/Post.java +++ b/src/main/java/com/ftm/server/domain/entity/Post.java @@ -2,63 +2,31 @@ import com.ftm.server.domain.enums.GroomingCategory; import com.ftm.server.domain.enums.HashTag; -import io.hypersistence.utils.hibernate.type.array.EnumArrayType; -import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType; -import jakarta.persistence.*; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.annotations.Type; -import org.hibernate.type.SqlTypes; -@Entity -@Table(name = "post") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Post extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; +public class Post extends BaseTime { - @Column(nullable = false) + private Long id; + private Long userId; private String title; - - @Lob - @Column(nullable = false) private String content; - - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) - @Column(nullable = false, name = "grooming_category", columnDefinition = "grooming_category") private GroomingCategory groomingCategory; - - @Type( - value = EnumArrayType.class, - parameters = - @org.hibernate.annotations.Parameter( - name = AbstractArrayType.SQL_ARRAY_TYPE, - value = "hashtag")) - @Column(name = "hashtags", columnDefinition = "hashtag[]") private HashTag[] hashtags; - - private Integer viewCount = 0; - - private Integer likeCount = 0; - - private Boolean isDeleted = false; - + private Integer viewCount; + private Integer likeCount; + private Boolean isDeleted; private LocalDateTime deletedAt; @Builder(access = AccessLevel.PRIVATE) private Post( - User user, + Long id, + Long userId, String title, String content, GroomingCategory groomingCategory, @@ -66,8 +34,11 @@ private Post( Integer viewCount, Integer likeCount, Boolean isDeleted, - LocalDateTime deletedAt) { - this.user = user; + LocalDateTime deletedAt, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.userId = userId; this.title = title; this.content = content; this.groomingCategory = groomingCategory; @@ -76,5 +47,36 @@ private Post( this.likeCount = likeCount; this.isDeleted = isDeleted; this.deletedAt = deletedAt; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static Post of( + Long id, + Long userId, + String title, + String content, + GroomingCategory groomingCategory, + HashTag[] hashtags, + Integer viewCount, + Integer likeCount, + Boolean isDeleted, + LocalDateTime deletedAt, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return Post.builder() + .id(id) + .userId(userId) + .title(title) + .content(content) + .groomingCategory(groomingCategory) + .hashtags(hashtags) + .viewCount(viewCount) + .likeCount(likeCount) + .isDeleted(isDeleted) + .deletedAt(deletedAt) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/PostImage.java b/src/main/java/com/ftm/server/domain/entity/PostImage.java index 91a55c5..4a2d5f7 100644 --- a/src/main/java/com/ftm/server/domain/entity/PostImage.java +++ b/src/main/java/com/ftm/server/domain/entity/PostImage.java @@ -1,29 +1,45 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "post_image") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PostImage extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "post_id") - private Post post; +public class PostImage extends BaseTime { + private Long id; + private Long postId; private String objectKey; @Builder(access = AccessLevel.PRIVATE) - private PostImage(Post post, String objectKey) { - this.post = post; + private PostImage( + Long id, + Long postId, + String objectKey, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.postId = postId; this.objectKey = objectKey; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static PostImage of( + Long id, + Long postId, + String objectKey, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return PostImage.builder() + .id(id) + .postId(postId) + .objectKey(objectKey) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/PostProduct.java b/src/main/java/com/ftm/server/domain/entity/PostProduct.java index 5bfe845..e3f646d 100644 --- a/src/main/java/com/ftm/server/domain/entity/PostProduct.java +++ b/src/main/java/com/ftm/server/domain/entity/PostProduct.java @@ -1,40 +1,56 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import com.ftm.server.domain.enums.HashTag; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "post_product") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PostProduct extends BaseEntity { +public class PostProduct extends BaseTime { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "post_id") - private Post post; - - @Column(nullable = false) + private Long postId; private String name; - - @Lob private String detail; - private String brand; - - private String link; + private HashTag[] hashTags; @Builder(access = AccessLevel.PRIVATE) - private PostProduct(Post post, String name, String detail, String brand, String link) { - this.post = post; + private PostProduct( + Long id, + Long postId, + String name, + String brand, + HashTag[] hashTags, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.postId = postId; this.name = name; - this.detail = detail; this.brand = brand; - this.link = link; + this.hashTags = hashTags; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static PostProduct of( + Long id, + Long postId, + String name, + String brand, + HashTag[] hashTags, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return PostProduct.builder() + .id(id) + .postId(postId) + .name(name) + .brand(brand) + .hashTags(hashTags) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/PostProductImage.java b/src/main/java/com/ftm/server/domain/entity/PostProductImage.java index e7acd39..9192665 100644 --- a/src/main/java/com/ftm/server/domain/entity/PostProductImage.java +++ b/src/main/java/com/ftm/server/domain/entity/PostProductImage.java @@ -1,29 +1,45 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "post_product_image") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PostProductImage extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "post_product_id") - private PostProduct postProduct; +public class PostProductImage extends BaseTime { + private Long id; + private Long postProductId; private String objectKey; @Builder(access = AccessLevel.PRIVATE) - private PostProductImage(PostProduct postProduct, String objectKey) { - this.postProduct = postProduct; + private PostProductImage( + Long id, + Long postProductId, + String objectKey, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.postProductId = postProductId; this.objectKey = objectKey; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static PostProductImage of( + Long id, + Long postProductId, + String objectKey, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return PostProductImage.builder() + .id(id) + .postProductId(postProductId) + .objectKey(objectKey) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } } diff --git a/src/main/java/com/ftm/server/domain/entity/User.java b/src/main/java/com/ftm/server/domain/entity/User.java index 63e8ef9..209cccf 100644 --- a/src/main/java/com/ftm/server/domain/entity/User.java +++ b/src/main/java/com/ftm/server/domain/entity/User.java @@ -1,86 +1,38 @@ package com.ftm.server.domain.entity; -import com.ftm.server.application.dto.command.GeneralUserCreationCommand; -import com.ftm.server.application.dto.command.SocialUserCreationCommand; +import com.ftm.server.application.command.user.GeneralUserCreationCommand; +import com.ftm.server.application.command.user.SocialUserCreationCommand; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; import com.ftm.server.domain.enums.SocialProvider; import com.ftm.server.domain.enums.UserRole; -import io.hypersistence.utils.hibernate.type.array.EnumArrayType; -import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayType; -import jakarta.persistence.*; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.annotations.Type; -import org.hibernate.type.SqlTypes; -@Entity -@Table(name = "users") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class User extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +public class User extends BaseTime { - @Column(unique = true) + private Long id; private String email; - private String password; - - @Column(nullable = false, unique = true) private String nickname; - - @Column(name = "age_group", columnDefinition = "age_group") - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) private AgeGroup ageGroup; - - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) - @Column(name = "social_provider", columnDefinition = "social_provider") private SocialProvider socialProvider; - - @Column(unique = true) private String socialId; - - @Column(nullable = false) - private Integer groomingScore = 0; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "grooming_level_id") - private GroomingLevel groomingLevel; - - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) - @Column(name = "role", columnDefinition = "role") + private Integer groomingScore; + private Long groomingLevelId; private UserRole role; - - @Type( - value = EnumArrayType.class, - parameters = { - @org.hibernate.annotations.Parameter( - name = AbstractArrayType.SQL_ARRAY_TYPE, - value = "hashtag" // PostgreSQL에서 정의된 ENUM 타입 이름 - ) - }) - @Column( - name = "favorite_hashtags", - columnDefinition = "hashtag[]" // PostgreSQL의 ENUM 배열 타입으로 지정 - ) private HashTag[] favoriteHashtags; - - @Column(nullable = false) - private Boolean isDeleted = false; - + private Boolean isDeleted; private LocalDateTime deletedAt; @Builder(access = AccessLevel.PRIVATE) private User( + Long id, String email, String password, String nickname, @@ -88,11 +40,14 @@ private User( SocialProvider socialProvider, String socialId, Integer groomingScore, - GroomingLevel groomingLevel, + Long groomingLevelId, UserRole role, HashTag[] favoriteHashtags, Boolean isDeleted, - LocalDateTime deletedAt) { + LocalDateTime deletedAt, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; this.email = email; this.password = password; this.nickname = nickname; @@ -100,11 +55,48 @@ private User( this.socialProvider = socialProvider; this.socialId = socialId; this.groomingScore = groomingScore; - this.groomingLevel = groomingLevel; + this.groomingLevelId = groomingLevelId; this.role = role; this.favoriteHashtags = favoriteHashtags; this.isDeleted = isDeleted; this.deletedAt = deletedAt; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static User of( + Long id, + String email, + String password, + String nickname, + AgeGroup ageGroup, + SocialProvider socialProvider, + String socialId, + Integer groomingScore, + Long groomingLevelId, + UserRole role, + HashTag[] favoriteHashtags, + Boolean isDeleted, + LocalDateTime deletedAt, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return User.builder() + .id(id) + .email(email) + .password(password) + .nickname(nickname) + .ageGroup(ageGroup) + .socialProvider(socialProvider) + .socialId(socialId) + .groomingScore(groomingScore) + .groomingLevelId(groomingLevelId) + .role(role) + .favoriteHashtags(favoriteHashtags) + .isDeleted(isDeleted) + .deletedAt(deletedAt) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } public static User createGeneralUser(GeneralUserCreationCommand command) { diff --git a/src/main/java/com/ftm/server/domain/entity/UserImage.java b/src/main/java/com/ftm/server/domain/entity/UserImage.java index a7b0a9d..76525c1 100644 --- a/src/main/java/com/ftm/server/domain/entity/UserImage.java +++ b/src/main/java/com/ftm/server/domain/entity/UserImage.java @@ -1,34 +1,49 @@ package com.ftm.server.domain.entity; -import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -@Entity -@Table(name = "user_image") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class UserImage extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; +public class UserImage extends BaseTime { - @Column(nullable = false) + private Long id; + private Long userId; private String objectKey = "default-image"; @Builder(access = AccessLevel.PRIVATE) - private UserImage(User user, String objectKey) { - this.user = user; + private UserImage( + Long id, + Long userId, + String objectKey, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + this.id = id; + this.userId = userId; this.objectKey = objectKey; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static UserImage of( + Long id, + Long userId, + String objectKey, + LocalDateTime createdAt, + LocalDateTime updatedAt) { + return UserImage.builder() + .id(id) + .userId(userId) + .objectKey(objectKey) + .createdAt(createdAt) + .updatedAt(updatedAt) + .build(); } - public static UserImage createUserImage(User user) { - return UserImage.builder().user(user).objectKey("users/default-image.png").build(); + public static UserImage createUserImage(Long userId) { + return UserImage.builder().userId(userId).objectKey("users/default-image.png").build(); } } diff --git a/src/main/java/com/ftm/server/domain/vo/SocialLoginSuccessVo.java b/src/main/java/com/ftm/server/domain/vo/SocialLoginSuccessVo.java deleted file mode 100644 index 3842591..0000000 --- a/src/main/java/com/ftm/server/domain/vo/SocialLoginSuccessVo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ftm.server.domain.vo; - -import com.ftm.server.domain.entity.User; -import lombok.Getter; - -/** 가입된 유저라 로그인에 성공한 경우 VO */ -@Getter -public class SocialLoginSuccessVo extends SocialLoginOutcomeVo { - - private final User user; - private final UserSummaryVo userSummaryVo; - - private SocialLoginSuccessVo(User user, UserSummaryVo userSummaryVo) { - super(true); - this.user = user; - this.userSummaryVo = userSummaryVo; - } - - public static SocialLoginSuccessVo from(User user, UserSummaryVo userSummaryVo) { - return new SocialLoginSuccessVo(user, userSummaryVo); - } -} diff --git a/src/main/java/com/ftm/server/infrastructure/security/SecurityConfig.java b/src/main/java/com/ftm/server/infrastructure/security/SecurityConfig.java index 4759dbd..7dc32c5 100644 --- a/src/main/java/com/ftm/server/infrastructure/security/SecurityConfig.java +++ b/src/main/java/com/ftm/server/infrastructure/security/SecurityConfig.java @@ -1,5 +1,6 @@ package com.ftm.server.infrastructure.security; +import com.ftm.server.adapter.out.security.UserPrincipalAdapter; import com.ftm.server.infrastructure.security.handler.PermissionDeniedHandler; import com.ftm.server.infrastructure.security.handler.UnauthenticatedAccessHandler; import java.util.List; @@ -129,7 +130,7 @@ public SecurityContextRepository securityContextRepository() { // 시큐리티 인증을 관리하는 AuthenticationManager 설정 @Bean - public AuthenticationManager authenticationManager(UserPrincipalService userPrincipalService) { + public AuthenticationManager authenticationManager(UserPrincipalAdapter userPrincipalService) { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(userPrincipalService); provider.setPasswordEncoder(passwordEncoder()); diff --git a/src/main/java/com/ftm/server/web/dto/response/UserLoginResponse.java b/src/main/java/com/ftm/server/web/dto/response/UserLoginResponse.java deleted file mode 100644 index edd01a4..0000000 --- a/src/main/java/com/ftm/server/web/dto/response/UserLoginResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ftm.server.web.dto.response; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.ftm.server.domain.vo.UserSummaryVo; -import java.time.LocalDateTime; -import lombok.Getter; - -@Getter -public class UserLoginResponse { - - private final Long id; - private final String nickname; - private final String profileImageUrl; - private final String mildLevelName; - private final String spicyLevelName; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm", shape = JsonFormat.Shape.STRING) - private final LocalDateTime loginTime; - - UserLoginResponse(UserSummaryVo userSummaryVo) { - this.id = userSummaryVo.getId(); - this.nickname = userSummaryVo.getNickname(); - this.profileImageUrl = userSummaryVo.getProfileImageUrl(); - this.mildLevelName = userSummaryVo.getMildLevelName(); - this.spicyLevelName = userSummaryVo.getSpicyLevelName(); - this.loginTime = LocalDateTime.now(); - } - - public static UserLoginResponse from(UserSummaryVo userSummaryVo) { - return new UserLoginResponse(userSummaryVo); - } -} diff --git a/src/test/java/com/ftm/server/auth/UserLoginTest.java b/src/test/java/com/ftm/server/auth/GeneralLoginTest.java similarity index 84% rename from src/test/java/com/ftm/server/auth/UserLoginTest.java rename to src/test/java/com/ftm/server/auth/GeneralLoginTest.java index 186c78b..b54584a 100644 --- a/src/test/java/com/ftm/server/auth/UserLoginTest.java +++ b/src/test/java/com/ftm/server/auth/GeneralLoginTest.java @@ -1,12 +1,11 @@ package com.ftm.server.auth; import static com.epages.restdocs.apispec.ResourceDocumentation.resource; -import static org.springframework.http.MediaType.*; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.JsonFieldType.*; import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -14,15 +13,15 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.GeneralUserCreationCommand; -import com.ftm.server.application.port.AuthenticationPort; -import com.ftm.server.application.port.repository.UserImageRepository; -import com.ftm.server.application.port.repository.UserRepository; +import com.ftm.server.adapter.in.web.auth.dto.request.GeneralLoginRequest; +import com.ftm.server.application.command.user.GeneralUserCreationCommand; +import com.ftm.server.application.port.out.persistence.user.SaveUserImagePort; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.domain.entity.User; import com.ftm.server.domain.entity.UserImage; import com.ftm.server.domain.enums.AgeGroup; -import com.ftm.server.web.dto.request.UserLoginRequest; import java.util.List; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; @@ -36,11 +35,11 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -public class UserLoginTest extends BaseTest { +public class GeneralLoginTest extends BaseTest { - @Autowired private UserRepository userRepository; - @Autowired private UserImageRepository userImageRepository; - @Autowired private AuthenticationPort authenticationPort; + @Autowired private SaveUserPort saveUserPort; + @Autowired private SaveUserImagePort saveUserImagePort; + @Autowired private SecurityAuthenticationPort securityAuthenticationPort; private final List requestFieldLoginUser = List.of( @@ -74,7 +73,7 @@ public class UserLoginTest extends BaseTest { "nullable", "그루밍 테스트를 아직 진행하지 않은 경우 null")), fieldWithPath("data.loginTime").type(STRING).description("로그인 시간")); - private ResultActions getResultActions(UserLoginRequest request) throws Exception { + private ResultActions getResultActions(GeneralLoginRequest request) throws Exception { return mockMvc.perform( RestDocumentationRequestBuilders.post("/api/auth/login") .contentType(APPLICATION_JSON_VALUE) @@ -107,12 +106,12 @@ void setUp() { GeneralUserCreationCommand testCommand = GeneralUserCreationCommand.of( "test@gmail.com", - authenticationPort.passwordEncode("test1234!"), + securityAuthenticationPort.passwordEncode("test1234!"), "test", AgeGroup.TEENS, null); - User testUser = userRepository.save(User.createGeneralUser(testCommand)); - userImageRepository.save(UserImage.createUserImage(testUser)); + User testUser = saveUserPort.saveUser(User.createGeneralUser(testCommand)); + saveUserImagePort.saveUserDefaultImage(UserImage.createUserImage(testUser.getId())); } @Test @@ -121,7 +120,7 @@ void setUp() { // given String email = "test@gmail.com"; String password = "test1234!"; - UserLoginRequest request = new UserLoginRequest(email, password); + GeneralLoginRequest request = new GeneralLoginRequest(email, password); // when ResultActions resultActions = getResultActions(request); @@ -146,7 +145,7 @@ void setUp() { // given String email = "test@gmail.com"; String password = "test12345!"; - UserLoginRequest request = new UserLoginRequest(email, password); + GeneralLoginRequest request = new GeneralLoginRequest(email, password); // when ResultActions resultActions = getResultActions(request); diff --git a/src/test/java/com/ftm/server/auth/KakaoLoginTest.java b/src/test/java/com/ftm/server/auth/KakaoLoginTest.java index 2b2c376..833b9aa 100644 --- a/src/test/java/com/ftm/server/auth/KakaoLoginTest.java +++ b/src/test/java/com/ftm/server/auth/KakaoLoginTest.java @@ -9,25 +9,23 @@ import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.JsonFieldType.*; -import static org.springframework.restdocs.payload.JsonFieldType.STRING; import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.KakaoAuthCommand; -import com.ftm.server.application.port.SocialAuthClientPort; -import com.ftm.server.application.port.repository.UserImageRepository; -import com.ftm.server.application.port.repository.UserRepository; +import com.ftm.server.adapter.in.web.auth.dto.request.KakaoLoginRequest; +import com.ftm.server.application.command.auth.KakaoLoginCommand; +import com.ftm.server.application.port.out.oauth.SocialOAuthClientPort; +import com.ftm.server.application.port.out.persistence.user.SaveUserImagePort; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.domain.entity.User; import com.ftm.server.domain.entity.UserImage; import com.ftm.server.infrastructure.oauth.kakao.KakaoAuthUser; -import com.ftm.server.web.dto.request.KakaoLoginRequest; import java.util.List; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; @@ -42,10 +40,11 @@ public class KakaoLoginTest extends BaseTest { - @MockitoBean private SocialAuthClientPort kakaoClient; + @MockitoBean + private SocialOAuthClientPort kakaoOAuthClientPort; - @Autowired private UserRepository userRepository; - @Autowired private UserImageRepository userImageRepository; + @Autowired private SaveUserPort saveUserPort; + @Autowired private SaveUserImagePort saveUserImagePort; private final List requestFieldKakaoLogin = List.of(fieldWithPath("authorizationCode").type(STRING).description("카카오 인증 코드")); @@ -102,13 +101,14 @@ private RestDocumentationResultHandler getDocument( @Transactional void 카카오_로그인_성공1() throws Exception { // given - User testUser = userRepository.save(User.createTestKakaoUser()); - UserImage testUserImage = UserImage.createUserImage(testUser); - userImageRepository.save(testUserImage); + User testUser = saveUserPort.saveUser(User.createTestKakaoUser()); + UserImage userImage = UserImage.createUserImage(testUser.getId()); + saveUserImagePort.saveUserDefaultImage(userImage); KakaoLoginRequest request = new KakaoLoginRequest("test_code"); KakaoAuthUser testKakaoUser = KakaoAuthUser.from("test_kakao_id"); - given(kakaoClient.authenticate(any(KakaoAuthCommand.class))).willReturn(testKakaoUser); + given(kakaoOAuthClientPort.authenticate(any(KakaoLoginCommand.class))) + .willReturn(testKakaoUser); // when ResultActions resultActions = getResultActions(request); @@ -134,7 +134,8 @@ private RestDocumentationResultHandler getDocument( // given KakaoLoginRequest request = new KakaoLoginRequest("test_code"); KakaoAuthUser testKakaoUser = KakaoAuthUser.from("test_kakao_id"); - given(kakaoClient.authenticate(any(KakaoAuthCommand.class))).willReturn(testKakaoUser); + given(kakaoOAuthClientPort.authenticate(any(KakaoLoginCommand.class))) + .willReturn(testKakaoUser); // when ResultActions resultActions = getResultActions(request); @@ -161,8 +162,8 @@ private RestDocumentationResultHandler getDocument( // given KakaoLoginRequest request = new KakaoLoginRequest("test_code"); doThrow(new CustomException(ErrorResponseCode.KAKAO_AUTH_TOKEN_EXCHANGE_FAILED)) - .when(kakaoClient) - .authenticate(any(KakaoAuthCommand.class)); + .when(kakaoOAuthClientPort) + .authenticate(any(KakaoLoginCommand.class)); // when ResultActions resultActions = getResultActions(request); @@ -191,8 +192,8 @@ private RestDocumentationResultHandler getDocument( // given KakaoLoginRequest request = new KakaoLoginRequest("test_code"); doThrow(new CustomException(ErrorResponseCode.KAKAO_USER_PROFILE_FETCH_FAILED)) - .when(kakaoClient) - .authenticate(any(KakaoAuthCommand.class)); + .when(kakaoOAuthClientPort) + .authenticate(any(KakaoLoginCommand.class)); // when ResultActions resultActions = getResultActions(request); diff --git a/src/test/java/com/ftm/server/auth/LogoutTest.java b/src/test/java/com/ftm/server/auth/LogoutTest.java index 9c9cc96..89f4c33 100644 --- a/src/test/java/com/ftm/server/auth/LogoutTest.java +++ b/src/test/java/com/ftm/server/auth/LogoutTest.java @@ -2,27 +2,27 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import static org.springframework.restdocs.headers.HeaderDocumentation.*; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.JsonFieldType.*; -import static org.springframework.restdocs.payload.JsonFieldType.STRING; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.GeneralUserCreationCommand; -import com.ftm.server.application.port.AuthenticationPort; -import com.ftm.server.application.port.repository.UserImageRepository; -import com.ftm.server.application.port.repository.UserRepository; +import com.ftm.server.adapter.in.web.auth.dto.request.GeneralLoginRequest; +import com.ftm.server.application.command.user.GeneralUserCreationCommand; +import com.ftm.server.application.port.out.persistence.user.SaveUserImagePort; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; +import com.ftm.server.application.port.out.security.SecurityAuthenticationPort; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.domain.entity.User; import com.ftm.server.domain.entity.UserImage; -import com.ftm.server.web.dto.request.UserLoginRequest; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -37,11 +37,9 @@ public class LogoutTest extends BaseTest { - @Autowired private UserRepository userRepository; - - @Autowired private UserImageRepository userImageRepository; - - @Autowired private AuthenticationPort authenticationPort; + @Autowired private SecurityAuthenticationPort securityAuthenticationPort; + @Autowired private SaveUserPort saveUserPort; + @Autowired private SaveUserImagePort saveUserImagePort; private final List responseFieldLogout = List.of( @@ -74,20 +72,19 @@ void setUp() { GeneralUserCreationCommand command = new GeneralUserCreationCommand( "test@gmail.com", - authenticationPort.passwordEncode("test1234!"), + securityAuthenticationPort.passwordEncode("test1234!"), "test", null, null); - User testUser = User.createGeneralUser(command); - User saved = userRepository.save(testUser); - userImageRepository.save(UserImage.createUserImage(saved)); + User testUser = saveUserPort.saveUser(User.createGeneralUser(command)); + saveUserImagePort.saveUserDefaultImage(UserImage.createUserImage(testUser.getId())); } @Test @Transactional void 로그아웃_성공() throws Exception { // given - UserLoginRequest request = new UserLoginRequest("test@gmail.com", "test1234!"); + GeneralLoginRequest request = new GeneralLoginRequest("test@gmail.com", "test1234!"); // when MvcResult loginResult = diff --git a/src/test/java/com/ftm/server/user/EmailAuthenticationTest.java b/src/test/java/com/ftm/server/user/EmailAuthenticationTest.java index 81fa0b6..8e1970c 100644 --- a/src/test/java/com/ftm/server/user/EmailAuthenticationTest.java +++ b/src/test/java/com/ftm/server/user/EmailAuthenticationTest.java @@ -4,18 +4,17 @@ import static org.mockito.Mockito.doThrow; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.EmailAuthenticationCommand; -import com.ftm.server.application.usecase.user.EmailAuthenticationUseCase; +import com.ftm.server.adapter.in.web.user.dto.request.EmailAuthenticationRequest; +import com.ftm.server.application.command.user.EmailAuthenticationCommand; +import com.ftm.server.application.port.in.user.EmailAuthenticationUseCase; import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; -import com.ftm.server.web.dto.request.EmailAuthenticationRequest; import jakarta.transaction.Transactional; import java.util.List; import org.junit.jupiter.api.Test; @@ -32,7 +31,6 @@ public class EmailAuthenticationTest extends BaseTest { @Autowired private EmailAuthenticationUseCase emailAuthenticationUseCase; - @MockitoSpyBean private EmailAuthenticationUseCase mockitoEmailAuthenticationUseCase; private final List responseFieldDescriptors = @@ -100,8 +98,7 @@ private RestDocumentationResultHandler getDocument(Integer identifier) { // given EmailAuthenticationRequest request = new EmailAuthenticationRequest("test@gmail.com"); for (int i = 0; i < 5; i++) { - emailAuthenticationUseCase.sendEmailAuthenticationCode( - EmailAuthenticationCommand.from(request)); + emailAuthenticationUseCase.execute(EmailAuthenticationCommand.from(request)); } // when ResultActions resultActions = getResultActions(request); @@ -127,7 +124,7 @@ private RestDocumentationResultHandler getDocument(Integer identifier) { EmailAuthenticationRequest request = new EmailAuthenticationRequest("test@gmail.com"); doThrow(new CustomException(ErrorResponseCode.FAIL_TO_SEND_EMAIL)) .when(mockitoEmailAuthenticationUseCase) - .sendEmailAuthenticationCode(EmailAuthenticationCommand.from(request)); + .execute(EmailAuthenticationCommand.from(request)); // when ResultActions resultActions = getResultActions(request); diff --git a/src/test/java/com/ftm/server/user/EmailCodeVerificationTest.java b/src/test/java/com/ftm/server/user/EmailCodeVerificationTest.java index b3b59ef..d8a08a2 100644 --- a/src/test/java/com/ftm/server/user/EmailCodeVerificationTest.java +++ b/src/test/java/com/ftm/server/user/EmailCodeVerificationTest.java @@ -3,15 +3,14 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.EmailVerificationLogCreationCommand; -import com.ftm.server.application.service.EmailVerificationLogsService; -import com.ftm.server.web.dto.request.EmailCodeVerificationRequest; +import com.ftm.server.adapter.in.web.user.dto.request.EmailCodeVerificationRequest; +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; +import com.ftm.server.application.port.out.persistence.user.SaveEmailVerificationLogPort; import jakarta.transaction.Transactional; import java.util.List; import org.junit.jupiter.api.Test; @@ -25,7 +24,7 @@ public class EmailCodeVerificationTest extends BaseTest { - @Autowired private EmailVerificationLogsService emailVerificationLogsService; + @Autowired private SaveEmailVerificationLogPort saveEmailVerificationLogPort; private final List requestFieldDescriptors = List.of( @@ -74,7 +73,7 @@ private RestDocumentationResultHandler getDocument(Integer identifier) { String email = "test@gmail.com"; String code = "123456"; // given - emailVerificationLogsService.saveEmailVerificationLogs( + saveEmailVerificationLogPort.saveEmailVerificationLogs( EmailVerificationLogCreationCommand.of(email, code)); // when diff --git a/src/test/java/com/ftm/server/user/GeneralUserSignupTest.java b/src/test/java/com/ftm/server/user/GeneralUserSignupTest.java index db8051d..7f6a6a9 100644 --- a/src/test/java/com/ftm/server/user/GeneralUserSignupTest.java +++ b/src/test/java/com/ftm/server/user/GeneralUserSignupTest.java @@ -3,22 +3,23 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.EmailVerificationLogCreationCommand; -import com.ftm.server.application.dto.command.GeneralUserCreationCommand; -import com.ftm.server.application.port.repository.EmailVerificationLogsRepository; -import com.ftm.server.application.service.UserService; +import com.ftm.server.adapter.in.web.user.dto.request.GeneralUserSignupRequest; +import com.ftm.server.adapter.out.persistence.mapper.EmailVerificationLogsMapper; +import com.ftm.server.adapter.out.persistence.repository.EmailVerificationLogsRepository; +import com.ftm.server.application.command.user.EmailVerificationLogCreationCommand; +import com.ftm.server.application.command.user.GeneralUserCreationCommand; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.domain.entity.EmailVerificationLogs; +import com.ftm.server.domain.entity.User; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; -import com.ftm.server.web.dto.request.GeneralUserSignupRequest; import jakarta.transaction.Transactional; import java.util.List; import org.junit.jupiter.api.Test; @@ -34,8 +35,8 @@ public class GeneralUserSignupTest extends BaseTest { @Autowired private EmailVerificationLogsRepository emailVerificationLogsRepository; - - @Autowired private UserService userService; + @Autowired private SaveUserPort saveUserPort; + @Autowired private EmailVerificationLogsMapper emailVerificationLogsMapper; private final List requestFieldDescriptors = List.of( @@ -99,7 +100,7 @@ private RestDocumentationResultHandler getDocument(Integer identifier) { new EmailVerificationLogCreationCommand(email, code); EmailVerificationLogs data = EmailVerificationLogs.from(command); data.updateVerificationStatus(true); - emailVerificationLogsRepository.save(data); + emailVerificationLogsRepository.save(emailVerificationLogsMapper.toJpaEntity(data)); GeneralUserSignupRequest request = new GeneralUserSignupRequest( @@ -145,7 +146,8 @@ private RestDocumentationResultHandler getDocument(Integer identifier) { GeneralUserCreationCommand command = new GeneralUserCreationCommand( email, "qwer1234!", "닉넴", AgeGroup.FIFTIES, hashTags); - userService.createGeneralUser(command); + + saveUserPort.saveUser(User.createGeneralUser(command)); GeneralUserSignupRequest request = new GeneralUserSignupRequest( diff --git a/src/test/java/com/ftm/server/user/GetUserSignupOptionsTest.java b/src/test/java/com/ftm/server/user/GetUserSignupOptionsTest.java index 142a265..e4adcc7 100644 --- a/src/test/java/com/ftm/server/user/GetUserSignupOptionsTest.java +++ b/src/test/java/com/ftm/server/user/GetUserSignupOptionsTest.java @@ -3,8 +3,8 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.epages.restdocs.apispec.ResourceSnippetParameters; diff --git a/src/test/java/com/ftm/server/user/SocialUserSignupTest.java b/src/test/java/com/ftm/server/user/SocialUserSignupTest.java index 58da74f..1cc0f68 100644 --- a/src/test/java/com/ftm/server/user/SocialUserSignupTest.java +++ b/src/test/java/com/ftm/server/user/SocialUserSignupTest.java @@ -2,10 +2,10 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static com.ftm.server.common.consts.StaticConsts.PENDING_SOCIAL_USER_SESSION_KEY; -import static org.springframework.restdocs.headers.HeaderDocumentation.*; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.JsonFieldType.STRING; import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -13,14 +13,15 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.ftm.server.BaseTest; -import com.ftm.server.application.dto.command.SocialUserCreationCommand; -import com.ftm.server.application.service.UserService; +import com.ftm.server.adapter.in.web.user.dto.request.SocialUserSignupRequest; +import com.ftm.server.application.command.user.SocialUserCreationCommand; +import com.ftm.server.application.port.out.persistence.user.SaveUserPort; +import com.ftm.server.application.vo.auth.PendingSocialUserVo; import com.ftm.server.common.response.enums.ErrorResponseCode; +import com.ftm.server.domain.entity.User; import com.ftm.server.domain.enums.AgeGroup; import com.ftm.server.domain.enums.HashTag; import com.ftm.server.domain.enums.SocialProvider; -import com.ftm.server.domain.vo.PendingSocialUserVo; -import com.ftm.server.web.dto.request.SocialUserSignupRequest; import jakarta.servlet.http.Cookie; import jakarta.transaction.Transactional; import java.util.List; @@ -38,7 +39,7 @@ public class SocialUserSignupTest extends BaseTest { - @Autowired private UserService userService; + @Autowired private SaveUserPort saveUserPort; private final List requestFieldDescriptors = List.of( @@ -179,7 +180,7 @@ private RestDocumentationResultHandler getDocument(Integer identifier) { "닉네임", AgeGroup.FIFTIES, List.of(HashTag.PERFUME)); - userService.createSocialUser(command); + saveUserPort.saveSocialUser(User.createSocailUser(command)); PendingSocialUserVo pendingSocialUserVo = PendingSocialUserVo.from(SocialProvider.KAKAO, "12345");