From 6c1ec84706ba700b5c4c362994095bc40609175b Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 8 Dec 2024 11:36:09 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20dto=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/signword/SignWordDetailResponse.java | 12 ++++++++++++ ...ResourceRequest.java => SignWordResourceDto.java} | 2 +- .../SignWordResourceListRequest.java | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/main/java/site/sonisori/sonisori/dto/signword/SignWordDetailResponse.java rename src/main/java/site/sonisori/sonisori/dto/signwordresource/{SignWordResourceRequest.java => SignWordResourceDto.java} (89%) diff --git a/src/main/java/site/sonisori/sonisori/dto/signword/SignWordDetailResponse.java b/src/main/java/site/sonisori/sonisori/dto/signword/SignWordDetailResponse.java new file mode 100644 index 0000000..58ab6dd --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/dto/signword/SignWordDetailResponse.java @@ -0,0 +1,12 @@ +package site.sonisori.sonisori.dto.signword; + +import java.util.List; + +import site.sonisori.sonisori.dto.signwordresource.SignWordResourceDto; + +public record SignWordDetailResponse( + String word, + String description, + List resources +) { +} diff --git a/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceRequest.java b/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceDto.java similarity index 89% rename from src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceRequest.java rename to src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceDto.java index a57b16b..c610637 100644 --- a/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceRequest.java +++ b/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceDto.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.Size; import site.sonisori.sonisori.common.enums.ResourceType; -public record SignWordResourceRequest( +public record SignWordResourceDto( @NotNull ResourceType resourceType, diff --git a/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceListRequest.java b/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceListRequest.java index 5a3b8e3..b9f03d5 100644 --- a/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceListRequest.java +++ b/src/main/java/site/sonisori/sonisori/dto/signwordresource/SignWordResourceListRequest.java @@ -8,6 +8,6 @@ public record SignWordResourceListRequest( @NotNull @Size(min = 1) - List resources + List resources ) { } From 0f6a4446969d6e7a1e2d23fc7d7f5dbe0cb41870 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 8 Dec 2024 11:38:02 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20oauth2=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/site/sonisori/sonisori/config/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/site/sonisori/sonisori/config/SecurityConfig.java b/src/main/java/site/sonisori/sonisori/config/SecurityConfig.java index 24fadc8..edab1ca 100644 --- a/src/main/java/site/sonisori/sonisori/config/SecurityConfig.java +++ b/src/main/java/site/sonisori/sonisori/config/SecurityConfig.java @@ -51,7 +51,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests((auth) -> auth .requestMatchers( - "/login/oauth2/code/*", "/api/auth/signup", "/api/auth/login", "/api/auth" + "/login/**", "/api/auth/signup", "/api/auth/login", "/api/auth" ).permitAll() .requestMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated() From f9e06d75396077ddd41073413348a6ce09402aa4 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 8 Dec 2024 12:41:31 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20entity=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20service=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sonisori/sonisori/entity/SignWord.java | 7 +++++++ .../sonisori/service/SignWordService.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/site/sonisori/sonisori/entity/SignWord.java b/src/main/java/site/sonisori/sonisori/entity/SignWord.java index a0323e0..89976e9 100644 --- a/src/main/java/site/sonisori/sonisori/entity/SignWord.java +++ b/src/main/java/site/sonisori/sonisori/entity/SignWord.java @@ -1,10 +1,14 @@ package site.sonisori.sonisori.entity; +import java.util.List; + import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; @@ -36,6 +40,9 @@ public class SignWord extends DateEntity { @Size(max = 500) private String description; + @OneToMany(mappedBy = "signWord", fetch = FetchType.LAZY) + private List signWordResources; + public SignWordResponse toDto() { return new SignWordResponse(this.id, this.word); } diff --git a/src/main/java/site/sonisori/sonisori/service/SignWordService.java b/src/main/java/site/sonisori/sonisori/service/SignWordService.java index eaea894..47dcdd7 100644 --- a/src/main/java/site/sonisori/sonisori/service/SignWordService.java +++ b/src/main/java/site/sonisori/sonisori/service/SignWordService.java @@ -9,8 +9,10 @@ import lombok.RequiredArgsConstructor; import site.sonisori.sonisori.common.constants.ErrorMessage; import site.sonisori.sonisori.common.response.SuccessResponse; +import site.sonisori.sonisori.dto.signword.SignWordDetailResponse; import site.sonisori.sonisori.dto.signword.SignWordRequest; import site.sonisori.sonisori.dto.signword.SignWordResponse; +import site.sonisori.sonisori.dto.signwordresource.SignWordResourceDto; import site.sonisori.sonisori.entity.SignWord; import site.sonisori.sonisori.exception.NotFoundException; import site.sonisori.sonisori.repository.SignWordRepository; @@ -27,6 +29,22 @@ public List getAllSignWords() { .collect(Collectors.toList()); } + @Transactional(readOnly = true) + public SignWordDetailResponse getSignWordDetail(Long wordId) { + SignWord signWord = signWordRepository.findById(wordId) + .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_WORD.getMessage())); + + List resources = signWord.getSignWordResources().stream() + .map(resource -> new SignWordResourceDto(resource.getResourceType(), resource.getResourceUrl())) + .toList(); + + return new SignWordDetailResponse( + signWord.getWord(), + signWord.getDescription(), + resources + ); + } + @Transactional public SuccessResponse addSignWord(SignWordRequest signWordRequest) { SignWord signWord = SignWord.builder() From 16324dc83d41a6cd86c18bc1520fb96f9ca533e2 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 8 Dec 2024 12:49:26 +0900 Subject: [PATCH 4/6] =?UTF-8?q?chore:=20sign=20word=EA=B0=80=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EB=90=A0=20=EB=95=8C=20resource=EB=8F=84=20=ED=95=A8?= =?UTF-8?q?=EA=BB=98=20=EC=82=AD=EC=A0=9C=EB=90=98=EB=8F=84=EB=A1=9D=20cas?= =?UTF-8?q?cade=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/db/migration/V5__add_cascade_settings.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/resources/db/migration/V5__add_cascade_settings.sql diff --git a/src/main/resources/db/migration/V5__add_cascade_settings.sql b/src/main/resources/db/migration/V5__add_cascade_settings.sql new file mode 100644 index 0000000..8ad35e6 --- /dev/null +++ b/src/main/resources/db/migration/V5__add_cascade_settings.sql @@ -0,0 +1,7 @@ +ALTER TABLE `sonisori`.`sign_word_resources` +DROP FOREIGN KEY `fk_sign-word-resources_sign-word_id`; +ALTER TABLE `sonisori`.`sign_word_resources` + ADD CONSTRAINT `fk_sign-word-resources_sign-word_id` + FOREIGN KEY (`sign_word_id`) + REFERENCES `sonisori`.`sign_words` (`id`) + ON DELETE CASCADE; From 5b73f7347f11c3ee711cbe5dde9d8f25edb9fae6 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 8 Dec 2024 12:51:23 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20controller=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sonisori/sonisori/controller/SignWordController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/site/sonisori/sonisori/controller/SignWordController.java b/src/main/java/site/sonisori/sonisori/controller/SignWordController.java index 132a6eb..b13c383 100644 --- a/src/main/java/site/sonisori/sonisori/controller/SignWordController.java +++ b/src/main/java/site/sonisori/sonisori/controller/SignWordController.java @@ -15,6 +15,7 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import site.sonisori.sonisori.common.response.SuccessResponse; +import site.sonisori.sonisori.dto.signword.SignWordDetailResponse; import site.sonisori.sonisori.dto.signword.SignWordRequest; import site.sonisori.sonisori.dto.signword.SignWordResponse; import site.sonisori.sonisori.service.SignWordService; @@ -31,6 +32,14 @@ public ResponseEntity> getAllSignWords() { return ResponseEntity.ok(signWords); } + @GetMapping("/words/{wordId}") + public ResponseEntity getSignWordDetail( + @PathVariable(name = "wordId") Long wordId + ) { + SignWordDetailResponse signWordDetail = signWordService.getSignWordDetail(wordId); + return ResponseEntity.ok(signWordDetail); + } + @PostMapping("/admin/words") public ResponseEntity addSignWordByAdmin(@RequestBody @Valid SignWordRequest signWordRequest) { SuccessResponse successResponse = signWordService.addSignWord(signWordRequest); From 32c665dada620e2a0a82a48f9f4dda1703c764cb Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 8 Dec 2024 13:01:52 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sonisori/controller/SignWordController.java | 2 +- .../sonisori/sonisori/service/SignWordService.java | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/site/sonisori/sonisori/controller/SignWordController.java b/src/main/java/site/sonisori/sonisori/controller/SignWordController.java index b13c383..6821938 100644 --- a/src/main/java/site/sonisori/sonisori/controller/SignWordController.java +++ b/src/main/java/site/sonisori/sonisori/controller/SignWordController.java @@ -33,7 +33,7 @@ public ResponseEntity> getAllSignWords() { } @GetMapping("/words/{wordId}") - public ResponseEntity getSignWordDetail( + public ResponseEntity getSignWordDetails( @PathVariable(name = "wordId") Long wordId ) { SignWordDetailResponse signWordDetail = signWordService.getSignWordDetail(wordId); diff --git a/src/main/java/site/sonisori/sonisori/service/SignWordService.java b/src/main/java/site/sonisori/sonisori/service/SignWordService.java index 47dcdd7..398a56d 100644 --- a/src/main/java/site/sonisori/sonisori/service/SignWordService.java +++ b/src/main/java/site/sonisori/sonisori/service/SignWordService.java @@ -14,6 +14,7 @@ import site.sonisori.sonisori.dto.signword.SignWordResponse; import site.sonisori.sonisori.dto.signwordresource.SignWordResourceDto; import site.sonisori.sonisori.entity.SignWord; +import site.sonisori.sonisori.entity.SignWordResource; import site.sonisori.sonisori.exception.NotFoundException; import site.sonisori.sonisori.repository.SignWordRepository; @@ -34,9 +35,7 @@ public SignWordDetailResponse getSignWordDetail(Long wordId) { SignWord signWord = signWordRepository.findById(wordId) .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_WORD.getMessage())); - List resources = signWord.getSignWordResources().stream() - .map(resource -> new SignWordResourceDto(resource.getResourceType(), resource.getResourceUrl())) - .toList(); + List resources = mapSignWordResources(signWord.getSignWordResources()); return new SignWordDetailResponse( signWord.getWord(), @@ -45,6 +44,12 @@ public SignWordDetailResponse getSignWordDetail(Long wordId) { ); } + private List mapSignWordResources(List resources) { + return resources.stream() + .map(resource -> new SignWordResourceDto(resource.getResourceType(), resource.getResourceUrl())) + .toList(); + } + @Transactional public SuccessResponse addSignWord(SignWordRequest signWordRequest) { SignWord signWord = SignWord.builder()