From be8d521cc869d8bbdf83f174e749ffaea5a55c2f Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Thu, 19 Jan 2023 01:41:23 +0900 Subject: [PATCH 01/18] feat(#53): converted archive dto v1 classes java to kotlin --- .../v1/archive/ArchiveCountResponseDtoV1.java | 13 --- .../v1/archive/ArchiveCountResponseDtoV1.kt | 3 + .../archive/dto/v1/archive/ArchiveDtoV1.java | 98 ------------------- .../archive/dto/v1/archive/ArchiveDtoV1.kt | 87 ++++++++++++++++ .../dto/v1/archive/ArchiveImageDtoV1.java | 34 ------- .../dto/v1/archive/ArchiveImageDtoV1.kt | 29 ++++++ .../archive/ArchiveImageUrlResponseDtoV1.java | 12 --- .../archive/ArchiveImageUrlResponseDtoV1.kt | 3 + .../v1/archive/ArchiveListResponseDtoV1.java | 22 ----- .../v1/archive/ArchiveListResponseDtoV1.kt | 17 ++++ .../archive/EmailDuplicateResponseDtoV1.java | 12 --- .../v1/archive/EmailDuplicateResponseDtoV1.kt | 3 + .../service/archive/ArchiveService.java | 13 +-- 13 files changed, 149 insertions(+), 197 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.java deleted file mode 100644 index 7b2b68b1..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.java +++ /dev/null @@ -1,13 +0,0 @@ -package site.archive.dto.v1.archive; - -import lombok.AllArgsConstructor; -import lombok.Getter; - - -@Getter -@AllArgsConstructor -public class ArchiveCountResponseDtoV1 { - - private final long count; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt new file mode 100644 index 00000000..867f701d --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v1.archive + +data class ArchiveCountResponseDtoV1(val count: Long) \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.java deleted file mode 100644 index f8878b03..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.java +++ /dev/null @@ -1,98 +0,0 @@ -package site.archive.dto.v1.archive; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import site.archive.common.DateTimeUtils; -import site.archive.domain.archive.Archive; -import site.archive.domain.archive.CoverImageType; -import site.archive.domain.archive.Emotion; -import site.archive.domain.user.BaseUser; - -import java.time.LocalDate; -import java.util.List; -import java.util.Objects; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Builder -@JsonInclude(Include.NON_NULL) -public class ArchiveDtoV1 { - private Long archiveId; - private String name; - private String watchedOn; - private Emotion emotion; - private String mainImage; - private Boolean isPublic; // Default value is false - private CoverImageType coverImageType; // Default value is EMOTION_COVER - - private long authorId; - - private List companions; - private List images; - - /** - * 아카이브 상세 조회 DTO V1 - * 아카이브 연결 이미지들을 다 포함 - * - * @param archive Archive Entity - * @return ArchiveDtoV1 archive specific DTO - */ - public static ArchiveDtoV1 specificFrom(Archive archive) { - var archiveImages = archive.getArchiveImages().stream() - .map(ArchiveImageDtoV1::from) - .toList(); - return ArchiveDtoV1.builder() - .archiveId(archive.getId()) - .name(archive.getName()) - .watchedOn(archive.getWatchedOn().format(DateTimeUtils.getYymmddFormatter())) - .emotion(archive.getEmotion()) - .mainImage(archive.getMainImage()) - .companions(archive.getCompanions()) - .images(archiveImages) - .authorId(archive.getAuthor().getId()) - .isPublic(archive.getIsPublic()) - .build(); - } - - /** - * 아카이브 리스트 조회 DTO - * 아카이브 연결 이미지들을 포함하고 있지 않음 - * - * @param archive archive entity - * @return ArchiveDtoV1 archive simple DTO - */ - public static ArchiveDtoV1 simpleFrom(Archive archive) { - return ArchiveDtoV1.builder() - .archiveId(archive.getId()) - .name(archive.getName()) - .watchedOn(archive.getWatchedOn().format(DateTimeUtils.getYymmddFormatter())) - .emotion(archive.getEmotion()) - .companions(archive.getCompanions()) - .mainImage(archive.getMainImage()) - .authorId(archive.getAuthor().getId()) - .isPublic(archive.getIsPublic()) - .coverImageType(archive.getCoverImageType()) - .build(); - } - - public Archive toEntity(BaseUser user) { - var archivePublic = this.isPublic != null && this.isPublic; - var archiveCoverImageType = Objects.requireNonNullElse(coverImageType, CoverImageType.EMOTION_COVER); - return Archive.builder() - .name(name) - .watchedOn(LocalDate.parse(watchedOn, DateTimeUtils.getYymmddFormatter())) - .emotion(emotion) - .mainImage(mainImage) - .companions(companions) - .author(user) - .isPublic(archivePublic) - .coverImageType(archiveCoverImageType) - .build(); - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.kt new file mode 100644 index 00000000..1362c19c --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.kt @@ -0,0 +1,87 @@ +package site.archive.dto.v1.archive + +import com.fasterxml.jackson.annotation.JsonInclude +import site.archive.common.yymmddFormatter +import site.archive.domain.archive.Archive +import site.archive.domain.archive.CoverImageType +import site.archive.domain.archive.Emotion +import site.archive.domain.user.BaseUser +import java.time.LocalDate + +@JsonInclude(JsonInclude.Include.NON_NULL) +data class ArchiveDtoV1( + val archiveId: Long, + val name: String, + val watchedOn: String, + val emotion: Emotion, + val mainImage: String, + val authorId: Long, + val isPublic: Boolean? = null, + val coverImageType: CoverImageType? = null, + var companions: List? = null, + var images: List? = null +) { + + fun toEntity(user: BaseUser): Archive { + val archivePublic = isPublic ?: false + val archiveCoverImageType = coverImageType ?: CoverImageType.EMOTION_COVER + return Archive.builder() + .name(name) + .watchedOn(LocalDate.parse(watchedOn, yymmddFormatter)) + .emotion(emotion) + .mainImage(mainImage) + .companions(companions) + .author(user) + .isPublic(archivePublic) + .coverImageType(archiveCoverImageType) + .build() + } + + companion object { + /** + * 아카이브 상세 조회 DTO V1 + * 아카이브 연결 이미지들을 다 포함 + * + * @param archive Archive Entity + * @return ArchiveDtoV1 archive specific DTO + */ + @JvmStatic + fun specificForm(archive: Archive): ArchiveDtoV1 { + val archiveImages = archive.archiveImages.map(ArchiveImageDtoV1::from).toList() + return ArchiveDtoV1( + archiveId = archive.id, + name = archive.name, + watchedOn = archive.watchedOn.format(yymmddFormatter), + emotion = archive.emotion, + mainImage = archive.mainImage, + companions = archive.companions, + images = archiveImages, + authorId = archive.author.id, + isPublic = archive.isPublic + ) + } + + /** + * 아카이브 리스트 조회 DTO + * 아카이브 연결 이미지들을 포함하고 있지 않음 + * + * @param archive archive entity + * @return ArchiveDtoV1 archive simple DTO + */ + @JvmStatic + fun simpleForm(archive: Archive): ArchiveDtoV1 { + return ArchiveDtoV1( + archiveId = archive.id, + name = archive.name, + watchedOn = archive.watchedOn.format(yymmddFormatter), + emotion = archive.emotion, + companions = archive.companions, + mainImage = archive.mainImage, + authorId = archive.author.id, + isPublic = archive.isPublic, + coverImageType = archive.coverImageType + ) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.java deleted file mode 100644 index 0fed0224..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.java +++ /dev/null @@ -1,34 +0,0 @@ -package site.archive.dto.v1.archive; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import site.archive.domain.archive.Archive; -import site.archive.domain.archive.ArchiveImage; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Builder -public class ArchiveImageDtoV1 { - - private Long archiveImageId; - private String image; - private String review; - private String backgroundColor; - - public static ArchiveImageDtoV1 from(ArchiveImage archiveImage) { - return ArchiveImageDtoV1.builder() - .archiveImageId(archiveImage.getId()) - .image(archiveImage.getImage()) - .review(archiveImage.getReview()) - .backgroundColor(archiveImage.getBackgroundColor()) - .build(); - } - - public ArchiveImage toEntity(Archive archive) { - return new ArchiveImage(image, review, backgroundColor, archive); - } - -} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt new file mode 100644 index 00000000..51c51f85 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt @@ -0,0 +1,29 @@ +package site.archive.dto.v1.archive + +import site.archive.domain.archive.Archive +import site.archive.domain.archive.ArchiveImage + +data class ArchiveImageDtoV1( + val archiveImageId: Long, + val image: String, + val review: String, + val backgroundColor: String +) { + + fun toEntity(archive: Archive): ArchiveImage { + return ArchiveImage(image, review, backgroundColor, archive) + } + + companion object { + @JvmStatic + fun from(archiveImage: ArchiveImage): ArchiveImageDtoV1 { + return ArchiveImageDtoV1( + archiveImageId = archiveImage.id, + image = archiveImage.image, + review = archiveImage.review, + backgroundColor = archiveImage.backgroundColor + ) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.java deleted file mode 100644 index 876a0dff..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.java +++ /dev/null @@ -1,12 +0,0 @@ -package site.archive.dto.v1.archive; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class ArchiveImageUrlResponseDtoV1 { - - private final String imageUrl; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt new file mode 100644 index 00000000..d0fd740e --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v1.archive + +data class ArchiveImageUrlResponseDtoV1(val imageUrl: String) \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.java deleted file mode 100644 index 386652ac..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.java +++ /dev/null @@ -1,22 +0,0 @@ -package site.archive.dto.v1.archive; - -import lombok.Getter; - -import java.util.List; - -@Getter -public class ArchiveListResponseDtoV1 { - - private final int archiveCount; - private final List archives; - - private ArchiveListResponseDtoV1(List archives) { - this.archiveCount = archives.size(); - this.archives = archives; - } - - public static ArchiveListResponseDtoV1 from(List archiveDtoV1s) { - return new ArchiveListResponseDtoV1(archiveDtoV1s); - } - -} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt new file mode 100644 index 00000000..2bd782c0 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt @@ -0,0 +1,17 @@ +package site.archive.dto.v1.archive + +data class ArchiveListResponseDtoV1( + val archiveCount: Int, + val archives: List +) { + + private constructor(archives: List) : this(archives.size, archives) + + companion object { + @JvmStatic + fun from(archiveDtoV1s: List): ArchiveListResponseDtoV1 { + return ArchiveListResponseDtoV1(archiveDtoV1s) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.java deleted file mode 100644 index 8073587c..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.java +++ /dev/null @@ -1,12 +0,0 @@ -package site.archive.dto.v1.archive; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class EmailDuplicateResponseDtoV1 { - - private boolean isDuplicatedEmail; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt new file mode 100644 index 00000000..839b2dd6 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v1.archive + +data class EmailDuplicateResponseDtoV1(val isDuplicatedEmail: Boolean) \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/service/archive/ArchiveService.java b/archive-application/src/main/java/site/archive/service/archive/ArchiveService.java index 3be6b9c1..1ac4873f 100644 --- a/archive-application/src/main/java/site/archive/service/archive/ArchiveService.java +++ b/archive-application/src/main/java/site/archive/service/archive/ArchiveService.java @@ -19,6 +19,7 @@ import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; @@ -43,7 +44,7 @@ public class ArchiveService { public ArchiveListResponseDtoV1 getAllArchive(UserInfo userInfo) { var authorId = userInfo.getUserId(); var archiveDtos = archiveRepository.findAllByAuthorId(authorId).stream() - .map(ArchiveDtoV1::simpleFrom) + .map(ArchiveDtoV1::simpleForm) .toList(); return ArchiveListResponseDtoV1.from(archiveDtos); } @@ -60,7 +61,7 @@ public ArchiveListResponseDtoV1 getAllArchive(UserInfo userInfo) { public ArchiveListResponseDtoV1 getAllArchive(UserInfo userInfo, Long authorId) { var archiveDtos = archiveRepository.findAllByAuthorId(authorId).stream() .filter(hasViewAuthority(userInfo.getUserId())) - .map(ArchiveDtoV1::simpleFrom) + .map(ArchiveDtoV1::simpleForm) .toList(); return ArchiveListResponseDtoV1.from(archiveDtos); } @@ -106,7 +107,7 @@ public List getAllArchiveNextPage(UserInfo userInfo, Archi public ArchiveDtoV1 getOneArchiveById(Long archiveId) { var archive = archiveRepository.findById(archiveId) .orElseThrow(() -> new ResourceNotFoundException("조회하려는 아카이브가 존재하지 않습니다")); - return ArchiveDtoV1.specificFrom(archive); + return ArchiveDtoV1.specificForm(archive); } /** @@ -136,9 +137,9 @@ public void save(ArchiveDtoV1 archiveDtoV1, Long authorId) { var user = userRepository.findById(authorId) .orElseThrow(() -> new ResourceNotFoundException("아이디에 해당하는 유저가 존재하지 않습니다.")); var archive = archiveRepository.save(archiveDtoV1.toEntity(user)); - archiveDtoV1.getImages().stream() - .map(archiveImageDto -> archiveImageDto.toEntity(archive)) - .forEach(archive::addImage); + Objects.requireNonNull(archiveDtoV1.getImages()).stream() + .map(archiveImageDto -> archiveImageDto.toEntity(archive)) + .forEach(archive::addImage); } public long countArchive(UserInfo userInfo) { From 5f8c0fc5e86ca5f6480195b31fc573e7183f3687 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Thu, 19 Jan 2023 02:00:50 +0900 Subject: [PATCH 02/18] feat(#53): converted auth dto v1 classes java to kotlin --- .../dto/v1/auth/BasicRegisterCommandV1.java | 23 ----------- .../dto/v1/auth/BasicRegisterCommandV1.kt | 13 +++++++ .../archive/dto/v1/auth/LoginCommandV1.java | 17 -------- .../archive/dto/v1/auth/LoginCommandV1.kt | 3 ++ .../dto/v1/auth/OAuthRegisterCommandV1.java | 30 -------------- .../dto/v1/auth/OAuthRegisterCommandV1.kt | 20 ++++++++++ .../v1/auth/PasswordRegisterCommandV1.java | 39 ------------------- .../dto/v1/auth/PasswordRegisterCommandV1.kt | 29 ++++++++++++++ 8 files changed, 65 insertions(+), 109 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.java b/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.java deleted file mode 100644 index a79f0a1c..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.java +++ /dev/null @@ -1,23 +0,0 @@ -package site.archive.dto.v1.auth; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import site.archive.domain.user.BaseUser; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotEmpty; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public abstract class BasicRegisterCommandV1 { - - @NotEmpty(message = "필수 입력 항목입니다.") - @Email(message = "올바른 이메일을 입력해 주세요.") - private String email; - - public abstract BaseUser toUserEntity(); -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt b/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt new file mode 100644 index 00000000..e15c488f --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt @@ -0,0 +1,13 @@ +package site.archive.dto.v1.auth + +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.NotBlank +import site.archive.domain.user.BaseUser + +abstract class BasicRegisterCommandV1( + @field: NotBlank(message = "이메일은 필수 입력 항목입니다.") + @field: Email(message = "올바른 이메일을 입력해 주세요.") + val email: String, +) { + abstract fun toUserEntity(): BaseUser +} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.java b/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.java deleted file mode 100644 index 6abeda95..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.java +++ /dev/null @@ -1,17 +0,0 @@ -package site.archive.dto.v1.auth; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class LoginCommandV1 { - - private String email; - private String password; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.kt b/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.kt new file mode 100644 index 00000000..331be0e1 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v1.auth + +data class LoginCommandV1(val email: String, val password: String) \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.java b/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.java deleted file mode 100644 index 165b2ca9..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.java +++ /dev/null @@ -1,30 +0,0 @@ -package site.archive.dto.v1.auth; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import site.archive.common.ArchiveStringUtils; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.OAuthProvider; -import site.archive.domain.user.OAuthUser; -import site.archive.domain.user.UserRole; - -@NoArgsConstructor -@Getter -public class OAuthRegisterCommandV1 extends BasicRegisterCommandV1 { - - private OAuthProvider provider; - - public OAuthRegisterCommandV1(String mailAddress, OAuthProvider provider) { - super(mailAddress); - this.provider = provider; - } - - @Override - public BaseUser toUserEntity() { - return new OAuthUser(getEmail(), - UserRole.GENERAL, - provider, - ArchiveStringUtils.extractIdFromMail(getEmail())); - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt b/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt new file mode 100644 index 00000000..247a5c58 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt @@ -0,0 +1,20 @@ +package site.archive.dto.v1.auth + +import site.archive.common.extractIdFromMail +import site.archive.domain.user.BaseUser +import site.archive.domain.user.OAuthProvider +import site.archive.domain.user.OAuthUser +import site.archive.domain.user.UserRole + +class OAuthRegisterCommandV1(email: String, val provider: OAuthProvider) : BasicRegisterCommandV1(email) { + + override fun toUserEntity(): BaseUser { + return OAuthUser( + email, + UserRole.GENERAL, + provider, + extractIdFromMail(email) + ) + } + +} diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.java b/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.java deleted file mode 100644 index 373d594e..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.java +++ /dev/null @@ -1,39 +0,0 @@ -package site.archive.dto.v1.auth; - -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import site.archive.common.ArchiveStringUtils; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.PasswordUser; -import site.archive.domain.user.UserRole; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.Pattern; - -@EqualsAndHashCode(callSuper = true) -@Getter -@Setter -@NoArgsConstructor -public class PasswordRegisterCommandV1 extends BasicRegisterCommandV1 { - - @NotEmpty(message = "필수 입력 항목입니다.") - @Pattern(regexp = "(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9@$!%*#?&]{8,20}$", - message = "비밀번호는 영문/숫자 를 꼭 포함하여 8~20자리로 입력해 주세요.") - private String password; - - public PasswordRegisterCommandV1(String userMail, String password) { - super(userMail); - this.password = password; - } - - @Override - public BaseUser toUserEntity() { - return new PasswordUser(getEmail(), - UserRole.GENERAL, - getPassword(), - ArchiveStringUtils.extractIdFromMail(getEmail())); - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt b/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt new file mode 100644 index 00000000..7fde82fe --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt @@ -0,0 +1,29 @@ +package site.archive.dto.v1.auth + +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Pattern +import site.archive.common.extractIdFromMail +import site.archive.domain.user.BaseUser +import site.archive.domain.user.PasswordUser +import site.archive.domain.user.UserRole + +class PasswordRegisterCommandV1( + email: String, + @field: NotBlank(message = "비밀번호는 필수 입력 항목입니다.") + @field: Pattern( + regexp = "(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9@$!%*#?&]{8,20}$", + message = "비밀번호는 영문/숫자 를 꼭 포함하여 8~20자리로 입력해 주세요." + ) + var password: String +) : BasicRegisterCommandV1(email) { + + override fun toUserEntity(): BaseUser { + return PasswordUser( + email, + UserRole.GENERAL, + password, + extractIdFromMail(email) + ) + } + +} \ No newline at end of file From 19b594bca74a5a1c67ae80a20201834e9437f9e4 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Thu, 19 Jan 2023 02:21:39 +0900 Subject: [PATCH 03/18] feat(#53): converted user dto v1 classes java to kotlin --- .../archive/dto/v1/user/BaseUserDtoV1.java | 35 ------------------- .../site/archive/dto/v1/user/BaseUserDtoV1.kt | 35 +++++++++++++++++++ .../v1/user/OAuthRegisterRequestDtoV1.java | 23 ------------ .../dto/v1/user/OAuthRegisterRequestDtoV1.kt | 8 +++++ .../dto/v1/user/SpecificUserDtoV1.java | 32 ----------------- .../archive/dto/v1/user/SpecificUserDtoV1.kt | 33 +++++++++++++++++ .../dto/v1/user/UserEmailRequestDtoV1.java | 21 ----------- .../dto/v1/user/UserEmailRequestDtoV1.kt | 10 ++++++ .../user/UserPasswordResetRequestDtoV1.java | 33 ----------------- .../v1/user/UserPasswordResetRequestDtoV1.kt | 21 +++++++++++ 10 files changed, 107 insertions(+), 144 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt delete mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.java create mode 100644 archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.java deleted file mode 100644 index 05a86000..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.java +++ /dev/null @@ -1,35 +0,0 @@ -package site.archive.dto.v1.user; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import site.archive.common.DateTimeUtils; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.UserRole; - -import java.time.LocalDateTime; - -@RequiredArgsConstructor -@Getter -public class BaseUserDtoV1 { - - private final Long userId; - private final String mailAddress; - private final UserRole userRole; - private final LocalDateTime createdAt; - private final String profileImage; - private final String nickname; - - public static BaseUserDtoV1 from(BaseUser baseUser) { - return new BaseUserDtoV1(baseUser.getId(), - baseUser.getMailAddress(), - baseUser.getRole(), - baseUser.getCreatedAt(), - baseUser.getProfileImage(), - baseUser.getNickname()); - } - - public String getCreatedAt() { - return DateTimeUtils.getDateTimeFormatter().format(this.createdAt); - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.kt new file mode 100644 index 00000000..cd889d14 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.kt @@ -0,0 +1,35 @@ +package site.archive.dto.v1.user + +import site.archive.common.dateTimeFormatter +import site.archive.domain.user.BaseUser +import site.archive.domain.user.UserRole +import java.time.LocalDateTime + +data class BaseUserDtoV1( + val userId: Long, + val mailAddress: String, + val userRole: UserRole, + val profileImage: String, + val nickname: String, + private val createdAt: LocalDateTime +) { + + fun getCreatedAt(): String { + return dateTimeFormatter.format(createdAt) + } + + companion object { + @JvmStatic + fun from(baseUser: BaseUser): BaseUserDtoV1 { + return BaseUserDtoV1( + userId = baseUser.id, + mailAddress = baseUser.mailAddress, + userRole = baseUser.role, + createdAt = baseUser.createdAt, + profileImage = baseUser.profileImage, + nickname = baseUser.nickname + ) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.java deleted file mode 100644 index 6884b8f3..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.java +++ /dev/null @@ -1,23 +0,0 @@ -package site.archive.dto.v1.user; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -import jakarta.validation.constraints.NotNull; - -@Getter -@ToString -@NoArgsConstructor -@AllArgsConstructor -public class OAuthRegisterRequestDtoV1 { - - @NotNull - private String provider; - - @JsonProperty("providerAccessToken") - private String token; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt new file mode 100644 index 00000000..e82bdaaa --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt @@ -0,0 +1,8 @@ +package site.archive.dto.v1.user + +import com.fasterxml.jackson.annotation.JsonProperty + +data class OAuthRegisterRequestDtoV1( + val provider: String, + @field: JsonProperty("providerAccessToken") val token: String +) \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.java deleted file mode 100644 index d92a9c5d..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.java +++ /dev/null @@ -1,32 +0,0 @@ -package site.archive.dto.v1.user; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import site.archive.common.DateTimeUtils; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.UserRole; - -@RequiredArgsConstructor -@Getter -public class SpecificUserDtoV1 { - - private final Long userId; - private final String mailAddress; - private final UserRole userRole; - private final String createdAt; - private final String profileImage; - private final String nickname; - private final String userType; - - public static SpecificUserDtoV1 from(BaseUser baseUser) { - var createdAt = DateTimeUtils.getDateTimeFormatter().format(baseUser.getCreatedAt()); - return new SpecificUserDtoV1(baseUser.getId(), - baseUser.getMailAddress(), - baseUser.getRole(), - createdAt, - baseUser.getProfileImage(), - baseUser.getNickname(), - baseUser.getUserType()); - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.kt new file mode 100644 index 00000000..05621658 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.kt @@ -0,0 +1,33 @@ +package site.archive.dto.v1.user + +import site.archive.common.dateTimeFormatter +import site.archive.domain.user.BaseUser +import site.archive.domain.user.UserRole + +data class SpecificUserDtoV1( + val userId: Long, + val mailAddress: String, + val userRole: UserRole, + val createdAt: String, + val profileImage: String, + val nickname: String, + val userType: String +) { + + companion object { + @JvmStatic + fun from(baseUser: BaseUser) : SpecificUserDtoV1 { + val createdAt = dateTimeFormatter.format(baseUser.createdAt) + return SpecificUserDtoV1( + userId = baseUser.id, + mailAddress = baseUser.mailAddress, + userRole = baseUser.role, + createdAt = createdAt, + profileImage = baseUser.profileImage, + nickname = baseUser.nickname, + userType = baseUser.userType + ) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.java deleted file mode 100644 index 03a811ae..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.java +++ /dev/null @@ -1,21 +0,0 @@ -package site.archive.dto.v1.user; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class UserEmailRequestDtoV1 { - - @Email - @NotNull - @NotBlank - private String email; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt new file mode 100644 index 00000000..01aa1a1f --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt @@ -0,0 +1,10 @@ +package site.archive.dto.v1.user + +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.NotBlank + +data class UserEmailRequestDtoV1( + @field: NotBlank(message = "이메일은 필수 입력 항목입니다.") + @field: Email(message = "올바른 이메일을 입력해 주세요.") + val email: String +) \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.java b/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.java deleted file mode 100644 index f2735f90..00000000 --- a/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.java +++ /dev/null @@ -1,33 +0,0 @@ -package site.archive.dto.v1.user; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class UserPasswordResetRequestDtoV1 { - - @Email - @NotNull - @NotBlank - private String email; - - @NotNull - @NotEmpty - private String currentPassword; - - @NotNull - @NotEmpty - @Pattern(regexp = "(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9@$!%*#?&]{8,20}$", - message = "비밀번호는 영문/숫자 를 꼭 포함하여 8~20자리로 입력해 주세요.") - private String newPassword; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt b/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt new file mode 100644 index 00000000..fd561d47 --- /dev/null +++ b/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt @@ -0,0 +1,21 @@ +package site.archive.dto.v1.user + +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Pattern + +data class UserPasswordResetRequestDtoV1( + @field: NotBlank(message = "이메일은 필수 입력 항목입니다.") + @field: Email(message = "올바른 이메일을 입력해 주세요.") + val email: String, + + @field: NotBlank(message = "현재 비밀번호는 필수 입력 항목입니다.") + val currentPassword: String, + + @field: NotBlank(message = "새로운 비밀번호는 필수 입력 항목입니다.") + @field: Pattern( + regexp = "(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9@$!%*#?&]{8,20}$", + message = "비밀번호는 영문/숫자 를 꼭 포함하여 8~20자리로 입력해 주세요." + ) + val newPassword: String +) \ No newline at end of file From 1ff4dc32fbe0729214ffc50ab003829df57d94ec Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Thu, 19 Jan 2023 02:23:41 +0900 Subject: [PATCH 04/18] feat(#53): v1 dto package java to kotlin directory --- .../site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt | 0 .../{java => kotlin}/site/archive/dto/v1/archive/ArchiveDtoV1.kt | 0 .../site/archive/dto/v1/archive/ArchiveImageDtoV1.kt | 0 .../site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt | 0 .../site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt | 0 .../site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt | 0 .../site/archive/dto/v1/auth/BasicRegisterCommandV1.kt | 0 .../{java => kotlin}/site/archive/dto/v1/auth/LoginCommandV1.kt | 0 .../site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt | 0 .../site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt | 0 .../{java => kotlin}/site/archive/dto/v1/user/BaseUserDtoV1.kt | 0 .../site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt | 0 .../site/archive/dto/v1/user/SpecificUserDtoV1.kt | 0 .../site/archive/dto/v1/user/UserEmailRequestDtoV1.kt | 0 .../site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/archive/ArchiveDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/auth/LoginCommandV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/user/BaseUserDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/user/SpecificUserDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt (100%) rename archive-application/src/main/{java => kotlin}/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt (100%) diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveCountResponseDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageUrlResponseDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveListResponseDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/auth/BasicRegisterCommandV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/auth/LoginCommandV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/auth/LoginCommandV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/auth/LoginCommandV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/auth/OAuthRegisterCommandV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/user/BaseUserDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/user/SpecificUserDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/user/UserEmailRequestDtoV1.kt diff --git a/archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt similarity index 100% rename from archive-application/src/main/java/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt rename to archive-application/src/main/kotlin/site/archive/dto/v1/user/UserPasswordResetRequestDtoV1.kt From 285db7e127c9276bd4e525eb2c3f2e2d744ba8a9 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Fri, 20 Jan 2023 10:10:09 +0900 Subject: [PATCH 05/18] feat(#53): converted application config classes java to kotlin --- .../archive/config/AsyncConfiguration.java | 64 ------------------- .../site/archive/config/ClientConfig.java | 27 -------- .../site/archive/config/AsyncConfiguration.kt | 54 ++++++++++++++++ .../site/archive/config/ClientConfig.kt | 32 ++++++++++ 4 files changed, 86 insertions(+), 91 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/config/AsyncConfiguration.java delete mode 100644 archive-application/src/main/java/site/archive/config/ClientConfig.java create mode 100644 archive-application/src/main/kotlin/site/archive/config/AsyncConfiguration.kt create mode 100644 archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt diff --git a/archive-application/src/main/java/site/archive/config/AsyncConfiguration.java b/archive-application/src/main/java/site/archive/config/AsyncConfiguration.java deleted file mode 100644 index e17c8d37..00000000 --- a/archive-application/src/main/java/site/archive/config/AsyncConfiguration.java +++ /dev/null @@ -1,64 +0,0 @@ -package site.archive.config; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; -import lombok.extern.slf4j.Slf4j; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.AsyncConfigurer; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.Executor; - -@Configuration -@EnableConfigurationProperties(AsyncConfiguration.MailExecutorProperty.class) -@EnableAsync -@RequiredArgsConstructor -@Slf4j -public class AsyncConfiguration implements AsyncConfigurer { - - private final MailExecutorProperty mailExecutorProperty; - - @Override - @Bean("mailExecutor") - public Executor getAsyncExecutor() { - var executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(mailExecutorProperty.getCorePoolSize()); - executor.setMaxPoolSize(mailExecutorProperty.getMaxPoolSize()); - executor.setQueueCapacity(mailExecutorProperty.getQueueCapacity()); - executor.setAwaitTerminationSeconds(mailExecutorProperty.getAwaitTerminationSeconds()); - executor.setWaitForTasksToCompleteOnShutdown(true); - executor.setThreadNamePrefix(MailExecutorProperty.THREAD_NAME_PREFIX); - executor.initialize(); - return executor; - } - - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return (exception, method, params) -> - log.error("Async Exception handler: '{}' threw unexpected exception ", - method.toGenericString(), exception); - } - - @ConfigurationProperties(prefix = "spring.mail.executor") - @AllArgsConstructor - @Getter - @ToString - public static class MailExecutorProperty { - - private static final String THREAD_NAME_PREFIX = "mail-executor-"; - - private int corePoolSize; - private int maxPoolSize; - private int queueCapacity; - private int awaitTerminationSeconds; - - } - -} diff --git a/archive-application/src/main/java/site/archive/config/ClientConfig.java b/archive-application/src/main/java/site/archive/config/ClientConfig.java deleted file mode 100644 index 12ca5446..00000000 --- a/archive-application/src/main/java/site/archive/config/ClientConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package site.archive.config; - -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.BufferingClientHttpRequestFactory; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - -import java.nio.charset.StandardCharsets; -import java.time.Duration; - -@Configuration -public class ClientConfig { - - @Bean - public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { - return restTemplateBuilder - .requestFactory(() -> new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())) - .setConnectTimeout(Duration.ofMillis(3000)) - .setReadTimeout(Duration.ofMillis(3000)) - .additionalMessageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8)) - .build(); - } - -} diff --git a/archive-application/src/main/kotlin/site/archive/config/AsyncConfiguration.kt b/archive-application/src/main/kotlin/site/archive/config/AsyncConfiguration.kt new file mode 100644 index 00000000..cd3ad22b --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/config/AsyncConfiguration.kt @@ -0,0 +1,54 @@ +package site.archive.config + +import org.slf4j.LoggerFactory +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.scheduling.annotation.AsyncConfigurer +import org.springframework.scheduling.annotation.EnableAsync +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor +import site.archive.config.AsyncConfiguration.MailExecutorProperty +import java.lang.reflect.Method +import java.util.concurrent.Executor + +@Configuration +@EnableConfigurationProperties(MailExecutorProperty::class) +@EnableAsync +class AsyncConfiguration(val mailExecutorProperty: MailExecutorProperty) : AsyncConfigurer { + + private val log = LoggerFactory.getLogger(javaClass) + + @Bean("mailExecutor") + override fun getAsyncExecutor(): Executor? { + val executor = ThreadPoolTaskExecutor() + executor.corePoolSize = mailExecutorProperty.corePoolSize + executor.maxPoolSize = mailExecutorProperty.maxPoolSize + executor.queueCapacity = mailExecutorProperty.queueCapacity + executor.setAwaitTerminationSeconds(mailExecutorProperty.awaitTerminationSeconds) + executor.setWaitForTasksToCompleteOnShutdown(true) + executor.setThreadNamePrefix(MailExecutorProperty.THREAD_NAME_PREFIX) + executor.initialize() + return executor + } + + override fun getAsyncUncaughtExceptionHandler(): AsyncUncaughtExceptionHandler? { + return AsyncUncaughtExceptionHandler { exception: Throwable?, method: Method, _: Array? -> + log.error("Async Exception handler: '{}' threw unexpected exception ", method.toGenericString(), exception) + } + } + + @ConfigurationProperties(prefix = "spring.mail.executor") + class MailExecutorProperty( + val corePoolSize: Int = 0, + val maxPoolSize: Int = 0, + val queueCapacity: Int = 0, + val awaitTerminationSeconds: Int = 0 + ) { + companion object { + const val THREAD_NAME_PREFIX = "mail-executor-" + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt b/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt new file mode 100644 index 00000000..2e3aac8f --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt @@ -0,0 +1,32 @@ +package site.archive.config + +import org.springframework.boot.web.client.RestTemplateBuilder +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.http.client.BufferingClientHttpRequestFactory +import org.springframework.http.client.SimpleClientHttpRequestFactory +import org.springframework.http.converter.StringHttpMessageConverter +import org.springframework.web.client.RestTemplate +import java.nio.charset.StandardCharsets +import java.time.Duration +import java.util.function.Supplier + +@Configuration +class ClientConfig { + + @Bean + fun restTemplateBuilder(): RestTemplateBuilder { + return RestTemplateBuilder() + } + + @Bean + fun restTemplate(restTemplateBuilder: RestTemplateBuilder): RestTemplate { + return restTemplateBuilder + .requestFactory(Supplier { BufferingClientHttpRequestFactory(SimpleClientHttpRequestFactory()) }) + .setConnectTimeout(Duration.ofMillis(3000)) + .setReadTimeout(Duration.ofMillis(3000)) + .additionalMessageConverters(StringHttpMessageConverter(StandardCharsets.UTF_8)) + .build() + } + +} \ No newline at end of file From 1888bdf102239c8456466fa9f26b61d818d8ccac Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sat, 21 Jan 2023 23:57:46 +0900 Subject: [PATCH 06/18] feat(#53): converted dto v2 classes java to kotlin --- .../dto/v2/ArchiveCommunityResponseDto.java | 53 --------------- .../site/archive/dto/v2/ArchiveDtoV2.java | 66 ------------------- .../dto/v2/ArchiveLikeListResponseDto.java | 17 ----- .../dto/v2/ArchiveLikeResponseDto.java | 53 --------------- .../site/archive/dto/v2/LikesRequestDto.java | 14 ---- .../dto/v2/MyArchiveListResponseDto.java | 22 ------- .../archive/dto/v2/MyArchiveResponseDto.java | 47 ------------- .../dto/v2/ArchiveCommunityResponseDto.kt | 47 +++++++++++++ .../site/archive/dto/v2/ArchiveDtoV2.kt | 49 ++++++++++++++ .../dto/v2/ArchiveLikeListResponseDto.kt | 3 + .../archive/dto/v2/ArchiveLikeResponseDto.kt | 45 +++++++++++++ .../site/archive/dto/v2/LikesRequestDto.kt | 3 + .../dto/v2/MyArchiveListResponseDto.kt | 13 ++++ .../archive/dto/v2/MyArchiveResponseDto.kt | 41 ++++++++++++ 14 files changed, 201 insertions(+), 272 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ArchiveCommunityResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ArchiveDtoV2.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeListResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/LikesRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/MyArchiveListResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/MyArchiveResponseDto.java create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt diff --git a/archive-application/src/main/java/site/archive/dto/v2/ArchiveCommunityResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/ArchiveCommunityResponseDto.java deleted file mode 100644 index b5149d34..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ArchiveCommunityResponseDto.java +++ /dev/null @@ -1,53 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import site.archive.common.DateTimeUtils; -import site.archive.domain.archive.Archive; -import site.archive.domain.archive.CoverImageType; -import site.archive.domain.archive.Emotion; - -@RequiredArgsConstructor -@Builder -@Getter -public class ArchiveCommunityResponseDto { - - private final Long archiveId; - private final String name; - private final String watchedOn; - private final Emotion emotion; - private final String mainImage; - private final CoverImageType coverImageType; - private final Long authorId; - private final String authorNickname; - private final String authorProfileImage; - private final Boolean isLiked; - private final Long likeCount; - private final Long dateMilli; - - public static ArchiveCommunityResponseDto from(Archive archive, Long currentUserIdx, long dateMilli) { - var author = archive.getAuthor(); - var isLiked = archive.getLikes().stream() - .anyMatch(like -> !like.getIsDeleted() && like.getUser().getId().equals(currentUserIdx)); - var likeCount = archive.getLikes().stream() - .filter(like -> !like.getIsDeleted()).count(); - return ArchiveCommunityResponseDto.builder() - .archiveId(archive.getId()) - .name(archive.getName()) - .watchedOn(archive.getWatchedOn().format(DateTimeUtils.getYymmddFormatter())) - .emotion(archive.getEmotion()) - .mainImage(archive.getMainImage()) - .coverImageType(archive.getCoverImageType()) - .authorId(author.getId()) - .authorNickname(author.getNickname()) - .authorProfileImage(author.getProfileImage()) - .isLiked(isLiked) - .likeCount(likeCount) - .dateMilli(dateMilli) - .build(); - } - -} - - diff --git a/archive-application/src/main/java/site/archive/dto/v2/ArchiveDtoV2.java b/archive-application/src/main/java/site/archive/dto/v2/ArchiveDtoV2.java deleted file mode 100644 index bbbb1597..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ArchiveDtoV2.java +++ /dev/null @@ -1,66 +0,0 @@ -package site.archive.dto.v2; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import site.archive.common.DateTimeUtils; -import site.archive.domain.archive.Archive; -import site.archive.domain.archive.CoverImageType; -import site.archive.domain.archive.Emotion; -import site.archive.dto.v1.archive.ArchiveImageDtoV1; - -import java.util.List; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Builder -@JsonInclude(JsonInclude.Include.NON_NULL) -public class ArchiveDtoV2 { - - private Long archiveId; - private String name; - private String watchedOn; - private Emotion emotion; - private String mainImage; - private Boolean isPublic; // Default value is false - private CoverImageType coverImageType; // Default value is EMOTION_COVER - - private long authorId; - private String nickname; - private String profileImage; - - private List companions; - private List images; - - /** - * 아카이브 상세 조회 DTO V2 - * 아카이브 작가의 닉네임, 프로필이미지 포함 - * 아카이브 연결 이미지들을 다 포함 - * - * @param archive Archive Entity - * @return ArchiveDtoV2 archive specific DTO - */ - public static ArchiveDtoV2 specificFrom(Archive archive) { - var archiveImages = archive.getArchiveImages().stream() - .map(ArchiveImageDtoV1::from) - .toList(); - var author = archive.getAuthor(); - return ArchiveDtoV2.builder() - .archiveId(archive.getId()) - .name(archive.getName()) - .watchedOn(archive.getWatchedOn().format(DateTimeUtils.getYymmddFormatter())) - .emotion(archive.getEmotion()) - .mainImage(archive.getMainImage()) - .companions(archive.getCompanions()) - .images(archiveImages) - .authorId(author.getId()) - .nickname(author.getNickname()) - .profileImage(author.getProfileImage()) - .isPublic(archive.getIsPublic()) - .coverImageType(archive.getCoverImageType()) - .build(); - } -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeListResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeListResponseDto.java deleted file mode 100644 index 1ea4768f..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeListResponseDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -@RequiredArgsConstructor -@Getter -public class ArchiveLikeListResponseDto { - - private final Integer archiveCount; - private final List archives; - -} - - diff --git a/archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeResponseDto.java deleted file mode 100644 index 04062190..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ArchiveLikeResponseDto.java +++ /dev/null @@ -1,53 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; -import site.archive.common.DateTimeUtils; -import site.archive.domain.archive.Archive; -import site.archive.domain.archive.CoverImageType; -import site.archive.domain.archive.Emotion; - -@RequiredArgsConstructor -@Builder -@Getter -@ToString -public class ArchiveLikeResponseDto { - - private final Long archiveId; - private final String name; - private final String watchedOn; - private final Emotion emotion; - private final String mainImage; - private final CoverImageType coverImageType; - private final Long authorId; - private final String authorNickname; - private final String authorProfileImage; - private final Boolean isLiked; - private final Long likeCount; - - public static ArchiveLikeResponseDto from(Archive archive, Long currentUserIdx) { - var author = archive.getAuthor(); - var isLiked = archive.getLikes().stream() - .anyMatch(like -> !like.getIsDeleted() && like.getUser().getId().equals(currentUserIdx)); - var likeCount = archive.getLikes().stream() - .filter(like -> !like.getIsDeleted()).count(); - return ArchiveLikeResponseDto.builder() - .archiveId(archive.getId()) - .name(archive.getName()) - .watchedOn(archive.getWatchedOn().format(DateTimeUtils.getYymmddFormatter())) - .emotion(archive.getEmotion()) - .mainImage(archive.getMainImage()) - .coverImageType(archive.getCoverImageType()) - .authorId(author.getId()) - .authorNickname(author.getNickname()) - .authorProfileImage(author.getProfileImage()) - .isLiked(isLiked) - .likeCount(likeCount) - .build(); - } - -} - - diff --git a/archive-application/src/main/java/site/archive/dto/v2/LikesRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/LikesRequestDto.java deleted file mode 100644 index 2bb36c82..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/LikesRequestDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -@NoArgsConstructor -@Getter -public class LikesRequestDto { - - private List archiveIds; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/MyArchiveListResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/MyArchiveListResponseDto.java deleted file mode 100644 index 103215a8..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/MyArchiveListResponseDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Getter; - -import java.util.List; - -@Getter -public class MyArchiveListResponseDto { - - private final Long archiveCount; - private final List archives; - - private MyArchiveListResponseDto(Long archiveCount, List archives) { - this.archiveCount = archiveCount; - this.archives = archives; - } - - public static MyArchiveListResponseDto from(Long archiveCount, List archiveDtos) { - return new MyArchiveListResponseDto(archiveCount, archiveDtos); - } - -} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v2/MyArchiveResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/MyArchiveResponseDto.java deleted file mode 100644 index 80149e77..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/MyArchiveResponseDto.java +++ /dev/null @@ -1,47 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import site.archive.common.DateTimeUtils; -import site.archive.domain.archive.Archive; -import site.archive.domain.archive.CoverImageType; -import site.archive.domain.archive.Emotion; - -@RequiredArgsConstructor -@Builder -@Getter -public class MyArchiveResponseDto { - - private final Long archiveId; - private final String name; - private final String watchedOn; - private final Emotion emotion; - private final String mainImage; - private final Boolean isPublic; - private final CoverImageType coverImageType; - private final Long authorId; - private final Long likeCount; - private final Long dateMilli; - - public static MyArchiveResponseDto from(Archive archive, long dateMilli) { - var author = archive.getAuthor(); - var likeCount = archive.getLikes().stream() - .filter(like -> !like.getIsDeleted()).count(); - return MyArchiveResponseDto.builder() - .archiveId(archive.getId()) - .name(archive.getName()) - .watchedOn(archive.getWatchedOn().format(DateTimeUtils.getYymmddFormatter())) - .emotion(archive.getEmotion()) - .mainImage(archive.getMainImage()) - .isPublic(archive.getIsPublic()) - .coverImageType(archive.getCoverImageType()) - .authorId(author.getId()) - .likeCount(likeCount) - .dateMilli(dateMilli) - .build(); - } - -} - - diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt new file mode 100644 index 00000000..de7313d0 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt @@ -0,0 +1,47 @@ +package site.archive.dto.v2 + +import site.archive.common.yymmddFormatter +import site.archive.domain.archive.Archive +import site.archive.domain.archive.CoverImageType +import site.archive.domain.archive.Emotion + +class ArchiveCommunityResponseDto( + val archiveId: Long, + val name: String, + val watchedOn: String, + val emotion: Emotion, + val mainImage: String, + val coverImageType: CoverImageType, + val authorId: Long, + val authorNickname: String, + val authorProfileImage: String, + val isLiked: Boolean, + val likeCount: Long, + val dateMilli: Long +) { + companion object { + @JvmStatic + fun from(archive: Archive, currentUserIdx: Long, dateMilli: Long): ArchiveCommunityResponseDto { + val author = archive.author + val isLiked = archive.likes.stream() + .anyMatch { !it.isDeleted && it.user.id.equals(currentUserIdx) } + val likeCount = archive.likes.stream() + .filter { !it.isDeleted } + .count() + return ArchiveCommunityResponseDto( + archiveId = archive.id, + name = archive.name, + watchedOn = archive.watchedOn.format(yymmddFormatter), + emotion = archive.emotion, + mainImage = archive.mainImage, + coverImageType = archive.coverImageType, + authorId = author.id, + authorNickname = author.nickname, + authorProfileImage = author.profileImage, + isLiked = isLiked, + likeCount = likeCount, + dateMilli = dateMilli + ) + } + } +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt new file mode 100644 index 00000000..a156d832 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt @@ -0,0 +1,49 @@ +package site.archive.dto.v2 + +import com.fasterxml.jackson.annotation.JsonInclude +import site.archive.common.yymmddFormatter +import site.archive.domain.archive.Archive +import site.archive.domain.archive.CoverImageType +import site.archive.domain.archive.Emotion +import site.archive.dto.v1.archive.ArchiveImageDtoV1 + +@JsonInclude(JsonInclude.Include.NON_NULL) +class ArchiveDtoV2( + val archiveId: Long, + val name: String, + val watchedOn: String, + val emotion: Emotion, + val mainImage: String, + val isPublic: Boolean, + val coverImageType: CoverImageType, + val authorId: Long, + val nickname: String, + val profileImage: String, + val companions: List? = null, + val images: List? = null +) { + companion object { + @JvmStatic + fun specificFrom(archive: Archive): ArchiveDtoV2 { + val archiveImages = archive.archiveImages.stream() + .map(ArchiveImageDtoV1::from) + .toList() + val author = archive.author + return ArchiveDtoV2( + archiveId = archive.id, + name = archive.name, + watchedOn = archive.watchedOn.format(yymmddFormatter), + emotion = archive.emotion, + mainImage = archive.mainImage, + companions = archive.companions, + images = archiveImages, + authorId = author.id, + nickname = author.nickname, + profileImage = author.profileImage, + isPublic = archive.isPublic, + coverImageType = archive.coverImageType + ) + } + + } +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt new file mode 100644 index 00000000..3f108336 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +class ArchiveLikeListResponseDto(val archiveCount: Int, val archives: List) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt new file mode 100644 index 00000000..d744ffbf --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt @@ -0,0 +1,45 @@ +package site.archive.dto.v2 + +import site.archive.common.yymmddFormatter +import site.archive.domain.archive.Archive +import site.archive.domain.archive.CoverImageType +import site.archive.domain.archive.Emotion + +class ArchiveLikeResponseDto( + val archiveId: Long, + val name: String, + val watchedOn: String, + val emotion: Emotion, + val mainImage: String, + val coverImageType: CoverImageType, + val authorId: Long, + val authorNickname: String, + val authorProfileImage: String, + val isLiked: Boolean, + val likeCount: Long +) { + companion object { + @JvmStatic + fun from(archive: Archive, currentUserIdx: Long): ArchiveLikeResponseDto { + val author = archive.author + val isLiked = archive.likes.stream() + .anyMatch { !it.isDeleted && it.user.id.equals(currentUserIdx) } + val likeCount = archive.likes.stream() + .filter { !it.isDeleted } + .count() + return ArchiveLikeResponseDto( + archiveId = archive.id, + name = archive.name, + watchedOn = archive.watchedOn.format(yymmddFormatter), + emotion = archive.emotion, + mainImage = archive.mainImage, + coverImageType = archive.coverImageType, + authorId = author.id, + authorNickname = author.nickname, + authorProfileImage = author.profileImage, + isLiked = isLiked, + likeCount = likeCount + ) + } + } +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt new file mode 100644 index 00000000..f8a92eb3 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +class LikesRequestDto(val archiveIds: List) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt new file mode 100644 index 00000000..cd9e381c --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt @@ -0,0 +1,13 @@ +package site.archive.dto.v2 + +class MyArchiveListResponseDto( + val archiveCount: Long, + val archives: List +) { + companion object { + @JvmStatic + fun from(archiveCount: Long, archiveDtos: List): MyArchiveListResponseDto { + return MyArchiveListResponseDto(archiveCount, archiveDtos) + } + } +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt new file mode 100644 index 00000000..5b9d8cc5 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt @@ -0,0 +1,41 @@ +package site.archive.dto.v2 + +import site.archive.common.yymmddFormatter +import site.archive.domain.archive.Archive +import site.archive.domain.archive.CoverImageType +import site.archive.domain.archive.Emotion + +class MyArchiveResponseDto( + val archiveId: Long, + val name: String, + val watchedOn: String, + val emotion: Emotion, + val mainImage: String, + val isPublic: Boolean, + val coverImageType: CoverImageType, + val authorId: Long, + val likeCount: Long, + val dateMilli: Long +) { + companion object { + @JvmStatic + fun from(archive: Archive, dateMilli: Long): MyArchiveResponseDto { + val author = archive.author + val likeCount = archive.likes.stream() + .filter { !it.isDeleted } + .count() + return MyArchiveResponseDto( + archiveId = archive.id, + name = archive.name, + watchedOn = archive.watchedOn.format(yymmddFormatter), + emotion = archive.emotion, + mainImage = archive.mainImage, + isPublic = archive.isPublic, + coverImageType = archive.coverImageType, + authorId = author.id, + likeCount = likeCount, + dateMilli = dateMilli + ) + } + } +} \ No newline at end of file From 388314f62e4a44d260b77f9492ca42c892da6e1f Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 00:29:06 +0900 Subject: [PATCH 07/18] feat(#53): converted dto v2 classes java to kotlin --- .../dto/v2/ArchiveCountResponseDto.java | 4 -- .../archive/dto/v2/BannerListResponseDto.java | 6 --- .../archive/dto/v2/BannerResponseDto.java | 13 ------- .../dto/v2/NicknameDuplicateResponseDto.java | 4 -- .../archive/dto/v2/OAuthLoginRequestDto.java | 22 ----------- .../dto/v2/OAuthRegisterRequestDto.java | 27 ------------- .../dto/v2/OAuthUserInfoRequestDto.java | 27 ------------- .../dto/v2/PasswordRegisterRequestDto.java | 39 ------------------- .../archive/dto/v2/ReportCheckResponse.java | 4 -- .../site/archive/dto/v2/ReportRequestDto.java | 12 ------ .../archive/dto/v2/UnlikesRequestDto.java | 14 ------- .../dto/v2/UserNicknameUpdateRequest.java | 4 -- .../dto/v2/ArchiveCommunityResponseDto.kt | 2 +- .../archive/dto/v2/ArchiveCountResponseDto.kt | 3 ++ .../site/archive/dto/v2/ArchiveDtoV2.kt | 2 +- .../dto/v2/ArchiveLikeListResponseDto.kt | 2 +- .../archive/dto/v2/ArchiveLikeResponseDto.kt | 2 +- .../archive/dto/v2/BannerListResponseDto.kt | 3 ++ .../site/archive/dto/v2/BannerResponseDto.kt | 18 +++++++++ .../site/archive/dto/v2/LikesRequestDto.kt | 2 +- .../dto/v2/MyArchiveListResponseDto.kt | 2 +- .../archive/dto/v2/MyArchiveResponseDto.kt | 2 +- .../dto/v2/NicknameDuplicateResponseDto.kt | 3 ++ .../archive/dto/v2/OAuthLoginRequestDto.kt | 13 +++++++ .../archive/dto/v2/OAuthRegisterRequestDto.kt | 18 +++++++++ .../archive/dto/v2/OAuthUserInfoRequestDto.kt | 16 ++++++++ .../dto/v2/PasswordRegisterRequestDto.kt | 34 ++++++++++++++++ .../archive/dto/v2/ReportCheckResponse.kt | 3 ++ .../site/archive/dto/v2/ReportRequestDto.kt | 3 ++ .../site/archive/dto/v2/UnlikesRequestDto.kt | 3 ++ .../dto/v2/UserNicknameUpdateRequest.kt | 3 ++ .../service/archive/ArchiveServiceTest.java | 2 +- .../archive/web/api/v2/UserControllerV2.java | 2 +- 33 files changed, 129 insertions(+), 185 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ArchiveCountResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/BannerListResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/BannerResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/NicknameDuplicateResponseDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/OAuthLoginRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/OAuthRegisterRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/OAuthUserInfoRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/PasswordRegisterRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ReportCheckResponse.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/ReportRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/UnlikesRequestDto.java delete mode 100644 archive-application/src/main/java/site/archive/dto/v2/UserNicknameUpdateRequest.java create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCountResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/BannerListResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/BannerResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/NicknameDuplicateResponseDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/OAuthLoginRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/OAuthRegisterRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/OAuthUserInfoRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/PasswordRegisterRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ReportCheckResponse.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/ReportRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/UnlikesRequestDto.kt create mode 100644 archive-application/src/main/kotlin/site/archive/dto/v2/UserNicknameUpdateRequest.kt diff --git a/archive-application/src/main/java/site/archive/dto/v2/ArchiveCountResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/ArchiveCountResponseDto.java deleted file mode 100644 index f841822c..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ArchiveCountResponseDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package site.archive.dto.v2; - -public record ArchiveCountResponseDto(Long count) { -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/BannerListResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/BannerListResponseDto.java deleted file mode 100644 index 250c7a37..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/BannerListResponseDto.java +++ /dev/null @@ -1,6 +0,0 @@ -package site.archive.dto.v2; - -import java.util.List; - -public record BannerListResponseDto(List banners) { -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/BannerResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/BannerResponseDto.java deleted file mode 100644 index d33043ce..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/BannerResponseDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package site.archive.dto.v2; - -import site.archive.domain.banner.Banner; - -public record BannerResponseDto(String type, String summaryImage, String mainContent) { - - public static BannerResponseDto from(Banner banner) { - return new BannerResponseDto(banner.getType().toString(), - banner.getSummaryImage(), - banner.getMainContent()); - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/NicknameDuplicateResponseDto.java b/archive-application/src/main/java/site/archive/dto/v2/NicknameDuplicateResponseDto.java deleted file mode 100644 index f54ba1b9..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/NicknameDuplicateResponseDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package site.archive.dto.v2; - -public record NicknameDuplicateResponseDto(boolean isDuplicatedNickname) { -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/OAuthLoginRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/OAuthLoginRequestDto.java deleted file mode 100644 index 554801ce..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/OAuthLoginRequestDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package site.archive.dto.v2; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import jakarta.validation.constraints.NotEmpty; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class OAuthLoginRequestDto { - - @NotEmpty(message = "Oauth provider는 필수 값입니다.") - private String provider; - - @NotEmpty(message = "Provider access token은 필수 값입니다.") - @JsonProperty("providerAccessToken") - private String token; - -} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v2/OAuthRegisterRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/OAuthRegisterRequestDto.java deleted file mode 100644 index c95996eb..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/OAuthRegisterRequestDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package site.archive.dto.v2; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.OAuthProvider; -import site.archive.domain.user.OAuthUser; -import site.archive.domain.user.UserRole; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class OAuthRegisterRequestDto { - - private OAuthProvider provider; - private String email; - private String nickname; - - public BaseUser toUserEntity() { - return new OAuthUser(this.email, - UserRole.GENERAL, - this.provider, - this.nickname); - } - -} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v2/OAuthUserInfoRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/OAuthUserInfoRequestDto.java deleted file mode 100644 index b4c521ae..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/OAuthUserInfoRequestDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package site.archive.dto.v2; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -import jakarta.validation.constraints.NotEmpty; - -@Getter -@ToString -@NoArgsConstructor -@AllArgsConstructor -public class OAuthUserInfoRequestDto { - - @NotEmpty(message = "Oauth provider는 필수 값입니다.") - private String provider; - - @NotEmpty(message = "Provider access token은 필수 값입니다.") - @JsonProperty("providerAccessToken") - private String token; - - @NotEmpty(message = "닉네임은 필수 값입니다.") - private String nickname; - -} \ No newline at end of file diff --git a/archive-application/src/main/java/site/archive/dto/v2/PasswordRegisterRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/PasswordRegisterRequestDto.java deleted file mode 100644 index 29177956..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/PasswordRegisterRequestDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package site.archive.dto.v2; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.PasswordUser; -import site.archive.domain.user.UserRole; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.Pattern; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class PasswordRegisterRequestDto { - - @NotEmpty(message = "이메일은 필수 값입니다.") - @Email(message = "올바른 이메일을 입력해 주세요.") - private String email; - - @NotEmpty(message = "패스워드는 필수 값입니다.") - @Pattern(regexp = "(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9@$!%*#?&]{8,20}$", - message = "비밀번호는 영문/숫자 를 꼭 포함하여 8~20자리로 입력해 주세요.") - private String password; - - @NotEmpty(message = "닉네임은 필수 값입니다.") - private String nickname; - - public BaseUser toUserEntity() { - return new PasswordUser(this.email, UserRole.GENERAL, this.password, this.nickname); - } - - public void updatePasswordToEncrypt(String encryptPassword) { - this.password = encryptPassword; - } - -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/ReportCheckResponse.java b/archive-application/src/main/java/site/archive/dto/v2/ReportCheckResponse.java deleted file mode 100644 index c5e3b8b1..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ReportCheckResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package site.archive.dto.v2; - -public record ReportCheckResponse(Boolean isReported) { -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/ReportRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/ReportRequestDto.java deleted file mode 100644 index cd26249f..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/ReportRequestDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@Getter -public class ReportRequestDto { - - private String reason; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/UnlikesRequestDto.java b/archive-application/src/main/java/site/archive/dto/v2/UnlikesRequestDto.java deleted file mode 100644 index b4cb69f2..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/UnlikesRequestDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package site.archive.dto.v2; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -@NoArgsConstructor -@Getter -public class UnlikesRequestDto { - - private List archiveIds; - -} diff --git a/archive-application/src/main/java/site/archive/dto/v2/UserNicknameUpdateRequest.java b/archive-application/src/main/java/site/archive/dto/v2/UserNicknameUpdateRequest.java deleted file mode 100644 index 852fac45..00000000 --- a/archive-application/src/main/java/site/archive/dto/v2/UserNicknameUpdateRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package site.archive.dto.v2; - -public record UserNicknameUpdateRequest(String nickname) { -} diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt index de7313d0..2dff1ede 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCommunityResponseDto.kt @@ -5,7 +5,7 @@ import site.archive.domain.archive.Archive import site.archive.domain.archive.CoverImageType import site.archive.domain.archive.Emotion -class ArchiveCommunityResponseDto( +data class ArchiveCommunityResponseDto( val archiveId: Long, val name: String, val watchedOn: String, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCountResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCountResponseDto.kt new file mode 100644 index 00000000..42525ac4 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveCountResponseDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class ArchiveCountResponseDto(val count: Long) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt index a156d832..561e892e 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt @@ -8,7 +8,7 @@ import site.archive.domain.archive.Emotion import site.archive.dto.v1.archive.ArchiveImageDtoV1 @JsonInclude(JsonInclude.Include.NON_NULL) -class ArchiveDtoV2( +data class ArchiveDtoV2( val archiveId: Long, val name: String, val watchedOn: String, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt index 3f108336..90bb6701 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeListResponseDto.kt @@ -1,3 +1,3 @@ package site.archive.dto.v2 -class ArchiveLikeListResponseDto(val archiveCount: Int, val archives: List) \ No newline at end of file +data class ArchiveLikeListResponseDto(val archiveCount: Int, val archives: List) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt index d744ffbf..7408dac3 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveLikeResponseDto.kt @@ -5,7 +5,7 @@ import site.archive.domain.archive.Archive import site.archive.domain.archive.CoverImageType import site.archive.domain.archive.Emotion -class ArchiveLikeResponseDto( +data class ArchiveLikeResponseDto( val archiveId: Long, val name: String, val watchedOn: String, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/BannerListResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/BannerListResponseDto.kt new file mode 100644 index 00000000..8f62a97f --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/BannerListResponseDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class BannerListResponseDto(val banners: List) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/BannerResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/BannerResponseDto.kt new file mode 100644 index 00000000..c170dadc --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/BannerResponseDto.kt @@ -0,0 +1,18 @@ +package site.archive.dto.v2 + +import site.archive.domain.banner.Banner + +data class BannerResponseDto(val type: String, val summaryImage: String, val mainContent: String) { + + companion object { + @JvmStatic + fun from(banner: Banner): BannerResponseDto { + return BannerResponseDto( + banner.type.toString(), + banner.summaryImage, + banner.mainContent + ) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt index f8a92eb3..d84a356e 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/LikesRequestDto.kt @@ -1,3 +1,3 @@ package site.archive.dto.v2 -class LikesRequestDto(val archiveIds: List) \ No newline at end of file +data class LikesRequestDto(val archiveIds: List) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt index cd9e381c..e2e660c7 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveListResponseDto.kt @@ -1,6 +1,6 @@ package site.archive.dto.v2 -class MyArchiveListResponseDto( +data class MyArchiveListResponseDto( val archiveCount: Long, val archives: List ) { diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt index 5b9d8cc5..788d0529 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/MyArchiveResponseDto.kt @@ -5,7 +5,7 @@ import site.archive.domain.archive.Archive import site.archive.domain.archive.CoverImageType import site.archive.domain.archive.Emotion -class MyArchiveResponseDto( +data class MyArchiveResponseDto( val archiveId: Long, val name: String, val watchedOn: String, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/NicknameDuplicateResponseDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/NicknameDuplicateResponseDto.kt new file mode 100644 index 00000000..60e5bf53 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/NicknameDuplicateResponseDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class NicknameDuplicateResponseDto(val isDuplicatedNickname: Boolean) diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthLoginRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthLoginRequestDto.kt new file mode 100644 index 00000000..7d818af4 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthLoginRequestDto.kt @@ -0,0 +1,13 @@ +package site.archive.dto.v2 + +import com.fasterxml.jackson.annotation.JsonProperty +import jakarta.validation.constraints.NotBlank + +data class OAuthLoginRequestDto( + @NotBlank(message = "Oauth provider는 필수 값입니다.") + val provider: String, + + @NotBlank(message = "Provider access token은 필수 값입니다.") + @JsonProperty("providerAccessToken") + val token: String +) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthRegisterRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthRegisterRequestDto.kt new file mode 100644 index 00000000..19f5c484 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthRegisterRequestDto.kt @@ -0,0 +1,18 @@ +package site.archive.dto.v2 + +import site.archive.domain.user.BaseUser +import site.archive.domain.user.OAuthProvider +import site.archive.domain.user.OAuthUser +import site.archive.domain.user.UserRole + +data class OAuthRegisterRequestDto( + val provider: OAuthProvider, + val email: String, + val nickname: String +) { + + fun toUserEntity(): BaseUser { + return OAuthUser(email, UserRole.GENERAL, provider, nickname) + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthUserInfoRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthUserInfoRequestDto.kt new file mode 100644 index 00000000..d0829c4a --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/OAuthUserInfoRequestDto.kt @@ -0,0 +1,16 @@ +package site.archive.dto.v2 + +import com.fasterxml.jackson.annotation.JsonProperty +import jakarta.validation.constraints.NotBlank + +data class OAuthUserInfoRequestDto( + @NotBlank(message = "Oauth provider는 필수 값입니다.") + val provider: String, + + @NotBlank(message = "Provider access token은 필수 값입니다.") + @JsonProperty("providerAccessToken") + val token: String, + + @NotBlank(message = "닉네임은 필수 값입니다.") + val nickname: String +) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/PasswordRegisterRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/PasswordRegisterRequestDto.kt new file mode 100644 index 00000000..dfd7830a --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/PasswordRegisterRequestDto.kt @@ -0,0 +1,34 @@ +package site.archive.dto.v2 + +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Pattern +import site.archive.domain.user.BaseUser +import site.archive.domain.user.PasswordUser +import site.archive.domain.user.UserRole + +data class PasswordRegisterRequestDto( + @NotBlank(message = "이메일은 필수 값입니다.") + @Email(message = "올바른 이메일을 입력해 주세요.") + val email: String, + + @NotBlank(message = "닉네임은 필수 값입니다.") + val nickname: String, + + @NotBlank(message = "패스워드는 필수 값입니다.") + @Pattern( + regexp = "(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z\\d@$!%*#?&]{8,20}$", + message = "비밀번호는 영문/숫자 를 꼭 포함하여 8~20자리로 입력해 주세요." + ) + var password: String +) { + + fun toUserEntity(): BaseUser { + return PasswordUser(email, UserRole.GENERAL, password, nickname) + } + + fun updatePasswordToEncrypt(encryptPassword: String) { + password = encryptPassword + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ReportCheckResponse.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ReportCheckResponse.kt new file mode 100644 index 00000000..07d39969 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ReportCheckResponse.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class ReportCheckResponse(val isReported: Boolean) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ReportRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ReportRequestDto.kt new file mode 100644 index 00000000..adfe5b0e --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ReportRequestDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class ReportRequestDto(val reason: String) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/UnlikesRequestDto.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/UnlikesRequestDto.kt new file mode 100644 index 00000000..77b74685 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/UnlikesRequestDto.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class UnlikesRequestDto(val archiveIds: List) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/UserNicknameUpdateRequest.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/UserNicknameUpdateRequest.kt new file mode 100644 index 00000000..1620bbef --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/UserNicknameUpdateRequest.kt @@ -0,0 +1,3 @@ +package site.archive.dto.v2 + +data class UserNicknameUpdateRequest(val nickname: String) \ No newline at end of file diff --git a/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java b/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java index 4ec49349..75741192 100644 --- a/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java +++ b/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java @@ -113,7 +113,7 @@ void canViewOnlyPublicArchiveWhenOtherArchive() { assertThat(allArchives.getArchiveCount()).isEqualTo(archivePublicCount); allArchives.getArchives() .forEach(archiveDto -> { - assertThat(archiveDto.getIsPublic()).isTrue(); + assertThat(archiveDto.isPublic()).isTrue(); assertThat(archiveDto.getAuthorId()).isEqualTo(USER_ID); }); } diff --git a/archive-web/src/main/java/site/archive/web/api/v2/UserControllerV2.java b/archive-web/src/main/java/site/archive/web/api/v2/UserControllerV2.java index fc39e3df..d1ed0f95 100644 --- a/archive-web/src/main/java/site/archive/web/api/v2/UserControllerV2.java +++ b/archive-web/src/main/java/site/archive/web/api/v2/UserControllerV2.java @@ -38,7 +38,7 @@ public ResponseEntity checkDuplicatedNickname(@Req @PutMapping("/nickname") public ResponseEntity updateProfileNickname(@RequestUser UserInfo user, @RequestBody UserNicknameUpdateRequest request) { - userService.updateUserNickname(user.getUserId(), request.nickname()); + userService.updateUserNickname(user.getUserId(), request.getNickname()); return ResponseEntity.noContent().build(); } From 1244b2fafdc8bdb16b0d8c069fb6c401c6379644 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 02:10:21 +0900 Subject: [PATCH 08/18] feat(#53): converted Like Service java to kotlin --- .../archive/service/like/LikeService.java | 57 ------------------- .../site/archive/service/like/LikeService.kt | 49 ++++++++++++++++ 2 files changed, 49 insertions(+), 57 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/service/like/LikeService.java create mode 100644 archive-application/src/main/kotlin/site/archive/service/like/LikeService.kt diff --git a/archive-application/src/main/java/site/archive/service/like/LikeService.java b/archive-application/src/main/java/site/archive/service/like/LikeService.java deleted file mode 100644 index cdb2df81..00000000 --- a/archive-application/src/main/java/site/archive/service/like/LikeService.java +++ /dev/null @@ -1,57 +0,0 @@ -package site.archive.service.like; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.common.exception.common.ResourceNotFoundException; -import site.archive.domain.common.BaseTimeEntity; -import site.archive.domain.like.Like; -import site.archive.domain.like.LikeRepository; - -import java.util.List; - -@Service -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class LikeService { - - private final LikeRepository likeRepository; - - @Transactional - public void save(Long userId, Long archiveId) { - likeRepository.findByUserIdAndArchiveId(userId, archiveId) - .ifPresentOrElse(BaseTimeEntity::softDeleteCancel, - () -> likeRepository.save(Like.of(userId, archiveId))); - } - - @Transactional - public void save(Long userId, List archiveIds) { - archiveIds.forEach(archiveId -> likeRepository.findByUserIdAndArchiveId(userId, archiveId) - .ifPresentOrElse(BaseTimeEntity::softDeleteCancel, - () -> likeRepository.save(Like.of(userId, archiveId)))); - } - - @Transactional - public void delete(Long userId, Long archiveId) { - likeRepository.findByUserIdAndArchiveId(userId, archiveId) - .ifPresentOrElse(likeRepository::delete, - () -> {throw new ResourceNotFoundException("조건에 맞는 Like 데이터가 없습니다");}); - } - - @Transactional - public void delete(Long userId, List archiveIds) { - archiveIds.forEach(archiveId -> likeRepository.findByUserIdAndArchiveId(userId, archiveId) - .ifPresentOrElse(likeRepository::delete, - () -> { - throw new ResourceNotFoundException("조건에 맞는 Like 데이터가 없습니다"); - })); - } - - public List likeArchiveIds(Long userId) { - return likeRepository.findAllByUserId(userId).stream() - .filter(like -> !like.getIsDeleted()) - .map(like -> like.getArchive().getId()) - .toList(); - } - -} diff --git a/archive-application/src/main/kotlin/site/archive/service/like/LikeService.kt b/archive-application/src/main/kotlin/site/archive/service/like/LikeService.kt new file mode 100644 index 00000000..59a35a0b --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/like/LikeService.kt @@ -0,0 +1,49 @@ +package site.archive.service.like + +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.common.exception.common.ResourceNotFoundException +import site.archive.domain.common.BaseTimeEntity +import site.archive.domain.like.Like +import site.archive.domain.like.LikeRepository + +@Service +@Transactional(readOnly = true) +class LikeService(private val likeRepository: LikeRepository) { + + @Transactional + fun save(userId: Long, archiveId: Long) { + likeRepository.findByUserIdAndArchiveId(userId, archiveId) + .ifPresentOrElse(BaseTimeEntity::softDeleteCancel) { likeRepository.save(Like.of(userId, archiveId)) } + } + + @Transactional + fun save(userId: Long, archiveIds: List) { + archiveIds.forEach { + likeRepository.findByUserIdAndArchiveId(userId, it) + .ifPresentOrElse(BaseTimeEntity::softDeleteCancel) { likeRepository.save(Like.of(userId, it)) } + } + } + + @Transactional + fun delete(userId: Long, archiveId: Long) { + likeRepository.findByUserIdAndArchiveId(userId, archiveId) + .ifPresentOrElse(likeRepository::delete) { throw ResourceNotFoundException("조건에 맞는 Like 데이터가 없습니다") } + } + + @Transactional + fun delete(userId: Long, archiveIds: List) { + archiveIds.forEach { + likeRepository.findByUserIdAndArchiveId(userId, it) + .ifPresentOrElse(likeRepository::delete) { throw ResourceNotFoundException("조건에 맞는 Like 데이터가 없습니다") } + } + } + + fun likeArchiveIds(userId: Long): List { + return likeRepository.findAllByUserId(userId) + .filter { !it.isDeleted } + .map { it.archive.id } + .toList() + } + +} \ No newline at end of file From a9e0a42dab5efd1cfb94a38d771aa72c948bf919 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 02:10:28 +0900 Subject: [PATCH 09/18] feat(#53): converted Report Service java to kotlin --- .../archive/service/report/ReportService.java | 37 ------------------- .../archive/service/report/ReportService.kt | 33 +++++++++++++++++ 2 files changed, 33 insertions(+), 37 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/service/report/ReportService.java create mode 100644 archive-application/src/main/kotlin/site/archive/service/report/ReportService.kt diff --git a/archive-application/src/main/java/site/archive/service/report/ReportService.java b/archive-application/src/main/java/site/archive/service/report/ReportService.java deleted file mode 100644 index f58c55e7..00000000 --- a/archive-application/src/main/java/site/archive/service/report/ReportService.java +++ /dev/null @@ -1,37 +0,0 @@ -package site.archive.service.report; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import site.archive.domain.common.BaseTimeEntity; -import site.archive.domain.report.Report; -import site.archive.domain.report.ReportRepository; - -import jakarta.transaction.Transactional; - -@Service -@RequiredArgsConstructor -public class ReportService { - - private final ReportRepository reportRepository; - - public boolean isReportedBy(Long archiveId, Long userId) { - return reportRepository.findByArchiveIdAndUserId(archiveId, userId) - .filter(report -> !report.getIsDeleted()) - .isPresent(); - } - - @Transactional - public void reportArchive(Long archiveId, Long userId, String reason) { - var report = reportRepository.findByArchiveIdAndUserId(archiveId, userId) - .orElseGet(() -> Report.of(reason, archiveId, userId)); - report.softDeleteCancel(); - reportRepository.save(report); - } - - @Transactional - public void cancelReportArchive(Long archiveId, Long userId) { - reportRepository.findByArchiveIdAndUserId(archiveId, userId) - .ifPresent(BaseTimeEntity::softDelete); - } - -} diff --git a/archive-application/src/main/kotlin/site/archive/service/report/ReportService.kt b/archive-application/src/main/kotlin/site/archive/service/report/ReportService.kt new file mode 100644 index 00000000..40251d62 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/report/ReportService.kt @@ -0,0 +1,33 @@ +package site.archive.service.report + +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.domain.common.BaseTimeEntity +import site.archive.domain.report.Report +import site.archive.domain.report.ReportRepository + +@Service +@Transactional(readOnly = true) +class ReportService(private val reportRepository: ReportRepository) { + + fun isReportedBy(archiveId: Long, userId: Long): Boolean { + return reportRepository.findByArchiveIdAndUserId(archiveId, userId) + .filter { !it.isDeleted } + .isPresent + } + + @Transactional + fun reportArchive(archiveId: Long, userId: Long, reason: String) { + val report = reportRepository.findByArchiveIdAndUserId(archiveId, userId) + .orElseGet { Report.of(reason, archiveId, userId) } + report.softDeleteCancel() + reportRepository.save(report) + } + + @Transactional + fun cancelReportArchive(archiveId: Long, userId: Long) { + reportRepository.findByArchiveIdAndUserId(archiveId, userId) + .ifPresent(BaseTimeEntity::softDelete) + } + +} \ No newline at end of file From 3567db54e04ecc0ff27ec69cd7c83a1eaa37c4cd Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 02:11:38 +0900 Subject: [PATCH 10/18] feat(#53): set logging level of hibernate for logging query - temporary because Spring Boot DataSource Decorator (net.ttddyy.dsproxy.listener) is not working at Spring boot 3.0 --- archive-web/src/main/resources/logback-spring.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/archive-web/src/main/resources/logback-spring.xml b/archive-web/src/main/resources/logback-spring.xml index dd6dbba0..e3d38dac 100644 --- a/archive-web/src/main/resources/logback-spring.xml +++ b/archive-web/src/main/resources/logback-spring.xml @@ -88,12 +88,23 @@ + + + + + + + + + + + From d15f2584dbe92204d462dfae7a1af3fc1e76e4d3 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 13:41:39 +0900 Subject: [PATCH 11/18] feat(#53): converted banner service classes java to kotlin --- .../archive/service/banner/BannerService.java | 39 ------------------- .../archive/service/banner/BannerService.kt | 33 ++++++++++++++++ 2 files changed, 33 insertions(+), 39 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/service/banner/BannerService.java create mode 100644 archive-application/src/main/kotlin/site/archive/service/banner/BannerService.kt diff --git a/archive-application/src/main/java/site/archive/service/banner/BannerService.java b/archive-application/src/main/java/site/archive/service/banner/BannerService.java deleted file mode 100644 index b5584155..00000000 --- a/archive-application/src/main/java/site/archive/service/banner/BannerService.java +++ /dev/null @@ -1,39 +0,0 @@ -package site.archive.service.banner; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.domain.banner.Banner; -import site.archive.domain.banner.BannerRepository; -import site.archive.domain.banner.BannerType; -import site.archive.dto.v2.BannerListResponseDto; -import site.archive.dto.v2.BannerResponseDto; - -@Service -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class BannerService { - - private final BannerRepository bannerRepository; - - public BannerListResponseDto getAllBanner() { - var bannerResponse = bannerRepository.findAllByOrderByCreatedAtDesc().stream() - .map(banner -> new BannerResponseDto(banner.getType().toString(), - banner.getSummaryImage(), - banner.getMainContent())) - .toList(); - return new BannerListResponseDto(bannerResponse); - } - - @Transactional - public BannerResponseDto createBanner(String summaryImageUri, String mainContent, BannerType type) { - var banner = bannerRepository.save(new Banner(summaryImageUri, mainContent, type)); - return BannerResponseDto.from(banner); - } - - @Transactional - public void deleteBanner(Long bannerId) { - bannerRepository.deleteById(bannerId); - } - -} diff --git a/archive-application/src/main/kotlin/site/archive/service/banner/BannerService.kt b/archive-application/src/main/kotlin/site/archive/service/banner/BannerService.kt new file mode 100644 index 00000000..197fdbfc --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/banner/BannerService.kt @@ -0,0 +1,33 @@ +package site.archive.service.banner + +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.domain.banner.Banner +import site.archive.domain.banner.BannerRepository +import site.archive.domain.banner.BannerType +import site.archive.dto.v2.BannerListResponseDto +import site.archive.dto.v2.BannerResponseDto + +@Service +@Transactional(readOnly = true) +class BannerService(val bannerRepository: BannerRepository) { + + fun getAllBanner(): BannerListResponseDto { + val bannerResponse = bannerRepository.findAllByOrderByCreatedAtDesc() + .map { BannerResponseDto(it.type.toString(), it.summaryImage, it.mainContent) } + .toList() + return BannerListResponseDto(bannerResponse) + } + + @Transactional + fun createBanner(summaryImageUri: String, mainContent: String, type: BannerType): BannerResponseDto { + val banner = bannerRepository.save(Banner(summaryImageUri, mainContent, type)) + return BannerResponseDto.from(banner) + } + + @Transactional + fun deleteBanner(bannerId: Long) { + bannerRepository.deleteById(bannerId) + } + +} \ No newline at end of file From 7ad0d73e0dd96edaf58c9a5dc983403ff6a2e80f Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 13:41:47 +0900 Subject: [PATCH 12/18] feat(#53): converted messaging service classes java to kotlin --- .../site/archive/service/message/MessagingService.java | 9 --------- .../site/archive/service/message/MessagingService.kt | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/service/message/MessagingService.java create mode 100644 archive-application/src/main/kotlin/site/archive/service/message/MessagingService.kt diff --git a/archive-application/src/main/java/site/archive/service/message/MessagingService.java b/archive-application/src/main/java/site/archive/service/message/MessagingService.java deleted file mode 100644 index f2241de5..00000000 --- a/archive-application/src/main/java/site/archive/service/message/MessagingService.java +++ /dev/null @@ -1,9 +0,0 @@ -package site.archive.service.message; - -import site.archive.dto.v1.user.BaseUserDtoV1; - -public interface MessagingService { - - void sendUserRegisterMessage(BaseUserDtoV1 user, String registerType); - -} diff --git a/archive-application/src/main/kotlin/site/archive/service/message/MessagingService.kt b/archive-application/src/main/kotlin/site/archive/service/message/MessagingService.kt new file mode 100644 index 00000000..5cf3946d --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/message/MessagingService.kt @@ -0,0 +1,9 @@ +package site.archive.service.message + +import site.archive.dto.v1.user.BaseUserDtoV1 + +interface MessagingService { + + fun sendUserRegisterMessage(user: BaseUserDtoV1, registerType: String) + +} \ No newline at end of file From 0e3c52a3b2e4dcdf22e07246770eda302b5bc7dc Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 14:35:41 +0900 Subject: [PATCH 13/18] feat(#53): converted user service classes java to kotlin --- .../archive/service/user/UserAuthService.java | 83 ------------------- .../service/user/UserProfileImageService.java | 20 ----- .../service/user/UserRegisterServiceV1.java | 58 ------------- .../service/user/UserRegisterServiceV2.java | 47 ----------- .../archive/service/user/UserService.java | 60 -------------- .../archive/service/user/UserAuthService.kt | 78 +++++++++++++++++ .../service/user/UserProfileImageService.kt | 16 ++++ .../service/user/UserRegisterServiceV1.kt | 59 +++++++++++++ .../service/user/UserRegisterServiceV2.kt | 47 +++++++++++ .../site/archive/service/user/UserService.kt | 58 +++++++++++++ 10 files changed, 258 insertions(+), 268 deletions(-) delete mode 100644 archive-application/src/main/java/site/archive/service/user/UserAuthService.java delete mode 100644 archive-application/src/main/java/site/archive/service/user/UserProfileImageService.java delete mode 100644 archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV1.java delete mode 100644 archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV2.java delete mode 100644 archive-application/src/main/java/site/archive/service/user/UserService.java create mode 100644 archive-application/src/main/kotlin/site/archive/service/user/UserAuthService.kt create mode 100644 archive-application/src/main/kotlin/site/archive/service/user/UserProfileImageService.kt create mode 100644 archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV1.kt create mode 100644 archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV2.kt create mode 100644 archive-application/src/main/kotlin/site/archive/service/user/UserService.kt diff --git a/archive-application/src/main/java/site/archive/service/user/UserAuthService.java b/archive-application/src/main/java/site/archive/service/user/UserAuthService.java deleted file mode 100644 index cf37cd54..00000000 --- a/archive-application/src/main/java/site/archive/service/user/UserAuthService.java +++ /dev/null @@ -1,83 +0,0 @@ -package site.archive.service.user; - -import lombok.RequiredArgsConstructor; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.common.exception.common.ResourceNotFoundException; -import site.archive.common.exception.common.UnauthorizedResourceException; -import site.archive.common.exception.user.LoginFailException; -import site.archive.common.exception.user.OAuthUserHasNotPasswordException; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.PasswordUser; -import site.archive.domain.user.PasswordUserRepository; -import site.archive.domain.user.UserInfo; -import site.archive.domain.user.UserRepository; -import site.archive.dto.v1.auth.LoginCommandV1; -import site.archive.dto.v1.user.UserPasswordResetRequestDtoV1; -import site.archive.infra.mail.MailService; - -import java.util.Objects; - -@Service -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class UserAuthService { - - private final UserRepository userRepository; - private final PasswordUserRepository passwordUserRepository; - private final PasswordEncoder encoder; - private final MailService mailService; - - public UserInfo tryLoginAndReturnInfo(LoginCommandV1 command) throws LoginFailException { - var user = verifyPasswordReturnUser(command.getEmail(), command.getPassword()); - return user.convertToUserInfo(); - } - - @Transactional - public void updateTemporaryPassword(final String email, final String temporaryPassword) { - var passwordUser = userRepository.findByMailAddress(email) - .map(this::convertPasswordUser) - .orElseThrow(() -> new ResourceNotFoundException("Email")); - passwordUser.updatePassword(encoder.encode(temporaryPassword), true); - mailService.sendTemporaryPassword(email, temporaryPassword); - } - - @Transactional - public void resetPassword(UserInfo userInfo, UserPasswordResetRequestDtoV1 userPasswordResetRequestDtoV1) { - if (!Objects.equals(userInfo.getMailAddress(), userPasswordResetRequestDtoV1.getEmail())) { - throw new UnauthorizedResourceException("해당 이메일에 대한 비밀번호 초기화 권한이 없습니다."); - } - this.resetPassword(userPasswordResetRequestDtoV1); - } - - @Transactional - public void resetPassword(UserPasswordResetRequestDtoV1 userPasswordResetRequestDtoV1) { - var passwordUser = verifyPasswordReturnUser( - userPasswordResetRequestDtoV1.getEmail(), userPasswordResetRequestDtoV1.getCurrentPassword()); - passwordUser.updatePassword(encoder.encode(userPasswordResetRequestDtoV1.getNewPassword()), false); - } - - public boolean isTemporaryPasswordLogin(long userId) { - return passwordUserRepository.findById(userId) - .map(PasswordUser::isCurrentTemporaryPassword) - .orElse(false); - } - - private PasswordUser verifyPasswordReturnUser(final String email, final String password) { - var user = passwordUserRepository.findByMailAddress(email) - .orElseThrow(() -> new ResourceNotFoundException("Email")); - if (!encoder.matches(password, user.getPassword())) { - throw new LoginFailException("비밀번호가 다릅니다"); - } - return user; - } - - private PasswordUser convertPasswordUser(BaseUser user) { - if (!(user instanceof PasswordUser)) { - throw new OAuthUserHasNotPasswordException(); - } - return (PasswordUser) user; - } - -} diff --git a/archive-application/src/main/java/site/archive/service/user/UserProfileImageService.java b/archive-application/src/main/java/site/archive/service/user/UserProfileImageService.java deleted file mode 100644 index e9b3f0c4..00000000 --- a/archive-application/src/main/java/site/archive/service/user/UserProfileImageService.java +++ /dev/null @@ -1,20 +0,0 @@ -package site.archive.service.user; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.domain.user.UserRepository; - -@Service -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class UserProfileImageService { - - private final UserRepository userRepository; - - @Transactional - public void updateUserProfileImage(Long userId, String profileImageUri) { - userRepository.updateUserProfileImage(userId, profileImageUri); - } - -} diff --git a/archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV1.java b/archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV1.java deleted file mode 100644 index 034b7a48..00000000 --- a/archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV1.java +++ /dev/null @@ -1,58 +0,0 @@ -package site.archive.service.user; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.common.exception.common.DuplicateResourceException; -import site.archive.domain.user.BaseUser; -import site.archive.domain.user.PasswordUser; -import site.archive.domain.user.UserInfo; -import site.archive.domain.user.UserRepository; -import site.archive.dto.v1.auth.BasicRegisterCommandV1; -import site.archive.dto.v1.auth.OAuthRegisterCommandV1; -import site.archive.dto.v1.user.BaseUserDtoV1; -import site.archive.service.message.MessagingService; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class UserRegisterServiceV1 { - - private final UserRepository userRepository; - private final MessagingService messagingService; - - public long getOrRegisterUser(BasicRegisterCommandV1 registerCommand) { - var user = userRepository.findByMailAddress(registerCommand.getEmail()) - .orElseGet(() -> registerUser(registerCommand)); - return user.getId(); - } - - public UserInfo getOrRegisterUserReturnInfo(BasicRegisterCommandV1 registerCommand) { - var user = userRepository.findByMailAddress(registerCommand.getEmail()) - .orElseGet(() -> registerUser(registerCommand)); - return user.convertToUserInfo(); - } - - public BaseUser registerUser(BasicRegisterCommandV1 registerCommand) { - try { - var user = userRepository.save(registerCommand.toUserEntity()); - sendRegisterNotification(registerCommand, user); - return user; - } catch (DataIntegrityViolationException e) { - throw new DuplicateResourceException("이메일이 이미 존재합니다."); - } - } - - private void sendRegisterNotification(BasicRegisterCommandV1 registerCommand, BaseUser user) { - if (registerCommand instanceof OAuthRegisterCommandV1 oAuthRegisterCommand) { - var oauthProvider = oAuthRegisterCommand.getProvider().getRegistrationId(); - messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), oauthProvider); - } else { - messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), PasswordUser.PASSWORD_TYPE); - } - } - -} diff --git a/archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV2.java b/archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV2.java deleted file mode 100644 index 77503f08..00000000 --- a/archive-application/src/main/java/site/archive/service/user/UserRegisterServiceV2.java +++ /dev/null @@ -1,47 +0,0 @@ -package site.archive.service.user; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.common.exception.common.DuplicateResourceException; -import site.archive.domain.user.PasswordUser; -import site.archive.domain.user.UserInfo; -import site.archive.domain.user.UserRepository; -import site.archive.dto.v1.user.BaseUserDtoV1; -import site.archive.dto.v2.OAuthRegisterRequestDto; -import site.archive.dto.v2.PasswordRegisterRequestDto; -import site.archive.service.message.MessagingService; - -@Service -@Transactional -@Slf4j -@RequiredArgsConstructor -public class UserRegisterServiceV2 { - - private final UserRepository userRepository; - private final MessagingService messagingService; - - public UserInfo registerUser(PasswordRegisterRequestDto registerRequest) { - try { - var user = userRepository.save(registerRequest.toUserEntity()); - messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), PasswordUser.PASSWORD_TYPE); - return user.convertToUserInfo(); - } catch (DataIntegrityViolationException e) { - throw new DuplicateResourceException("이메일 또는 닉네임이 중복되었습니다. 중복을 다시 확인해주세요."); - } - } - - public UserInfo registerUser(OAuthRegisterRequestDto registerCommand) { - try { - var user = userRepository.save(registerCommand.toUserEntity()); - var oauthProvider = registerCommand.getProvider().getRegistrationId(); - messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), oauthProvider); - return user.convertToUserInfo(); - } catch (DataIntegrityViolationException e) { - throw new DuplicateResourceException("이메일 또는 닉네임이 중복되었습니다. 중복을 다시 확인해주세요."); - } - } - -} diff --git a/archive-application/src/main/java/site/archive/service/user/UserService.java b/archive-application/src/main/java/site/archive/service/user/UserService.java deleted file mode 100644 index 823b862b..00000000 --- a/archive-application/src/main/java/site/archive/service/user/UserService.java +++ /dev/null @@ -1,60 +0,0 @@ -package site.archive.service.user; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import site.archive.common.exception.common.DuplicateFieldValueException; -import site.archive.common.exception.common.ResourceNotFoundException; -import site.archive.domain.user.UserRepository; -import site.archive.dto.v1.user.BaseUserDtoV1; -import site.archive.dto.v1.user.SpecificUserDtoV1; - -@Service -@Transactional(readOnly = true) -@Slf4j -@RequiredArgsConstructor -public class UserService { - - private final UserRepository userRepository; - - public BaseUserDtoV1 findUserById(long userId) { - return userRepository.findById(userId) - .map(BaseUserDtoV1::from) - .orElseThrow(() -> new ResourceNotFoundException("아이디에 해당하는 유저가 존재하지 않습니다.")); - } - - public BaseUserDtoV1 findUserByEmail(String email) { - return userRepository.findByMailAddress(email) - .map(BaseUserDtoV1::from) - .orElseThrow(() -> new ResourceNotFoundException("가입되지 않은 Email 입니다.")); - } - - public SpecificUserDtoV1 findSpecificUserById(long userId) { - var user = userRepository.findById(userId) - .orElseThrow(() -> new ResourceNotFoundException("아이디에 해당하는 유저가 존재하지 않습니다.")); - return SpecificUserDtoV1.from(user); - } - - public boolean existsEmail(String email) { - return userRepository.findByMailAddress(email).isPresent(); - } - - public boolean existsNickname(String nickname) { - return userRepository.findByNickname(nickname).isPresent(); - } - - @Transactional - public void deleteUser(long userId) { - userRepository.deleteById(userId); - } - - @Transactional - public void updateUserNickname(long userId, String nickname) { - if (existsNickname(nickname)) { - throw new DuplicateFieldValueException("nickname", nickname); - } - userRepository.updateNickName(userId, nickname); - } - -} diff --git a/archive-application/src/main/kotlin/site/archive/service/user/UserAuthService.kt b/archive-application/src/main/kotlin/site/archive/service/user/UserAuthService.kt new file mode 100644 index 00000000..bc7862aa --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/user/UserAuthService.kt @@ -0,0 +1,78 @@ +package site.archive.service.user + +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.common.exception.common.ResourceNotFoundException +import site.archive.common.exception.common.UnauthorizedResourceException +import site.archive.common.exception.user.LoginFailException +import site.archive.common.exception.user.OAuthUserHasNotPasswordException +import site.archive.domain.user.BaseUser +import site.archive.domain.user.PasswordUser +import site.archive.domain.user.PasswordUserRepository +import site.archive.domain.user.UserInfo +import site.archive.domain.user.UserRepository +import site.archive.dto.v1.auth.LoginCommandV1 +import site.archive.dto.v1.user.UserPasswordResetRequestDtoV1 +import site.archive.infra.mail.MailService + +@Service +@Transactional(readOnly = true) +class UserAuthService( + val userRepository: UserRepository, + val passwordUserRepository: PasswordUserRepository, + val encoder: PasswordEncoder, + val mailService: MailService +) { + + fun tryLoginAndReturnInfo(command: LoginCommandV1): UserInfo { + val user = verifyPasswordReturnUser(command.email, command.password) + return user.convertToUserInfo() + } + + @Transactional + fun updateTemporaryPassword(email: String, temporaryPassword: String) { + val passwordUser = userRepository.findByMailAddress(email) + .map { convertPasswordUser(it) } + .orElseThrow { ResourceNotFoundException("Email") } + passwordUser.updatePassword(encoder.encode(temporaryPassword), true) + mailService.sendTemporaryPassword(email, temporaryPassword) + } + + @Transactional + fun resetPassword(userInfo: UserInfo, userPasswordResetRequestDtoV1: UserPasswordResetRequestDtoV1) { + if (userInfo.mailAddress != userPasswordResetRequestDtoV1.email) { + throw UnauthorizedResourceException("해당 이메일에 대한 비밀번호 초기화 권한이 없습니다.") + } + this.resetPassword(userPasswordResetRequestDtoV1) + } + + @Transactional + fun resetPassword(userPasswordResetRequestDtoV1: UserPasswordResetRequestDtoV1) { + val passwordUser = verifyPasswordReturnUser(userPasswordResetRequestDtoV1.email, userPasswordResetRequestDtoV1.currentPassword) + passwordUser.updatePassword(encoder.encode(userPasswordResetRequestDtoV1.newPassword), false) + } + + fun isTemporaryPasswordLogin(userId: Long): Boolean { + return passwordUserRepository.findById(userId) + .map(PasswordUser::isCurrentTemporaryPassword) + .orElse(false) + } + + private fun verifyPasswordReturnUser(email: String, password: String): PasswordUser { + val user = passwordUserRepository.findByMailAddress(email) + .orElseThrow { ResourceNotFoundException("Email") } + if (!encoder.matches(password, user.password)) { + throw LoginFailException("비밀번호가 다릅니다") + } + return user + } + + private fun convertPasswordUser(user: BaseUser): PasswordUser { + if (user !is PasswordUser) { + throw OAuthUserHasNotPasswordException() + } + return user + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/service/user/UserProfileImageService.kt b/archive-application/src/main/kotlin/site/archive/service/user/UserProfileImageService.kt new file mode 100644 index 00000000..bbc84cf8 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/user/UserProfileImageService.kt @@ -0,0 +1,16 @@ +package site.archive.service.user + +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.domain.user.UserRepository + +@Service +@Transactional(readOnly = true) +class UserProfileImageService(val userRepository: UserRepository) { + + @Transactional + fun updateUserProfileImage(userId: Long, profileImageUri: String) { + userRepository.updateUserProfileImage(userId, profileImageUri) + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV1.kt b/archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV1.kt new file mode 100644 index 00000000..2f7bd75e --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV1.kt @@ -0,0 +1,59 @@ +package site.archive.service.user + +import org.slf4j.LoggerFactory +import org.springframework.dao.DataIntegrityViolationException +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.common.exception.common.DuplicateResourceException +import site.archive.domain.user.BaseUser +import site.archive.domain.user.PasswordUser +import site.archive.domain.user.UserInfo +import site.archive.domain.user.UserRepository +import site.archive.dto.v1.auth.BasicRegisterCommandV1 +import site.archive.dto.v1.auth.OAuthRegisterCommandV1 +import site.archive.dto.v1.user.BaseUserDtoV1 +import site.archive.service.message.MessagingService + +@Service +@Transactional(readOnly = true) +class UserRegisterServiceV1(val userRepository: UserRepository, val messagingService: MessagingService) { + + private val log = LoggerFactory.getLogger(javaClass) + + + @Transactional + fun getOrRegisterUser(registerCommand: BasicRegisterCommandV1): Long { + val user = userRepository.findByMailAddress(registerCommand.email) + .orElseGet { registerUser(registerCommand) } + return user.id + } + + @Transactional + fun getOrRegisterUserReturnInfo(registerCommand: BasicRegisterCommandV1): UserInfo { + val user = userRepository.findByMailAddress(registerCommand.email) + .orElseGet { registerUser(registerCommand) } + return user.convertToUserInfo() + } + + @Transactional + fun registerUser(registerCommand: BasicRegisterCommandV1): BaseUser { + try { + val user = userRepository.save(registerCommand.toUserEntity()) + sendRegisterNotification(registerCommand, user) + return user + } catch (e: DataIntegrityViolationException) { + log.error("[v1] 이메일이 이미 존재합니다.", e) + throw DuplicateResourceException("이메일이 이미 존재합니다.") + } + } + + private fun sendRegisterNotification(registerCommand: BasicRegisterCommandV1, user: BaseUser) { + if (registerCommand is OAuthRegisterCommandV1) { + val oauthProvider = registerCommand.provider.registrationId + messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), oauthProvider) + } else { + messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), PasswordUser.PASSWORD_TYPE) + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV2.kt b/archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV2.kt new file mode 100644 index 00000000..58e07615 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/user/UserRegisterServiceV2.kt @@ -0,0 +1,47 @@ +package site.archive.service.user + +import org.slf4j.LoggerFactory +import org.springframework.dao.DataIntegrityViolationException +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.common.exception.common.DuplicateResourceException +import site.archive.domain.user.PasswordUser +import site.archive.domain.user.UserInfo +import site.archive.domain.user.UserRepository +import site.archive.dto.v1.user.BaseUserDtoV1 +import site.archive.dto.v2.OAuthRegisterRequestDto +import site.archive.dto.v2.PasswordRegisterRequestDto +import site.archive.service.message.MessagingService + +@Service +@Transactional(readOnly = true) +class UserRegisterServiceV2(val userRepository: UserRepository, val messagingService: MessagingService) { + + private val log = LoggerFactory.getLogger(javaClass) + + @Transactional + fun registerUser(registerRequest: PasswordRegisterRequestDto): UserInfo { + try { + val user = userRepository.save(registerRequest.toUserEntity()) + messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), PasswordUser.PASSWORD_TYPE) + return user.convertToUserInfo() + } catch (e: DataIntegrityViolationException) { + log.error("[v2] 이메일 또는 닉네임이 중복되었습니다.", e) + throw DuplicateResourceException("이메일 또는 닉네임이 중복되었습니다. 중복을 다시 확인해주세요.") + } + } + + @Transactional + fun registerUser(registerCommand: OAuthRegisterRequestDto): UserInfo { + try { + val user = userRepository.save(registerCommand.toUserEntity()) + val oAuthProvider = registerCommand.provider.registrationId + messagingService.sendUserRegisterMessage(BaseUserDtoV1.from(user), oAuthProvider) + return user.convertToUserInfo() + } catch (e: DataIntegrityViolationException) { + log.error("[v2] 이메일 또는 닉네임이 중복되었습니다.", e) + throw DuplicateResourceException("이메일 또는 닉네임이 중복되었습니다. 중복을 다시 확인해주세요.") + } + } + +} \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/service/user/UserService.kt b/archive-application/src/main/kotlin/site/archive/service/user/UserService.kt new file mode 100644 index 00000000..e4a2cc79 --- /dev/null +++ b/archive-application/src/main/kotlin/site/archive/service/user/UserService.kt @@ -0,0 +1,58 @@ +package site.archive.service.user + +import org.slf4j.LoggerFactory +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import site.archive.common.exception.common.DuplicateFieldValueException +import site.archive.common.exception.common.ResourceNotFoundException +import site.archive.domain.user.UserRepository +import site.archive.dto.v1.user.BaseUserDtoV1 +import site.archive.dto.v1.user.SpecificUserDtoV1 + +@Service +@Transactional(readOnly = true) +class UserService(val userRepository: UserRepository) { + + private val log = LoggerFactory.getLogger(javaClass) + + fun findUserById(userId: Long): BaseUserDtoV1 { + return userRepository.findById(userId) + .map(BaseUserDtoV1::from) + .orElseThrow { ResourceNotFoundException("아이디에 해당하는 유저가 존재하지 않습니다.") } + } + + fun findUserByEmail(email: String): BaseUserDtoV1 { + return userRepository.findByMailAddress(email) + .map(BaseUserDtoV1::from) + .orElseThrow { ResourceNotFoundException("가입되지 않은 Email 입니다.") } + } + + fun findSpecificUserById(userId: Long): SpecificUserDtoV1 { + val user = userRepository.findById(userId) + .orElseThrow { ResourceNotFoundException("아이디에 해당하는 유저가 존재하지 않습니다.") } + return SpecificUserDtoV1.from(user) + } + + fun existsEmail(email: String): Boolean { + return userRepository.findByMailAddress(email).isPresent + } + + fun existsNickname(nickname: String): Boolean { + return userRepository.findByNickname(nickname).isPresent + } + + @Transactional + fun deleteUser(userId: Long) { + log.info("User($userId)이 탈퇴했습니다") + userRepository.deleteById(userId) + } + + @Transactional + fun updateUserNickname(userId: Long, nickname: String) { + if (existsNickname(nickname)) { + throw DuplicateFieldValueException("nickname", nickname) + } + userRepository.updateNickName(userId, nickname) + } + +} \ No newline at end of file From 6c636257d359c54a50b16f23f001e16b83761aae Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 14:45:19 +0900 Subject: [PATCH 14/18] fix(#53): fix DTO NPE at test --- .../java/site/archive/service/archive/ArchiveServiceTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java b/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java index 75741192..d7646d93 100644 --- a/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java +++ b/archive-application/src/test/java/site/archive/service/archive/ArchiveServiceTest.java @@ -9,6 +9,7 @@ import site.archive.common.exception.common.UnauthorizedResourceException; import site.archive.domain.archive.Archive; import site.archive.domain.archive.ArchiveRepository; +import site.archive.domain.archive.CoverImageType; import site.archive.domain.archive.Emotion; import site.archive.domain.user.BaseUser; import site.archive.domain.user.UserInfo; @@ -158,6 +159,7 @@ void cannotViewPrivateSpecificArchiveWhenOtherArchive() { private List dummyArchives(BaseUser user) { return List.of( Archive.builder() + .id(1L) .name("archive_1") .author(user) .watchedOn(LocalDate.now()) @@ -167,6 +169,7 @@ private List dummyArchives(BaseUser user) { .isPublic(true) .build(), Archive.builder() + .id(2L) .name("archive_2") .author(user) .watchedOn(LocalDate.now()) @@ -188,6 +191,7 @@ private Archive dummyArchive(long archiveId, BaseUser user, boolean isPublic) { .mainImage("main_image_1") .companions(Collections.emptyList()) .isPublic(isPublic) + .coverImageType(CoverImageType.EMOTION_COVER) .build(); } From bad896081f278f2ca4f4c5e8b56fa9a6f9cbcfee Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 14:53:19 +0900 Subject: [PATCH 15/18] feat(#53): set id field of request dto to nullable --- .../main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt | 2 +- .../kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt | 2 +- .../site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt | 1 + .../src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt | 2 +- .../site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt | 4 +++- .../main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt | 2 +- .../src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt | 2 +- 7 files changed, 9 insertions(+), 6 deletions(-) diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt index 1362c19c..ae37e9a7 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveDtoV1.kt @@ -10,7 +10,7 @@ import java.time.LocalDate @JsonInclude(JsonInclude.Include.NON_NULL) data class ArchiveDtoV1( - val archiveId: Long, + val archiveId: Long?, val name: String, val watchedOn: String, val emotion: Emotion, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt index 51c51f85..16d7d1a8 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/ArchiveImageDtoV1.kt @@ -4,7 +4,7 @@ import site.archive.domain.archive.Archive import site.archive.domain.archive.ArchiveImage data class ArchiveImageDtoV1( - val archiveImageId: Long, + val archiveImageId: Long?, val image: String, val review: String, val backgroundColor: String diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt index 7fde82fe..5b1e337c 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/auth/PasswordRegisterCommandV1.kt @@ -9,6 +9,7 @@ import site.archive.domain.user.UserRole class PasswordRegisterCommandV1( email: String, + @field: NotBlank(message = "비밀번호는 필수 입력 항목입니다.") @field: Pattern( regexp = "(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9@$!%*#?&]{8,20}$", diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt index cd889d14..34e49928 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/user/BaseUserDtoV1.kt @@ -6,7 +6,7 @@ import site.archive.domain.user.UserRole import java.time.LocalDateTime data class BaseUserDtoV1( - val userId: Long, + val userId: Long?, val mailAddress: String, val userRole: UserRole, val profileImage: String, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt index e82bdaaa..d05fad3c 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/user/OAuthRegisterRequestDtoV1.kt @@ -4,5 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty data class OAuthRegisterRequestDtoV1( val provider: String, - @field: JsonProperty("providerAccessToken") val token: String + + @field: JsonProperty("providerAccessToken") + val token: String ) \ No newline at end of file diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt index 05621658..4b361683 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/user/SpecificUserDtoV1.kt @@ -5,7 +5,7 @@ import site.archive.domain.user.BaseUser import site.archive.domain.user.UserRole data class SpecificUserDtoV1( - val userId: Long, + val userId: Long?, val mailAddress: String, val userRole: UserRole, val createdAt: String, diff --git a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt index 561e892e..bed4bfec 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v2/ArchiveDtoV2.kt @@ -9,7 +9,7 @@ import site.archive.dto.v1.archive.ArchiveImageDtoV1 @JsonInclude(JsonInclude.Include.NON_NULL) data class ArchiveDtoV2( - val archiveId: Long, + val archiveId: Long?, val name: String, val watchedOn: String, val emotion: Emotion, From 478aee46ee31c3ff617287eaf5ed7ca66dc997a0 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 16:46:00 +0900 Subject: [PATCH 16/18] refactor(#53): use default RestTemplateBuilder autowired --- .../src/main/kotlin/site/archive/config/ClientConfig.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt b/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt index 2e3aac8f..65650471 100644 --- a/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt +++ b/archive-application/src/main/kotlin/site/archive/config/ClientConfig.kt @@ -14,11 +14,6 @@ import java.util.function.Supplier @Configuration class ClientConfig { - @Bean - fun restTemplateBuilder(): RestTemplateBuilder { - return RestTemplateBuilder() - } - @Bean fun restTemplate(restTemplateBuilder: RestTemplateBuilder): RestTemplate { return restTemplateBuilder From fa021b1e5b4681854a60dd886eac9fc66b21f334 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Sun, 22 Jan 2023 16:59:55 +0900 Subject: [PATCH 17/18] fix: ignore jwt filter at actuator path --- .../token/jwt/JwtTokenPersistFilter.java | 26 +++++++++++-------- .../security/token/jwt/JwtTokenSupport.java | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenPersistFilter.java b/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenPersistFilter.java index 03fec1cc..17299260 100644 --- a/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenPersistFilter.java +++ b/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenPersistFilter.java @@ -1,5 +1,10 @@ package site.archive.web.config.security.token.jwt; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.context.SecurityContextHolder; @@ -7,29 +12,28 @@ import site.archive.web.config.security.token.HttpAuthTokenSupport; import site.archive.web.config.security.token.TokenProvider; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - import java.io.IOException; @RequiredArgsConstructor @Slf4j public class JwtTokenPersistFilter extends OncePerRequestFilter { + private static final String MONITORING_PATH_PREFIX = "/actuator"; + private final HttpAuthTokenSupport httpTokenExtractor; private final TokenProvider tokenProvider; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - try { - var tokenStr = httpTokenExtractor.extractToken(request); - var authToken = tokenProvider.parseUserInfoFromToken(tokenStr); - SecurityContextHolder.getContext().setAuthentication(new JwtAuthenticationToken(authToken)); - } catch (Exception e) { - SecurityContextHolder.clearContext(); + if (!request.getRequestURI().startsWith(MONITORING_PATH_PREFIX)) { + try { + var tokenStr = httpTokenExtractor.extractToken(request); + var authToken = tokenProvider.parseUserInfoFromToken(tokenStr); + SecurityContextHolder.getContext().setAuthentication(new JwtAuthenticationToken(authToken)); + } catch (Exception e) { + SecurityContextHolder.clearContext(); + } } filterChain.doFilter(request, response); } diff --git a/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenSupport.java b/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenSupport.java index de55756a..cef13830 100644 --- a/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenSupport.java +++ b/archive-web/src/main/java/site/archive/web/config/security/token/jwt/JwtTokenSupport.java @@ -17,7 +17,7 @@ public class JwtTokenSupport implements HttpAuthTokenSupport { public String extractToken(HttpServletRequest target) { try { String tokenTypeAndStr = target.getHeader(HttpHeaders.AUTHORIZATION); - log.debug("Parsing token in header: {}", tokenTypeAndStr); + log.debug("Parsing token in header: {} - Request path: {}", tokenTypeAndStr, target.getRequestURI()); return tokenTypeAndStr.split(" ")[1]; } catch (Exception e) { throw new TokenNotFoundException(); From 8fad931c39b4eafb86de09237aecdb92b366fff4 Mon Sep 17 00:00:00 2001 From: KimDoubleB Date: Mon, 23 Jan 2023 22:59:43 +0900 Subject: [PATCH 18/18] fix(#53): isDuplicated to duplicated (wrong field fix) --- .../site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archive-application/src/main/kotlin/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt index 839b2dd6..7d0471fa 100644 --- a/archive-application/src/main/kotlin/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt +++ b/archive-application/src/main/kotlin/site/archive/dto/v1/archive/EmailDuplicateResponseDtoV1.kt @@ -1,3 +1,3 @@ package site.archive.dto.v1.archive -data class EmailDuplicateResponseDtoV1(val isDuplicatedEmail: Boolean) \ No newline at end of file +data class EmailDuplicateResponseDtoV1(val duplicatedEmail: Boolean) \ No newline at end of file