From c73254252046fd2fda4e89f759f6ac667a411ba2 Mon Sep 17 00:00:00 2001 From: soohyun Date: Sat, 5 Oct 2024 01:08:00 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[#242]=20feature:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toaster/controller/ToastController.java | 14 ++++++++++---- .../request/toast/MoveToastDto.java | 6 ++++++ .../response/toast/ModifiedCategory.java | 7 +++++++ .../toaster/service/toast/ToastService.java | 19 +++++++++++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java create mode 100644 linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java diff --git a/linkmind/src/main/java/com/app/toaster/controller/ToastController.java b/linkmind/src/main/java/com/app/toaster/controller/ToastController.java index 4093d251..e46af637 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/ToastController.java +++ b/linkmind/src/main/java/com/app/toaster/controller/ToastController.java @@ -3,7 +3,8 @@ import java.io.IOException; import java.util.List; -import com.app.toaster.controller.request.toast.UpdateToastDto; +import com.app.toaster.controller.request.toast.*; +import com.app.toaster.controller.response.toast.ModifiedCategory; import com.app.toaster.controller.response.toast.ModifiedTitle; import com.app.toaster.controller.response.toast.WeekLinkDto; import com.app.toaster.service.link.LinkService; @@ -22,9 +23,6 @@ import com.app.toaster.common.dto.ApiResponse; // import com.app.toaster.config.UserId; import com.app.toaster.config.UserId; -import com.app.toaster.controller.request.toast.IsReadDto; -import com.app.toaster.controller.request.toast.OgRequestDto; -import com.app.toaster.controller.request.toast.SaveToastDto; import com.app.toaster.controller.response.toast.IsReadResponse; import com.app.toaster.exception.Success; import com.app.toaster.service.parse.ParsingService; @@ -98,5 +96,13 @@ public ApiResponse modifyTitle( return ApiResponse.success(Success.UPDATE_TOAST_TITLE_SUCCESS, toastService.modifyTitle(userId,updateToastDto)); } + @PatchMapping("/category") + @ResponseStatus(HttpStatus.OK) + public ApiResponse modifyCategory( + @UserId Long userId, + @Valid @RequestBody MoveToastDto updateToastDto + ){ + return ApiResponse.success(Success.UPDATE_TOAST_TITLE_SUCCESS, toastService.modifyClip(userId,updateToastDto)); + } } diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java b/linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java new file mode 100644 index 00000000..cc80b8b0 --- /dev/null +++ b/linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java @@ -0,0 +1,6 @@ +package com.app.toaster.controller.request.toast; + +import jakarta.validation.constraints.NotNull; + +public record MoveToastDto(Long toastId, @NotNull Long categoryId) { +} diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java b/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java new file mode 100644 index 00000000..1a1dc858 --- /dev/null +++ b/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java @@ -0,0 +1,7 @@ +package com.app.toaster.controller.response.toast; + +public record ModifiedCategory(Long categoryId) { + public static ModifiedCategory of(Long categoryId){ + return new ModifiedCategory(categoryId); + } +} diff --git a/linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java b/linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java index c956ce46..eb7e09cb 100644 --- a/linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java +++ b/linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.stream.Collectors; +import com.app.toaster.controller.request.toast.MoveToastDto; +import com.app.toaster.controller.response.toast.ModifiedCategory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -148,7 +150,24 @@ public ModifiedTitle modifyTitle(Long userId, UpdateToastDto updateToastDto){ } toast.updateTitle(updateToastDto.title()); return ModifiedTitle.of(updateToastDto.title()); + } + @Transactional + public ModifiedCategory modifyClip(Long userId, MoveToastDto updateToastDto){ + User presentUser = userRepository.findByUserId(userId).orElseThrow( + ()-> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage()) + ); + Toast toast = toastRepository.findById(updateToastDto.toastId()).orElseThrow( + () -> new BadRequestException(Error.BAD_REQUEST_ID, Error.BAD_REQUEST_ID.getMessage()) + ); + if (!presentUser.equals(toast.getUser())){ + throw new ForbiddenException(Error.UNAUTHORIZED_ACCESS, Error.UNAUTHORIZED_ACCESS.getMessage()); + } + Category category = categoryRepository.findById(updateToastDto.categoryId()).orElseThrow( + () -> new NotFoundException(Error.NOT_FOUND_CATEGORY_EXCEPTION, Error.NOT_FOUND_CATEGORY_EXCEPTION.getMessage()) + ); + toast.updateCategory(category); + return ModifiedCategory.of(updateToastDto.categoryId()); } From 5f5bd5b29f68dcd4f09a9f32d35e8041e5e4525f Mon Sep 17 00:00:00 2001 From: soohyun Date: Sun, 6 Oct 2024 15:43:25 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[#242]=20feature:=20=EC=B5=9C=EA=B7=BC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=9C=203=EA=B0=9C=20=ED=86=A0=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CategoryController.java | 5 +- .../toaster/controller/MainController.java | 3 - .../request/toast/DeleteToastDto.java | 4 - .../request/toast/OgRequestDto.java | 4 - .../category/GetCategoryResponseDto.java | 5 +- .../response/search/SearchMainResult.java | 2 +- .../com/app/toaster/exception/Success.java | 2 + .../querydsl/CustomToastRepository.java | 2 +- .../com/app/toaster/service/UserService.java | 2 +- .../app/toaster/service/auth/AuthService.java | 8 +- .../service/category/CategoryService.java | 8 +- .../app/toaster/service/link/LinkService.java | 5 +- .../toaster/service/search/SearchService.java | 11 +- .../controller/ToastController.java | 21 +-- .../controller/request}/IsReadDto.java | 2 +- .../controller/request}/MoveToastDto.java | 2 +- .../controller/request}/SaveToastDto.java | 2 +- .../controller/request}/UpdateToastDto.java | 2 +- .../controller/response}/IsReadResponse.java | 2 +- .../response}/ModifiedCategory.java | 2 +- .../controller/response}/ModifiedTitle.java | 2 +- .../controller/response}/ToastDto.java | 5 +- .../controller/response}/ToastFilter.java | 2 +- .../controller/response}/WeekLinkDto.java | 2 +- .../app/toaster/{ => toast}/domain/Toast.java | 4 +- .../infrastructure/ToastRepository.java | 9 +- .../toast => toast/service}/ToastService.java | 130 +++++++----------- .../querydsl/CustomToastRepositoryTest.java | 4 +- 28 files changed, 99 insertions(+), 153 deletions(-) delete mode 100644 linkmind/src/main/java/com/app/toaster/controller/request/toast/DeleteToastDto.java delete mode 100644 linkmind/src/main/java/com/app/toaster/controller/request/toast/OgRequestDto.java rename linkmind/src/main/java/com/app/toaster/{ => toast}/controller/ToastController.java (84%) rename linkmind/src/main/java/com/app/toaster/{controller/request/toast => toast/controller/request}/IsReadDto.java (54%) rename linkmind/src/main/java/com/app/toaster/{controller/request/toast => toast/controller/request}/MoveToastDto.java (70%) rename linkmind/src/main/java/com/app/toaster/{controller/request/toast => toast/controller/request}/SaveToastDto.java (79%) rename linkmind/src/main/java/com/app/toaster/{controller/request/toast => toast/controller/request}/UpdateToastDto.java (88%) rename linkmind/src/main/java/com/app/toaster/{controller/response/toast => toast/controller/response}/IsReadResponse.java (73%) rename linkmind/src/main/java/com/app/toaster/{controller/response/toast => toast/controller/response}/ModifiedCategory.java (76%) rename linkmind/src/main/java/com/app/toaster/{controller/response/toast => toast/controller/response}/ModifiedTitle.java (75%) rename linkmind/src/main/java/com/app/toaster/{controller/response/toast => toast/controller/response}/ToastDto.java (70%) rename linkmind/src/main/java/com/app/toaster/{controller/response/toast => toast/controller/response}/ToastFilter.java (53%) rename linkmind/src/main/java/com/app/toaster/{controller/response/toast => toast/controller/response}/WeekLinkDto.java (84%) rename linkmind/src/main/java/com/app/toaster/{ => toast}/domain/Toast.java (93%) rename linkmind/src/main/java/com/app/toaster/{ => toast}/infrastructure/ToastRepository.java (91%) rename linkmind/src/main/java/com/app/toaster/{service/toast => toast/service}/ToastService.java (61%) diff --git a/linkmind/src/main/java/com/app/toaster/controller/CategoryController.java b/linkmind/src/main/java/com/app/toaster/controller/CategoryController.java index 99e4446b..af14946f 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/CategoryController.java +++ b/linkmind/src/main/java/com/app/toaster/controller/CategoryController.java @@ -4,8 +4,7 @@ import com.app.toaster.config.UserId; import com.app.toaster.controller.request.category.*; import com.app.toaster.controller.response.category.CategoriesResponse; -import com.app.toaster.controller.response.toast.ToastFilter; -import com.app.toaster.controller.response.category.CategoryResponse; +import com.app.toaster.toast.controller.response.ToastFilter; import com.app.toaster.controller.response.category.GetCategoryResponseDto; import com.app.toaster.controller.valid.Severity; import com.app.toaster.controller.valid.TitleValid; @@ -14,14 +13,12 @@ import com.app.toaster.service.search.SearchService; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; -import java.util.List; @RestController @RequestMapping("/category") diff --git a/linkmind/src/main/java/com/app/toaster/controller/MainController.java b/linkmind/src/main/java/com/app/toaster/controller/MainController.java index 5c8fc860..fa442ff0 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/MainController.java +++ b/linkmind/src/main/java/com/app/toaster/controller/MainController.java @@ -4,11 +4,8 @@ import org.springframework.web.bind.annotation.*; import com.app.toaster.common.dto.ApiResponse; -import com.app.toaster.config.UserId; import com.app.toaster.controller.valid.TitleValid; -import com.app.toaster.service.UserService; import com.app.toaster.service.search.SearchService; -import com.app.toaster.service.toast.ToastService; import lombok.RequiredArgsConstructor; diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/DeleteToastDto.java b/linkmind/src/main/java/com/app/toaster/controller/request/toast/DeleteToastDto.java deleted file mode 100644 index fa5b054a..00000000 --- a/linkmind/src/main/java/com/app/toaster/controller/request/toast/DeleteToastDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.app.toaster.controller.request.toast; - -public record DeleteToastDto(Long toastId) { -} diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/OgRequestDto.java b/linkmind/src/main/java/com/app/toaster/controller/request/toast/OgRequestDto.java deleted file mode 100644 index 1523a76e..00000000 --- a/linkmind/src/main/java/com/app/toaster/controller/request/toast/OgRequestDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.app.toaster.controller.request.toast; - -public record OgRequestDto(String linkUrl) { -} diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/category/GetCategoryResponseDto.java b/linkmind/src/main/java/com/app/toaster/controller/response/category/GetCategoryResponseDto.java index f274ccf6..ee37086f 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/category/GetCategoryResponseDto.java +++ b/linkmind/src/main/java/com/app/toaster/controller/response/category/GetCategoryResponseDto.java @@ -1,11 +1,8 @@ package com.app.toaster.controller.response.category; -import com.app.toaster.controller.response.auth.TokenResponseDto; -import com.app.toaster.controller.response.toast.ToastDto; -import com.app.toaster.domain.Toast; +import com.app.toaster.toast.controller.response.ToastDto; import lombok.Builder; -import java.util.ArrayList; import java.util.List; @Builder diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/search/SearchMainResult.java b/linkmind/src/main/java/com/app/toaster/controller/response/search/SearchMainResult.java index 70eb55f9..6752ca47 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/search/SearchMainResult.java +++ b/linkmind/src/main/java/com/app/toaster/controller/response/search/SearchMainResult.java @@ -2,7 +2,7 @@ import java.util.List; -import com.app.toaster.controller.response.toast.ToastDto; +import com.app.toaster.toast.controller.response.ToastDto; public record SearchMainResult(String keyword, List toasts, List categories) { public static SearchMainResult of(String keyword, List toasts, List categories){ diff --git a/linkmind/src/main/java/com/app/toaster/exception/Success.java b/linkmind/src/main/java/com/app/toaster/exception/Success.java index 14c3200e..34055ba3 100644 --- a/linkmind/src/main/java/com/app/toaster/exception/Success.java +++ b/linkmind/src/main/java/com/app/toaster/exception/Success.java @@ -25,6 +25,7 @@ public enum Success { GET_SITES_SUCCESS(HttpStatus.OK, "추천 사이트 조회 성공"), GET_SETTINGS_SUCCESS(HttpStatus.OK, "설정 페이지 조회 성공"), GET_POPUP_SUCCESS(HttpStatus.OK, "팝업 정보 조회 성공"), + GET_RECENT_TOAST_SUCCESS(HttpStatus.OK, "최근 저장한 토스트 조회 성공"), GET_CATEORIES_SUCCESS(HttpStatus.OK, "전체 카테고리 조회 성공"), GET_CATEORY_SUCCESS(HttpStatus.OK, "세부 카테고리 조회 성공"), @@ -47,6 +48,7 @@ public enum Success { UPDATE_ISREAD_SUCCESS(HttpStatus.OK, "열람여부 수정 완료"), UPDATE_CATEGORY_TITLE_SUCCESS(HttpStatus.OK, "카테고리 수정 완료"), + MOVE_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 이동 성공"), UPDATE_TIMER_DATETIME_SUCCESS(HttpStatus.OK, "타이머 시간/날짜 수정 완료"), UPDATE_TIMER_COMMENT_SUCCESS(HttpStatus.OK, "타이머 코멘트 수정 완료"), CHANGE_TIMER_ALARM_SUCCESS(HttpStatus.OK, "타이머 알람여부 수정 완료"), diff --git a/linkmind/src/main/java/com/app/toaster/infrastructure/querydsl/CustomToastRepository.java b/linkmind/src/main/java/com/app/toaster/infrastructure/querydsl/CustomToastRepository.java index 90553ca8..25044802 100644 --- a/linkmind/src/main/java/com/app/toaster/infrastructure/querydsl/CustomToastRepository.java +++ b/linkmind/src/main/java/com/app/toaster/infrastructure/querydsl/CustomToastRepository.java @@ -14,7 +14,7 @@ // import com.app.toaster.domain.Category; // import com.app.toaster.domain.QToast; // import com.app.toaster.domain.QUser; -// import com.app.toaster.domain.Toast; +// import com.app.toaster.toast.domain.Toast; // import com.app.toaster.domain.User; // import com.querydsl.core.types.Path; // import com.querydsl.core.types.dsl.BooleanExpression; diff --git a/linkmind/src/main/java/com/app/toaster/service/UserService.java b/linkmind/src/main/java/com/app/toaster/service/UserService.java index 47a25217..3da664cd 100644 --- a/linkmind/src/main/java/com/app/toaster/service/UserService.java +++ b/linkmind/src/main/java/com/app/toaster/service/UserService.java @@ -14,7 +14,7 @@ import com.app.toaster.exception.Error; import com.app.toaster.exception.model.BadRequestException; import com.app.toaster.exception.model.NotFoundException; -import com.app.toaster.infrastructure.ToastRepository; +import com.app.toaster.toast.infrastructure.ToastRepository; import com.app.toaster.infrastructure.UserRepository; // import com.app.toaster.infrastructure.querydsl.CustomToastRepository; diff --git a/linkmind/src/main/java/com/app/toaster/service/auth/AuthService.java b/linkmind/src/main/java/com/app/toaster/service/auth/AuthService.java index 4855e586..5837d439 100644 --- a/linkmind/src/main/java/com/app/toaster/service/auth/AuthService.java +++ b/linkmind/src/main/java/com/app/toaster/service/auth/AuthService.java @@ -5,9 +5,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.client.RestTemplate; -import com.app.toaster.common.dto.ApiResponse; import com.app.toaster.config.jwt.JwtService; import com.app.toaster.controller.request.auth.SignInRequestDto; import com.app.toaster.controller.response.auth.SignInResponseDto; @@ -17,21 +15,19 @@ import com.app.toaster.domain.User; import com.app.toaster.exception.Error; import com.app.toaster.exception.Success; -import com.app.toaster.exception.model.BadRequestException; import com.app.toaster.exception.model.CustomException; import com.app.toaster.exception.model.NotFoundException; import com.app.toaster.exception.model.UnprocessableEntityException; import com.app.toaster.external.client.slack.SlackApi; import com.app.toaster.infrastructure.CategoryRepository; import com.app.toaster.infrastructure.TimerRepository; -import com.app.toaster.infrastructure.ToastRepository; +import com.app.toaster.toast.infrastructure.ToastRepository; import com.app.toaster.infrastructure.UserRepository; -import com.app.toaster.popup.entity.PopupInvisibleManager; import com.app.toaster.popup.infrastructure.PopupManagerRepository; import com.app.toaster.service.auth.apple.AppleSignInService; import com.app.toaster.service.auth.kakao.KakaoSignInService; import com.app.toaster.service.auth.kakao.LoginResult; -import com.app.toaster.service.toast.ToastService; +import com.app.toaster.toast.service.ToastService; import lombok.RequiredArgsConstructor; diff --git a/linkmind/src/main/java/com/app/toaster/service/category/CategoryService.java b/linkmind/src/main/java/com/app/toaster/service/category/CategoryService.java index b1fd6de1..7e477997 100644 --- a/linkmind/src/main/java/com/app/toaster/service/category/CategoryService.java +++ b/linkmind/src/main/java/com/app/toaster/service/category/CategoryService.java @@ -3,13 +3,13 @@ import com.app.toaster.controller.request.category.*; import com.app.toaster.controller.response.category.CategoriesResponse; import com.app.toaster.controller.response.category.DuplicatedResponse; -import com.app.toaster.controller.response.toast.ToastDto; -import com.app.toaster.controller.response.toast.ToastFilter; +import com.app.toaster.toast.controller.response.ToastDto; +import com.app.toaster.toast.controller.response.ToastFilter; import com.app.toaster.controller.response.category.CategoryResponse; import com.app.toaster.controller.response.category.GetCategoryResponseDto; import com.app.toaster.domain.Category; import com.app.toaster.domain.Reminder; -import com.app.toaster.domain.Toast; +import com.app.toaster.toast.domain.Toast; import com.app.toaster.domain.User; import com.app.toaster.exception.Error; import com.app.toaster.exception.model.BadRequestException; @@ -17,7 +17,7 @@ import com.app.toaster.exception.model.NotFoundException; import com.app.toaster.infrastructure.CategoryRepository; import com.app.toaster.infrastructure.TimerRepository; -import com.app.toaster.infrastructure.ToastRepository; +import com.app.toaster.toast.infrastructure.ToastRepository; import com.app.toaster.infrastructure.UserRepository; import lombok.RequiredArgsConstructor; diff --git a/linkmind/src/main/java/com/app/toaster/service/link/LinkService.java b/linkmind/src/main/java/com/app/toaster/service/link/LinkService.java index 4509e41a..1358e865 100644 --- a/linkmind/src/main/java/com/app/toaster/service/link/LinkService.java +++ b/linkmind/src/main/java/com/app/toaster/service/link/LinkService.java @@ -1,6 +1,6 @@ package com.app.toaster.service.link; -import com.app.toaster.controller.response.toast.WeekLinkDto; +import com.app.toaster.toast.controller.response.WeekLinkDto; import com.app.toaster.domain.Link; import com.app.toaster.infrastructure.LinkRepository; import lombok.RequiredArgsConstructor; @@ -9,10 +9,7 @@ import java.time.Duration; import java.time.LocalDateTime; -import java.time.Period; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor diff --git a/linkmind/src/main/java/com/app/toaster/service/search/SearchService.java b/linkmind/src/main/java/com/app/toaster/service/search/SearchService.java index f1f78837..ce4a86da 100644 --- a/linkmind/src/main/java/com/app/toaster/service/search/SearchService.java +++ b/linkmind/src/main/java/com/app/toaster/service/search/SearchService.java @@ -8,24 +8,19 @@ import com.app.toaster.common.dto.ApiResponse; import com.app.toaster.controller.response.search.CategoryResult; -import com.app.toaster.controller.response.search.SearchCategoryResult; import com.app.toaster.controller.response.search.SearchMainResult; -import com.app.toaster.controller.response.search.ToastResult; -import com.app.toaster.controller.response.toast.ToastDto; +import com.app.toaster.toast.controller.response.ToastDto; import com.app.toaster.domain.Category; -import com.app.toaster.domain.Toast; +import com.app.toaster.toast.domain.Toast; import com.app.toaster.domain.User; import com.app.toaster.exception.Error; import com.app.toaster.exception.Success; import com.app.toaster.exception.model.BadRequestException; -import com.app.toaster.exception.model.CustomException; import com.app.toaster.exception.model.NotFoundException; import com.app.toaster.infrastructure.CategoryRepository; -import com.app.toaster.infrastructure.ToastRepository; +import com.app.toaster.toast.infrastructure.ToastRepository; import com.app.toaster.infrastructure.UserRepository; -import com.google.protobuf.Api; -import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; @Service diff --git a/linkmind/src/main/java/com/app/toaster/controller/ToastController.java b/linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java similarity index 84% rename from linkmind/src/main/java/com/app/toaster/controller/ToastController.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java index e46af637..a1e68938 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/ToastController.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java @@ -1,13 +1,11 @@ -package com.app.toaster.controller; +package com.app.toaster.toast.controller; import java.io.IOException; import java.util.List; -import com.app.toaster.controller.request.toast.*; -import com.app.toaster.controller.response.toast.ModifiedCategory; -import com.app.toaster.controller.response.toast.ModifiedTitle; -import com.app.toaster.controller.response.toast.WeekLinkDto; import com.app.toaster.service.link.LinkService; +import com.app.toaster.toast.controller.request.*; +import com.app.toaster.toast.controller.response.*; import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; @@ -23,10 +21,9 @@ import com.app.toaster.common.dto.ApiResponse; // import com.app.toaster.config.UserId; import com.app.toaster.config.UserId; -import com.app.toaster.controller.response.toast.IsReadResponse; import com.app.toaster.exception.Success; import com.app.toaster.service.parse.ParsingService; -import com.app.toaster.service.toast.ToastService; +import com.app.toaster.toast.service.ToastService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -87,6 +84,14 @@ public ApiResponse> getWeekLinks( return ApiResponse.success(Success.GET_LINKS_SUCCESS, linkService.getWeekLinks()); } + @GetMapping("/recent-saved") + @ResponseStatus(HttpStatus.OK) + public ApiResponse> getRecentSavedLinks( + @UserId Long userId + ) { + return ApiResponse.success(Success.GET_RECENT_TOAST_SUCCESS, toastService.getToastTop3_savedRecently(userId)); + } + @PatchMapping("/title") @ResponseStatus(HttpStatus.OK) public ApiResponse modifyTitle( @@ -102,7 +107,7 @@ public ApiResponse modifyCategory( @UserId Long userId, @Valid @RequestBody MoveToastDto updateToastDto ){ - return ApiResponse.success(Success.UPDATE_TOAST_TITLE_SUCCESS, toastService.modifyClip(userId,updateToastDto)); + return ApiResponse.success(Success.MOVE_CATEGORY_SUCCESS, toastService.modifyClip(userId,updateToastDto)); } } diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/IsReadDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/IsReadDto.java similarity index 54% rename from linkmind/src/main/java/com/app/toaster/controller/request/toast/IsReadDto.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/request/IsReadDto.java index 18297ad0..46729f05 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/request/toast/IsReadDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/IsReadDto.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.request.toast; +package com.app.toaster.toast.controller.request; public record IsReadDto(Long toastId, Boolean isRead) { } diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java similarity index 70% rename from linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java index cc80b8b0..6978a6fd 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/request/toast/MoveToastDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.request.toast; +package com.app.toaster.toast.controller.request; import jakarta.validation.constraints.NotNull; diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/SaveToastDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/SaveToastDto.java similarity index 79% rename from linkmind/src/main/java/com/app/toaster/controller/request/toast/SaveToastDto.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/request/SaveToastDto.java index 34eeb1e2..bb8a50c8 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/request/toast/SaveToastDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/SaveToastDto.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.request.toast; +package com.app.toaster.toast.controller.request; import java.util.List; diff --git a/linkmind/src/main/java/com/app/toaster/controller/request/toast/UpdateToastDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java similarity index 88% rename from linkmind/src/main/java/com/app/toaster/controller/request/toast/UpdateToastDto.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java index 0126eafe..42d868dd 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/request/toast/UpdateToastDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.request.toast; +package com.app.toaster.toast.controller.request; import com.app.toaster.controller.valid.Severity; import com.app.toaster.controller.valid.TitleValid; diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/IsReadResponse.java b/linkmind/src/main/java/com/app/toaster/toast/controller/response/IsReadResponse.java similarity index 73% rename from linkmind/src/main/java/com/app/toaster/controller/response/toast/IsReadResponse.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/response/IsReadResponse.java index cabc9463..ed8508aa 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/toast/IsReadResponse.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/response/IsReadResponse.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.response.toast; +package com.app.toaster.toast.controller.response; public record IsReadResponse(Boolean isRead) { public static IsReadResponse of(Boolean isRead){ diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ModifiedCategory.java similarity index 76% rename from linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/response/ModifiedCategory.java index 1a1dc858..aef5065b 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedCategory.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ModifiedCategory.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.response.toast; +package com.app.toaster.toast.controller.response; public record ModifiedCategory(Long categoryId) { public static ModifiedCategory of(Long categoryId){ diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedTitle.java b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ModifiedTitle.java similarity index 75% rename from linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedTitle.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/response/ModifiedTitle.java index 362d8810..39c00b40 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ModifiedTitle.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ModifiedTitle.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.response.toast; +package com.app.toaster.toast.controller.response; public record ModifiedTitle(String updatedTitle) { public static ModifiedTitle of(String updatedTitle){ diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ToastDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ToastDto.java similarity index 70% rename from linkmind/src/main/java/com/app/toaster/controller/response/toast/ToastDto.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/response/ToastDto.java index bc79188f..9e59c506 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ToastDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ToastDto.java @@ -1,7 +1,6 @@ -package com.app.toaster.controller.response.toast; +package com.app.toaster.toast.controller.response; -import com.app.toaster.controller.response.category.GetCategoryResponseDto; -import com.app.toaster.domain.Toast; +import com.app.toaster.toast.domain.Toast; public record ToastDto (Long toastId, String toastTitle, String linkUrl, Boolean isRead, String categoryTitle, String thumbnailUrl){ public static ToastDto of(Toast toast){ diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ToastFilter.java b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ToastFilter.java similarity index 53% rename from linkmind/src/main/java/com/app/toaster/controller/response/toast/ToastFilter.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/response/ToastFilter.java index 33a916dd..61676578 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/toast/ToastFilter.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/response/ToastFilter.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.response.toast; +package com.app.toaster.toast.controller.response; public enum ToastFilter { ALL, diff --git a/linkmind/src/main/java/com/app/toaster/controller/response/toast/WeekLinkDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/response/WeekLinkDto.java similarity index 84% rename from linkmind/src/main/java/com/app/toaster/controller/response/toast/WeekLinkDto.java rename to linkmind/src/main/java/com/app/toaster/toast/controller/response/WeekLinkDto.java index 37c1d5ca..1046f1fd 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/response/toast/WeekLinkDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/response/WeekLinkDto.java @@ -1,4 +1,4 @@ -package com.app.toaster.controller.response.toast; +package com.app.toaster.toast.controller.response; import com.app.toaster.domain.Link; diff --git a/linkmind/src/main/java/com/app/toaster/domain/Toast.java b/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java similarity index 93% rename from linkmind/src/main/java/com/app/toaster/domain/Toast.java rename to linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java index d8ab1323..2cf27ab0 100644 --- a/linkmind/src/main/java/com/app/toaster/domain/Toast.java +++ b/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java @@ -1,9 +1,11 @@ -package com.app.toaster.domain; +package com.app.toaster.toast.domain; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import com.app.toaster.domain.Category; +import com.app.toaster.domain.User; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; diff --git a/linkmind/src/main/java/com/app/toaster/infrastructure/ToastRepository.java b/linkmind/src/main/java/com/app/toaster/toast/infrastructure/ToastRepository.java similarity index 91% rename from linkmind/src/main/java/com/app/toaster/infrastructure/ToastRepository.java rename to linkmind/src/main/java/com/app/toaster/toast/infrastructure/ToastRepository.java index 0b9c4f23..d02a6870 100644 --- a/linkmind/src/main/java/com/app/toaster/infrastructure/ToastRepository.java +++ b/linkmind/src/main/java/com/app/toaster/toast/infrastructure/ToastRepository.java @@ -1,4 +1,4 @@ -package com.app.toaster.infrastructure; +package com.app.toaster.toast.infrastructure; import com.app.toaster.domain.Category; import com.app.toaster.domain.User; @@ -6,12 +6,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import com.app.toaster.domain.Category; -import com.app.toaster.domain.Toast; -import com.app.toaster.domain.User; +import com.app.toaster.toast.domain.Toast; import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; @@ -64,4 +61,6 @@ Long countAllByUpdateAtThisWeek(@Param("startOfWeek") LocalDateTime startOfWeek, @Param("endOfWeek") LocalDateTime endOfWeek, @Param("user") User user); + List findTop3ByUserOrderByCreatedAtDesc(User user); + } diff --git a/linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java b/linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java similarity index 61% rename from linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java rename to linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java index eb7e09cb..b5f49226 100644 --- a/linkmind/src/main/java/com/app/toaster/service/toast/ToastService.java +++ b/linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java @@ -1,40 +1,37 @@ -package com.app.toaster.service.toast; +package com.app.toaster.toast.service; import java.io.IOException; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import com.app.toaster.controller.request.toast.MoveToastDto; -import com.app.toaster.controller.response.toast.ModifiedCategory; +import com.app.toaster.toast.controller.request.MoveToastDto; +import com.app.toaster.toast.controller.response.ModifiedCategory; +import com.app.toaster.toast.controller.response.ToastDto; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.app.toaster.controller.request.toast.IsReadDto; -import com.app.toaster.controller.request.toast.SaveToastDto; -import com.app.toaster.controller.request.toast.UpdateToastDto; +import com.app.toaster.toast.controller.request.IsReadDto; +import com.app.toaster.toast.controller.request.SaveToastDto; +import com.app.toaster.toast.controller.request.UpdateToastDto; import com.app.toaster.controller.response.parse.OgResponse; -import com.app.toaster.controller.response.toast.IsReadResponse; -import com.app.toaster.controller.response.toast.ModifiedTitle; +import com.app.toaster.toast.controller.response.IsReadResponse; +import com.app.toaster.toast.controller.response.ModifiedTitle; import com.app.toaster.domain.Category; -import com.app.toaster.domain.Toast; +import com.app.toaster.toast.domain.Toast; import com.app.toaster.domain.User; import com.app.toaster.exception.Error; import com.app.toaster.exception.model.BadRequestException; import com.app.toaster.exception.model.CustomException; import com.app.toaster.exception.model.ForbiddenException; import com.app.toaster.exception.model.NotFoundException; -import com.app.toaster.external.client.aws.ImagePresignedUrlResponse; -import com.app.toaster.external.client.aws.PresignedUrlVO; import com.app.toaster.external.client.aws.S3Service; import com.app.toaster.infrastructure.CategoryRepository; -import com.app.toaster.infrastructure.ToastRepository; +import com.app.toaster.toast.infrastructure.ToastRepository; import com.app.toaster.infrastructure.UserRepository; import com.app.toaster.service.parse.ParsingService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import software.amazon.awssdk.utils.Logger; @Service @RequiredArgsConstructor @@ -45,8 +42,6 @@ public class ToastService { private final CategoryRepository categoryRepository; private final S3Service s3Service; private final ParsingService parsingService; - private static final String TOAST_IMAGE_FOLDER_NAME = "toast/"; - private static Logger logger; @Value("${static-image.root}") private String BASIC_ROOT; @@ -55,9 +50,7 @@ public class ToastService { @Transactional public void createToast(Long userId, SaveToastDto saveToastDto){ //해당 유저 탐색 - User presentUser = userRepository.findByUserId(userId).orElseThrow( - ()-> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage()) - ); + User presentUser = findUser(userId); //토스트 생성 try { System.out.println(saveToastDto.linkUrl()); @@ -87,15 +80,8 @@ public void createToast(Long userId, SaveToastDto saveToastDto){ } @Transactional public IsReadResponse readToast(Long userId, IsReadDto isReadDto){ - User presentUser = userRepository.findByUserId(userId).orElseThrow( - ()-> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage()) - ); - Toast toast = toastRepository.findById(isReadDto.toastId()).orElseThrow( - () -> new NotFoundException(Error.NOT_FOUND_TOAST_EXCEPTION, Error.NOT_FOUND_TOAST_EXCEPTION.getMessage()) - ); - if (!presentUser.equals(toast.getUser())){ - throw new ForbiddenException(Error.INVALID_USER_ACCESS, Error.INVALID_USER_ACCESS.getMessage()); - } + Toast toast = findToast(isReadDto.toastId()); + isOwnerOfToast(userId,toast); if (isReadDto.isRead() && toast.getIsRead() || !isReadDto.isRead() && !toast.getIsRead()){ throw new BadRequestException(Error.BAD_REQUEST_ISREAD, Error.BAD_REQUEST_ISREAD.getMessage()); } @@ -108,6 +94,15 @@ public IsReadResponse readToast(Long userId, IsReadDto isReadDto){ return IsReadResponse.of(isReadDto.isRead()); } + @Transactional(readOnly = true) + public List getToastTop3_savedRecently(Long userId){ + User presentUser = findUser(userId); + return toastRepository.findTop3ByUserOrderByCreatedAtDesc(presentUser) + .stream() + .map(ToastDto::of) + .toList(); + } + @Transactional public void deleteToast(Long userId, Long toastId) throws IOException { User presentUser = userRepository.findByUserId(userId).orElseThrow( @@ -139,35 +134,44 @@ public void deleteAllToast(User user) throws IOException { @Transactional public ModifiedTitle modifyTitle(Long userId, UpdateToastDto updateToastDto){ - User presentUser = userRepository.findByUserId(userId).orElseThrow( - ()-> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage()) - ); - Toast toast = toastRepository.findById(updateToastDto.toastId()).orElseThrow( - () -> new BadRequestException(Error.BAD_REQUEST_ID, Error.BAD_REQUEST_ID.getMessage()) - ); - if (!presentUser.equals(toast.getUser())){ - throw new ForbiddenException(Error.UNAUTHORIZED_ACCESS, Error.UNAUTHORIZED_ACCESS.getMessage()); - } + Toast toast = findToast(updateToastDto.toastId()); + isOwnerOfToast(userId,toast); toast.updateTitle(updateToastDto.title()); return ModifiedTitle.of(updateToastDto.title()); } @Transactional public ModifiedCategory modifyClip(Long userId, MoveToastDto updateToastDto){ - User presentUser = userRepository.findByUserId(userId).orElseThrow( + Toast toast = findToast(updateToastDto.toastId()); + isOwnerOfToast(userId, toast); + Category category = findCategory(updateToastDto.categoryId()); + toast.updateCategory(category); + return ModifiedCategory.of(updateToastDto.categoryId()); + } + + private void isOwnerOfToast(Long userId, Toast toast){ + User presentUser = findUser(userId); + if (!presentUser.equals(toast.getUser())){ + throw new ForbiddenException(Error.UNAUTHORIZED_ACCESS, Error.UNAUTHORIZED_ACCESS.getMessage()); + } + } + + private User findUser(Long userId){ + return userRepository.findByUserId(userId).orElseThrow( ()-> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage()) ); - Toast toast = toastRepository.findById(updateToastDto.toastId()).orElseThrow( + } + + private Toast findToast(Long toastId){ + return toastRepository.findById(toastId).orElseThrow( () -> new BadRequestException(Error.BAD_REQUEST_ID, Error.BAD_REQUEST_ID.getMessage()) ); - if (!presentUser.equals(toast.getUser())){ - throw new ForbiddenException(Error.UNAUTHORIZED_ACCESS, Error.UNAUTHORIZED_ACCESS.getMessage()); - } - Category category = categoryRepository.findById(updateToastDto.categoryId()).orElseThrow( + } + + private Category findCategory(Long categoryId){ + return categoryRepository.findById(categoryId).orElseThrow( () -> new NotFoundException(Error.NOT_FOUND_CATEGORY_EXCEPTION, Error.NOT_FOUND_CATEGORY_EXCEPTION.getMessage()) ); - toast.updateCategory(category); - return ModifiedCategory.of(updateToastDto.categoryId()); } @@ -182,42 +186,6 @@ private void checkCategoryIsEmpty(Toast toast, Long categoryId){ toast.updateCategory(foundCategory); } } - // presigned url로 저장하는 로직 - private void convertToBytes(){ - // RestClient restClient = RestClient.create(BASIC_ROOT+res.imageAdvanced()); - // Response response = restClient.get(); - // byte[] imageBytes = response.content().asByteArray(); - } - - public ImagePresignedUrlResponse getUploadPreSignedUrl(String filename) { - try { - - PresignedUrlVO presignedUrlVO = s3Service.getUploadPreSignedUrl(filename ,TOAST_IMAGE_FOLDER_NAME); - return new ImagePresignedUrlResponse( - presignedUrlVO.fileName(), - presignedUrlVO.url() - ); - } catch (Exception e) { - - System.out.println(e.getMessage()); - System.out.println(String.valueOf(e.getCause())); - System.out.println(Arrays.toString(e.getStackTrace())); - throw e; - } - } - // presign url로 요청 보내는 api - private void requestPreSignedUrl(){ - // HttpHeaders headers = new HttpHeaders(); - // headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - // final String imageUrl = TOAST_IMAGE_FOLDER_NAME+realRes.fileName(); - // s3Service.getURL(imageUrl); - // - // HttpEntity entity = new HttpEntity<>(bytes, headers); - // - // // RestTemplate을 사용하여 PUT 요청을 보낸다. - // RestTemplate restTemplate = new RestTemplate(); - // restTemplate.put(realRes.preSignedUrl(), entity); - } private String checkIsBasicImage(String imageUrl){ if (!imageUrl.startsWith("http")){ diff --git a/linkmind/src/test/java/com/app/toaster/infrastructure/querydsl/CustomToastRepositoryTest.java b/linkmind/src/test/java/com/app/toaster/infrastructure/querydsl/CustomToastRepositoryTest.java index 7cd5db8d..e8cc47a2 100644 --- a/linkmind/src/test/java/com/app/toaster/infrastructure/querydsl/CustomToastRepositoryTest.java +++ b/linkmind/src/test/java/com/app/toaster/infrastructure/querydsl/CustomToastRepositoryTest.java @@ -21,10 +21,10 @@ // import org.springframework.transaction.annotation.Transactional; // // import com.app.toaster.config.JpaQueryFactoryConfig; -// import com.app.toaster.domain.Toast; +// import com.app.toaster.toast.domain.Toast; // import com.app.toaster.fixture.Fixture; // import com.app.toaster.infrastructure.CategoryRepository; -// import com.app.toaster.infrastructure.ToastRepository; +// import com.app.toaster.toast.infrastructure.ToastRepository; // import com.app.toaster.infrastructure.UserRepository; // import com.querydsl.core.types.dsl.BooleanExpression; // import com.querydsl.jpa.impl.JPAQueryFactory; From e049bd6dc3b4fe2501625e80badefb8c35433af2 Mon Sep 17 00:00:00 2001 From: soohyun Date: Thu, 10 Oct 2024 00:28:37 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[#242]=20fix:=20=EC=95=88=EC=98=AC=EB=9D=BC?= =?UTF-8?q?=EA=B0=84=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/toaster/toast/controller/request/OgRequestDto.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 linkmind/src/main/java/com/app/toaster/toast/controller/request/OgRequestDto.java diff --git a/linkmind/src/main/java/com/app/toaster/toast/controller/request/OgRequestDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/OgRequestDto.java new file mode 100644 index 00000000..b039ae9b --- /dev/null +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/OgRequestDto.java @@ -0,0 +1,4 @@ +package com.app.toaster.toast.controller.request; + +public record OgRequestDto(String linkUrl) { +} From 522c69d63ea28b39869bf7cdb41e77badd755785 Mon Sep 17 00:00:00 2001 From: soohyun Date: Sun, 13 Oct 2024 01:38:44 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[#242]=20refactor:=20not=20null=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/app/toaster/toast/controller/ToastController.java | 1 + .../app/toaster/toast/controller/request/MoveToastDto.java | 2 +- .../src/main/java/com/app/toaster/toast/domain/Toast.java | 4 ++++ .../java/com/app/toaster/toast/service/ToastService.java | 6 +++--- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java b/linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java index a1e68938..d875f895 100644 --- a/linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/ToastController.java @@ -39,6 +39,7 @@ public class ToastController { @PostMapping("/og") @ResponseStatus(HttpStatus.OK) + @Deprecated public ApiResponse getOgAdvanced( @RequestBody OgRequestDto ogRequestDto ) throws IOException { diff --git a/linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java index 6978a6fd..bb9c1ea3 100644 --- a/linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/MoveToastDto.java @@ -2,5 +2,5 @@ import jakarta.validation.constraints.NotNull; -public record MoveToastDto(Long toastId, @NotNull Long categoryId) { +public record MoveToastDto(@NotNull Long toastId, @NotNull Long categoryId) { } diff --git a/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java b/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java index 2cf27ab0..d255ba27 100644 --- a/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java +++ b/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java @@ -72,4 +72,8 @@ public void setUpdateAt(){ this.updateAt=LocalDateTime.now(); } + public boolean isToastOwner(User presentUser){ + return this.user.equals(presentUser); + } + } diff --git a/linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java b/linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java index b5f49226..dbeb7c9a 100644 --- a/linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java +++ b/linkmind/src/main/java/com/app/toaster/toast/service/ToastService.java @@ -104,7 +104,7 @@ public List getToastTop3_savedRecently(Long userId){ } @Transactional - public void deleteToast(Long userId, Long toastId) throws IOException { + public void deleteToast(Long userId, Long toastId) { User presentUser = userRepository.findByUserId(userId).orElseThrow( ()-> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage()) ); @@ -150,8 +150,8 @@ public ModifiedCategory modifyClip(Long userId, MoveToastDto updateToastDto){ } private void isOwnerOfToast(Long userId, Toast toast){ - User presentUser = findUser(userId); - if (!presentUser.equals(toast.getUser())){ + User presentUser = findUser(userId); + if (!toast.isToastOwner(presentUser)){ throw new ForbiddenException(Error.UNAUTHORIZED_ACCESS, Error.UNAUTHORIZED_ACCESS.getMessage()); } } From 18aa6a1cd4491285d41fddc424e188b9f736a467 Mon Sep 17 00:00:00 2001 From: soohyun Date: Sun, 13 Oct 2024 02:50:20 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[#242]=20refactor:=20toastid=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java b/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java index d255ba27..eee99993 100644 --- a/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java +++ b/linkmind/src/main/java/com/app/toaster/toast/domain/Toast.java @@ -17,9 +17,10 @@ @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Toast { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long Id; + private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") From 41edf260f142919825ee2bb7084b6bd791863137 Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 14 Oct 2024 22:11:11 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[#245]=20refactor:=20=ED=86=A0=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=9C=EB=AA=A9=20=EC=88=98=EC=A0=95=20validatio?= =?UTF-8?q?n=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EA=B7=B8=EB=A3=B9?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toaster/controller/valid/TitleValid.java | 2 +- .../controller/valid/TitleValidator.java | 22 +++++++++++++------ .../valid/marker/ToastValidationGroup.java | 4 ++++ .../controller/request/UpdateToastDto.java | 3 ++- 4 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 linkmind/src/main/java/com/app/toaster/controller/valid/marker/ToastValidationGroup.java diff --git a/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValid.java b/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValid.java index 43b9ad25..9abe70aa 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValid.java +++ b/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValid.java @@ -17,5 +17,5 @@ String message() default "Invalid title"; Class[] groups() default {}; Class[] payload() default {}; - String pattern() default "[가-힣|a-z|A-Z|0-9|]"; + String pattern() default "^[\\S][가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9\\s]{0,20}$"; } diff --git a/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValidator.java b/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValidator.java index ed537c23..01f6cdc1 100644 --- a/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValidator.java +++ b/linkmind/src/main/java/com/app/toaster/controller/valid/TitleValidator.java @@ -1,18 +1,17 @@ package com.app.toaster.controller.valid; - -import com.app.toaster.exception.Error; -import com.app.toaster.exception.model.CustomException; - +import com.app.toaster.controller.valid.marker.ToastValidationGroup; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; public class TitleValidator implements ConstraintValidator { - public String pattern; + private String pattern; + private Class[] groups; @Override public void initialize(TitleValid constraintAnnotation) { this.pattern = constraintAnnotation.pattern(); + this.groups = constraintAnnotation.groups(); } @Override @@ -39,13 +38,13 @@ public boolean isValid(String title, ConstraintValidatorContext context) { return false; } - if(title.length()>15){ + if(!isGroupActive(ToastValidationGroup.class) && title.length()>15){ //토스트쪽이 아니면 검증을 합니다. context.buildConstraintViolationWithTemplate("이름은 최대 15자까지 입력 가능해요") .addConstraintViolation(); return false; } - if(!title.matches("^[\\S][가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9\\s]{0,20}$")){ + if(!title.matches(pattern)){ context.buildConstraintViolationWithTemplate("특수 문자로는 검색할 수 없어요.") .addConstraintViolation(); return false; @@ -53,4 +52,13 @@ public boolean isValid(String title, ConstraintValidatorContext context) { return true; } + + private boolean isGroupActive(Class targetGroup) { + for (Class group : groups) { + if (group.equals(targetGroup)) { + return true; + } + } + return false; + } } \ No newline at end of file diff --git a/linkmind/src/main/java/com/app/toaster/controller/valid/marker/ToastValidationGroup.java b/linkmind/src/main/java/com/app/toaster/controller/valid/marker/ToastValidationGroup.java new file mode 100644 index 00000000..457405f8 --- /dev/null +++ b/linkmind/src/main/java/com/app/toaster/controller/valid/marker/ToastValidationGroup.java @@ -0,0 +1,4 @@ +package com.app.toaster.controller.valid.marker; + +public interface ToastValidationGroup { +} diff --git a/linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java b/linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java index 42d868dd..18d19f9f 100644 --- a/linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java +++ b/linkmind/src/main/java/com/app/toaster/toast/controller/request/UpdateToastDto.java @@ -3,9 +3,10 @@ import com.app.toaster.controller.valid.Severity; import com.app.toaster.controller.valid.TitleValid; +import com.app.toaster.controller.valid.marker.ToastValidationGroup; import jakarta.validation.constraints.NotNull; -public record UpdateToastDto(Long toastId, @TitleValid(payload = Severity.Error.class) @NotNull String title) { +public record UpdateToastDto(Long toastId, @TitleValid(payload = Severity.Error.class, groups = {ToastValidationGroup.class}) @NotNull String title) { public static UpdateToastDto of(Long toastId, String title){ return new UpdateToastDto(toastId,title); }