diff --git a/src/main/generated/com/codecrafters/companity/user/adapter/infrastructure/jpa/QUserEntity.java b/src/main/generated/com/codecrafters/companity/user/adapter/infrastructure/jpa/QUserEntity.java new file mode 100644 index 0000000..37bf284 --- /dev/null +++ b/src/main/generated/com/codecrafters/companity/user/adapter/infrastructure/jpa/QUserEntity.java @@ -0,0 +1,41 @@ +package com.codecrafters.companity.user.adapter.infrastructure.jpa; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QUserEntity is a Querydsl query type for UserEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUserEntity extends EntityPathBase { + + private static final long serialVersionUID = 1701790324L; + + public static final QUserEntity userEntity = new QUserEntity("userEntity"); + + public final StringPath nickName = createString("nickName"); + + public final StringPath userId = createString("userId"); + + public final StringPath userName = createString("userName"); + + public QUserEntity(String variable) { + super(UserEntity.class, forVariable(variable)); + } + + public QUserEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QUserEntity(PathMetadata metadata) { + super(UserEntity.class, metadata); + } + +} + diff --git a/src/main/generated/com/codecrafters/companity/user/adapter/jpa/QUserEntity.java b/src/main/generated/com/codecrafters/companity/user/adapter/jpa/QUserEntity.java new file mode 100644 index 0000000..a51b5bd --- /dev/null +++ b/src/main/generated/com/codecrafters/companity/user/adapter/jpa/QUserEntity.java @@ -0,0 +1,42 @@ +package com.codecrafters.companity.user.adapter.jpa; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.codecrafters.companity.user.adapter.infrastructure.jpa.UserEntity; +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QUserEntity is a Querydsl query type for UserEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUserEntity extends EntityPathBase { + + private static final long serialVersionUID = 586088658L; + + public static final QUserEntity userEntity = new QUserEntity("userEntity"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath name = createString("name"); + + public final StringPath nickName = createString("nickName"); + + public QUserEntity(String variable) { + super(UserEntity.class, forVariable(variable)); + } + + public QUserEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QUserEntity(PathMetadata metadata) { + super(UserEntity.class, metadata); + } + +} + diff --git a/src/main/java/com/codecrafters/companity/adapter/user/UserController.java b/src/main/java/com/codecrafters/companity/adapter/user/UserController.java deleted file mode 100644 index 8bcd909..0000000 --- a/src/main/java/com/codecrafters/companity/adapter/user/UserController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.codecrafters.companity.adapter.user; - -import com.codecrafters.companity.adapter.user.dto.request.UserCreateRequest; -import com.codecrafters.companity.adapter.user.dto.resposne.UserCreateResponse; -import com.codecrafters.companity.application.in.usecase.UserUseCase; -import com.codecrafters.companity.domain.user.User; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.Map; - -@RestController -@RequestMapping("/users") -@RequiredArgsConstructor -public class UserController { - - private final UserUseCase userUseCase; - - @PostMapping - public ResponseEntity signUp (@RequestBody UserCreateRequest request) { - User user = userUseCase.signUp(request); - UserCreateResponse response = UserCreateResponse.from(user); - - return new ResponseEntity<>(response, HttpStatus.OK); - } -} diff --git a/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/UserRepositoryImpl.java b/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/UserRepositoryImpl.java deleted file mode 100644 index 2086f17..0000000 --- a/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/UserRepositoryImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.codecrafters.companity.adapter.user.infrastructure; - -import com.codecrafters.companity.adapter.user.infrastructure.jpa.UserEntity; -import com.codecrafters.companity.adapter.user.infrastructure.jpa.UserJPARepository; -import com.codecrafters.companity.application.out.persistence.UserRepository; -import com.codecrafters.companity.domain.user.User; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class UserRepositoryImpl implements UserRepository { - private final UserJPARepository userJPARepository; - - @Override - public User save(User user) { - UserEntity entity = UserEntity.from(user); - userJPARepository.save(entity); - - return User.builder() - .userId(entity.getUserId()) - .userName(entity.getUserName()) - .nickName(entity.getNickName()) - .build(); - } - - @Override - public User getUserById(String userId) { - UserEntity userEntity = userJPARepository.getById(userId); - return userEntity.toDomain(); - } -} diff --git a/src/main/java/com/codecrafters/companity/application/in/usecase/UserUseCase.java b/src/main/java/com/codecrafters/companity/application/in/usecase/UserUseCase.java deleted file mode 100644 index 1be7b40..0000000 --- a/src/main/java/com/codecrafters/companity/application/in/usecase/UserUseCase.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.codecrafters.companity.application.in.usecase; - -import com.codecrafters.companity.adapter.user.dto.request.UserCreateRequest; -import com.codecrafters.companity.domain.user.User; - -public interface UserUseCase { - public User signUp(UserCreateRequest user); -} diff --git a/src/main/java/com/codecrafters/companity/application/out/persistence/UserRepository.java b/src/main/java/com/codecrafters/companity/application/out/persistence/UserRepository.java deleted file mode 100644 index 947fa77..0000000 --- a/src/main/java/com/codecrafters/companity/application/out/persistence/UserRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.codecrafters.companity.application.out.persistence; - -import com.codecrafters.companity.domain.user.User; - -public interface UserRepository { - User save(User user); - User getUserById(String userId); -} diff --git a/src/main/java/com/codecrafters/companity/application/service/user/UserService.java b/src/main/java/com/codecrafters/companity/application/service/user/UserService.java deleted file mode 100644 index d31b4f1..0000000 --- a/src/main/java/com/codecrafters/companity/application/service/user/UserService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.codecrafters.companity.application.service.user; - -import com.codecrafters.companity.adapter.user.dto.request.UserCreateRequest; -import com.codecrafters.companity.application.in.usecase.UserUseCase; -import com.codecrafters.companity.application.out.persistence.UserRepository; -import com.codecrafters.companity.domain.user.User; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class UserService implements UserUseCase { - - private final UserRepository userRepository; - - @Override - public User signUp(UserCreateRequest request) { - User user = User.from(request); - user.validateUser(); - return userRepository.save(user); - } - -} diff --git a/src/main/java/com/codecrafters/companity/adapter/post/out/ResponseComment.java b/src/main/java/com/codecrafters/companity/comment/adapter/dto/response/ResponseComment.java similarity index 59% rename from src/main/java/com/codecrafters/companity/adapter/post/out/ResponseComment.java rename to src/main/java/com/codecrafters/companity/comment/adapter/dto/response/ResponseComment.java index 027adf5..31ea375 100644 --- a/src/main/java/com/codecrafters/companity/adapter/post/out/ResponseComment.java +++ b/src/main/java/com/codecrafters/companity/comment/adapter/dto/response/ResponseComment.java @@ -1,6 +1,6 @@ -package com.codecrafters.companity.adapter.post.out; +package com.codecrafters.companity.comment.adapter.dto.response; -import com.codecrafters.companity.adapter.user.ResponseUser; +import com.codecrafters.companity.user.adapter.ResponseUser; import java.time.LocalDateTime; diff --git a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/comment/CommentEntity.java b/src/main/java/com/codecrafters/companity/comment/adapter/infrastructure/jpa/CommentEntity.java similarity index 61% rename from src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/comment/CommentEntity.java rename to src/main/java/com/codecrafters/companity/comment/adapter/infrastructure/jpa/CommentEntity.java index 48f6f87..f82fb75 100644 --- a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/comment/CommentEntity.java +++ b/src/main/java/com/codecrafters/companity/comment/adapter/infrastructure/jpa/CommentEntity.java @@ -1,14 +1,12 @@ -package com.codecrafters.companity.adapter.infrastructure.jpa.comment; +package com.codecrafters.companity.comment.adapter.infrastructure.jpa; -import com.codecrafters.companity.adapter.infrastructure.jpa.common.BaseTimeEntity; -import com.codecrafters.companity.adapter.infrastructure.jpa.post.PostEntity; -import com.codecrafters.companity.adapter.user.infrastructure.jpa.UserEntity; +import com.codecrafters.companity.common.adapter.infrastructure.jpa.BaseTimeEntity; +import com.codecrafters.companity.post.adapter.infrastructure.jpa.PostEntity; +import com.codecrafters.companity.user.adapter.infrastructure.jpa.UserEntity; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; -import java.time.LocalDateTime; - @Entity(name = "Comment") @Getter @Setter diff --git a/src/main/java/com/codecrafters/companity/domain/post/Comment.java b/src/main/java/com/codecrafters/companity/comment/domain/Comment.java similarity index 62% rename from src/main/java/com/codecrafters/companity/domain/post/Comment.java rename to src/main/java/com/codecrafters/companity/comment/domain/Comment.java index b0d6d1e..16a522b 100644 --- a/src/main/java/com/codecrafters/companity/domain/post/Comment.java +++ b/src/main/java/com/codecrafters/companity/comment/domain/Comment.java @@ -1,6 +1,6 @@ -package com.codecrafters.companity.domain.post; +package com.codecrafters.companity.comment.domain; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.user.domain.User; import java.time.LocalDateTime; diff --git a/src/main/java/com/codecrafters/companity/common/adapter/ExceptionControllerAdvice.java b/src/main/java/com/codecrafters/companity/common/adapter/ExceptionControllerAdvice.java new file mode 100644 index 0000000..58903e3 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/common/adapter/ExceptionControllerAdvice.java @@ -0,0 +1,23 @@ +package com.codecrafters.companity.common.adapter; + +import com.codecrafters.companity.common.adapter.dto.response.ExceptionResponse; +import com.codecrafters.companity.exception.CustomException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + + +@RestControllerAdvice(basePackages = "com.codecrafters.companity") +public class ExceptionControllerAdvice { + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity exceptionHandler(IllegalArgumentException e) { + return new ResponseEntity(e.getMessage(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(CustomException.class) + public ResponseEntity exceptionHandler(CustomException e) { + + return ExceptionResponse.toResponseEntity(e); + } +} diff --git a/src/main/java/com/codecrafters/companity/adapter/utility/LocalDateTimeProvider.java b/src/main/java/com/codecrafters/companity/common/adapter/LocalDateTimeProvider.java similarity index 66% rename from src/main/java/com/codecrafters/companity/adapter/utility/LocalDateTimeProvider.java rename to src/main/java/com/codecrafters/companity/common/adapter/LocalDateTimeProvider.java index 8da3a4c..7d6e65e 100644 --- a/src/main/java/com/codecrafters/companity/adapter/utility/LocalDateTimeProvider.java +++ b/src/main/java/com/codecrafters/companity/common/adapter/LocalDateTimeProvider.java @@ -1,6 +1,6 @@ -package com.codecrafters.companity.adapter.utility; +package com.codecrafters.companity.common.adapter; -import com.codecrafters.companity.application.out.utility.DateTimeProvider; +import com.codecrafters.companity.common.application.DateTimeProvider; import org.springframework.stereotype.Component; import java.time.LocalDateTime; diff --git a/src/main/java/com/codecrafters/companity/common/adapter/dto/response/ExceptionResponse.java b/src/main/java/com/codecrafters/companity/common/adapter/dto/response/ExceptionResponse.java new file mode 100644 index 0000000..9f624a7 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/common/adapter/dto/response/ExceptionResponse.java @@ -0,0 +1,24 @@ +package com.codecrafters.companity.common.adapter.dto.response; + +import com.codecrafters.companity.exception.CustomException; +import lombok.Builder; +import org.springframework.http.ResponseEntity; + +@Builder +public class ExceptionResponse { + private String code; + private String msg; + + public static ResponseEntity toResponseEntity(CustomException ex) { + ResultCode errorType = ex.getResultCode(); + String message = ex.getMessage(); + + return ResponseEntity + .status(ex.getStatus()) + .body(ExceptionResponse.builder() + .code(errorType.getCode()) + .msg(errorType.getMsg()) + .build()); + } + +} diff --git a/src/main/java/com/codecrafters/companity/common/adapter/dto/response/ResultCode.java b/src/main/java/com/codecrafters/companity/common/adapter/dto/response/ResultCode.java new file mode 100644 index 0000000..ae37ff6 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/common/adapter/dto/response/ResultCode.java @@ -0,0 +1,14 @@ +package com.codecrafters.companity.common.adapter.dto.response; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ResultCode { + UNKNOWN("UNKNOWN", "unchecked exception"), + USER_NOT_FOUND("USER_NOT_FOUND", "user not found exception."); + + private final String code; + private final String msg; +} diff --git a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/common/BaseTimeEntity.java b/src/main/java/com/codecrafters/companity/common/adapter/infrastructure/jpa/BaseTimeEntity.java similarity index 88% rename from src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/common/BaseTimeEntity.java rename to src/main/java/com/codecrafters/companity/common/adapter/infrastructure/jpa/BaseTimeEntity.java index a7a4c8b..5933808 100644 --- a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/common/BaseTimeEntity.java +++ b/src/main/java/com/codecrafters/companity/common/adapter/infrastructure/jpa/BaseTimeEntity.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.adapter.infrastructure.jpa.common; +package com.codecrafters.companity.common.adapter.infrastructure.jpa; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; diff --git a/src/main/java/com/codecrafters/companity/application/out/utility/DateTimeProvider.java b/src/main/java/com/codecrafters/companity/common/application/DateTimeProvider.java similarity index 62% rename from src/main/java/com/codecrafters/companity/application/out/utility/DateTimeProvider.java rename to src/main/java/com/codecrafters/companity/common/application/DateTimeProvider.java index 9cbcec6..cebbf5a 100644 --- a/src/main/java/com/codecrafters/companity/application/out/utility/DateTimeProvider.java +++ b/src/main/java/com/codecrafters/companity/common/application/DateTimeProvider.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.application.out.utility; +package com.codecrafters.companity.common.application; import java.time.LocalDateTime; diff --git a/src/main/java/com/codecrafters/companity/config/mapper/CustomModelMapper.java b/src/main/java/com/codecrafters/companity/config/mapper/CustomModelMapper.java index 7b78e16..df05f1c 100644 --- a/src/main/java/com/codecrafters/companity/config/mapper/CustomModelMapper.java +++ b/src/main/java/com/codecrafters/companity/config/mapper/CustomModelMapper.java @@ -1,9 +1,9 @@ package com.codecrafters.companity.config.mapper; -import com.codecrafters.companity.adapter.post.out.ResponsePost; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.adapter.dto.response.ResponsePost; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; +import com.codecrafters.companity.post.domain.Post; import org.modelmapper.Converter; import org.modelmapper.ModelMapper; import org.modelmapper.config.Configuration; diff --git a/src/main/java/com/codecrafters/companity/domain/post/OrderType.java b/src/main/java/com/codecrafters/companity/domain/post/OrderType.java deleted file mode 100644 index 2ce3105..0000000 --- a/src/main/java/com/codecrafters/companity/domain/post/OrderType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.codecrafters.companity.domain.post; - -public enum OrderType { - RecentDate, Favorite -} diff --git a/src/main/java/com/codecrafters/companity/exception/CustomException.java b/src/main/java/com/codecrafters/companity/exception/CustomException.java new file mode 100644 index 0000000..75dd7cf --- /dev/null +++ b/src/main/java/com/codecrafters/companity/exception/CustomException.java @@ -0,0 +1,49 @@ +package com.codecrafters.companity.exception; + +import com.codecrafters.companity.common.adapter.dto.response.ResultCode; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class CustomException extends RuntimeException{ + private final HttpStatus status; + private final ResultCode resultCode; + private final String message; + + public CustomException(HttpStatus status, ResultCode resultCode, String message) { + this.status = status; + this.resultCode = resultCode; + this.message = message; + } + + public CustomException(HttpStatus status, ResultCode resultCode, Throwable cause) { + this.status = status; + this.resultCode = resultCode; + this.message = cause.getMessage(); + } + + public CustomException(HttpStatus status, CustomException customException) { + this.status = status; + this.resultCode = customException.getResultCode(); + this.message = customException.getMessage(); + } + + public CustomException(HttpStatus status, Throwable cause) { + this.status = status; + this.resultCode = ResultCode.UNKNOWN; + this.message = cause.getMessage(); + } + + public CustomException(Exception exception) { + if (exception.getClass() == CustomException.class) { + CustomException customException = (CustomException) exception; + this.status = customException.getStatus(); + this.resultCode = customException.getResultCode(); + this.message = customException.getMessage(); + } else { + this.status = HttpStatus.BAD_REQUEST; + this.resultCode = ResultCode.UNKNOWN; + this.message = exception.getMessage(); + } + } +} diff --git a/src/main/java/com/codecrafters/companity/adapter/post/PostController.java b/src/main/java/com/codecrafters/companity/post/adapter/PostController.java similarity index 76% rename from src/main/java/com/codecrafters/companity/adapter/post/PostController.java rename to src/main/java/com/codecrafters/companity/post/adapter/PostController.java index e40ebc3..6c80658 100644 --- a/src/main/java/com/codecrafters/companity/adapter/post/PostController.java +++ b/src/main/java/com/codecrafters/companity/post/adapter/PostController.java @@ -1,11 +1,11 @@ -package com.codecrafters.companity.adapter.post; +package com.codecrafters.companity.post.adapter; -import com.codecrafters.companity.application.out.persistence.PostCriteria; -import com.codecrafters.companity.adapter.post.in.RequestPost; -import com.codecrafters.companity.adapter.post.out.ResponsePost; -import com.codecrafters.companity.application.in.usecase.PostUseCase; +import com.codecrafters.companity.post.application.port.out.persistence.PostCriteria; +import com.codecrafters.companity.post.adapter.dto.request.RequestPost; +import com.codecrafters.companity.post.adapter.dto.response.ResponsePost; +import com.codecrafters.companity.post.application.port.in.PostUseCase; import com.codecrafters.companity.config.mapper.CompanityObjectMapper; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.domain.Post; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/codecrafters/companity/adapter/post/in/RequestPost.java b/src/main/java/com/codecrafters/companity/post/adapter/dto/request/RequestPost.java similarity index 65% rename from src/main/java/com/codecrafters/companity/adapter/post/in/RequestPost.java rename to src/main/java/com/codecrafters/companity/post/adapter/dto/request/RequestPost.java index a690b0a..11805b4 100644 --- a/src/main/java/com/codecrafters/companity/adapter/post/in/RequestPost.java +++ b/src/main/java/com/codecrafters/companity/post/adapter/dto/request/RequestPost.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.adapter.post.in; +package com.codecrafters.companity.post.adapter.dto.request; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/codecrafters/companity/adapter/post/out/ResponsePost.java b/src/main/java/com/codecrafters/companity/post/adapter/dto/response/ResponsePost.java similarity index 75% rename from src/main/java/com/codecrafters/companity/adapter/post/out/ResponsePost.java rename to src/main/java/com/codecrafters/companity/post/adapter/dto/response/ResponsePost.java index 7c054a8..d8d3e12 100644 --- a/src/main/java/com/codecrafters/companity/adapter/post/out/ResponsePost.java +++ b/src/main/java/com/codecrafters/companity/post/adapter/dto/response/ResponsePost.java @@ -1,6 +1,6 @@ -package com.codecrafters.companity.adapter.post.out; +package com.codecrafters.companity.post.adapter.dto.response; -import com.codecrafters.companity.adapter.user.ResponseUser; +import com.codecrafters.companity.user.adapter.ResponseUser; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImpl.java b/src/main/java/com/codecrafters/companity/post/adapter/infrastructure/PostRepositoryImpl.java similarity index 75% rename from src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImpl.java rename to src/main/java/com/codecrafters/companity/post/adapter/infrastructure/PostRepositoryImpl.java index 3b0bc9b..91e9eea 100644 --- a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImpl.java +++ b/src/main/java/com/codecrafters/companity/post/adapter/infrastructure/PostRepositoryImpl.java @@ -1,12 +1,14 @@ -package com.codecrafters.companity.adapter.infrastructure.jpa.post; +package com.codecrafters.companity.post.adapter.infrastructure; -import com.codecrafters.companity.application.out.persistence.PostRepository; -import com.codecrafters.companity.application.out.persistence.PostCriteria; +import com.codecrafters.companity.post.adapter.infrastructure.jpa.PostEntity; +import com.codecrafters.companity.post.adapter.infrastructure.jpa.PostJPARepository; +import com.codecrafters.companity.post.application.port.out.persistence.PostRepository; +import com.codecrafters.companity.post.application.port.out.persistence.PostCriteria; import com.codecrafters.companity.config.mapper.CompanityObjectMapper; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; -import com.codecrafters.companity.domain.post.OrderType; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; +import com.codecrafters.companity.post.domain.enums.OrderType; +import com.codecrafters.companity.post.domain.Post; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -15,7 +17,7 @@ import java.util.List; -import static com.codecrafters.companity.adapter.infrastructure.jpa.post.QPostEntity.postEntity; +import static com.codecrafters.companity.post.adapter.infrastructure.jpa.QPostEntity.postEntity; @Repository diff --git a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostEntity.java b/src/main/java/com/codecrafters/companity/post/adapter/infrastructure/jpa/PostEntity.java similarity index 63% rename from src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostEntity.java rename to src/main/java/com/codecrafters/companity/post/adapter/infrastructure/jpa/PostEntity.java index e42e596..0c505bd 100644 --- a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostEntity.java +++ b/src/main/java/com/codecrafters/companity/post/adapter/infrastructure/jpa/PostEntity.java @@ -1,10 +1,10 @@ -package com.codecrafters.companity.adapter.infrastructure.jpa.post; +package com.codecrafters.companity.post.adapter.infrastructure.jpa; -import com.codecrafters.companity.adapter.infrastructure.jpa.comment.CommentEntity; -import com.codecrafters.companity.adapter.infrastructure.jpa.common.BaseTimeEntity; -import com.codecrafters.companity.adapter.user.infrastructure.jpa.UserEntity; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; +import com.codecrafters.companity.comment.adapter.infrastructure.jpa.CommentEntity; +import com.codecrafters.companity.common.adapter.infrastructure.jpa.BaseTimeEntity; +import com.codecrafters.companity.user.adapter.infrastructure.jpa.UserEntity; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; import jakarta.persistence.*; import lombok.Getter; diff --git a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostJPARepository.java b/src/main/java/com/codecrafters/companity/post/adapter/infrastructure/jpa/PostJPARepository.java similarity index 67% rename from src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostJPARepository.java rename to src/main/java/com/codecrafters/companity/post/adapter/infrastructure/jpa/PostJPARepository.java index 4804c2c..c464677 100644 --- a/src/main/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostJPARepository.java +++ b/src/main/java/com/codecrafters/companity/post/adapter/infrastructure/jpa/PostJPARepository.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.adapter.infrastructure.jpa.post; +package com.codecrafters.companity.post.adapter.infrastructure.jpa; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/codecrafters/companity/application/service/post/PostFactory.java b/src/main/java/com/codecrafters/companity/post/application/PostFactory.java similarity index 79% rename from src/main/java/com/codecrafters/companity/application/service/post/PostFactory.java rename to src/main/java/com/codecrafters/companity/post/application/PostFactory.java index afc5a90..36acb11 100644 --- a/src/main/java/com/codecrafters/companity/application/service/post/PostFactory.java +++ b/src/main/java/com/codecrafters/companity/post/application/PostFactory.java @@ -1,8 +1,8 @@ -package com.codecrafters.companity.application.service.post; +package com.codecrafters.companity.post.application; import com.codecrafters.companity.config.mapper.CompanityObjectMapper; -import com.codecrafters.companity.domain.post.Post; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.post.domain.Post; +import com.codecrafters.companity.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/codecrafters/companity/application/service/post/PostService.java b/src/main/java/com/codecrafters/companity/post/application/PostService.java similarity index 68% rename from src/main/java/com/codecrafters/companity/application/service/post/PostService.java rename to src/main/java/com/codecrafters/companity/post/application/PostService.java index e85875b..773a6f9 100644 --- a/src/main/java/com/codecrafters/companity/application/service/post/PostService.java +++ b/src/main/java/com/codecrafters/companity/post/application/PostService.java @@ -1,12 +1,12 @@ -package com.codecrafters.companity.application.service.post; - -import com.codecrafters.companity.application.in.usecase.PostUseCase; -import com.codecrafters.companity.application.out.persistence.PostCriteria; -import com.codecrafters.companity.application.out.utility.DateTimeProvider; -import com.codecrafters.companity.application.out.persistence.PostRepository; -import com.codecrafters.companity.application.out.persistence.UserRepository; -import com.codecrafters.companity.domain.post.Post; -import com.codecrafters.companity.domain.user.User; +package com.codecrafters.companity.post.application; + +import com.codecrafters.companity.post.application.port.in.PostUseCase; +import com.codecrafters.companity.post.application.port.out.persistence.PostCriteria; +import com.codecrafters.companity.common.application.DateTimeProvider; +import com.codecrafters.companity.post.application.port.out.persistence.PostRepository; +import com.codecrafters.companity.user.application.port.out.UserRepository; +import com.codecrafters.companity.post.domain.Post; +import com.codecrafters.companity.user.domain.User; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/codecrafters/companity/application/in/usecase/PostUseCase.java b/src/main/java/com/codecrafters/companity/post/application/port/in/PostUseCase.java similarity index 53% rename from src/main/java/com/codecrafters/companity/application/in/usecase/PostUseCase.java rename to src/main/java/com/codecrafters/companity/post/application/port/in/PostUseCase.java index e8b7145..dc07647 100644 --- a/src/main/java/com/codecrafters/companity/application/in/usecase/PostUseCase.java +++ b/src/main/java/com/codecrafters/companity/post/application/port/in/PostUseCase.java @@ -1,7 +1,7 @@ -package com.codecrafters.companity.application.in.usecase; +package com.codecrafters.companity.post.application.port.in; -import com.codecrafters.companity.application.out.persistence.PostCriteria; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.application.port.out.persistence.PostCriteria; +import com.codecrafters.companity.post.domain.Post; import java.util.List; diff --git a/src/main/java/com/codecrafters/companity/application/out/persistence/PostCriteria.java b/src/main/java/com/codecrafters/companity/post/application/port/out/persistence/PostCriteria.java similarity index 55% rename from src/main/java/com/codecrafters/companity/application/out/persistence/PostCriteria.java rename to src/main/java/com/codecrafters/companity/post/application/port/out/persistence/PostCriteria.java index 52114a6..a5a7b92 100644 --- a/src/main/java/com/codecrafters/companity/application/out/persistence/PostCriteria.java +++ b/src/main/java/com/codecrafters/companity/post/application/port/out/persistence/PostCriteria.java @@ -1,8 +1,8 @@ -package com.codecrafters.companity.application.out.persistence; +package com.codecrafters.companity.post.application.port.out.persistence; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; -import com.codecrafters.companity.domain.post.OrderType; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; +import com.codecrafters.companity.post.domain.enums.OrderType; import lombok.Builder; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/codecrafters/companity/application/out/persistence/PostRepository.java b/src/main/java/com/codecrafters/companity/post/application/port/out/persistence/PostRepository.java similarity index 65% rename from src/main/java/com/codecrafters/companity/application/out/persistence/PostRepository.java rename to src/main/java/com/codecrafters/companity/post/application/port/out/persistence/PostRepository.java index 41d3429..9c8f919 100644 --- a/src/main/java/com/codecrafters/companity/application/out/persistence/PostRepository.java +++ b/src/main/java/com/codecrafters/companity/post/application/port/out/persistence/PostRepository.java @@ -1,6 +1,6 @@ -package com.codecrafters.companity.application.out.persistence; +package com.codecrafters.companity.post.application.port.out.persistence; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.domain.Post; import java.util.List; diff --git a/src/main/java/com/codecrafters/companity/domain/post/Post.java b/src/main/java/com/codecrafters/companity/post/domain/Post.java similarity index 64% rename from src/main/java/com/codecrafters/companity/domain/post/Post.java rename to src/main/java/com/codecrafters/companity/post/domain/Post.java index 3a2f8a6..3559672 100644 --- a/src/main/java/com/codecrafters/companity/domain/post/Post.java +++ b/src/main/java/com/codecrafters/companity/post/domain/Post.java @@ -1,8 +1,9 @@ -package com.codecrafters.companity.domain.post; +package com.codecrafters.companity.post.domain; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.comment.domain.Comment; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; +import com.codecrafters.companity.user.domain.User; import lombok.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/codecrafters/companity/domain/enums/City.java b/src/main/java/com/codecrafters/companity/post/domain/enums/City.java similarity index 92% rename from src/main/java/com/codecrafters/companity/domain/enums/City.java rename to src/main/java/com/codecrafters/companity/post/domain/enums/City.java index 07f874e..60b28f0 100644 --- a/src/main/java/com/codecrafters/companity/domain/enums/City.java +++ b/src/main/java/com/codecrafters/companity/post/domain/enums/City.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.domain.enums; +package com.codecrafters.companity.post.domain.enums; public enum City { Seoul(0 ,"서울시"), diff --git a/src/main/java/com/codecrafters/companity/post/domain/enums/OrderType.java b/src/main/java/com/codecrafters/companity/post/domain/enums/OrderType.java new file mode 100644 index 0000000..861768f --- /dev/null +++ b/src/main/java/com/codecrafters/companity/post/domain/enums/OrderType.java @@ -0,0 +1,5 @@ +package com.codecrafters.companity.post.domain.enums; + +public enum OrderType { + RecentDate, Favorite +} diff --git a/src/main/java/com/codecrafters/companity/domain/enums/Sport.java b/src/main/java/com/codecrafters/companity/post/domain/enums/Sport.java similarity index 88% rename from src/main/java/com/codecrafters/companity/domain/enums/Sport.java rename to src/main/java/com/codecrafters/companity/post/domain/enums/Sport.java index f2ba9f2..ab17af0 100644 --- a/src/main/java/com/codecrafters/companity/domain/enums/Sport.java +++ b/src/main/java/com/codecrafters/companity/post/domain/enums/Sport.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.domain.enums; +package com.codecrafters.companity.post.domain.enums; public enum Sport { Badminton(0 ,"배드민턴"), diff --git a/src/main/java/com/codecrafters/companity/adapter/user/ResponseUser.java b/src/main/java/com/codecrafters/companity/user/adapter/ResponseUser.java similarity index 62% rename from src/main/java/com/codecrafters/companity/adapter/user/ResponseUser.java rename to src/main/java/com/codecrafters/companity/user/adapter/ResponseUser.java index c2d2ac0..302cfeb 100644 --- a/src/main/java/com/codecrafters/companity/adapter/user/ResponseUser.java +++ b/src/main/java/com/codecrafters/companity/user/adapter/ResponseUser.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.adapter.user; +package com.codecrafters.companity.user.adapter; public class ResponseUser { private Long id; private String nickname; diff --git a/src/main/java/com/codecrafters/companity/user/adapter/UserController.java b/src/main/java/com/codecrafters/companity/user/adapter/UserController.java new file mode 100644 index 0000000..e699450 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/user/adapter/UserController.java @@ -0,0 +1,42 @@ +package com.codecrafters.companity.user.adapter; + +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.adapter.dto.request.UserUpdateRequest; +import com.codecrafters.companity.user.adapter.dto.resposne.UserCreateResponse; +import com.codecrafters.companity.user.application.port.in.UserUseCase; +import com.codecrafters.companity.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/users") +@RequiredArgsConstructor +public class UserController { + + private final UserUseCase userUseCase; + + @PostMapping + public ResponseEntity signUp (@RequestBody UserCreateRequest request) { + User user = userUseCase.signUp(request); + UserCreateResponse response = UserCreateResponse.from(user); + + return new ResponseEntity<>(response, HttpStatus.CREATED); + } + + @DeleteMapping("/{userId}") + public ResponseEntity delete (@PathVariable("userId") String userId) throws Exception { + userUseCase.delete(userId); + + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + // FIXME: 인증 Token을 이용해 userId를 가져오는 방식으로 변경 필요 /users/{userId}/nick-name -> /users/nick-name + @PatchMapping("/{userId}/nick-name") + public ResponseEntity signUp (@PathVariable("userId") String userId, @RequestBody UserUpdateRequest request) { + User user = userUseCase.updateNickName(userId, request.getNickName()); + + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/src/main/java/com/codecrafters/companity/adapter/user/dto/request/UserCreateRequest.java b/src/main/java/com/codecrafters/companity/user/adapter/dto/request/UserCreateRequest.java similarity index 89% rename from src/main/java/com/codecrafters/companity/adapter/user/dto/request/UserCreateRequest.java rename to src/main/java/com/codecrafters/companity/user/adapter/dto/request/UserCreateRequest.java index 91667a4..0b0758e 100644 --- a/src/main/java/com/codecrafters/companity/adapter/user/dto/request/UserCreateRequest.java +++ b/src/main/java/com/codecrafters/companity/user/adapter/dto/request/UserCreateRequest.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.adapter.user.dto.request; +package com.codecrafters.companity.user.adapter.dto.request; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/codecrafters/companity/user/adapter/dto/request/UserUpdateRequest.java b/src/main/java/com/codecrafters/companity/user/adapter/dto/request/UserUpdateRequest.java new file mode 100644 index 0000000..a601f13 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/user/adapter/dto/request/UserUpdateRequest.java @@ -0,0 +1,19 @@ +package com.codecrafters.companity.user.adapter.dto.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +/** + * UserId는 PK이므로 변경되지 않는다. + */ +@Getter +public class UserUpdateRequest { + private final String userName; + private final String nickName; + + public UserUpdateRequest(@JsonProperty("userName") String userName, @JsonProperty("nickName") String nickName) { + this.userName = userName; + this.nickName = nickName; + } + +} diff --git a/src/main/java/com/codecrafters/companity/adapter/user/dto/resposne/UserCreateResponse.java b/src/main/java/com/codecrafters/companity/user/adapter/dto/resposne/UserCreateResponse.java similarity index 81% rename from src/main/java/com/codecrafters/companity/adapter/user/dto/resposne/UserCreateResponse.java rename to src/main/java/com/codecrafters/companity/user/adapter/dto/resposne/UserCreateResponse.java index ea9e9ff..0e17b4a 100644 --- a/src/main/java/com/codecrafters/companity/adapter/user/dto/resposne/UserCreateResponse.java +++ b/src/main/java/com/codecrafters/companity/user/adapter/dto/resposne/UserCreateResponse.java @@ -1,7 +1,7 @@ -package com.codecrafters.companity.adapter.user.dto.resposne; +package com.codecrafters.companity.user.adapter.dto.resposne; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.user.domain.User; import lombok.Getter; @Getter diff --git a/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/UserRepositoryImpl.java b/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/UserRepositoryImpl.java new file mode 100644 index 0000000..c10be35 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/UserRepositoryImpl.java @@ -0,0 +1,43 @@ +package com.codecrafters.companity.user.adapter.infrastructure; + +import com.codecrafters.companity.user.adapter.infrastructure.jpa.UserEntity; +import com.codecrafters.companity.user.adapter.infrastructure.jpa.UserJPARepository; +import com.codecrafters.companity.common.adapter.dto.response.ResultCode; +import com.codecrafters.companity.user.application.port.out.UserRepository; +import com.codecrafters.companity.user.domain.User; +import com.codecrafters.companity.exception.CustomException; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class UserRepositoryImpl implements UserRepository { + private final UserJPARepository userJPARepository; + + @Override + public User save(User user) { + UserEntity entity = UserEntity.from(user); + userJPARepository.save(entity); + + return User.builder() + .userId(entity.getUserId()) + .userName(entity.getUserName()) + .nickName(entity.getNickName()) + .build(); + } + + @Override + public User getUserById(String userId){ + UserEntity userEntity = userJPARepository.findById(userId).orElseThrow(() -> { + throw new CustomException(HttpStatus.BAD_REQUEST, ResultCode.USER_NOT_FOUND, "user not found. userId : " + userId); + }); + + return userEntity.toDomain(); + } + + @Override + public void deleteById(String userId) { + userJPARepository.deleteById(userId); + } +} diff --git a/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/jpa/UserEntity.java b/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/jpa/UserEntity.java similarity index 89% rename from src/main/java/com/codecrafters/companity/adapter/user/infrastructure/jpa/UserEntity.java rename to src/main/java/com/codecrafters/companity/user/adapter/infrastructure/jpa/UserEntity.java index d632fb0..3babdb2 100644 --- a/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/jpa/UserEntity.java +++ b/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/jpa/UserEntity.java @@ -1,9 +1,9 @@ -package com.codecrafters.companity.adapter.user.infrastructure.jpa; +package com.codecrafters.companity.user.adapter.infrastructure.jpa; import jakarta.persistence.Column; import lombok.Getter; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.user.domain.User; import jakarta.persistence.Entity; import jakarta.persistence.Id; import lombok.Builder; diff --git a/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/jpa/UserJPARepository.java b/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/jpa/UserJPARepository.java similarity index 69% rename from src/main/java/com/codecrafters/companity/adapter/user/infrastructure/jpa/UserJPARepository.java rename to src/main/java/com/codecrafters/companity/user/adapter/infrastructure/jpa/UserJPARepository.java index e40444a..ca9bcb4 100644 --- a/src/main/java/com/codecrafters/companity/adapter/user/infrastructure/jpa/UserJPARepository.java +++ b/src/main/java/com/codecrafters/companity/user/adapter/infrastructure/jpa/UserJPARepository.java @@ -1,4 +1,4 @@ -package com.codecrafters.companity.adapter.user.infrastructure.jpa; +package com.codecrafters.companity.user.adapter.infrastructure.jpa; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/codecrafters/companity/user/application/UserService.java b/src/main/java/com/codecrafters/companity/user/application/UserService.java new file mode 100644 index 0000000..8ec9e03 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/user/application/UserService.java @@ -0,0 +1,40 @@ +package com.codecrafters.companity.user.application; + +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.application.port.in.UserUseCase; +import com.codecrafters.companity.user.application.port.out.UserRepository; +import com.codecrafters.companity.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserService implements UserUseCase { + + private final UserRepository userRepository; + + @Override + public User signUp(UserCreateRequest request) { + User user = User.from(request); + user.validateCreateUser(); + + return userRepository.save(user); + } + + @Override + public User updateNickName(String userId, String nickName) { + User user = userRepository.getUserById(userId); + user.updateNickName(nickName); + + return userRepository.save(user); + } + + @Override + public void delete(String userId) { + User user = userRepository.getUserById(userId); + if (user == null) throw new IllegalArgumentException("user not found with UserID : " + userId); + + userRepository.deleteById(userId); + } + +} diff --git a/src/main/java/com/codecrafters/companity/user/application/port/in/UserUseCase.java b/src/main/java/com/codecrafters/companity/user/application/port/in/UserUseCase.java new file mode 100644 index 0000000..c45d2bd --- /dev/null +++ b/src/main/java/com/codecrafters/companity/user/application/port/in/UserUseCase.java @@ -0,0 +1,10 @@ +package com.codecrafters.companity.user.application.port.in; + +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.domain.User; + +public interface UserUseCase { + public User signUp(UserCreateRequest user); + public User updateNickName(String userId, String nickName); + public void delete(String userId) throws Exception; +} diff --git a/src/main/java/com/codecrafters/companity/user/application/port/out/UserRepository.java b/src/main/java/com/codecrafters/companity/user/application/port/out/UserRepository.java new file mode 100644 index 0000000..e9470a3 --- /dev/null +++ b/src/main/java/com/codecrafters/companity/user/application/port/out/UserRepository.java @@ -0,0 +1,10 @@ +package com.codecrafters.companity.user.application.port.out; + +import com.codecrafters.companity.user.domain.User; + +public interface UserRepository { + User save(User user); + User getUserById(String userId); + + void deleteById(String userId); +} diff --git a/src/main/java/com/codecrafters/companity/domain/user/User.java b/src/main/java/com/codecrafters/companity/user/domain/User.java similarity index 79% rename from src/main/java/com/codecrafters/companity/domain/user/User.java rename to src/main/java/com/codecrafters/companity/user/domain/User.java index 07d3c75..d02a7e3 100644 --- a/src/main/java/com/codecrafters/companity/domain/user/User.java +++ b/src/main/java/com/codecrafters/companity/user/domain/User.java @@ -1,12 +1,11 @@ -package com.codecrafters.companity.domain.user; +package com.codecrafters.companity.user.domain; -import com.codecrafters.companity.adapter.user.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; import lombok.*; import java.util.Objects; @Getter -@Setter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -26,8 +25,12 @@ public boolean equals(Object o) { return Objects.equals(userId, user.userId) && Objects.equals(userName, user.userName) && Objects.equals(nickName, user.nickName); } - public void validateUser() { + public void validateCreateUser() { if (this.userId == null) throw new IllegalArgumentException("userId is required."); if (this.userName == null) throw new IllegalArgumentException("userName is required."); } + + public void updateNickName(String nickName) { + this.nickName = nickName; + } } diff --git a/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImplTest.java b/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImplTest.java index 843ed63..44c7ab0 100644 --- a/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImplTest.java +++ b/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/post/PostRepositoryImplTest.java @@ -1,11 +1,13 @@ package com.codecrafters.companity.adapter.infrastructure.jpa.post; import com.codecrafters.companity.config.mapper.CustomModelMapper; -import com.codecrafters.companity.application.out.persistence.PostCriteria; +import com.codecrafters.companity.post.adapter.infrastructure.jpa.PostJPARepository; +import com.codecrafters.companity.post.adapter.infrastructure.PostRepositoryImpl; +import com.codecrafters.companity.post.application.port.out.persistence.PostCriteria; import com.codecrafters.companity.config.QuerydslConfig; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; -import com.codecrafters.companity.domain.post.OrderType; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; +import com.codecrafters.companity.post.domain.enums.OrderType; import com.querydsl.jpa.impl.JPAQueryFactory; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/user/UserRepositoryImplTest.java b/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/user/UserRepositoryImplTest.java index cccd49e..43fda70 100644 --- a/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/user/UserRepositoryImplTest.java +++ b/src/test/java/com/codecrafters/companity/adapter/infrastructure/jpa/user/UserRepositoryImplTest.java @@ -1,6 +1,6 @@ package com.codecrafters.companity.adapter.infrastructure.jpa.user; -import com.codecrafters.companity.application.out.persistence.UserRepository; +import com.codecrafters.companity.user.application.port.out.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/src/test/java/com/codecrafters/companity/application/service/post/PostServiceTest.java b/src/test/java/com/codecrafters/companity/application/service/post/PostServiceTest.java index 7c2ade5..7bedd2e 100644 --- a/src/test/java/com/codecrafters/companity/application/service/post/PostServiceTest.java +++ b/src/test/java/com/codecrafters/companity/application/service/post/PostServiceTest.java @@ -2,11 +2,13 @@ import com.codecrafters.companity.mock.repository.PostInMemoryImpl; import com.codecrafters.companity.mock.repository.UserInMemoryImpl; -import com.codecrafters.companity.application.out.persistence.PostRepository; -import com.codecrafters.companity.application.out.persistence.UserRepository; +import com.codecrafters.companity.post.application.port.out.persistence.PostRepository; +import com.codecrafters.companity.post.application.PostFactory; +import com.codecrafters.companity.post.application.PostService; +import com.codecrafters.companity.user.application.port.out.UserRepository; import com.codecrafters.companity.config.mapper.CustomModelMapper; -import com.codecrafters.companity.domain.post.Post; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.post.domain.Post; +import com.codecrafters.companity.user.domain.User; import com.codecrafters.companity.mock.TestDateTimeProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/codecrafters/companity/application/service/user/UserServiceTest.java b/src/test/java/com/codecrafters/companity/application/service/user/UserServiceTest.java index 91819f7..3854004 100644 --- a/src/test/java/com/codecrafters/companity/application/service/user/UserServiceTest.java +++ b/src/test/java/com/codecrafters/companity/application/service/user/UserServiceTest.java @@ -1,8 +1,10 @@ package com.codecrafters.companity.application.service.user; -import com.codecrafters.companity.adapter.user.dto.request.UserCreateRequest; -import com.codecrafters.companity.application.out.persistence.UserRepository; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.application.UserService; +import com.codecrafters.companity.user.application.port.out.UserRepository; +import com.codecrafters.companity.user.domain.User; +import com.codecrafters.companity.exception.CustomException; import com.codecrafters.companity.mock.repository.UserInMemoryImpl; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -17,6 +19,7 @@ public class UserServiceTest { public UserServiceTest() { userRepository = new UserInMemoryImpl(); userService = new UserService(userRepository); + userRepository.save(User.builder().userId(USER_ID).userName(USER_NAME).nickName(NICKNAME).build()); } @Test @@ -34,4 +37,36 @@ public UserServiceTest() { Assertions.assertEquals(request.getNickName(), user.getNickName()); }); } + + @Test + public void 사용자의_nickName을_변경할_수_있다() { + //given + String userId = USER_ID; + String newNickName = "NEW_NICK_NAME"; + + //when + User newUser = userService.updateNickName(userId, newNickName); + + //then + Assertions.assertAll(() -> { + Assertions.assertEquals(userId, newUser.getUserId()); + Assertions.assertEquals(USER_NAME, newUser.getUserName()); + Assertions.assertEquals(newNickName, newUser.getNickName()); + }); + } + + @Test + public void userId에_해당하는_특정_User를_삭제할_수_있다() { + //given + String userId = USER_ID; + UserCreateRequest request = new UserCreateRequest(userId, USER_NAME, NICKNAME); + User user = userService.signUp(request); + + //when + userService.delete(userId); + + //then + Assertions.assertThrows(CustomException.class, () -> userRepository.getUserById(userId)); + } + } diff --git a/src/test/java/com/codecrafters/companity/adapter/utility/CustomModelMapperTest.java b/src/test/java/com/codecrafters/companity/common/adapter/CustomModelMapperTest.java similarity index 95% rename from src/test/java/com/codecrafters/companity/adapter/utility/CustomModelMapperTest.java rename to src/test/java/com/codecrafters/companity/common/adapter/CustomModelMapperTest.java index f830a40..d379716 100644 --- a/src/test/java/com/codecrafters/companity/adapter/utility/CustomModelMapperTest.java +++ b/src/test/java/com/codecrafters/companity/common/adapter/CustomModelMapperTest.java @@ -1,8 +1,8 @@ -package com.codecrafters.companity.adapter.utility; +package com.codecrafters.companity.common.adapter; -import com.codecrafters.companity.adapter.infrastructure.jpa.post.PostEntity; +import com.codecrafters.companity.post.adapter.infrastructure.jpa.PostEntity; import com.codecrafters.companity.config.mapper.CustomModelMapper; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.domain.Post; import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/src/test/java/com/codecrafters/companity/domain/post/PostFactoryTest.java b/src/test/java/com/codecrafters/companity/domain/post/PostFactoryTest.java index f26cccb..d4016a0 100644 --- a/src/test/java/com/codecrafters/companity/domain/post/PostFactoryTest.java +++ b/src/test/java/com/codecrafters/companity/domain/post/PostFactoryTest.java @@ -1,8 +1,9 @@ package com.codecrafters.companity.domain.post; -import com.codecrafters.companity.application.service.post.PostFactory; +import com.codecrafters.companity.post.application.PostFactory; import com.codecrafters.companity.config.mapper.CustomModelMapper; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.post.domain.Post; +import com.codecrafters.companity.user.domain.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/codecrafters/companity/domain/user/UserTest.java b/src/test/java/com/codecrafters/companity/domain/user/UserTest.java index 0f9c7c1..254d2b5 100644 --- a/src/test/java/com/codecrafters/companity/domain/user/UserTest.java +++ b/src/test/java/com/codecrafters/companity/domain/user/UserTest.java @@ -1,6 +1,7 @@ package com.codecrafters.companity.domain.user; -import com.codecrafters.companity.adapter.user.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; +import com.codecrafters.companity.user.domain.User; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,8 +35,29 @@ public class UserTest { //when //then - Assertions.assertThrows(IllegalArgumentException.class, () -> userCase1.validateUser()); - Assertions.assertThrows(IllegalArgumentException.class, () -> userCase2.validateUser()); - Assertions.assertThrows(IllegalArgumentException.class, () -> userCase3.validateUser()); + Assertions.assertThrows(IllegalArgumentException.class, () -> userCase1.validateCreateUser()); + Assertions.assertThrows(IllegalArgumentException.class, () -> userCase2.validateCreateUser()); + Assertions.assertThrows(IllegalArgumentException.class, () -> userCase3.validateCreateUser()); + } + + @Test + void 사용자의_nickName을_새로운_nick_name으로_변경한다(){ + //given + User user = User.builder() + .userId(USER_ID) + .userName(USER_NAME) + .nickName(NICKNAME) + .build(); + String newNickName = "NEW_NICK_NAME"; + + //when + user.updateNickName(newNickName); + + //then + Assertions.assertAll(() -> { + Assertions.assertEquals(USER_ID, user.getUserId()); + Assertions.assertEquals(USER_NAME, user.getUserName()); + Assertions.assertEquals("NEW_NICK_NAME", user.getNickName()); + }); } } diff --git a/src/test/java/com/codecrafters/companity/mock/TestDateTimeProvider.java b/src/test/java/com/codecrafters/companity/mock/TestDateTimeProvider.java index e4b13ec..b069796 100644 --- a/src/test/java/com/codecrafters/companity/mock/TestDateTimeProvider.java +++ b/src/test/java/com/codecrafters/companity/mock/TestDateTimeProvider.java @@ -1,6 +1,6 @@ package com.codecrafters.companity.mock; -import com.codecrafters.companity.application.out.utility.DateTimeProvider; +import com.codecrafters.companity.common.application.DateTimeProvider; import java.time.LocalDateTime; public class TestDateTimeProvider implements DateTimeProvider { diff --git a/src/test/java/com/codecrafters/companity/mock/repository/PostInMemoryImpl.java b/src/test/java/com/codecrafters/companity/mock/repository/PostInMemoryImpl.java index 7015e58..9684053 100644 --- a/src/test/java/com/codecrafters/companity/mock/repository/PostInMemoryImpl.java +++ b/src/test/java/com/codecrafters/companity/mock/repository/PostInMemoryImpl.java @@ -1,8 +1,8 @@ package com.codecrafters.companity.mock.repository; -import com.codecrafters.companity.application.out.persistence.PostRepository; -import com.codecrafters.companity.application.out.persistence.PostCriteria; -import com.codecrafters.companity.domain.post.Post; +import com.codecrafters.companity.post.application.port.out.persistence.PostRepository; +import com.codecrafters.companity.post.application.port.out.persistence.PostCriteria; +import com.codecrafters.companity.post.domain.Post; import java.util.List; import java.util.Map; diff --git a/src/test/java/com/codecrafters/companity/mock/repository/UserInMemoryImpl.java b/src/test/java/com/codecrafters/companity/mock/repository/UserInMemoryImpl.java index b0bbfdc..a725941 100644 --- a/src/test/java/com/codecrafters/companity/mock/repository/UserInMemoryImpl.java +++ b/src/test/java/com/codecrafters/companity/mock/repository/UserInMemoryImpl.java @@ -1,23 +1,31 @@ package com.codecrafters.companity.mock.repository; -import com.codecrafters.companity.application.out.persistence.UserRepository; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.common.adapter.dto.response.ResultCode; +import com.codecrafters.companity.user.application.port.out.UserRepository; +import com.codecrafters.companity.user.domain.User; +import com.codecrafters.companity.exception.CustomException; +import org.springframework.http.HttpStatus; + import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; public class UserInMemoryImpl implements UserRepository { private final Map repository = new ConcurrentHashMap<>(); @Override public User save(User user) { - user.setUserId(user.getUserId()); repository.put(user.getUserId(), user); return user; } @Override public User getUserById(String userId) { - if(!repository.containsKey(userId)) throw new IllegalArgumentException(); + if(!repository.containsKey(userId)) + throw new CustomException(HttpStatus.BAD_REQUEST, ResultCode.USER_NOT_FOUND, "user not found. userId : " + userId); return repository.get(userId); } + + @Override + public void deleteById(String userId) { + repository.remove(userId); + } } diff --git a/src/test/java/com/codecrafters/companity/static_reference/PostStatic.java b/src/test/java/com/codecrafters/companity/static_reference/PostStatic.java index 6d6ec69..ab179f3 100644 --- a/src/test/java/com/codecrafters/companity/static_reference/PostStatic.java +++ b/src/test/java/com/codecrafters/companity/static_reference/PostStatic.java @@ -1,7 +1,7 @@ package com.codecrafters.companity.static_reference; -import com.codecrafters.companity.domain.enums.City; -import com.codecrafters.companity.domain.enums.Sport; +import com.codecrafters.companity.post.domain.enums.City; +import com.codecrafters.companity.post.domain.enums.Sport; public class PostStatic { public static final String TITLE = "Test Title"; diff --git a/src/test/java/com/codecrafters/companity/user/adapter/UserControllerTest.java b/src/test/java/com/codecrafters/companity/user/adapter/UserControllerTest.java new file mode 100644 index 0000000..302f6cc --- /dev/null +++ b/src/test/java/com/codecrafters/companity/user/adapter/UserControllerTest.java @@ -0,0 +1,15 @@ +package com.codecrafters.companity.user.adapter; + +import com.codecrafters.companity.user.adapter.dto.request.UserCreateRequest; + +public class UserControllerTest { + +// private final UserUseCase userUseCase; + + public void signUp (UserCreateRequest request) { +// User user = userUseCase.signUp(request); +// UserCreateResponse response = UserCreateResponse.from(user); + +// return new ResponseEntity<>(response, HttpStatus.OK); + } +} diff --git a/src/test/java/com/codecrafters/companity/adapter/user/dto/response/UserCreateResponseTest.java b/src/test/java/com/codecrafters/companity/user/adapter/dto/response/UserCreateResponseTest.java similarity index 83% rename from src/test/java/com/codecrafters/companity/adapter/user/dto/response/UserCreateResponseTest.java rename to src/test/java/com/codecrafters/companity/user/adapter/dto/response/UserCreateResponseTest.java index fbd799a..f8d3a81 100644 --- a/src/test/java/com/codecrafters/companity/adapter/user/dto/response/UserCreateResponseTest.java +++ b/src/test/java/com/codecrafters/companity/user/adapter/dto/response/UserCreateResponseTest.java @@ -1,7 +1,7 @@ -package com.codecrafters.companity.adapter.user.dto.response; +package com.codecrafters.companity.user.adapter.dto.response; -import com.codecrafters.companity.adapter.user.dto.resposne.UserCreateResponse; -import com.codecrafters.companity.domain.user.User; +import com.codecrafters.companity.user.adapter.dto.resposne.UserCreateResponse; +import com.codecrafters.companity.user.domain.User; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test;