From 6642c92867fde4afb32e33e881a289ae39245a8e Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 00:05:25 +0900 Subject: [PATCH 01/55] =?UTF-8?q?[docs]=20USER=20swagger=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=84=B8=EC=84=B8=ED=9E=88=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/user/controller/UserApi.java | 347 +++++++++++++++--- 1 file changed, 303 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/recordy/server/user/controller/UserApi.java b/src/main/java/org/recordy/server/user/controller/UserApi.java index c5cf14c6..5c66945b 100644 --- a/src/main/java/org/recordy/server/user/controller/UserApi.java +++ b/src/main/java/org/recordy/server/user/controller/UserApi.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; +import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.user.controller.dto.request.UserSignInRequest; import org.recordy.server.user.controller.dto.request.UserSignUpRequest; import org.recordy.server.user.controller.dto.response.UserSignInResponse; @@ -22,8 +23,8 @@ public interface UserApi { @Operation( - summary = "유저 회원 가입 API", - description = "유저가 회원 가입하는 API입니다. ", + summary = "유저 로그인 API", + description = "사용자의 로그인 요청을 처리합니다.", responses = { @ApiResponse( responseCode = "200", @@ -34,6 +35,106 @@ public interface UserApi { implementation = UserSignInResponse.class ) ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 카카오 액세스 토큰의 정보를 조회하는 과정에서 오류가 발생하였습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token 토큰의 유효 기간이 만료되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token 토큰의 형식이 올바르지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token의 클레임 값이 올바르지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token의 값이 올바르지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple jwt 토큰이 유효하지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth 통신 암호화 과정 중 문제가 발생했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple 로그인 중 public key 생성에 문제가 발생했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ) } ) @@ -44,41 +145,101 @@ public ResponseEntity signIn( @Operation( security = @SecurityRequirement(name = "Authorization"), - summary = "로그아웃 API", - description = "access token을 바탕으로 로그아웃을 진행하는 API입니다.", + summary = "유저 회원 가입 API", + description = "소셜 로그인 이후 닉네임 설정 및 동의 항목 체크하는 API입니다.", responses = { @ApiResponse( - responseCode = "200", - description = "요청이 성공했습니다." + responseCode = "201", + description = "요청이 성공했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE + ) ), @ApiResponse( - responseCode = "404", - description = "존재하지 않는 회원입니다.", - content = @Content + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 이미 존재하는 닉네임입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ), @ApiResponse( responseCode = "404", - description = "인증 정보를 찾을 수 없습니다.", - content = @Content + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ) } ) - public ResponseEntity signOut( - @UserId Long userId + public ResponseEntity signUp( + @UserId Long userId, + @RequestBody UserSignUpRequest request ); @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "유저 닉네임 중복체크 API", - description = "유저가 회원 가입할 때 닉네임을 중복체크해주는 API입니다.", + summary = "닉네임 중복 체크 API", + description = "닉네임 중복체크하는 API입니다.", responses = { @ApiResponse( responseCode = "200", - description = "성공", + description = "요청이 성공했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 이미 존재하는 닉네임입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ) @@ -89,74 +250,172 @@ public ResponseEntity checkDuplicateNickname( ); @Operation( - summary = "유저 회원 탈퇴 API", - description = "유저가 회원 탈퇴하는 API입니다.", + summary = "토큰 재발급 API", + description = "사용자의 토큰 리프레시 요청을 처리합니다. (refreshToken을 바탕으로 AccessToken을 재발급합니다.)", responses = { @ApiResponse( responseCode = "200", - description = "성공", + description = "요청이 성공했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = UserReissueTokenResponse.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 회원입니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 인증 정보를 찾을 수 없습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ) } ) - public ResponseEntity delete( - @UserId Long userId + public ResponseEntity reissueToken( + @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken ); @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "access token 재발급 API", - description = "refresh token을 바탕으로 access token을 재발급 받는 API입니다.", + summary = "유저 회원 탈퇴 API", + description = "유저가 회원 탈퇴하는 API입니다.", responses = { @ApiResponse( - responseCode = "200", - description = "성공", + responseCode = "204", + description = "요청이 성공했습니다. 내용이 없습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = UserReissueTokenResponse.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ), @ApiResponse( responseCode = "404", - description = "존재하지 않는 회원입니다.", - content = @Content + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ), @ApiResponse( responseCode = "404", - description = "인증 정보를 찾을 수 없습니다.", - content = @Content + description = "Not Found - 인증 정보를 찾을 수 없습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ) } ) - public ResponseEntity reissueToken( - @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken + public ResponseEntity delete( + @UserId Long userId ); @Operation( - summary = "유저 회원 등록 API", - description = "유저 회원 등록하는 API입니다.", + summary = "유저 로그아웃 API", + description = "유저의 로그아웃 요청을 처리합니다. 이후 logout에 사용한 accessToken을 클라이언트 내에서 삭제해주세요.", responses = { @ApiResponse( - responseCode = "200", - description = "성공", + responseCode = "204", + description = "요청이 성공했습니다. 내용이 없습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 인증 정보를 찾을 수 없습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ) } ) - public ResponseEntity signUp( - @UserId Long userId, - @RequestBody UserSignUpRequest request + public ResponseEntity signOut( + @UserId Long userId ); } \ No newline at end of file From 0e955ea09dba429ead2bf7d110359e1717e0c97b Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 01:07:09 +0900 Subject: [PATCH 02/55] [feat] RecordApi(#56) --- .../server/record/controller/RecordApi.java | 79 +++++++++++++++++- .../record/controller/RecordController.java | 4 +- test.mv.db | Bin 20480 -> 20480 bytes 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index e348b578..e41df0aa 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -1,9 +1,86 @@ package org.recordy.server.record.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.recordy.server.auth.security.UserId; +import org.recordy.server.common.message.ErrorMessage; +import org.recordy.server.record.controller.dto.RecordCreateRequest; +import org.recordy.server.record.domain.File; +import org.recordy.server.record.domain.Record; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; @Tag(name = "기록 관련 API") public interface RecordApi { - + @Operation( + summary = "레코드 생성 API", + description = "유저가 레코드를 생성하는 API입니다. 파일과 함께 레코드 정보를 전송합니다.", + responses = { + @ApiResponse( + responseCode = "201", + description = "레코드가 성공적으로 생성되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Record.class + ) + ) + ), + @ApiResponse( + responseCode = "400", + description = "Bad Request - 요청이 잘못되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity createRecord( + @UserId Long uploaderId, + @RequestPart RecordCreateRequest recordCreateRequest, + @RequestPart File file + ); } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 7c77b95d..2265697a 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -1,6 +1,5 @@ package org.recordy.server.record.controller; - import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; import org.recordy.server.keyword.domain.Keyword; @@ -22,10 +21,11 @@ @RequiredArgsConstructor @RequestMapping("/api/v1/records") @RestController -public class RecordController { +public class RecordController implements RecordApi { private final RecordService recordService; + @Override @PostMapping public ResponseEntity createRecord( @UserId Long uploaderId, diff --git a/test.mv.db b/test.mv.db index 57a61dea6eac76e2ba994832163d1882a26fe246..0dc2c62d9d431a214d17705c7b7b3c2bc1016ba0 100644 GIT binary patch literal 20480 zcmeHP-E!MR7?o0*ic(4$hIP=t29&F@;Guxdc_5= zzyrVwz%2~V!0-gT1;Z_?l~<7*dmNaAPMFUZTCHcb`}ur2vX0JYZ%4$6`+4$GwcW#4 zJi-VeD|s;)zKm$*TgjNSf~OGidb6<>LV>B5ED;@zG&ElmoLqFOnC09C4T6 zICZ?+8oU4jKmZT`1ONd*01yBK00BS%5C8-K0YKojBe1P>ziL7MzxJF!0Du4>00;mA zfB+x>2mk_r03ZMe00Mx(Wg~EA^7r{L!q$i#@FVdoV8Biyk|5EJB22Auo)=M;CZa9? zA=k&qDh>x_od9-R8nadrz>uF5k!uxs5>f1#m-i}*34Xlsr*?Bi(^s?)%m>f9TRro$ z{jE-K>-obcJG+}EA79R}HBe_a|K? z#+{aDI95AB{ljDarA$_tq$*kEdwXKPPTMpU)9g9tvqu>XV{0;;9F^rADw|cmQ#`Fp zJG@4Q>(p9#l1xTyn4Ct4{!mBkO(UkQh()iCxH`RjQDdSa7PzTXtsQev#*CdbZJu!` zWYd@z#pub?&&yCVMn}hYvQ*B9Ql6r^LqzsPr#iby>@bnJPc`l1&nvclb?KaclBO4oa0^oQq1Kc4jaPg#G$H(9~TF=CNl zb*$_6v{k_}8`GO*L*%yFcjdk(x4zs4avQD=*?`;6@5n~1TTc0w>WEYxG^QE8FNc*FveEfbndA7#34@QS$?8bY zk90%km5i+C6A;KzoW&dwzgpExycnSjSHVpYTs)ah^icQoK&QH^`zx4=-2Hs(WTi=M zr>3@hL25g7L^qIpjcirIfq_mppwp!nt5o@KSEblvoBx&gXg=*|9Y|m=we<8rs zN|(?I{lD^?{++gRS2Hk6NI*hv5QlRwW6YqGU!Eia_G$g5^6oH}CiJ=68p~T0nEX|O3TyPO_cOA!AGorOPv8N)Br&76=s&)O5 zP>}if^#06Xp@;YLua&k{qu#h#(PwsaA!f24o))|_9?S{%?I-kjA4u(EnF^zW}oX0)PM@00;mAfWY-fU{-%O zh4k64=|iFa>6Pk#cjk^xS;}qwztFQe3)^k#|Euu-|GHlO|9dU}pVlU!b3v1k&UMq9 zx7?LUSQcw2H@$vr({kLBIn^5^qh8bhZ`K1e9XR2d*0lgsm3B0}^@jhy+}8XD{{IqV zb5V?Qjm*mbmoqB=zv@i=|E5d$U-|zO{Qqm~|G#Sa|D>iiy&$#KKd-b)d;X38pUinM zOEMJThX3EJ2WZl!`428+iT}U+Vsv5szwBzXD8#u}pUVGV$n5D_;QwF$`z81UfB+x> f2mk_r!2baOrT>-wK9gClRqOwh3;mC;MF0N{pWx(k literal 20480 zcmeHO&2QT_6qnL9@w#>!2JEh7X@g;!L6Q1C)mc&`K++YlTl7|t5|swEEyI!1q^BKr z8Fn6aUH^gYwq14|b{(*PXcQ&N@>kIQG2AOwwVGX5y_=K0G;2`?6uuc|Www0X^a;BC6k`XQ3yO0D5!~TG$+>X%@!Z7kL55 zvay5A?6}86+sA<=k^#m!0MzXBvn+JXER8~!CC24_L@vR~OZ~aFa!YGiG{RzR-oQ5J zZbE5;5Nz2Nwi|>7$VLfj*lrYXj{Sz?Bf>~xHJpID6nWx?Q%(XLH{8f&2#K%!gklFH zyTK{r2zz!Tv2738fxni-3Bm#WJRKf2pWrC|2+&a&AYdECm z>aEKH#F&yzj<%onkJLbTs(}!GKV@w(FR`Hy=wM^3o3cZm@FDLGnBQx-zhd|n@@ijcp$ z7jyVjK2Ha{-x<>WiC8_6e{)j2no-u}P4tm$lJVX^pdeoVP}WENINeW=nwF7Q!>U>) z_>@~CwCq@l6F!k6h0`P5k#CnHna}unsIi!q2xKdzs&Z7N$%Swwf{Q!Tu^#BI?(0N%bZ^DNV(org`*THG)!vsju}M6?x(n8N zVjnb*^O z^pPO6#824eacR}l4K+TS@&I!$HTU{TSFdzRqZuC$2gHwS9w$>?Vb1@BTc-xPgfjmx z!LQfOwCgLHzM_3*+qt?%^WsqwJAb7<_{Gwy%W zF?JsBwL5KNz1>c0L^f&N-;Qzq?f&af_jsu7T2mk_r03ZMe00LJQ zfoc9d=Kstb^M5AzKYgS8KbYWa1xK6Z|BGTgW2u8T&HrCqE&l)G1poIc{_iiz|Gl|< zx*nlhmjB1Ihc^}>E*VD@7sc!R8vpm^#p`PP|KbSfYw&-0+BA`FQjdYwLyC0~=LS6s z{x3UJA;qFHC#3k_`2Y71|1Z*Qs(Ag?iU0pK5&w59ZS|JaR(EbZoz&v#g|_CIRj-c! z$FpZ&7O`wv*Vb`5KwTBQnzp+0j>2m3|BJ25(((Tb%*!GP=h~AZ{=ZOJ%b_6te`UQM o5F8Ky1ONd*01)_pBcS-d;@@>9UGaaPBwVD}UP26gx{DkC0%Izui2wiq From d55cacbddd9c7f003ab9ff8f0c20d8537b8b82b4 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 01:41:14 +0900 Subject: [PATCH 03/55] =?UTF-8?q?[feat]=20Record=20api=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 52 ++++++++++++++++-- test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index e41df0aa..09f7413b 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -14,10 +14,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; @Tag(name = "기록 관련 API") public interface RecordApi { @@ -83,4 +80,51 @@ public ResponseEntity createRecord( @RequestPart RecordCreateRequest recordCreateRequest, @RequestPart File file ); + + @Operation( + summary = "레코드 삭제 API", + description = "주어진 record_id의 소유자라면 해당 record_id에 해당하는 레코드를 삭제합니다.", + responses = { + @ApiResponse( + responseCode = "204", + description = "레코드가 성공적으로 삭제되었습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "403", + description = "Forbidden - 삭제가 불가능한 기록입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 기록입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity deleteRecord( + @UserId Long uploaderId, + @PathVariable Long recordId + ); + } diff --git a/test.mv.db b/test.mv.db index 0dc2c62d9d431a214d17705c7b7b3c2bc1016ba0..4ae4f825a58e0f4515697d05f45a8295d0f8b603 100644 GIT binary patch literal 20480 zcmeHPO>f*p7`CG}HHDU5xSP;6LKthly#6?`rKu8>6qMbT-m0-ZPNVLwR~v6=IC0>@ zFW?SWBm`#!M{bBK7k&%lkMY`@-DWEis-Sld9?xbx^X7Tyas2psmF<97;UJBktG0Le zr3f%W$cmm#N6!Q1U@Mvko{2cXKJr~Zj$Jphl5{fUSwO90F*!O+N5#NoAhPJ0m;{_N z;kg)H*Wd#P00MvjAOHve0)PM@00;mAfB+x>2mk`F9f577`&A42|F!1?0ssU60YCr{ z00aO5KmZT`1ONd*01yBK&KrT5$v+UI09#{zAdcj_fFXYokO;|k9AIiq(liS&W=s|a zAmm7A-^vb$d7%KM%oS0q3ScB&WPxL4X%tW#n&u6g%KZ>w*9 zyua1$Z#}*DXlM7nNeJ68H*S2bm*1L?dRzPE&I9w|r+stl$xg4|GdFtO4YSwX?VFn% zhcqNU519xZl5{rB?QU<|+zf@RaPVR`q{MR&7Cd&sgmfq(+!Ze6!XwCGZW1CFhY^=Y zgc$AkE^-j^h_`8W@9*tA)HMCKD?jVny7oo^v&~qd&Kz`YC^Bvz#_Kt@HZB`dHqK9a zl^B*(e3)6w)OukTRVEc@N; zab4SiW*L?tRjIYoD4LG>C^`uc{a%IapekhA3R(8*kjwq$$|4gLvII`;wRX_uj>9aD zn_JGIZWZ*BAY~AFke$S72FY}ML+;`N1{8}J&3Z)cfV@}!kc5oO^nIjhAAC|$?(;ieZDV} zcZ%=Ru^9Cye00R4Ojhe0m6v8b90(h|T@1;@a4df%dHKzvKOM#CZhBy2Gw%j27g#wUYH*oCIFNi9-;xj`<*PJVZm9;5)^z978@nJt|?$Ma=i! zFDI)bJw4L#c_(LNJ)eZ27$tZp5OK>@J5eV@D8XfL6@tqr(~0iu9o^HZ?&$6srZRWG zYJaUYsVx+>S+XLvMO}H-q;``hCAFJ8S;7+P<$Jo#65>0^X;FJ2Yb2fP5-uhdvBv#Q zQG12E5k7S{n*9}NGyAODQG?m77#H4t$eGNpmMfX9eI=Q_FPSYF{`a2+!}YzgEjn-j z1ONd*01yBK00BVY!Vs9(-}R%IEW59(>BE??m?xccQ_}TB*VXz`i8b^;Egs_X=T0d} zn)<&`PVL7`%JRp`S=`8K=zpod>b3s$iPZmVf2>n&?WSg69ubfD!XQkDPQtlCDZvaA zW>D@Uh7x2joH*3;6N7akUkKtEN^BTPB^Zw2g8C#jlp-*cIx&=BFqHVXmc$8?uM1WY zcb9RDH78oL7j`A`L|iD>T(#bQAQfafIk_`8SnA>Z^b4hJ)u=01OXkdv&g4w?y^~CI zClh|6t~xK!%(>W#)ppa-fm(>n4Ol4VrEnAzF^WW?=s#TL643tw^grnT_S;C%{}=Z3 z022cOfB+x>2mk_rz-2^WUVk@r^i2OtTRZkHQvXYXrK$gy`Txr;n>ubeQ$zn>fd9XD zx%~ehTK<1rn}lLTlQ3Rrrjv%5UYdk?v4%3!>(@4OhTDSb4J_QSX%aT;0h$J!n7!d) z@yq>xX(FosDAC+gO<(gB{Qt9@&1FF@bTUi-znoI}|5dN@|64BMf8hUr1OES|_5Xiw z`TtQ(?RZ6MM-@-nr9Dlal+<3u|6lN877He;UuLB}&3b?)YvKmAqci;fv+qW);Qya- zJ6aaw!rM>j|G$*k&B`9||1aai62uG$00MvjAOHybPY{@ud6!zLsiSNC&oGyzP=t29&F@;Guxdc_5= zzyrVwz%2~V!0-gT1;Z_?l~<7*dmNaAPMFUZTCHcb`}ur2vX0JYZ%4$6`+4$GwcW#4 zJi-VeD|s;)zKm$*TgjNSf~OGidb6<>LV>B5ED;@zG&ElmoLqFOnC09C4T6 zICZ?+8oU4jKmZT`1ONd*01yBK00BS%5C8-K0YKojBe1P>ziL7MzxJF!0Du4>00;mA zfB+x>2mk_r03ZMe00Mx(Wg~EA^7r{L!q$i#@FVdoV8Biyk|5EJB22Auo)=M;CZa9? zA=k&qDh>x_od9-R8nadrz>uF5k!uxs5>f1#m-i}*34Xlsr*?Bi(^s?)%m>f9TRro$ z{jE-K>-obcJG+}EA79R}HBe_a|K? z#+{aDI95AB{ljDarA$_tq$*kEdwXKPPTMpU)9g9tvqu>XV{0;;9F^rADw|cmQ#`Fp zJG@4Q>(p9#l1xTyn4Ct4{!mBkO(UkQh()iCxH`RjQDdSa7PzTXtsQev#*CdbZJu!` zWYd@z#pub?&&yCVMn}hYvQ*B9Ql6r^LqzsPr#iby>@bnJPc`l1&nvclb?KaclBO4oa0^oQq1Kc4jaPg#G$H(9~TF=CNl zb*$_6v{k_}8`GO*L*%yFcjdk(x4zs4avQD=*?`;6@5n~1TTc0w>WEYxG^QE8FNc*FveEfbndA7#34@QS$?8bY zk90%km5i+C6A;KzoW&dwzgpExycnSjSHVpYTs)ah^icQoK&QH^`zx4=-2Hs(WTi=M zr>3@hL25g7L^qIpjcirIfq_mppwp!nt5o@KSEblvoBx&gXg=*|9Y|m=we<8rs zN|(?I{lD^?{++gRS2Hk6NI*hv5QlRwW6YqGU!Eia_G$g5^6oH}CiJ=68p~T0nEX|O3TyPO_cOA!AGorOPv8N)Br&76=s&)O5 zP>}if^#06Xp@;YLua&k{qu#h#(PwsaA!f24o))|_9?S{%?I-kjA4u(EnF^zW}oX0)PM@00;mAfWY-fU{-%O zh4k64=|iFa>6Pk#cjk^xS;}qwztFQe3)^k#|Euu-|GHlO|9dU}pVlU!b3v1k&UMq9 zx7?LUSQcw2H@$vr({kLBIn^5^qh8bhZ`K1e9XR2d*0lgsm3B0}^@jhy+}8XD{{IqV zb5V?Qjm*mbmoqB=zv@i=|E5d$U-|zO{Qqm~|G#Sa|D>iiy&$#KKd-b)d;X38pUinM zOEMJThX3EJ2WZl!`428+iT}U+Vsv5szwBzXD8#u}pUVGV$n5D_;QwF$`z81UfB+x> f2mk_r!2baOrT>-wK9gClRqOwh3;mC;MF0N{pWx(k From 60dd3c70bc63cfe27e29f37167182487fcbe8d28 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 02:22:10 +0900 Subject: [PATCH 04/55] =?UTF-8?q?[feat]=20Record=20api=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=93=B1=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 96 ++++++++++++++++++ test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 96 insertions(+) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 09f7413b..796571a0 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -11,11 +11,14 @@ import org.recordy.server.record.controller.dto.RecordCreateRequest; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; +import org.springframework.data.domain.Slice; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Tag(name = "기록 관련 API") public interface RecordApi { @@ -127,4 +130,97 @@ public ResponseEntity deleteRecord( @PathVariable Long recordId ); + @Operation( + summary = "최근 레코드 조회 API", + description = "사용자의 최근 레코드를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 카카오 액세스 토큰의 정보를 조회하는 과정에서 오류가 발생하였습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getRecentRecords( + @RequestParam(required = false) List keywords, + @RequestParam long cursorId, + @RequestParam int size + ); + + @Operation( + summary = "회원의 레코드 리스트 조회 API", + description = "회원의 최근 레코드 리스트를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getRecentRecordsByUser( + @UserId long userId, + @RequestParam long cursorId, + @RequestParam int size + ); } diff --git a/test.mv.db b/test.mv.db index 4ae4f825a58e0f4515697d05f45a8295d0f8b603..65d6aaba68f397974bd666374ebb27413cd55c30 100644 GIT binary patch literal 20480 zcmeHO-EQ1O7`3A|HHDVmaBo7|2w|+5@xQOw&{PRZ3d(Lvuc&6m<235-dbRO}286@~ zPXZ5sxI{wq4G>QNufq6e9PehAO(CHQ`u4)(S&e7DoNtcT$LGs-Of1&V_;b~E55E#I zMhIE_*<|=Uc3EQav7os~VjQ6;h>|1-xRqw(0nKB_Iu_%j!)#a%O#33|&%`+92ni7c z=%xlAKmZT`1ONd*01yBK00BS%5C8-K0YCr{c z2mk_r03ZMe00MvjAaKzLoSOW7F^sV_q6gwgz6%)87ct>Twxbw3);P=Z7?aeMg#ie8 z0Y+ASI4BAQywK+qPgMa7#fv=ltUTkfgPD0@pQ4!H$7?UO>nobRqP=V0d(z$NnIG?O zb$VM*Hy`cn-Zu$x*UYtB-|5x2=A-V`zPa43F;pni_gkr6-la+ReZN6&zrQ>nW(cTWL3s&_5#L3WKD*XqoTe;WwYvc^2beW z2XAGVsnl8-=aUf~@{<@jKQtlpI%H=mWZ7#%uJ%_Ti%e9=5;(Qjrh`t)n6aBA?JY+= zuMT=qkh~1iPrY`Ku8wcXU0hCy5|NqSG#V|DJ8=YDw%%41j_qtziD2>a<WdkZT>&e(Z(FVNQzgmct4R>FDgJ)O7>oM&bL_WKE=J zM|u(U3r05cNeIeOf--?fP_627pCOduD!3ZK#gpkok91!Tbw~H~UcfP0|!6=5C8-K0YCr{ z00b@#0VVU2S}V=1rcaTdy4b@PrlgyRZmRY9j8-coW%1l8B}rTVFBD^^adWGs|E2zF z*80~cQva{~w)&^Ga$7SnALFo-LJpHgZ#4#6%auHn!KxhO@3i&M`DqttMH9tlB0 zLx~MTsRY9lR5%ey45bJRrA`bb7z`yoZlpI$Kl@T?TQ%z1^@=&OqjNcvy?K(0&Uj2u)KwP+nmH3&x!P_vJWvaf znE`XfycCXNEQVZ^ivGj%Tmt%Efc|Ho|I1g$>eU|T|4Vy%fQbPCKmZT`1ONd*;3^_8 ztH0Yiy7_N<;rXePUaJ0QQ~H0A|G(I>IgOjO_5UUK|36i}t0pdZ}G6~!D0Br+~woJlkiT}Uc*L(&4f0?tnD9E`^ zX664^Q!4+z?$!SPluP&@`2XL4|9@rue`m`74;yMn=cINxx3uS<`TuiX%m#>(bc))i z^#E{N0YCr{00jOg X2q^up^mkiFH~K%JQvWBHqW}K_8`|ot literal 20480 zcmeHPO>f*p7`CG}HHDU5xSP;6LKthly#6?`rKu8>6qMbT-m0-ZPNVLwR~v6=IC0>@ zFW?SWBm`#!M{bBK7k&%lkMY`@-DWEis-Sld9?xbx^X7Tyas2psmF<97;UJBktG0Le zr3f%W$cmm#N6!Q1U@Mvko{2cXKJr~Zj$Jphl5{fUSwO90F*!O+N5#NoAhPJ0m;{_N z;kg)H*Wd#P00MvjAOHve0)PM@00;mAfB+x>2mk`F9f577`&A42|F!1?0ssU60YCr{ z00aO5KmZT`1ONd*01yBK&KrT5$v+UI09#{zAdcj_fFXYokO;|k9AIiq(liS&W=s|a zAmm7A-^vb$d7%KM%oS0q3ScB&WPxL4X%tW#n&u6g%KZ>w*9 zyua1$Z#}*DXlM7nNeJ68H*S2bm*1L?dRzPE&I9w|r+stl$xg4|GdFtO4YSwX?VFn% zhcqNU519xZl5{rB?QU<|+zf@RaPVR`q{MR&7Cd&sgmfq(+!Ze6!XwCGZW1CFhY^=Y zgc$AkE^-j^h_`8W@9*tA)HMCKD?jVny7oo^v&~qd&Kz`YC^Bvz#_Kt@HZB`dHqK9a zl^B*(e3)6w)OukTRVEc@N; zab4SiW*L?tRjIYoD4LG>C^`uc{a%IapekhA3R(8*kjwq$$|4gLvII`;wRX_uj>9aD zn_JGIZWZ*BAY~AFke$S72FY}ML+;`N1{8}J&3Z)cfV@}!kc5oO^nIjhAAC|$?(;ieZDV} zcZ%=Ru^9Cye00R4Ojhe0m6v8b90(h|T@1;@a4df%dHKzvKOM#CZhBy2Gw%j27g#wUYH*oCIFNi9-;xj`<*PJVZm9;5)^z978@nJt|?$Ma=i! zFDI)bJw4L#c_(LNJ)eZ27$tZp5OK>@J5eV@D8XfL6@tqr(~0iu9o^HZ?&$6srZRWG zYJaUYsVx+>S+XLvMO}H-q;``hCAFJ8S;7+P<$Jo#65>0^X;FJ2Yb2fP5-uhdvBv#Q zQG12E5k7S{n*9}NGyAODQG?m77#H4t$eGNpmMfX9eI=Q_FPSYF{`a2+!}YzgEjn-j z1ONd*01yBK00BVY!Vs9(-}R%IEW59(>BE??m?xccQ_}TB*VXz`i8b^;Egs_X=T0d} zn)<&`PVL7`%JRp`S=`8K=zpod>b3s$iPZmVf2>n&?WSg69ubfD!XQkDPQtlCDZvaA zW>D@Uh7x2joH*3;6N7akUkKtEN^BTPB^Zw2g8C#jlp-*cIx&=BFqHVXmc$8?uM1WY zcb9RDH78oL7j`A`L|iD>T(#bQAQfafIk_`8SnA>Z^b4hJ)u=01OXkdv&g4w?y^~CI zClh|6t~xK!%(>W#)ppa-fm(>n4Ol4VrEnAzF^WW?=s#TL643tw^grnT_S;C%{}=Z3 z022cOfB+x>2mk_rz-2^WUVk@r^i2OtTRZkHQvXYXrK$gy`Txr;n>ubeQ$zn>fd9XD zx%~ehTK<1rn}lLTlQ3Rrrjv%5UYdk?v4%3!>(@4OhTDSb4J_QSX%aT;0h$J!n7!d) z@yq>xX(FosDAC+gO<(gB{Qt9@&1FF@bTUi-znoI}|5dN@|64BMf8hUr1OES|_5Xiw z`TtQ(?RZ6MM-@-nr9Dlal+<3u|6lN877He;UuLB}&3b?)YvKmAqci;fv+qW);Qya- zJ6aaw!rM>j|G$*k&B`9||1aai62uG$00MvjAOHybPY{@ud6!zLsiSNC&oGyz Date: Sat, 13 Jul 2024 04:09:44 +0900 Subject: [PATCH 05/55] =?UTF-8?q?[feat]=20api=20=EB=AA=85=EC=84=B8?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 43 ++++++++++++++++-- test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 796571a0..0ac012d2 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -4,15 +4,13 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.record.controller.dto.RecordCreateRequest; +import org.recordy.server.record.controller.dto.request.RecordCreateRequest; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.springframework.data.domain.Slice; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -82,7 +80,7 @@ public ResponseEntity createRecord( @UserId Long uploaderId, @RequestPart RecordCreateRequest recordCreateRequest, @RequestPart File file - ); + ) ; @Operation( summary = "레코드 삭제 API", @@ -223,4 +221,41 @@ public ResponseEntity> getRecentRecordsByUser( @RequestParam long cursorId, @RequestParam int size ); + + @Operation( + summary = "레코드 시청 API", + description = "사용자가 특정 레코드를 시청했음을 기록합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 사용자 또는 기록입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity watch( + @UserId long userId, + @RequestParam long recordId + ); + } diff --git a/test.mv.db b/test.mv.db index 65d6aaba68f397974bd666374ebb27413cd55c30..14523ff3f3f38429bf6419a90eb3f8d932274e55 100644 GIT binary patch literal 20480 zcmeHNO>f*p7`7vlm_kc0+)YRuA&fPi@%II`G*yCj?VuE_bZ7{*D& z38OB)p}`*@00;mAfB+x>2mk_r03ZMe00MvjAOHxwas+lj|G)AaKmdRMAOHve0)PM@ z00;mAfB+x>2mk_rz*Qqqnf%P^ihk@^19~J*<(@!~p2e6Wc^~5GFH^0`)Pt8Z|?E`c7f%)*$j=BA0x7}%*8|~JH*>3H1%q{9L z!f-^HE0~8-+icQ`Y)@$>)M+3x`NsENK{|Z^`6M7eUhvd*xF8c!sW^PUat}p zjmtCKnFMuDo{7&?vWg^?$tphEm)CXL#+j(H=g!F(idF58qTLId3uK8&yLFQ(qs5^lkNdHW2;J zkoHe0&to6=C~ZFS{o!_DxCOG z%@ohhbXVOyp2>PD&f_qp*uzLZG-x;WLPQuzoja;qfgv4S?3KE1fZQm2uNLn->2nXe?KKB_ysZ$0wMsV?9I@TlI*F&A?o*t|?MCR^i{fCt%wZod) z(Iu%Jj(LKosNLjAN$n<27O_MzdzvLtDsa@K_5#*K4Qhw;SQC6xQ+xT-$hq(|n*55) zFnh`4sLAYRjB_79csaAn=}Km6UrA;kNM=ihKmScJT;DIxssRT;01yBK00BS%5C8*)UId z{v7?^43f`NGNt}6hphDfxHZ=Q;}!m&>Hj}K|6g1E|KpVYr!}?NC8@o9pX~Dbf5|Rc zv9-5|HLOAHxw~c!{lENa^aA>S$>XT0|C=$+ef*UA|L>SRwX+BM|H|HIU|>K15C8-K z0YCr{Scbr?{+{UnWTOA2(ac?ZrTU*w>3^b3oWggKmSn^KUo6HZar37Bm;P(L*YK|| zr2oJ2>-wR#a!WHD%5jJzVPIDXKc&!cnDqttMH9tnX%qcR(f z$|W>BAziTuCr0H68kIX~RED8ZnUCvfk|J3ya2a#=I`*+!T`o4+jRgI_>?a@o4+sDPfB+x>2mk{A Za|9~=U+M3rj;{TGDZ9B;v{&K({{@3O=pg_A literal 20480 zcmeHO-EQ1O7`3A|HHDVmaBo7|2w|+5@xQOw&{PRZ3d(Lvuc&6m<235-dbRO}286@~ zPXZ5sxI{wq4G>QNufq6e9PehAO(CHQ`u4)(S&e7DoNtcT$LGs-Of1&V_;b~E55E#I zMhIE_*<|=Uc3EQav7os~VjQ6;h>|1-xRqw(0nKB_Iu_%j!)#a%O#33|&%`+92ni7c z=%xlAKmZT`1ONd*01yBK00BS%5C8-K0YCr{c z2mk_r03ZMe00MvjAaKzLoSOW7F^sV_q6gwgz6%)87ct>Twxbw3);P=Z7?aeMg#ie8 z0Y+ASI4BAQywK+qPgMa7#fv=ltUTkfgPD0@pQ4!H$7?UO>nobRqP=V0d(z$NnIG?O zb$VM*Hy`cn-Zu$x*UYtB-|5x2=A-V`zPa43F;pni_gkr6-la+ReZN6&zrQ>nW(cTWL3s&_5#L3WKD*XqoTe;WwYvc^2beW z2XAGVsnl8-=aUf~@{<@jKQtlpI%H=mWZ7#%uJ%_Ti%e9=5;(Qjrh`t)n6aBA?JY+= zuMT=qkh~1iPrY`Ku8wcXU0hCy5|NqSG#V|DJ8=YDw%%41j_qtziD2>a<WdkZT>&e(Z(FVNQzgmct4R>FDgJ)O7>oM&bL_WKE=J zM|u(U3r05cNeIeOf--?fP_627pCOduD!3ZK#gpkok91!Tbw~H~UcfP0|!6=5C8-K0YCr{ z00b@#0VVU2S}V=1rcaTdy4b@PrlgyRZmRY9j8-coW%1l8B}rTVFBD^^adWGs|E2zF z*80~cQva{~w)&^Ga$7SnALFo-LJpHgZ#4#6%auHn!KxhO@3i&M`DqttMH9tlB0 zLx~MTsRY9lR5%ey45bJRrA`bb7z`yoZlpI$Kl@T?TQ%z1^@=&OqjNcvy?K(0&Uj2u)KwP+nmH3&x!P_vJWvaf znE`XfycCXNEQVZ^ivGj%Tmt%Efc|Ho|I1g$>eU|T|4Vy%fQbPCKmZT`1ONd*;3^_8 ztH0Yiy7_N<;rXePUaJ0QQ~H0A|G(I>IgOjO_5UUK|36i}t0pdZ}G6~!D0Br+~woJlkiT}Uc*L(&4f0?tnD9E`^ zX664^Q!4+z?$!SPluP&@`2XL4|9@rue`m`74;yMn=cINxx3uS<`TuiX%m#>(bc))i z^#E{N0YCr{00jOg X2q^up^mkiFH~K%JQvWBHqW}K_8`|ot From cfedd1d19111d9a6b99563d071dd31998f8caec6 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 04:14:41 +0900 Subject: [PATCH 06/55] =?UTF-8?q?[feat]=20api=20=EB=AA=85=EC=84=B8?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 42 ++++++++++++++++++ test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 42 insertions(+) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 0ac012d2..a1aa130f 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -258,4 +258,46 @@ public ResponseEntity watch( @RequestParam long recordId ); + @Operation( + summary = "인기 레코드 조회 API", + description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getFamousRecords( + @RequestParam(required = false) List keywords, + @RequestParam(required = false, defaultValue = "0") int pageNumber, + @RequestParam(required = false, defaultValue = "10") int pageSize + ); + } diff --git a/test.mv.db b/test.mv.db index 14523ff3f3f38429bf6419a90eb3f8d932274e55..47561bbbf05ad38724daf3fee8bfcb4fbeabcfc7 100644 GIT binary patch literal 20480 zcmeI3O>f*p7{~31Buk;C7w#ssjVg>aGk*7}8=5MCq@e7!^j6K-<235-dbRO}gcAp@ zi0=Rw#07CjAjBQ<3HU6G#~#P~l4h$WM3J5xJRWB}^UU9#XP@89cq<|%>t*pvm39uk z<`G5+nemJ9;AP}G)Qm@*<~)gTh(bS165o%_G#mA49@*v*9~~ZK16eTb@jQOPM^Q`z zoB0m9p}`+001AKtpa3WU3V;Hj04M+ofC8WZC;$pvxdK~?`&A13f91~v3;+c{0Z;%G z00lq+PyiGF1wa8%02BZPE?R-pMgATiMA#hCeSRob_51WV^2H{AJ{?BbHb+^ON7yBS z*cgDYlO)K@5BkMMff$k0o!kX5;KzC7nt2vSUg{bb_9r$IEd9NDUt7ARwJ?oIKtkRk z4(DD9*=vyr?fZb z4{1)jCqsT6%a~LB%8#w5<>n5a$j%iVyYq;~qSq&PrwR)Z_Oh>3_f@I4mdh7*x^ymT zvNld~-X4wUiMs2eL^GyrldbJ!gMHNynJOTR-^o}<^h><{yL5PGqnEKgp7IeN#QaXt z?~fO`WtZnvmR_VMnx_A@`kk)d)>gzQv#`BfBt#y|b61{w^61NBAdlh7fcCld{9Ty{ zQ;UARqcXz&`dswkeR(|_@{U;WjN?CZtT>1uzdY%fS?Z@wY>o%x!(!`}a@1wMovX*^I$>iASD?JMnZ@yVNC)vrg!~_B zlf%knd%|R5o|=rM$s|VdT4Ay{6)$%2D>7xXBaL=_T>qG`G{7FJY(C4zP}*o?*0ho6 z_@?@OLJ3dMX^t?L6uGiF!W=4m(l?s+(Vj>jXxhL3h*Uh#-7=LKIDi7604M+ofC8WZ zC~#>Cs92Cz0oB~y^a;hG9bY6$D<;38+7G7!x+3l@g19PjQ(@+rA=|0lp$hW~{ufc2 zYU<6?;$wnemOs;$mo$Az`@p#Oth3oQKH1xBcQ>DJJlWoPXb|G88EZGc)yu2Klg{Rz zvHi$+{CU^de74=`c8s-7d(G&yce=(p#mr^`=$XSsjF@`s##XztWvnwUzHkT{IM@AD{QruPT{Q>%e`&D{R16A$0-yjW01AKtizzV8-%XCL zzosVy2O^qt-W;K)YpD63Eyn+|1Q{b6d%O`svPV+LCh(`5)H*tLf*p7`7vlm_kc0+)YRuA&fPi@%II`G*yCj?VuE_bZ7{*D& z38OB)p}`*@00;mAfB+x>2mk_r03ZMe00MvjAOHxwas+lj|G)AaKmdRMAOHve0)PM@ z00;mAfB+x>2mk_rz*Qqqnf%P^ihk@^19~J*<(@!~p2e6Wc^~5GFH^0`)Pt8Z|?E`c7f%)*$j=BA0x7}%*8|~JH*>3H1%q{9L z!f-^HE0~8-+icQ`Y)@$>)M+3x`NsENK{|Z^`6M7eUhvd*xF8c!sW^PUat}p zjmtCKnFMuDo{7&?vWg^?$tphEm)CXL#+j(H=g!F(idF58qTLId3uK8&yLFQ(qs5^lkNdHW2;J zkoHe0&to6=C~ZFS{o!_DxCOG z%@ohhbXVOyp2>PD&f_qp*uzLZG-x;WLPQuzoja;qfgv4S?3KE1fZQm2uNLn->2nXe?KKB_ysZ$0wMsV?9I@TlI*F&A?o*t|?MCR^i{fCt%wZod) z(Iu%Jj(LKosNLjAN$n<27O_MzdzvLtDsa@K_5#*K4Qhw;SQC6xQ+xT-$hq(|n*55) zFnh`4sLAYRjB_79csaAn=}Km6UrA;kNM=ihKmScJT;DIxssRT;01yBK00BS%5C8*)UId z{v7?^43f`NGNt}6hphDfxHZ=Q;}!m&>Hj}K|6g1E|KpVYr!}?NC8@o9pX~Dbf5|Rc zv9-5|HLOAHxw~c!{lENa^aA>S$>XT0|C=$+ef*UA|L>SRwX+BM|H|HIU|>K15C8-K z0YCr{Scbr?{+{UnWTOA2(ac?ZrTU*w>3^b3oWggKmSn^KUo6HZar37Bm;P(L*YK|| zr2oJ2>-wR#a!WHD%5jJzVPIDXKc&!cnDqttMH9tnX%qcR(f z$|W>BAziTuCr0H68kIX~RED8ZnUCvfk|J3ya2a#=I`*+!T`o4+jRgI_>?a@o4+sDPfB+x>2mk{A Za|9~=U+M3rj;{TGDZ9B;v{&K({{@3O=pg_A From 7c53ea3d42fc4b3165f14d89abe4f3dda85fb4ae Mon Sep 17 00:00:00 2001 From: elive7 Date: Sat, 13 Jul 2024 02:24:24 +0900 Subject: [PATCH 07/55] =?UTF-8?q?[refactor]=20getRecentRecords=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=EA=B0=92=20=EA=B5=AC=EC=84=B1=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 15 ++++++----- .../controller/dto/response/RecordInfo.java | 25 +++++++++++++++++++ .../dto/response/RecordInfoWithBookmark.java | 8 ++++++ .../server/record/service/RecordService.java | 5 ++-- .../service/impl/RecordServiceImpl.java | 23 +++++++++++++++++ .../service/RecordStatService.java | 2 ++ .../service/impl/RecordStatServiceImpl.java | 7 ++++++ .../record/service/RecordServiceTest.java | 17 +++++++------ 8 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java create mode 100644 src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 9c2c30cb..ae071185 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -4,11 +4,14 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; +import org.recordy.server.record.controller.dto.response.RecordInfo; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; import org.recordy.server.record.service.RecordService; +import org.recordy.server.record_stat.service.RecordStatService; import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,6 +26,7 @@ public class RecordController { private final RecordService recordService; + private final RecordStatService recordStatService; @PostMapping public ResponseEntity createRecord( @@ -52,16 +56,15 @@ public ResponseEntity deleteRecord( } @GetMapping("/recent") - public ResponseEntity> getRecentRecords( + public ResponseEntity> getRecentRecordInfoWithBookmarks( + @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { - Slice records = recordService.getRecentRecords(keywords, cursorId, size); - return ResponseEntity - .ok() - .body(records); + Slice recordInfoWithBookmarks = recordService.getRecentRecordInfoWithBookmarks(userId, keywords, cursorId, size); + return ResponseEntity.ok().body(recordInfoWithBookmarks); } @GetMapping("/famous") @@ -88,7 +91,7 @@ public ResponseEntity watch( @GetMapping public ResponseEntity> getRecentRecordsByUser( - @RequestParam long userId, + @UserId long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java new file mode 100644 index 00000000..e30779ee --- /dev/null +++ b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java @@ -0,0 +1,25 @@ +package org.recordy.server.record.controller.dto.response; + +import org.recordy.server.record.service.dto.FileUrl; +import org.recordy.server.record.domain.Record; +public record RecordInfo ( + Long id, + FileUrl fileUrl, + String location, + String content, + Long uploaderId, + String uploaderNickname, + Long bookmarkCount +){ + public static RecordInfo from(Record record){ + return new RecordInfo( + record.getId(), + record.getFileUrl(), + record.getLocation(), + record.getContent(), + record.getUploader().getId(), + record.getUploader().getNickname(), + record.getBookmarkCount() + ); + } +} diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java new file mode 100644 index 00000000..6e8f3ec0 --- /dev/null +++ b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java @@ -0,0 +1,8 @@ +package org.recordy.server.record.controller.dto.response; + +public record RecordInfoWithBookmark ( + RecordInfo recordInfo, + Boolean isBookmark +){ + +} diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index 0e026384..f40514b3 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -1,5 +1,6 @@ package org.recordy.server.record.service; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; @@ -16,7 +17,7 @@ public interface RecordService { // query void watch(long userId, long recordId); Slice getFamousRecords(List keywords, int pageNumber, int size); - Slice getRecentRecords(List keywords, Long cursorId, int size); Slice getRecentRecordsByUser(long userId, long cursorId, int size); - Slice getSubscribingRecords(long userId, long cursorId, int size); + Slice getRecentRecordInfoWithBookmarks(long userId, List keywords, Long cursorId, int size); + } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index 7d31bf0b..502bb2cf 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -3,6 +3,8 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.keyword.domain.Keyword; +import org.recordy.server.record.controller.dto.response.RecordInfo; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; @@ -11,8 +13,10 @@ import org.recordy.server.record.service.FileService; import org.recordy.server.record.service.RecordService; import org.recordy.server.record.service.dto.FileUrl; +import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.View; import org.recordy.server.record_stat.repository.ViewRepository; +import org.recordy.server.record_stat.service.RecordStatService; import org.recordy.server.user.domain.User; import org.recordy.server.user.exception.UserException; import org.recordy.server.user.service.UserService; @@ -31,6 +35,7 @@ public class RecordServiceImpl implements RecordService { private final ViewRepository viewRepository; private final FileService fileService; private final UserService userService; + private final RecordStatService recordStatService; @Override public Record create(RecordCreate recordCreate, File file) { @@ -87,6 +92,24 @@ private Slice getFamousRecordsWithKeywords(List keywords, int p } @Override + public Slice getRecentRecordsByUser(long userId, long cursorId, int size) { + return recordRepository.findAllByUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); + } + + @Override + public Slice getRecentRecordInfoWithBookmarks(long userId,List keywords, Long cursorId, + int size) { + Slice records = getRecentRecords(keywords,cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); + + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } + public Slice getRecentRecords(List keywords, Long cursorId, int size) { if (Objects.isNull(keywords) || keywords.isEmpty()) { return getRecentRecords(cursorId, size); diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index b9dedc88..abc54a5f 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -1,5 +1,6 @@ package org.recordy.server.record_stat.service; +import java.util.List; import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.usecase.Preference; @@ -14,4 +15,5 @@ public interface RecordStatService { // query Preference getPreference(long userId); Slice getBookmarkedRecords(long userId, long cursorId, int size); + List findBookmarks(long userId, Slice records); } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index 7c4c89d4..4f0ac4e5 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -42,6 +42,13 @@ public void deleteBookmark(long userId, long recordId) { bookmarkRepository.delete(userId, recordId); } + @Override + public List findBookmarks(long userId, Slice records) { + return records.getContent().stream() + .map(record -> bookmarkRepository.findByUserAndRecord(userId, record.getId()).isPresent()) + .collect(Collectors.toList()); + } + @Override public Preference getPreference(long userId) { return Preference.of(userId, recordRepository.countAllByUserIdGroupByKeyword(userId)); diff --git a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java index ec372f3f..96829a2b 100644 --- a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.mock.FakeContainer; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; @@ -61,7 +62,7 @@ void init() { recordService.delete(1, record.getId()); // then - Slice result = recordService.getRecentRecords(null, 0L, 1); + Slice result = recordService.getRecentRecordInfoWithBookmarks(1,null, 0L, 1); assertAll( () -> assertThat(result.getContent()).hasSize(0), () -> assertThat(result.hasNext()).isFalse() @@ -113,16 +114,16 @@ void init() { recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); // when - Slice result = recordService.getRecentRecords(null, 6L, 10); + Slice result = recordService.getRecentRecordInfoWithBookmarks(1, null, 6L, 10); // then assertAll( () -> assertThat(result.getContent()).hasSize(5), - () -> assertThat(result.getContent().get(0).getId()).isEqualTo(5L), - () -> assertThat(result.getContent().get(1).getId()).isEqualTo(4L), - () -> assertThat(result.getContent().get(2).getId()).isEqualTo(3L), - () -> assertThat(result.getContent().get(3).getId()).isEqualTo(2L), - () -> assertThat(result.getContent().get(4).getId()).isEqualTo(1L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(5L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(4L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(3L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(2L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } @@ -135,7 +136,7 @@ void init() { recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); // when - Slice result = recordService.getRecentRecords(null, 1L, 3); + Slice result = recordService.getRecentRecordInfoWithBookmarks(1, null, 1L, 3); // then assertAll( From ba37ff89abda9784c4419ca74741f10a38569809 Mon Sep 17 00:00:00 2001 From: elive7 Date: Sat, 13 Jul 2024 04:57:37 +0900 Subject: [PATCH 08/55] =?UTF-8?q?[refactor]=20RecordController=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=EA=B0=92=20=EA=B5=AC=EC=84=B1=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 12 ++++---- .../server/record/service/RecordService.java | 4 +-- .../service/impl/RecordServiceImpl.java | 28 +++++++++++++++++++ .../recordy/server/mock/FakeContainer.java | 2 +- .../record/service/RecordServiceTest.java | 14 +++++----- 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index ae071185..3d19e51b 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -26,7 +26,6 @@ public class RecordController { private final RecordService recordService; - private final RecordStatService recordStatService; @PostMapping public ResponseEntity createRecord( @@ -68,14 +67,15 @@ public ResponseEntity> getRecentRecordInfoWithBook } @GetMapping("/famous") - public ResponseEntity> getFamousRecords( + public ResponseEntity> getFamousRecordInfoWithBookmarks( + @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize ){ return ResponseEntity .ok() - .body(recordService.getFamousRecords(keywords, pageNumber, pageSize)); + .body(recordService.getFamousRecordInfoWithBookmarks(userId, keywords, pageNumber, pageSize)); } @PostMapping("/{recordId}") @@ -89,13 +89,13 @@ public ResponseEntity watch( .build(); } - @GetMapping - public ResponseEntity> getRecentRecordsByUser( + @GetMapping("/user") + public ResponseEntity> getRecentRecordInfoWithBookmarksByUser( @UserId long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { - Slice records = recordService.getRecentRecordsByUser(userId, cursorId, size); + Slice records = recordService.getRecentRecordInfoWithBookmarksByUser(userId, cursorId, size); return ResponseEntity .ok() diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index f40514b3..92c63d3a 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -16,8 +16,8 @@ public interface RecordService { // query void watch(long userId, long recordId); - Slice getFamousRecords(List keywords, int pageNumber, int size); - Slice getRecentRecordsByUser(long userId, long cursorId, int size); + Slice getFamousRecordInfoWithBookmarks(long userId, List keywords, int pageNumber, int size); + Slice getRecentRecordInfoWithBookmarksByUser(long userId, long cursorId, int size); Slice getRecentRecordInfoWithBookmarks(long userId, List keywords, Long cursorId, int size); } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index 502bb2cf..cad98392 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -75,6 +75,21 @@ public void watch(long userId, long recordId) { } @Override + public Slice getFamousRecordInfoWithBookmarks(long userId, List keywords, + int pageNumber, int size) { + + Slice records = getFamousRecords(keywords, pageNumber,size); + List bookmarks = recordStatService.findBookmarks(userId, records); + + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } + + public Slice getFamousRecords(List keywords, int pageNumber, int size) { if (Objects.isNull(keywords) || keywords.isEmpty()) { return getFamousRecords(pageNumber, size); @@ -92,6 +107,19 @@ private Slice getFamousRecordsWithKeywords(List keywords, int p } @Override + public Slice getRecentRecordInfoWithBookmarksByUser(long userId, long cursorId, int size) { + + Slice records = getRecentRecordsByUser(userId, cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); + + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } + public Slice getRecentRecordsByUser(long userId, long cursorId, int size) { return recordRepository.findAllByUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); } diff --git a/src/test/java/org/recordy/server/mock/FakeContainer.java b/src/test/java/org/recordy/server/mock/FakeContainer.java index 40800853..8f7418a6 100644 --- a/src/test/java/org/recordy/server/mock/FakeContainer.java +++ b/src/test/java/org/recordy/server/mock/FakeContainer.java @@ -112,9 +112,9 @@ public FakeContainer() { this.authService = new AuthServiceImpl(authRepository, authPlatformServiceFactory, authTokenService); this.userService = new UserServiceImpl(userRepository, authService, authTokenService); this.fileService = new FakeFileService(); - this.recordService = new RecordServiceImpl(recordRepository, viewRepository, fileService, userService); this.keywordService = new KeywordServiceImpl(keywordRepository); this.recordStatService = new RecordStatServiceImpl(userRepository, recordRepository, bookmarkRepository); + this.recordService = new RecordServiceImpl(recordRepository, viewRepository, fileService, userService, recordStatService); this.s3Service = mock(S3Service.class); // S3Service mock 사용 diff --git a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java index 96829a2b..e0a94c88 100644 --- a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java @@ -93,13 +93,13 @@ void init() { recordService.create(DomainFixture.createRecordCreateByOtherUser(), DomainFixture.createFile()); //when - Slice result = recordService.getRecentRecordsByUser(1, Long.MAX_VALUE, 10); + Slice result = recordService.getRecentRecordInfoWithBookmarksByUser(1, Long.MAX_VALUE, 10); //then assertAll( () -> assertThat(result.get()).hasSize(2), - () -> assertThat(result.getContent().get(0).getId()).isEqualTo(2L), - () -> assertThat(result.getContent().get(1).getId()).isEqualTo(1L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(2L), + () -> assertThat(result.getContent().get(1).recordInfo().id()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } @@ -120,10 +120,10 @@ void init() { assertAll( () -> assertThat(result.getContent()).hasSize(5), () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(5L), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(4L), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(3L), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(2L), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(1L), + () -> assertThat(result.getContent().get(1).recordInfo().id()).isEqualTo(4L), + () -> assertThat(result.getContent().get(2).recordInfo().id()).isEqualTo(3L), + () -> assertThat(result.getContent().get(3).recordInfo().id()).isEqualTo(2L), + () -> assertThat(result.getContent().get(4).recordInfo().id()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } From 33ec491ed15dafae82c77496fe366226eef3a095 Mon Sep 17 00:00:00 2001 From: elive7 Date: Sun, 14 Jul 2024 17:39:05 +0900 Subject: [PATCH 09/55] =?UTF-8?q?[chore]=20=ED=95=A8=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=88=98=EC=A0=95=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordController.java | 6 +++--- .../recordy/server/record/service/RecordService.java | 6 +++--- .../server/record/service/impl/RecordServiceImpl.java | 11 ++++------- .../server/record/service/RecordServiceTest.java | 8 ++++---- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 3d19e51b..24546024 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -62,7 +62,7 @@ public ResponseEntity> getRecentRecordInfoWithBook @RequestParam(required = false, defaultValue = "10") int size ) { - Slice recordInfoWithBookmarks = recordService.getRecentRecordInfoWithBookmarks(userId, keywords, cursorId, size); + Slice recordInfoWithBookmarks = recordService.getRecentRecordInfosWithBookmarks(userId, keywords, cursorId, size); return ResponseEntity.ok().body(recordInfoWithBookmarks); } @@ -75,7 +75,7 @@ public ResponseEntity> getFamousRecordInfoWithBook ){ return ResponseEntity .ok() - .body(recordService.getFamousRecordInfoWithBookmarks(userId, keywords, pageNumber, pageSize)); + .body(recordService.getFamousRecordInfosWithBookmarks(userId, keywords, pageNumber, pageSize)); } @PostMapping("/{recordId}") @@ -95,7 +95,7 @@ public ResponseEntity> getRecentRecordInfoWithBook @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { - Slice records = recordService.getRecentRecordInfoWithBookmarksByUser(userId, cursorId, size); + Slice records = recordService.getRecentRecordInfosWithBookmarksByUser(userId, cursorId, size); return ResponseEntity .ok() diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index 92c63d3a..76c20343 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -16,8 +16,8 @@ public interface RecordService { // query void watch(long userId, long recordId); - Slice getFamousRecordInfoWithBookmarks(long userId, List keywords, int pageNumber, int size); - Slice getRecentRecordInfoWithBookmarksByUser(long userId, long cursorId, int size); - Slice getRecentRecordInfoWithBookmarks(long userId, List keywords, Long cursorId, int size); + Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, int pageNumber, int size); + Slice getRecentRecordInfosWithBookmarksByUser(long userId, long cursorId, int size); + Slice getRecentRecordInfosWithBookmarks(long userId, List keywords, Long cursorId, int size); } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index cad98392..d67d97b5 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -75,7 +75,7 @@ public void watch(long userId, long recordId) { } @Override - public Slice getFamousRecordInfoWithBookmarks(long userId, List keywords, + public Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, int pageNumber, int size) { Slice records = getFamousRecords(keywords, pageNumber,size); @@ -107,7 +107,7 @@ private Slice getFamousRecordsWithKeywords(List keywords, int p } @Override - public Slice getRecentRecordInfoWithBookmarksByUser(long userId, long cursorId, int size) { + public Slice getRecentRecordInfosWithBookmarksByUser(long userId, long cursorId, int size) { Slice records = getRecentRecordsByUser(userId, cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); @@ -125,7 +125,7 @@ public Slice getRecentRecordsByUser(long userId, long cursorId, int size } @Override - public Slice getRecentRecordInfoWithBookmarks(long userId,List keywords, Long cursorId, + public Slice getRecentRecordInfosWithBookmarks(long userId,List keywords, Long cursorId, int size) { Slice records = getRecentRecords(keywords,cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); @@ -154,10 +154,7 @@ private Slice getRecentRecordsWithKeywords(List keywords, long return recordRepository.findAllByIdAfterAndKeywordsOrderByIdDesc(keywords, cursorId, PageRequest.ofSize(size)); } - @Override - public Slice getRecentRecordsByUser(long userId, long cursorId, int size) { - return recordRepository.findAllByUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); - } + @Override public Slice getSubscribingRecords(long userId, long cursorId, int size) { diff --git a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java index e0a94c88..39949983 100644 --- a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java @@ -62,7 +62,7 @@ void init() { recordService.delete(1, record.getId()); // then - Slice result = recordService.getRecentRecordInfoWithBookmarks(1,null, 0L, 1); + Slice result = recordService.getRecentRecordInfosWithBookmarks(1,null, 0L, 1); assertAll( () -> assertThat(result.getContent()).hasSize(0), () -> assertThat(result.hasNext()).isFalse() @@ -93,7 +93,7 @@ void init() { recordService.create(DomainFixture.createRecordCreateByOtherUser(), DomainFixture.createFile()); //when - Slice result = recordService.getRecentRecordInfoWithBookmarksByUser(1, Long.MAX_VALUE, 10); + Slice result = recordService.getRecentRecordInfosWithBookmarksByUser(1, Long.MAX_VALUE, 10); //then assertAll( @@ -114,7 +114,7 @@ void init() { recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); // when - Slice result = recordService.getRecentRecordInfoWithBookmarks(1, null, 6L, 10); + Slice result = recordService.getRecentRecordInfosWithBookmarks(1, null, 6L, 10); // then assertAll( @@ -136,7 +136,7 @@ void init() { recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); // when - Slice result = recordService.getRecentRecordInfoWithBookmarks(1, null, 1L, 3); + Slice result = recordService.getRecentRecordInfosWithBookmarks(1, null, 1L, 3); // then assertAll( From 3aba0fca71fc230e000d7945660227b74610b2eb Mon Sep 17 00:00:00 2001 From: elive7 Date: Sun, 14 Jul 2024 19:58:08 +0900 Subject: [PATCH 10/55] =?UTF-8?q?[refactor]=20RecordController=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=EA=B0=92=20=EA=B5=AC=EC=84=B1=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=EC=99=84=EC=84=B1=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 17 +++++++++++++---- .../server/record/service/RecordService.java | 2 +- .../record/service/impl/RecordServiceImpl.java | 12 +++++++++++- .../repository/BookmarkRepository.java | 2 ++ .../repository/impl/BookmarkRepositoryImpl.java | 7 +++++++ .../service/impl/RecordStatServiceImpl.java | 4 +++- .../mock/bookmark/FakeBookmarkRepository.java | 8 ++++++++ .../BookmarkRepositoryIntegrationTest.java | 14 ++++++++++++++ 8 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 24546024..83e40000 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -89,16 +89,25 @@ public ResponseEntity watch( .build(); } - @GetMapping("/user") + @GetMapping public ResponseEntity> getRecentRecordInfoWithBookmarksByUser( - @UserId long userId, + @UserId Long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { - Slice records = recordService.getRecentRecordInfosWithBookmarksByUser(userId, cursorId, size); + return ResponseEntity + .ok() + .body(recordService.getRecentRecordInfosWithBookmarksByUser(userId, cursorId, size)); + } + @GetMapping("/follow") + public ResponseEntity> getSubscribingRecordInfosWithBookmarks( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size + ) { return ResponseEntity .ok() - .body(records); + .body(recordService.getSubscribingRecordInfosWithBookmarks(userId, cursorId, size)); } } diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index 76c20343..a86f8001 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -19,5 +19,5 @@ public interface RecordService { Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, int pageNumber, int size); Slice getRecentRecordInfosWithBookmarksByUser(long userId, long cursorId, int size); Slice getRecentRecordInfosWithBookmarks(long userId, List keywords, Long cursorId, int size); - + Slice getSubscribingRecordInfosWithBookmarks(long userId, long cursorId, int size); } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index d67d97b5..e03df40a 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -154,9 +154,19 @@ private Slice getRecentRecordsWithKeywords(List keywords, long return recordRepository.findAllByIdAfterAndKeywordsOrderByIdDesc(keywords, cursorId, PageRequest.ofSize(size)); } + @Override + public Slice getSubscribingRecordInfosWithBookmarks(long userId, long cursorId, int size) { + Slice records = getSubscribingRecords(userId,cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } - @Override public Slice getSubscribingRecords(long userId, long cursorId, int size) { return recordRepository.findAllBySubscribingUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); } diff --git a/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java b/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java index d5e0eb6e..d7d9ef58 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java +++ b/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java @@ -1,5 +1,6 @@ package org.recordy.server.record_stat.repository; +import java.util.Optional; import org.recordy.server.record_stat.domain.Bookmark; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -12,4 +13,5 @@ public interface BookmarkRepository { //query Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable); + Optional findByUserIdAndRecordId(long userId, long recordId); } diff --git a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java index d1666a52..71f0a64b 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java +++ b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java @@ -1,5 +1,6 @@ package org.recordy.server.record_stat.repository.impl; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.BookmarkEntity; @@ -33,4 +34,10 @@ public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, return bookmarkQueryDslRepository.findAllByUserOrderByIdDesc(userId, cursor, pageable) .map(BookmarkEntity::toDomain); } + + @Override + public Optional findByUserIdAndRecordId(long userId, long recordId) { + return bookmarkJpaRepository.findByUser_IdAndRecord_Id(userId, recordId) + .map(BookmarkEntity::toDomain); + } } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index 4f0ac4e5..93727c43 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -1,5 +1,7 @@ package org.recordy.server.record_stat.service.impl; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.record.domain.Record; @@ -45,7 +47,7 @@ public void deleteBookmark(long userId, long recordId) { @Override public List findBookmarks(long userId, Slice records) { return records.getContent().stream() - .map(record -> bookmarkRepository.findByUserAndRecord(userId, record.getId()).isPresent()) + .map(record -> bookmarkRepository.findByUserIdAndRecordId(userId, record.getId()).isPresent()) .collect(Collectors.toList()); } diff --git a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java index 75e09379..d5f7a145 100644 --- a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java +++ b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.repository.BookmarkRepository; import org.springframework.data.domain.Pageable; @@ -49,4 +50,11 @@ public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, return new SliceImpl<>(content.subList(0, pageable.getPageSize()), pageable, true); } + + @Override + public Optional findByUserIdAndRecordId(long userId, long recordId) { + return bookmarks.values().stream() + .filter(bookmark -> bookmark.getUser().getId() == userId && bookmark.getRecord().getId() == recordId) + .findFirst(); + } } diff --git a/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java b/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java index dde201c5..ad52c175 100644 --- a/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java +++ b/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java @@ -113,4 +113,18 @@ public class BookmarkRepositoryIntegrationTest extends IntegrationTest { () -> assertThat(result.hasNext()).isFalse() ); } + + @Test + void findByUserAndRecord를_통해_북마크를_찾을_수_있다() { + //given + + //when + Bookmark bookmark = bookmarkRepository.findByUserIdAndRecordId(1,1).get(); + + //then + assertAll( + () -> assertThat(bookmark.getUser().getId()).isEqualTo(1), + () -> assertThat(bookmark.getRecord().getId()).isEqualTo(1) + ); + } } From 57dca4e10911a8e862c4f34fe3c7dcbd7a4d1ede Mon Sep 17 00:00:00 2001 From: elive7 Date: Sun, 14 Jul 2024 21:01:59 +0900 Subject: [PATCH 11/55] =?UTF-8?q?[refactor]=20RecordStatController=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=EA=B0=92=20=EA=B5=AC=EC=84=B1=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EC=99=84=EC=84=B1=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record_stat/controller/RecordStatApi.java | 3 ++- .../controller/RecordStatController.java | 5 +++-- .../record_stat/service/RecordStatService.java | 3 ++- .../service/impl/RecordStatServiceImpl.java | 15 +++++++++++++++ ...st.java => ViewRepositoryIntegrationTest.java} | 0 .../service/RecordStatServiceTest.java | 13 +++++++------ 6 files changed, 29 insertions(+), 10 deletions(-) rename src/test/java/org/recordy/server/record_stat/repository/impl/{ViewRepositoryTest.java => ViewRepositoryIntegrationTest.java} (100%) diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java index d978597e..1e9fe0c0 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.usecase.Preference; import org.springframework.data.domain.Slice; @@ -86,7 +87,7 @@ public ResponseEntity getPreference( ) } ) - public ResponseEntity> getBookmarkedRecords( + public ResponseEntity> getBookmarkedRecords( @UserId Long userId, @RequestParam(required = false, defaultValue = "0L") long cursorId, @RequestParam(required = false, defaultValue = "10") int size diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java index d04a05b2..3f883560 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record_stat.domain.usecase.Preference; @@ -65,13 +66,13 @@ public ResponseEntity getPreference( @Override @GetMapping("/bookmark") - public ResponseEntity> getBookmarkedRecords( + public ResponseEntity> getBookmarkedRecords( @UserId Long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { return ResponseEntity .status(HttpStatus.OK) - .body(recordStatService.getBookmarkedRecords(userId,cursorId,size)); + .body(recordStatService.getBookmarkedRecordInfosWithBookmarks(userId,cursorId,size)); } } diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index abc54a5f..04c5f6a6 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -1,6 +1,7 @@ package org.recordy.server.record_stat.service; import java.util.List; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.usecase.Preference; @@ -14,6 +15,6 @@ public interface RecordStatService { // query Preference getPreference(long userId); - Slice getBookmarkedRecords(long userId, long cursorId, int size); + Slice getBookmarkedRecordInfosWithBookmarks(long userId, long cursorId, int size); List findBookmarks(long userId, Slice records); } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index 93727c43..655b94b2 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -4,6 +4,8 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; +import org.recordy.server.record.controller.dto.response.RecordInfo; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; @@ -56,7 +58,20 @@ public Preference getPreference(long userId) { return Preference.of(userId, recordRepository.countAllByUserIdGroupByKeyword(userId)); } + @Override + public Slice getBookmarkedRecordInfosWithBookmarks(long userId, long cursorId, int size) { + Slice records = getBookmarkedRecords(userId, cursorId, size); + List bookmarks = findBookmarks(userId, records); + + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } + public Slice getBookmarkedRecords(long userId, long cursorId, int size) { return bookmarkRepository.findAllByBookmarksOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)) .map(Bookmark::getRecord); diff --git a/src/test/java/org/recordy/server/record_stat/repository/impl/ViewRepositoryTest.java b/src/test/java/org/recordy/server/record_stat/repository/impl/ViewRepositoryIntegrationTest.java similarity index 100% rename from src/test/java/org/recordy/server/record_stat/repository/impl/ViewRepositoryTest.java rename to src/test/java/org/recordy/server/record_stat/repository/impl/ViewRepositoryIntegrationTest.java diff --git a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java index 437cab98..e57a9682 100644 --- a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java +++ b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.recordy.server.mock.FakeContainer; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record_stat.domain.Bookmark; @@ -55,7 +56,7 @@ void init() { recordStatService.deleteBookmark(1,1); // then - Slice result = recordStatService.getBookmarkedRecords(1, 7, 10); + Slice result = recordStatService.getBookmarkedRecordInfosWithBookmarks(1, 7, 10); assertAll( () -> assertThat(result.getContent()).hasSize(0) @@ -73,14 +74,14 @@ void init() { recordStatService.bookmark(2, 3); // when - Slice result = recordStatService.getBookmarkedRecords(1, 7, 10); + Slice result = recordStatService.getBookmarkedRecordInfosWithBookmarks(1, 7, 10); // then assertAll( () -> assertThat(result.getContent()).hasSize(3), - () -> assertThat(result.getContent().get(0).getId()).isEqualTo(3L), - () -> assertThat(result.getContent().get(1).getId()).isEqualTo(2L), - () -> assertThat(result.getContent().get(2).getId()).isEqualTo(1L), + () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(3L), + () -> assertThat(result.getContent().get(1).recordInfo().id()).isEqualTo(2L), + () -> assertThat(result.getContent().get(2).recordInfo().id()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } @@ -96,7 +97,7 @@ void init() { recordStatService.bookmark(2, 3); // when - Slice result = recordStatService.getBookmarkedRecords(1, 1, 10); + Slice result = recordStatService.getBookmarkedRecordInfosWithBookmarks(1, 1, 10); // then assertAll( From 6973029df9a1b8c93a6978f8342a28b4428f62d2 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sun, 14 Jul 2024 21:16:09 +0900 Subject: [PATCH 12/55] [docs] --- test.mv.db | Bin 20480 -> 20480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test.mv.db b/test.mv.db index 47561bbbf05ad38724daf3fee8bfcb4fbeabcfc7..c386a2c42289b93cb66cac558b12b598996577d6 100644 GIT binary patch literal 20480 zcmeI3L2ukd6vyp|q}zlRF5D0@p>2dP)_6Q#dwlAarb?uwRM~CSLs2xg$4Qi3d$sX~ zh7$)q0B1Pz0T6d2?i~0CoDrXb=keO>?50hiO{<`{hq1>Qd*1wZ{4)RdW;X(AhW#u$ z44m@VJ@`fjHX+1}_Q&aA;QPXiMpEQ54s1@i$K%-ZA~VTG1ChgB$8vOZkfo|&(wBL( zFGm3ru^lGNTh{P{1dsp{Kmter2_OL^fCP{L5fCP{L z51DgpJ{#gE7TezvUY!OkPa@nFx z%61||%W81o3@{Trsd)4@3l`KDj;97$EFqUsuDgTD`MaPT<+rIXua_ zcaqD_Xe3UmyIvPGW5zbs+g6tDRUOfp24MVF7ItA=F#Wg1@YcP47VgMIj$|6iTgA9P zzsN1yG8d}#MMeT-eqQ-XUtG}i1?^+w&eQIC&-h|zz0+IYz4v%?>%IZ++p4j8<2${) zYCP_)?--j8jE7(LjP<9R-CoyN?RHj;ZfC1!tO+}GLYST*lc7tK_L{NL>24Tnp@jW9 ze(Z$~^<8315xZeR+YX_^lb$1_Pl?OCB!u@NjEc8{5azVGM_fXD>aQ7{``eojHBJBR z#)k{ql6GA=4a@hv`pmyJfT3Fl@lxR_EW13=^5FiWS8m3uHyfRHH~oWS`AE5*!sV2% zr?|Ea=d}}>_?3w-vZFa)BodEvX^zwJQL$U8^i9d6-pMDE8Fni94S(fTj>^oUXgm~Y zbP^Enr`lwHVlq4BA*nev*;XclYgE??lPR1}Jm+bn;Sa@!3%7QlV04(+=NRcLBN_FZ zMpE6r0Y15WBn@3s)Rc!NP@~gYEF%H4?ORRzYzMx^yPEdr?@))+CgE6>HtsE1!V=*MGhKqo%*FErDH@%@&ITRi&d!SCws5daCqQ$(K?wkk;Hy-dP=YH}Wm^pEb5MOBsO#BKroE9!k3jFj?;DQFTXPZirA6LTO>#LHf^LM{Z>st@ zjkB$6&$5l88r0Rv4=8H=L2YGDu&a6sW_!A$?w<5y9?FxTibKJp97$MdyVDIc3!te(UFPKlNBv6$MWoNUTR-k9!ZDl=y)ANfQ+f?zxqV4KQE zI;VJ@Y2aaWu<&9U+D|T$GadOAC-Rbhezol>i;Taf%^YV{kOz^ zkN^@u0!RP}AOR$B^$E=C@2UP5Q~hr<$!HS4vVfj{K&}778F^AA;Xq(F^Z)ZXx6pGS z-`EgDVN?HKLjM0R%>Q4~UIWbkzxn+C?$yfwe{?GU&+7n=xL^S1{AfrSz$vyKos<86 z@m{29{=f81^RW@p@KSl!vbK|78vH|5tyZ lfFnQxNB{{S0VIF~{x<|F{a@+tss0bA`ac5w&n`#*{{tdt^5g&j literal 20480 zcmeI3O>f*p7{~31Buk;C7w#ssjVg>aGk*7}8=5MCq@e7!^j6K-<235-dbRO}gcAp@ zi0=Rw#07CjAjBQ<3HU6G#~#P~l4h$WM3J5xJRWB}^UU9#XP@89cq<|%>t*pvm39uk z<`G5+nemJ9;AP}G)Qm@*<~)gTh(bS165o%_G#mA49@*v*9~~ZK16eTb@jQOPM^Q`z zoB0m9p}`+001AKtpa3WU3V;Hj04M+ofC8WZC;$pvxdK~?`&A13f91~v3;+c{0Z;%G z00lq+PyiGF1wa8%02BZPE?R-pMgATiMA#hCeSRob_51WV^2H{AJ{?BbHb+^ON7yBS z*cgDYlO)K@5BkMMff$k0o!kX5;KzC7nt2vSUg{bb_9r$IEd9NDUt7ARwJ?oIKtkRk z4(DD9*=vyr?fZb z4{1)jCqsT6%a~LB%8#w5<>n5a$j%iVyYq;~qSq&PrwR)Z_Oh>3_f@I4mdh7*x^ymT zvNld~-X4wUiMs2eL^GyrldbJ!gMHNynJOTR-^o}<^h><{yL5PGqnEKgp7IeN#QaXt z?~fO`WtZnvmR_VMnx_A@`kk)d)>gzQv#`BfBt#y|b61{w^61NBAdlh7fcCld{9Ty{ zQ;UARqcXz&`dswkeR(|_@{U;WjN?CZtT>1uzdY%fS?Z@wY>o%x!(!`}a@1wMovX*^I$>iASD?JMnZ@yVNC)vrg!~_B zlf%knd%|R5o|=rM$s|VdT4Ay{6)$%2D>7xXBaL=_T>qG`G{7FJY(C4zP}*o?*0ho6 z_@?@OLJ3dMX^t?L6uGiF!W=4m(l?s+(Vj>jXxhL3h*Uh#-7=LKIDi7604M+ofC8WZ zC~#>Cs92Cz0oB~y^a;hG9bY6$D<;38+7G7!x+3l@g19PjQ(@+rA=|0lp$hW~{ufc2 zYU<6?;$wnemOs;$mo$Az`@p#Oth3oQKH1xBcQ>DJJlWoPXb|G88EZGc)yu2Klg{Rz zvHi$+{CU^de74=`c8s-7d(G&yce=(p#mr^`=$XSsjF@`s##XztWvnwUzHkT{IM@AD{QruPT{Q>%e`&D{R16A$0-yjW01AKtizzV8-%XCL zzosVy2O^qt-W;K)YpD63Eyn+|1Q{b6d%O`svPV+LCh(`5)H*tL Date: Mon, 15 Jul 2024 00:00:34 +0900 Subject: [PATCH 13/55] [feat] S3 presignedURL(#59) --- .../server/common/config/S3Config.java | 29 +++-- .../record/controller/RecordController.java | 9 ++ .../recordy/server/record/domain/File.java | 16 +++ .../server/record/service/S3Service.java | 4 +- .../record/service/impl/FileServiceImpl.java | 7 +- .../record/service/impl/S3ServiceImpl.java | 102 ++++++------------ test.mv.db | Bin 20480 -> 20480 bytes 7 files changed, 84 insertions(+), 83 deletions(-) diff --git a/src/main/java/org/recordy/server/common/config/S3Config.java b/src/main/java/org/recordy/server/common/config/S3Config.java index 129157ff..3f898311 100644 --- a/src/main/java/org/recordy/server/common/config/S3Config.java +++ b/src/main/java/org/recordy/server/common/config/S3Config.java @@ -7,28 +7,35 @@ import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; @Configuration public class S3Config { - private final String accessKey; - private final String secretKey; - private final String regionString; + @Value("${aws-property.access-key}") + private String accessKey; - public S3Config(@Value("${aws-property.access-key}") final String accessKey, - @Value("${aws-property.secret-key}") final String secretKey, - @Value("${aws-property.aws-region}") final String regionString) { - this.accessKey = accessKey; - this.secretKey = secretKey; - this.regionString = regionString; - } + @Value("${aws-property.secret-key}") + private String secretKey; + + @Value("${aws-property.aws-region}") + private String regionString; @Bean - public S3Client getS3Client() { + public S3Client s3Client() { AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey); return S3Client.builder() .region(Region.of(regionString)) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build(); } + + @Bean + public S3Presigner s3Presigner() { + AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey); + return S3Presigner.builder() + .region(Region.of(regionString)) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + } } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 9c2c30cb..3deef887 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -9,12 +9,14 @@ import org.recordy.server.record.domain.usecase.RecordCreate; import org.recordy.server.record.service.RecordService; +import org.recordy.server.record.service.S3Service; import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; @RequiredArgsConstructor @@ -23,6 +25,7 @@ public class RecordController { private final RecordService recordService; + private final S3Service s3Service; @PostMapping public ResponseEntity createRecord( @@ -98,4 +101,10 @@ public ResponseEntity> getRecentRecordsByUser( .ok() .body(records); } + @GetMapping("/file/{filename}") + public ResponseEntity getFile(@PathVariable(value = "filename") String fileName) throws IOException { + String url = s3Service.getPresignUrl(fileName); + return new ResponseEntity<>(url, HttpStatus.OK); + } } + diff --git a/src/main/java/org/recordy/server/record/domain/File.java b/src/main/java/org/recordy/server/record/domain/File.java index 5dddbb23..9b048426 100644 --- a/src/main/java/org/recordy/server/record/domain/File.java +++ b/src/main/java/org/recordy/server/record/domain/File.java @@ -2,6 +2,8 @@ import org.springframework.web.multipart.MultipartFile; +import java.util.UUID; + public record File( MultipartFile video, MultipartFile thumbnail @@ -10,4 +12,18 @@ public record File( public static File of(MultipartFile video, MultipartFile thumbnail) { return new File(video, thumbnail); } + + public String generateFileName(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + String extension = originalFilename.substring(originalFilename.lastIndexOf('.')); + return UUID.randomUUID() + extension; + } + + public String getVideoFileName() { + return generateFileName(video); + } + + public String getThumbnailFileName() { + return generateFileName(thumbnail); + } } diff --git a/src/main/java/org/recordy/server/record/service/S3Service.java b/src/main/java/org/recordy/server/record/service/S3Service.java index 29e4679e..a675c879 100644 --- a/src/main/java/org/recordy/server/record/service/S3Service.java +++ b/src/main/java/org/recordy/server/record/service/S3Service.java @@ -7,8 +7,8 @@ public interface S3Service { // command - public String uploadFile(MultipartFile file) throws IOException; - void deleteFile(String key) throws IOException; + public String getPresignUrl(String filename); + String uploadFile(byte[] fileData, String fileName) throws IOException; // query diff --git a/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java index 6042def5..36ec5b83 100644 --- a/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java @@ -20,8 +20,11 @@ public class FileServiceImpl implements FileService { @Override public FileUrl save(File file) { try { - String videoUrl = s3Service.uploadFile(file.video()); - String thumbnailUrl = s3Service.uploadFile(file.thumbnail()); + String videoFileName = file.getVideoFileName(); + String thumbnailFileName = file.getThumbnailFileName(); + + String videoUrl = s3Service.uploadFile(file.video().getBytes(), "videos/" + videoFileName); + String thumbnailUrl = s3Service.uploadFile(file.thumbnail().getBytes(), "thumbnails/" + thumbnailFileName); return new FileUrl(videoUrl, thumbnailUrl); } catch (IOException e) { diff --git a/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java index 484f0313..c95704b6 100644 --- a/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java @@ -1,95 +1,61 @@ package org.recordy.server.record.service.impl; -import org.recordy.server.common.config.S3Config; -import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.common.exception.ExternalException; +import lombok.RequiredArgsConstructor; import org.recordy.server.record.service.S3Service; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; +import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.UUID; +import java.time.Duration; @Component +@RequiredArgsConstructor public class S3ServiceImpl implements S3Service { - private String bucketName; - private S3Config s3Config; - private S3Client s3Client; - private static final List FILE_EXTENSIONS = Arrays.asList("image/jpeg", "image/png", "image/jpg", "image/webp", "video/mp4", "video/mov", "video/quicktime"); - private static final Long MAX_SIZE = 100 * 1024 * 1024L; // 100MB + @Value("${aws-property.s3-bucket-name}") + private String bucket; - public S3ServiceImpl(@Value("${aws-property.s3-bucket-name}") final String bucketName, S3Config s3Config) { - this.bucketName = bucketName; - this.s3Config = s3Config; - this.s3Client = s3Config.getS3Client(); - } + private final S3Client s3Client; + private final S3Presigner presigner; @Override - public String uploadFile(MultipartFile file) throws IOException { - validateFileExtension(file); - validateFileSize(file); - final String url = getFileExtension(file); - PutObjectRequest request = PutObjectRequest.builder() - .bucket(bucketName) - .key(url) - .contentType(file.getContentType()) - .contentDisposition("inline") - .build(); - RequestBody requestBody = RequestBody.fromBytes(file.getBytes()); - s3Client.putObject(request, requestBody); - return url; - } + public String getPresignUrl(String filename) { + if (filename == null || filename.equals("")) { + return null; + } - public String getFileExtension(MultipartFile file) { - return UUID.randomUUID() + switch (Objects.requireNonNull(file.getContentType())) { - case "image/jpeg", "image/jpg" -> ".jpg"; - case "image/png" -> ".png"; - case "image/webp" -> ".webp"; - case "video/mp4" -> ".mp4"; - case "video/mov", "video/quicktime" -> ".mov"; - default -> throw new ExternalException(ErrorMessage.INVALID_FILE_TYPE); - }; - } + GetObjectRequest getObjectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key(filename) + .build(); - @Override - public void deleteFile(String key) throws IOException { - s3Client.deleteObject(DeleteObjectRequest.builder() - .bucket(bucketName) - .key(key) - .build()); - } + GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(5)) + .getObjectRequest(getObjectRequest) + .build(); - public void setS3Client(S3Client s3Client) { - this.s3Client = s3Client; - } + PresignedGetObjectRequest presignedGetObjectRequest = presigner + .presignGetObject(getObjectPresignRequest); - private String generateImageFileName() { - return UUID.randomUUID() + ".jpg"; + return presignedGetObjectRequest.url().toString(); } - private String generateVideoFileName() { - return UUID.randomUUID() + ".mp4"; - } + @Override + public String uploadFile(byte[] fileData, String fileName) throws IOException { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucket) + .key(fileName) + .build(); - public void validateFileExtension(MultipartFile file) { - String contentType = file.getContentType(); - if (!FILE_EXTENSIONS.contains(contentType)) { - throw new ExternalException(ErrorMessage.INVALID_FILE_TYPE); - } - } + s3Client.putObject(putObjectRequest, RequestBody.fromBytes(fileData)); - public void validateFileSize(MultipartFile file) { - if (file.getSize() > MAX_SIZE) { - throw new ExternalException(ErrorMessage.INVALID_FILE_SIZE); - } + return getPresignUrl(fileName); } } diff --git a/test.mv.db b/test.mv.db index 57a61dea6eac76e2ba994832163d1882a26fe246..f091f8b70f4e1c37968bf6fb4534b52ceacc540a 100644 GIT binary patch literal 20480 zcmeHPPjlNu6qnLA6{SEAa2KI%hCyg{SO0aYOVdf1q-A24_SV^zR%xcT<#FWDaN^M6 z&PRYR05hCmI5K<*z6?(*$+DfKO-nqTcAgKC)>&zvek8h#J~L;w*$1P}p401-e05CKF05kLeG0Yu=9Be043|BcT98h{8O0*C-2fCwN0 zhyWsh2p|H803v`0EE|C)$xp1l9LCfd@jZC}S^WWj7Kcy-FyNz@a%-IDMJy923m}9> zloG4hA3&V|XATb>F;fIUtf72X#GX~;NgQOUd43-#Cb;mg_K&vmv1U-7u#iR4V6K#Y z#<{@)5lG*6498*ArOY)P9ub#h#Blv2l9GjnoA{D*-!r_BIKs)O;YHl%B!C0Sr4zB# z@DpDU0)GmKBPCA>9Au8j2po86<_ek`LEyU~3}b{DXC5Q&WuAJWmkC31AqfjyBXiw= zxKVgHOEbbE{#icWv!5_~aClJUV`-@W$A|M2KNHvAMe#HEuU8xn_7CjXS2FZuLlsQ zUd=M4Mr~HS%D5WA(=VnoJ<@$W)E(W^gB8kQ?*6#Av!bnP?J&UG@YwU{c4Spv?r zwipiKxh_5Gyvdbk^@3T)>V+(+O+L-UOqu9Vf7V2%)2ofEW{i@iL74E|t5Q^BG2z0* zX+LP%7d_bD()6`!YDv|9s`jdZ8$$x=%y$Umfee7% zhKzV_kO>GJh@=c35aK$16cCS)kcI1J=g!X7J>bQEUU;a_^5U%F#e$rX7r&fkR=jwY zWlpEui@#)}1MXPBQzI-Oq{UJQM!7fOH$&xMp)Ud)a$dA|)c&Dnf<#OZ}L zf(<8dclX7_IH{iQiWuv+fEa&W{oo&7dlfl-7PWg`eNg|8Y}Efvq~dhRj`|<LA2I)5l_gE}`rDKLzdxJ*7i1deq-TqBo*`;j#W~BO zv?iN=a-8#JF+&yS1g|BJC)Xi*-8$eCV~B13ANn@`IA=D_`C9q^I`nu#VEuTQbJj$9 zdj7w1)ph<~HER7o7v{wL|Lc%8JO>d#1P}p401^0~2sHY?(cdloU^DtZ1^q9UqW}K` DTM!{( literal 20480 zcmeHO&2QT_6qnL9@w#>!2JEh7X@g;!L6Q1C)mc&`K++YlTl7|t5|swEEyI!1q^BKr z8Fn6aUH^gYwq14|b{(*PXcQ&N@>kIQG2AOwwVGX5y_=K0G;2`?6uuc|Www0X^a;BC6k`XQ3yO0D5!~TG$+>X%@!Z7kL55 zvay5A?6}86+sA<=k^#m!0MzXBvn+JXER8~!CC24_L@vR~OZ~aFa!YGiG{RzR-oQ5J zZbE5;5Nz2Nwi|>7$VLfj*lrYXj{Sz?Bf>~xHJpID6nWx?Q%(XLH{8f&2#K%!gklFH zyTK{r2zz!Tv2738fxni-3Bm#WJRKf2pWrC|2+&a&AYdECm z>aEKH#F&yzj<%onkJLbTs(}!GKV@w(FR`Hy=wM^3o3cZm@FDLGnBQx-zhd|n@@ijcp$ z7jyVjK2Ha{-x<>WiC8_6e{)j2no-u}P4tm$lJVX^pdeoVP}WENINeW=nwF7Q!>U>) z_>@~CwCq@l6F!k6h0`P5k#CnHna}unsIi!q2xKdzs&Z7N$%Swwf{Q!Tu^#BI?(0N%bZ^DNV(org`*THG)!vsju}M6?x(n8N zVjnb*^O z^pPO6#824eacR}l4K+TS@&I!$HTU{TSFdzRqZuC$2gHwS9w$>?Vb1@BTc-xPgfjmx z!LQfOwCgLHzM_3*+qt?%^WsqwJAb7<_{Gwy%W zF?JsBwL5KNz1>c0L^f&N-;Qzq?f&af_jsu7T2mk_r03ZMe00LJQ zfoc9d=Kstb^M5AzKYgS8KbYWa1xK6Z|BGTgW2u8T&HrCqE&l)G1poIc{_iiz|Gl|< zx*nlhmjB1Ihc^}>E*VD@7sc!R8vpm^#p`PP|KbSfYw&-0+BA`FQjdYwLyC0~=LS6s z{x3UJA;qFHC#3k_`2Y71|1Z*Qs(Ag?iU0pK5&w59ZS|JaR(EbZoz&v#g|_CIRj-c! z$FpZ&7O`wv*Vb`5KwTBQnzp+0j>2m3|BJ25(((Tb%*!GP=h~AZ{=ZOJ%b_6te`UQM o5F8Ky1ONd*01)_pBcS-d;@@>9UGaaPBwVD}UP26gx{DkC0%Izui2wiq From 0b86593d7d1ed03bc3720b0b1a80072c17e0d06e Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:06:42 +0900 Subject: [PATCH 14/55] =?UTF-8?q?[del]=20test=ED=95=B4=EB=B3=B8=20api=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C(#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 5 ----- test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 5 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 3deef887..da0e1f5b 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -101,10 +101,5 @@ public ResponseEntity> getRecentRecordsByUser( .ok() .body(records); } - @GetMapping("/file/{filename}") - public ResponseEntity getFile(@PathVariable(value = "filename") String fileName) throws IOException { - String url = s3Service.getPresignUrl(fileName); - return new ResponseEntity<>(url, HttpStatus.OK); - } } diff --git a/test.mv.db b/test.mv.db index f091f8b70f4e1c37968bf6fb4534b52ceacc540a..f30550ad52eb6f1e887f3ebbcab6e637d1013e71 100644 GIT binary patch delta 1471 zcmd_pJ#W)M7zc1)K~zpFbzuoqG(!?sV9`6dLMQt!@}Hfo5YCPAW0 zJ0gZk=wK#d1PQ6~gc#TnpMb9cdx_uT3r>WXnUWj)y!`Her(Bi^ui>72Y<6BlbM*U}RI{ON`Ym{2R# zT6@wDLWB{5`mpnCG5|4fqm8NloF5H3K`$CZ>{j-`w=k^yxCCB?XVovD++0$wC~7?D zZIhDeKPrwqwyyqc#``q7m?Y8MRkT~CZ zDEgJl;$lk$Bz9c9YVJs4$M1>bS>m`oubTJ_KI__Hyz6l7>o*OwL)#`#kr&zsHA1;P42P@3>f}y*_*D z8qxDXcb~fmLa4Kyu`gd!^rl?9jC8NZM{I}hx}@${)HK+_F?qivPL?iR`PaX$ssIYL zRIV_o2O)A0g8HcYOd25AAhtpEJ-$2a_I+ssip|m%_#OnMA9LVE@VfjN6z>+4i;5Z= zyUh#s`qV24fm=9Ke8V^Py{qCoSt> zHYI=6l=>4*+w0^tO@NZ<(HVP)gT&M%iUJyna(yFMxzz{%J$Yz~yj=AumgG5qkcXoR zpV2bYlB8zKr#P(ex2VD|qYB^8SD3<-KqLv&)D#EtxK$J%tF`ud5QHE~T|Qkzda6&d z&8sR(K7Qi1)^cXIXBx2lEHo+gGK&(3VG0j%shJu4(%#Nj5~$NUP@J`zc4W3R%N8vB E1|GG&kpKVy From 2910da33d60a9ab5a13adce2d40461882a2eba95 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:15:31 +0900 Subject: [PATCH 15/55] =?UTF-8?q?[del]=20api=20=EC=82=AD=EC=A0=9C=20(#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 2 +- .../record/service/FileServiceTest.java | 4 ++ .../server/record/service/S3ServiceTest.java | 35 +++++++++--------- test.mv.db | Bin 20480 -> 20480 bytes 4 files changed, 22 insertions(+), 19 deletions(-) create mode 100644 src/test/java/org/recordy/server/record/service/FileServiceTest.java diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index da0e1f5b..e8be3d16 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -72,7 +72,7 @@ public ResponseEntity> getFamousRecords( @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize - ){ + ) { return ResponseEntity .ok() .body(recordService.getFamousRecords(keywords, pageNumber, pageSize)); diff --git a/src/test/java/org/recordy/server/record/service/FileServiceTest.java b/src/test/java/org/recordy/server/record/service/FileServiceTest.java new file mode 100644 index 00000000..52e3f9f1 --- /dev/null +++ b/src/test/java/org/recordy/server/record/service/FileServiceTest.java @@ -0,0 +1,4 @@ +package org.recordy.server.record.service; + +public class FileServiceTest { +} diff --git a/src/test/java/org/recordy/server/record/service/S3ServiceTest.java b/src/test/java/org/recordy/server/record/service/S3ServiceTest.java index e5a52a75..bdd34e97 100644 --- a/src/test/java/org/recordy/server/record/service/S3ServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/S3ServiceTest.java @@ -5,17 +5,17 @@ import org.recordy.server.common.config.S3Config; import org.recordy.server.common.exception.ExternalException; import org.recordy.server.record.service.impl.S3ServiceImpl; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -24,12 +24,16 @@ public class S3ServiceTest { private S3ServiceImpl s3Service; private S3Client s3ClientMock; + private S3Presigner presignerMock; + + @Value("${aws-property.s3-bucket-name}") + private String bucket = "recordy-bucket"; @BeforeEach void init() { - s3Service = new S3ServiceImpl("recordy-bucket", new S3Config("access-key", "secret-key", "ap-northeast-2")); s3ClientMock = mock(S3Client.class); - s3Service.setS3Client(s3ClientMock); + presignerMock = mock(S3Presigner.class); + s3Service = new S3ServiceImpl(bucket, s3ClientMock, presignerMock); } @Test @@ -43,10 +47,10 @@ void init() { .thenReturn(PutObjectResponse.builder().build()); // when - String result = s3Service.uploadFile(imageMock); + String result = s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg"); // then - assertThatCode(() -> s3Service.uploadFile(imageMock)).doesNotThrowAnyException(); + assertThatCode(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg")).doesNotThrowAnyException(); } @Test @@ -60,10 +64,10 @@ void init() { .thenReturn(PutObjectResponse.builder().build()); // when - String result = s3Service.uploadFile(videoMock); + String result = s3Service.uploadFile(videoMock.getBytes(), "test-video.mp4"); // then - assertThatCode(() -> s3Service.uploadFile(videoMock)).doesNotThrowAnyException(); + assertThatCode(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.mp4")).doesNotThrowAnyException(); } @Test @@ -73,12 +77,10 @@ void init() { when(imageMock.getContentType()).thenReturn("image/mov"); when(imageMock.getSize()).thenReturn(1024L); when(imageMock.getBytes()).thenReturn(new byte[1024]); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); //when //then - assertThatThrownBy(() -> s3Service.uploadFile(imageMock)) + assertThatThrownBy(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.mov")) .isInstanceOf(ExternalException.class); } @@ -89,12 +91,10 @@ void init() { when(videoMock.getContentType()).thenReturn("video/hwp"); when(videoMock.getSize()).thenReturn(1024L * 50); when(videoMock.getBytes()).thenReturn(new byte[1024 * 50]); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); //when //then - assertThatThrownBy(() -> s3Service.uploadFile(videoMock)) + assertThatThrownBy(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.hwp")) .isInstanceOf(ExternalException.class); } @@ -108,7 +108,7 @@ void init() { //when //then - assertThatThrownBy(() -> s3Service.uploadFile(imageMock)) + assertThatThrownBy(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg")) .isInstanceOf(ExternalException.class); } @@ -118,12 +118,11 @@ void init() { MultipartFile videoMock = mock(MultipartFile.class); when(videoMock.getContentType()).thenReturn("video/mov"); when(videoMock.getSize()).thenReturn(1024L * 1024 * 200); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); + when(videoMock.getBytes()).thenReturn(new byte[1024 * 1024 * 200]); //when //then - assertThatThrownBy(() -> s3Service.uploadFile(videoMock)) + assertThatThrownBy(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.mov")) .isInstanceOf(ExternalException.class); } } diff --git a/test.mv.db b/test.mv.db index f30550ad52eb6f1e887f3ebbcab6e637d1013e71..a22d5839da26d6fabc54feb1b2f30724a8c4a2f0 100644 GIT binary patch delta 1394 zcmd_pzi-n(6bEo$KtQTUosg*1mOv|86&AT)u2ZW+0t+xObYQN1ccxW?6E!gsUFh5a zfsVaZ#f(&WWMJSgU}a+BAAr4_eQ|tIiSh@KDV9#}-TS=n9iM^YGw}X?jnfb7&TUTJ zxF<$zPaFo3$D^oC(ZWS|x+pIf*XEzOdrO^>_2!x#docf@Erg&u+J7Yi6cQ9d?z^wW z;c&m71VkO(Y3_paENlL_27YGm*1v$Ijhc1Csn*DY@-n5l&Pb2{{E?{_b()M}mQF+mNE(gu)^0K8kvF4mTaK(uW z&QF^2m*#9ual#2F(wtD9Z04NB+|$c~6f$gZn!F~2IStgDNN)Q%r!G6i35AHtsm3!(*{iNRiQMVzg6}fxd|vW^8A~*A z#M&{R_@4aMb>7aMx`^hCP+=n($Q|`rK+vY!XDl6r340Sjat?~8p&k!*qh6mK1Y~S5 z2w#d}AW!XvOdoBid(3$vroP!17k&Mhn|&!jD#g0uzZRk&4vuJOS)gNC53-fV0|5Su U5S9xtf>VW%wN(gt6+*D^7y8w#Jpcdz delta 1394 zcmd_pJ#W)M7zc1)KtQTUosg*1LZFo`ghhRRKdVCm11|$Z2R5YMozJvt>O@V91PdKe zhYED;t@r>)l_$i&z=rq)d=1#k*_Xr@k|-YlPd@4NJoo(We@AEF=nTBSQzP`lhH;%x zGwHAa-DQUnp$sz5XG`b!beUf)uP@$n>zdfZ>&*k~o;QD80`KyZjjv#(UDK{;b-J6S`}ZA!$A5&sY3ntD`LX`^DP!Su z^#BIUHnTMAv$*Oe*X_acaaZ*On6DZ)YlQGE<4MFAEf4Jl6K9T5FswSS3gO?38>^#{ zZ5vvR;li?s=QbG2e;XgK>O!}}(g>;qm3JKai4%K}pKm_nz2;?pu_-vQEa)$iaFF4D&CojwQ0~#uv1+Oy$0x8pkk`wW*px|_;Iei+2qpB*W zS_KuHYoj}soO1pVrdKSw?bZ(X!t>VWl@~yb zB^oE2qd7ZNSg}Orpi3hM`ev8XtcO$jI Date: Mon, 15 Jul 2024 00:28:46 +0900 Subject: [PATCH 16/55] =?UTF-8?q?[feat]=20=EC=B5=9C=EA=B7=BC=20=EB=A0=88?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A1=B0=ED=9A=8C=20API(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 73 ++++++++----------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index a1aa130f..3f5b85cf 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -129,8 +129,8 @@ public ResponseEntity deleteRecord( ); @Operation( - summary = "최근 레코드 조회 API", - description = "사용자의 최근 레코드를 조회합니다.", + summary = "회원의 레코드 리스트 조회 API", + description = "회원의 최근 레코드 리스트를 조회합니다.", responses = { @ApiResponse( responseCode = "200", @@ -144,17 +144,7 @@ public ResponseEntity deleteRecord( ), @ApiResponse( responseCode = "401", - description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = ErrorMessage.class - ) - ) - ), - @ApiResponse( - responseCode = "401", - description = "Unauthorized - 카카오 액세스 토큰의 정보를 조회하는 과정에서 오류가 발생하였습니다.", + description = "Unauthorized - 인증이 필요합니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( @@ -174,29 +164,24 @@ public ResponseEntity deleteRecord( ) } ) - public ResponseEntity> getRecentRecords( - @RequestParam(required = false) List keywords, + public ResponseEntity> getRecentRecordsByUser( + @UserId long userId, @RequestParam long cursorId, @RequestParam int size ); @Operation( - summary = "회원의 레코드 리스트 조회 API", - description = "회원의 최근 레코드 리스트를 조회합니다.", + summary = "레코드 시청 API", + description = "사용자가 특정 레코드를 시청했음을 기록합니다.", responses = { @ApiResponse( responseCode = "200", description = "요청이 성공적으로 처리되었습니다.", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = Slice.class - ) - ) + content = @Content ), @ApiResponse( - responseCode = "401", - description = "Unauthorized - 인증이 필요합니다.", + responseCode = "404", + description = "Not Found - 존재하지 않는 사용자 또는 기록입니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( @@ -216,24 +201,28 @@ public ResponseEntity> getRecentRecords( ) } ) - public ResponseEntity> getRecentRecordsByUser( + public ResponseEntity watch( @UserId long userId, - @RequestParam long cursorId, - @RequestParam int size + @RequestParam long recordId ); @Operation( - summary = "레코드 시청 API", - description = "사용자가 특정 레코드를 시청했음을 기록합니다.", + summary = "인기 레코드 조회 API", + description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", responses = { @ApiResponse( responseCode = "200", description = "요청이 성공적으로 처리되었습니다.", - content = @Content + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) ), @ApiResponse( - responseCode = "404", - description = "Not Found - 존재하지 않는 사용자 또는 기록입니다.", + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( @@ -253,14 +242,15 @@ public ResponseEntity> getRecentRecordsByUser( ) } ) - public ResponseEntity watch( - @UserId long userId, - @RequestParam long recordId + public ResponseEntity> getFamousRecords( + @RequestParam(required = false) List keywords, + @RequestParam(required = false, defaultValue = "0") int pageNumber, + @RequestParam(required = false, defaultValue = "10") int pageSize ); @Operation( - summary = "인기 레코드 조회 API", - description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", + summary = "최근 레코드 조회 API", + description = "사용자가 최근 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 최근 레코드를 조회합니다.", responses = { @ApiResponse( responseCode = "200", @@ -294,10 +284,9 @@ public ResponseEntity watch( ) } ) - public ResponseEntity> getFamousRecords( + public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") int pageNumber, - @RequestParam(required = false, defaultValue = "10") int pageSize + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ); - } From 4eb62bd1ff7b9db1b20882e5a718b4dbfccbb704 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:43:30 +0900 Subject: [PATCH 17/55] =?UTF-8?q?[del]=20test.mv.db=EC=82=AD=EC=A0=9C=20(#?= =?UTF-8?q?56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.mv.db | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.mv.db diff --git a/test.mv.db b/test.mv.db deleted file mode 100644 index c386a2c42289b93cb66cac558b12b598996577d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI3L2ukd6vyp|q}zlRF5D0@p>2dP)_6Q#dwlAarb?uwRM~CSLs2xg$4Qi3d$sX~ zh7$)q0B1Pz0T6d2?i~0CoDrXb=keO>?50hiO{<`{hq1>Qd*1wZ{4)RdW;X(AhW#u$ z44m@VJ@`fjHX+1}_Q&aA;QPXiMpEQ54s1@i$K%-ZA~VTG1ChgB$8vOZkfo|&(wBL( zFGm3ru^lGNTh{P{1dsp{Kmter2_OL^fCP{L5fCP{L z51DgpJ{#gE7TezvUY!OkPa@nFx z%61||%W81o3@{Trsd)4@3l`KDj;97$EFqUsuDgTD`MaPT<+rIXua_ zcaqD_Xe3UmyIvPGW5zbs+g6tDRUOfp24MVF7ItA=F#Wg1@YcP47VgMIj$|6iTgA9P zzsN1yG8d}#MMeT-eqQ-XUtG}i1?^+w&eQIC&-h|zz0+IYz4v%?>%IZ++p4j8<2${) zYCP_)?--j8jE7(LjP<9R-CoyN?RHj;ZfC1!tO+}GLYST*lc7tK_L{NL>24Tnp@jW9 ze(Z$~^<8315xZeR+YX_^lb$1_Pl?OCB!u@NjEc8{5azVGM_fXD>aQ7{``eojHBJBR z#)k{ql6GA=4a@hv`pmyJfT3Fl@lxR_EW13=^5FiWS8m3uHyfRHH~oWS`AE5*!sV2% zr?|Ea=d}}>_?3w-vZFa)BodEvX^zwJQL$U8^i9d6-pMDE8Fni94S(fTj>^oUXgm~Y zbP^Enr`lwHVlq4BA*nev*;XclYgE??lPR1}Jm+bn;Sa@!3%7QlV04(+=NRcLBN_FZ zMpE6r0Y15WBn@3s)Rc!NP@~gYEF%H4?ORRzYzMx^yPEdr?@))+CgE6>HtsE1!V=*MGhKqo%*FErDH@%@&ITRi&d!SCws5daCqQ$(K?wkk;Hy-dP=YH}Wm^pEb5MOBsO#BKroE9!k3jFj?;DQFTXPZirA6LTO>#LHf^LM{Z>st@ zjkB$6&$5l88r0Rv4=8H=L2YGDu&a6sW_!A$?w<5y9?FxTibKJp97$MdyVDIc3!te(UFPKlNBv6$MWoNUTR-k9!ZDl=y)ANfQ+f?zxqV4KQE zI;VJ@Y2aaWu<&9U+D|T$GadOAC-Rbhezol>i;Taf%^YV{kOz^ zkN^@u0!RP}AOR$B^$E=C@2UP5Q~hr<$!HS4vVfj{K&}778F^AA;Xq(F^Z)ZXx6pGS z-`EgDVN?HKLjM0R%>Q4~UIWbkzxn+C?$yfwe{?GU&+7n=xL^S1{AfrSz$vyKos<86 z@m{29{=f81^RW@p@KSl!vbK|78vH|5tyZ lfFnQxNB{{S0VIF~{x<|F{a@+tss0bA`ac5w&n`#*{{tdt^5g&j From 0f8e4518d9a2e74a8ea302ada07ed83c993b7365 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 00:47:33 +0900 Subject: [PATCH 18/55] =?UTF-8?q?[chore]=20UserController=EC=9D=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EB=9E=91=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/recordy/server/record/controller/RecordController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 83e40000..b4fb1519 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -62,8 +62,7 @@ public ResponseEntity> getRecentRecordInfoWithBook @RequestParam(required = false, defaultValue = "10") int size ) { - Slice recordInfoWithBookmarks = recordService.getRecentRecordInfosWithBookmarks(userId, keywords, cursorId, size); - return ResponseEntity.ok().body(recordInfoWithBookmarks); + return ResponseEntity.ok().body(recordService.getRecentRecordInfosWithBookmarks(userId, keywords, cursorId, size)); } @GetMapping("/famous") From 07813813fc90272ef6af32eb3c629b82d5a19346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=84=B8=EB=B9=88?= <94737768+sebbbin@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:19:24 +0900 Subject: [PATCH 19/55] [fix] RecordController.java --- .../server/record/controller/RecordController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index ce53443b..3b62a394 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -54,7 +54,7 @@ public ResponseEntity deleteRecord( @GetMapping("/recent") public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecords(keywords, cursorId, size); @@ -78,7 +78,7 @@ public ResponseEntity> getFamousRecords( @PostMapping("/{recordId}") public ResponseEntity watch( @UserId Long userId, - @PathVariable long recordId + @PathVariable Long recordId ) { recordService.watch(userId, recordId); return ResponseEntity @@ -88,8 +88,8 @@ public ResponseEntity watch( @GetMapping public ResponseEntity> getRecentRecordsByUser( - @RequestParam long userId, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam Long userId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecordsByUser(userId, cursorId, size); From c54f0cf743ed435472b609eab2d1bce43fb8dfa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=84=B8=EB=B9=88?= <94737768+sebbbin@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:23:20 +0900 Subject: [PATCH 20/55] [fix] long Long --- .../org/recordy/server/record/controller/RecordApi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 3f5b85cf..feebd4ee 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -165,7 +165,7 @@ public ResponseEntity deleteRecord( } ) public ResponseEntity> getRecentRecordsByUser( - @UserId long userId, + @UserId Long userId, @RequestParam long cursorId, @RequestParam int size ); @@ -202,7 +202,7 @@ public ResponseEntity> getRecentRecordsByUser( } ) public ResponseEntity watch( - @UserId long userId, + @UserId Long userId, @RequestParam long recordId ); @@ -286,7 +286,7 @@ public ResponseEntity> getFamousRecords( ) public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); } From 9afd999f92bc1aff323c33adebd2fa3cf4206c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=84=B8=EB=B9=88?= <94737768+sebbbin@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:23:32 +0900 Subject: [PATCH 21/55] [fix] @Override --- .../recordy/server/record/controller/RecordController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 3b62a394..2ede74a2 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -39,6 +39,7 @@ public ResponseEntity createRecord( .body(record); } + @Override @DeleteMapping("/{recordId}") public ResponseEntity deleteRecord( @UserId Long uploaderId, @@ -51,6 +52,7 @@ public ResponseEntity deleteRecord( .build(); } + @Override @GetMapping("/recent") public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, @@ -64,6 +66,7 @@ public ResponseEntity> getRecentRecords( .body(records); } + @Override @GetMapping("/famous") public ResponseEntity> getFamousRecords( @RequestParam(required = false) List keywords, @@ -75,6 +78,7 @@ public ResponseEntity> getFamousRecords( .body(recordService.getFamousRecords(keywords, pageNumber, pageSize)); } + @Override @PostMapping("/{recordId}") public ResponseEntity watch( @UserId Long userId, @@ -86,6 +90,7 @@ public ResponseEntity watch( .build(); } + @Override @GetMapping public ResponseEntity> getRecentRecordsByUser( @RequestParam Long userId, From 035a4b817363e722cde97995381a6f78837c9b85 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 01:40:31 +0900 Subject: [PATCH 22/55] [fix] build error (#56) --- .../server/record/controller/RecordApi.java | 20 +- .../record/controller/RecordController.java | 12 +- test.trace.db | 381 ++++++++++++++++++ 3 files changed, 400 insertions(+), 13 deletions(-) create mode 100644 test.trace.db diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 3f5b85cf..13efa069 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -14,6 +14,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -78,8 +79,9 @@ public interface RecordApi { ) public ResponseEntity createRecord( @UserId Long uploaderId, - @RequestPart RecordCreateRequest recordCreateRequest, - @RequestPart File file + @RequestPart RecordCreateRequest request, + @RequestPart MultipartFile thumbnail, + @RequestPart MultipartFile video ) ; @Operation( @@ -165,9 +167,9 @@ public ResponseEntity deleteRecord( } ) public ResponseEntity> getRecentRecordsByUser( - @UserId long userId, - @RequestParam long cursorId, - @RequestParam int size + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ); @Operation( @@ -202,8 +204,8 @@ public ResponseEntity> getRecentRecordsByUser( } ) public ResponseEntity watch( - @UserId long userId, - @RequestParam long recordId + @UserId Long userId, + @PathVariable Long recordId ); @Operation( @@ -246,7 +248,7 @@ public ResponseEntity> getFamousRecords( @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize - ); + ) ; @Operation( summary = "최근 레코드 조회 API", @@ -286,7 +288,7 @@ public ResponseEntity> getFamousRecords( ) public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index b30ced4d..164a5922 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -54,10 +54,11 @@ public ResponseEntity deleteRecord( .build(); } + @Override @GetMapping("/recent") public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecords(keywords, cursorId, size); @@ -67,6 +68,7 @@ public ResponseEntity> getRecentRecords( .body(records); } + @Override @GetMapping("/famous") public ResponseEntity> getFamousRecords( @RequestParam(required = false) List keywords, @@ -78,10 +80,11 @@ public ResponseEntity> getFamousRecords( .body(recordService.getFamousRecords(keywords, pageNumber, pageSize)); } + @Override @PostMapping("/{recordId}") public ResponseEntity watch( @UserId Long userId, - @PathVariable long recordId + @PathVariable Long recordId ) { recordService.watch(userId, recordId); return ResponseEntity @@ -89,10 +92,11 @@ public ResponseEntity watch( .build(); } + @Override @GetMapping public ResponseEntity> getRecentRecordsByUser( - @RequestParam long userId, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecordsByUser(userId, cursorId, size); diff --git a/test.trace.db b/test.trace.db new file mode 100644 index 00000000..6bcbfcd2 --- /dev/null +++ b/test.trace.db @@ -0,0 +1,381 @@ +2024-07-15 00:49:49.858631+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 54 more +2024-07-15 00:49:51.822247+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) + at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) + at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 61 more +2024-07-15 00:50:07.445935+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 54 more +2024-07-15 00:50:09.424386+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) + at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) + at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 61 more +2024-07-15 00:50:45.292724+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 54 more +2024-07-15 00:50:47.312967+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) + at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) + at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 61 more From 4525987d1572f78a9e0be3b298a039c71cb67b04 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 01:41:03 +0900 Subject: [PATCH 23/55] [del] test.trace.db (#56) --- test.trace.db | 381 -------------------------------------------------- 1 file changed, 381 deletions(-) delete mode 100644 test.trace.db diff --git a/test.trace.db b/test.trace.db deleted file mode 100644 index 6bcbfcd2..00000000 --- a/test.trace.db +++ /dev/null @@ -1,381 +0,0 @@ -2024-07-15 00:49:49.858631+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) - at org.hibernate.boot.model.relational.Database.(Database.java:45) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 54 more -2024-07-15 00:49:51.822247+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) - at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) - at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1421) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 61 more -2024-07-15 00:50:07.445935+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) - at org.hibernate.boot.model.relational.Database.(Database.java:45) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 54 more -2024-07-15 00:50:09.424386+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) - at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) - at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1421) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 61 more -2024-07-15 00:50:45.292724+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) - at org.hibernate.boot.model.relational.Database.(Database.java:45) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 54 more -2024-07-15 00:50:47.312967+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) - at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) - at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1421) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 61 more From b5fb6dcbfa810430d22b9f997a32d92b60c3b679 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 01:42:19 +0900 Subject: [PATCH 24/55] =?UTF-8?q?[chore]=20=20RecordInfoWithBookmark?= =?UTF-8?q?=EC=97=90=20of=20=ED=95=A8=EC=88=98=20=EC=A0=81=EC=9A=A9=20(#57?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 4 +-- .../dto/response/RecordInfoWithBookmark.java | 8 ----- .../usecase}/RecordInfo.java | 2 +- .../usecase/RecordInfoWithBookmark.java | 19 +++++++++++ .../server/record/service/RecordService.java | 2 +- .../service/impl/RecordServiceImpl.java | 34 ++++--------------- .../record_stat/controller/RecordStatApi.java | 3 +- .../controller/RecordStatController.java | 10 +----- .../service/RecordStatService.java | 2 +- .../service/impl/RecordStatServiceImpl.java | 4 +-- .../record/service/RecordServiceTest.java | 2 +- .../service/RecordStatServiceTest.java | 3 +- 12 files changed, 35 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java rename src/main/java/org/recordy/server/record/{controller/dto/response => domain/usecase}/RecordInfo.java (92%) create mode 100644 src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index b4fb1519..1935a2e6 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -4,14 +4,12 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; -import org.recordy.server.record.controller.dto.response.RecordInfo; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; import org.recordy.server.record.service.RecordService; -import org.recordy.server.record_stat.service.RecordStatService; import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java deleted file mode 100644 index 6e8f3ec0..00000000 --- a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.recordy.server.record.controller.dto.response; - -public record RecordInfoWithBookmark ( - RecordInfo recordInfo, - Boolean isBookmark -){ - -} diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java similarity index 92% rename from src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java rename to src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java index e30779ee..d20ea2fb 100644 --- a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java +++ b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java @@ -1,4 +1,4 @@ -package org.recordy.server.record.controller.dto.response; +package org.recordy.server.record.domain.usecase; import org.recordy.server.record.service.dto.FileUrl; import org.recordy.server.record.domain.Record; diff --git a/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java new file mode 100644 index 00000000..6c08f6f5 --- /dev/null +++ b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java @@ -0,0 +1,19 @@ +package org.recordy.server.record.domain.usecase; + +import java.util.List; +import org.recordy.server.record.domain.Record; +import org.springframework.data.domain.Slice; + +public record RecordInfoWithBookmark ( + RecordInfo recordInfo, + Boolean isBookmark +){ + public static Slice of (Slice records, List bookmarks) { + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } +} diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index a86f8001..2a47c033 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -1,6 +1,6 @@ package org.recordy.server.record.service; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index e03df40a..486bee45 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -3,17 +3,15 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.keyword.domain.Keyword; -import org.recordy.server.record.controller.dto.response.RecordInfo; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record.service.FileService; import org.recordy.server.record.service.RecordService; import org.recordy.server.record.service.dto.FileUrl; -import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.View; import org.recordy.server.record_stat.repository.ViewRepository; import org.recordy.server.record_stat.service.RecordStatService; @@ -76,17 +74,12 @@ public void watch(long userId, long recordId) { @Override public Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, - int pageNumber, int size) { + int pageNumber, int size) { Slice records = getFamousRecords(keywords, pageNumber,size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } @@ -112,12 +105,7 @@ public Slice getRecentRecordInfosWithBookmarksByUser(lon Slice records = getRecentRecordsByUser(userId, cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } public Slice getRecentRecordsByUser(long userId, long cursorId, int size) { @@ -130,12 +118,7 @@ public Slice getRecentRecordInfosWithBookmarks(long user Slice records = getRecentRecords(keywords,cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } public Slice getRecentRecords(List keywords, Long cursorId, int size) { @@ -159,12 +142,7 @@ public Slice getSubscribingRecordInfosWithBookmarks(long Slice records = getSubscribingRecords(userId,cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } public Slice getSubscribingRecords(long userId, long cursorId, int size) { diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java index 1e9fe0c0..a78c9d9c 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java @@ -7,8 +7,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.recordy.server.record.domain.Record; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record_stat.domain.usecase.Preference; import org.springframework.data.domain.Slice; import org.springframework.http.MediaType; diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java index 3f883560..8fe76794 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java @@ -2,24 +2,16 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.recordy.server.record.domain.Record; -import org.recordy.server.record.repository.RecordRepository; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record_stat.domain.usecase.Preference; -import org.recordy.server.record_stat.repository.BookmarkRepository; import org.recordy.server.record_stat.service.RecordStatService; -import org.recordy.server.user.controller.dto.request.UserSignInRequest; -import org.recordy.server.user.repository.UserRepository; import org.springframework.data.domain.Slice; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index 04c5f6a6..1dae035a 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -1,7 +1,7 @@ package org.recordy.server.record_stat.service; import java.util.List; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.usecase.Preference; diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index 655b94b2..aff95b47 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -4,8 +4,8 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.record.controller.dto.response.RecordInfo; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfo; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; diff --git a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java index 39949983..06fc7baa 100644 --- a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.mock.FakeContainer; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; diff --git a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java index e57a9682..8f2daf5d 100644 --- a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java +++ b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java @@ -7,8 +7,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.recordy.server.mock.FakeContainer; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.recordy.server.record.domain.Record; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.user.domain.UserStatus; From 4bb8dbcc6efa297537c6014b45a7b864da8b6b5f Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 01:42:19 +0900 Subject: [PATCH 25/55] =?UTF-8?q?[refactor]=20=20RecordInfoWithBookmark?= =?UTF-8?q?=EC=97=90=20of=20=ED=95=A8=EC=88=98=20=EC=A0=81=EC=9A=A9=20(#57?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 4 +-- .../dto/response/RecordInfoWithBookmark.java | 8 ----- .../usecase}/RecordInfo.java | 2 +- .../usecase/RecordInfoWithBookmark.java | 19 +++++++++++ .../server/record/service/RecordService.java | 2 +- .../service/impl/RecordServiceImpl.java | 34 ++++--------------- .../record_stat/controller/RecordStatApi.java | 3 +- .../controller/RecordStatController.java | 10 +----- .../service/RecordStatService.java | 2 +- .../service/impl/RecordStatServiceImpl.java | 4 +-- .../record/service/RecordServiceTest.java | 2 +- .../service/RecordStatServiceTest.java | 3 +- 12 files changed, 35 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java rename src/main/java/org/recordy/server/record/{controller/dto/response => domain/usecase}/RecordInfo.java (92%) create mode 100644 src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index b4fb1519..1935a2e6 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -4,14 +4,12 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; -import org.recordy.server.record.controller.dto.response.RecordInfo; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; import org.recordy.server.record.service.RecordService; -import org.recordy.server.record_stat.service.RecordStatService; import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java deleted file mode 100644 index 6e8f3ec0..00000000 --- a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.recordy.server.record.controller.dto.response; - -public record RecordInfoWithBookmark ( - RecordInfo recordInfo, - Boolean isBookmark -){ - -} diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java similarity index 92% rename from src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java rename to src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java index e30779ee..d20ea2fb 100644 --- a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java +++ b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java @@ -1,4 +1,4 @@ -package org.recordy.server.record.controller.dto.response; +package org.recordy.server.record.domain.usecase; import org.recordy.server.record.service.dto.FileUrl; import org.recordy.server.record.domain.Record; diff --git a/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java new file mode 100644 index 00000000..6c08f6f5 --- /dev/null +++ b/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java @@ -0,0 +1,19 @@ +package org.recordy.server.record.domain.usecase; + +import java.util.List; +import org.recordy.server.record.domain.Record; +import org.springframework.data.domain.Slice; + +public record RecordInfoWithBookmark ( + RecordInfo recordInfo, + Boolean isBookmark +){ + public static Slice of (Slice records, List bookmarks) { + return records.map(record -> { + int index = records.getContent().indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }); + } +} diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index a86f8001..2a47c033 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -1,6 +1,6 @@ package org.recordy.server.record.service; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index e03df40a..486bee45 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -3,17 +3,15 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.keyword.domain.Keyword; -import org.recordy.server.record.controller.dto.response.RecordInfo; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record.service.FileService; import org.recordy.server.record.service.RecordService; import org.recordy.server.record.service.dto.FileUrl; -import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.View; import org.recordy.server.record_stat.repository.ViewRepository; import org.recordy.server.record_stat.service.RecordStatService; @@ -76,17 +74,12 @@ public void watch(long userId, long recordId) { @Override public Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, - int pageNumber, int size) { + int pageNumber, int size) { Slice records = getFamousRecords(keywords, pageNumber,size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } @@ -112,12 +105,7 @@ public Slice getRecentRecordInfosWithBookmarksByUser(lon Slice records = getRecentRecordsByUser(userId, cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } public Slice getRecentRecordsByUser(long userId, long cursorId, int size) { @@ -130,12 +118,7 @@ public Slice getRecentRecordInfosWithBookmarks(long user Slice records = getRecentRecords(keywords,cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } public Slice getRecentRecords(List keywords, Long cursorId, int size) { @@ -159,12 +142,7 @@ public Slice getSubscribingRecordInfosWithBookmarks(long Slice records = getSubscribingRecords(userId,cursorId, size); List bookmarks = recordStatService.findBookmarks(userId, records); - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); + return RecordInfoWithBookmark.of(records, bookmarks); } public Slice getSubscribingRecords(long userId, long cursorId, int size) { diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java index 1e9fe0c0..a78c9d9c 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java @@ -7,8 +7,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.recordy.server.record.domain.Record; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record_stat.domain.usecase.Preference; import org.springframework.data.domain.Slice; import org.springframework.http.MediaType; diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java index 3f883560..8fe76794 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java @@ -2,24 +2,16 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.recordy.server.record.domain.Record; -import org.recordy.server.record.repository.RecordRepository; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record_stat.domain.usecase.Preference; -import org.recordy.server.record_stat.repository.BookmarkRepository; import org.recordy.server.record_stat.service.RecordStatService; -import org.recordy.server.user.controller.dto.request.UserSignInRequest; -import org.recordy.server.user.repository.UserRepository; import org.springframework.data.domain.Slice; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index 04c5f6a6..1dae035a 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -1,7 +1,7 @@ package org.recordy.server.record_stat.service; import java.util.List; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.usecase.Preference; diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index 655b94b2..aff95b47 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -4,8 +4,8 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.record.controller.dto.response.RecordInfo; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfo; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; diff --git a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java index 39949983..06fc7baa 100644 --- a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.mock.FakeContainer; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; diff --git a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java index e57a9682..8f2daf5d 100644 --- a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java +++ b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java @@ -7,8 +7,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.recordy.server.mock.FakeContainer; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; -import org.recordy.server.record.domain.Record; +import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.user.domain.UserStatus; From dfec8ff9fb3ce9a1f940e1dfbf2bea46cc92e4bb Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 02:37:13 +0900 Subject: [PATCH 26/55] =?UTF-8?q?[refactor]=20controller=EC=97=90=EC=84=9C?= =?UTF-8?q?=20dto=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/controller/RecordController.java | 23 +++++++++--- .../dto/response}/RecordInfo.java | 2 +- .../dto/response}/RecordInfoWithBookmark.java | 2 +- .../server/record/service/RecordService.java | 10 +++--- .../service/impl/RecordServiceImpl.java | 35 +------------------ .../record_stat/controller/RecordStatApi.java | 2 +- .../controller/RecordStatController.java | 12 +++++-- .../service/RecordStatService.java | 4 +-- .../service/impl/RecordStatServiceImpl.java | 16 ++------- .../record/service/RecordServiceTest.java | 26 +++++++------- .../service/RecordStatServiceTest.java | 15 ++++---- 11 files changed, 61 insertions(+), 86 deletions(-) rename src/main/java/org/recordy/server/record/{domain/usecase => controller/dto/response}/RecordInfo.java (92%) rename src/main/java/org/recordy/server/record/{domain/usecase => controller/dto/response}/RecordInfoWithBookmark.java (91%) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 1935a2e6..bee77074 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -4,12 +4,13 @@ import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; import org.recordy.server.record.service.RecordService; +import org.recordy.server.record_stat.service.RecordStatService; import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -24,6 +25,7 @@ public class RecordController { private final RecordService recordService; + private final RecordStatService recordStatService; @PostMapping public ResponseEntity createRecord( @@ -59,8 +61,10 @@ public ResponseEntity> getRecentRecordInfoWithBook @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { + Slice records = recordService.getRecentRecords(keywords, cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); - return ResponseEntity.ok().body(recordService.getRecentRecordInfosWithBookmarks(userId, keywords, cursorId, size)); + return ResponseEntity.ok().body(RecordInfoWithBookmark.of(records, bookmarks)); } @GetMapping("/famous") @@ -70,9 +74,12 @@ public ResponseEntity> getFamousRecordInfoWithBook @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize ){ + Slice records = recordService.getFamousRecords(keywords, pageNumber, pageSize); + List bookmarks = recordStatService.findBookmarks(userId, records); + return ResponseEntity .ok() - .body(recordService.getFamousRecordInfosWithBookmarks(userId, keywords, pageNumber, pageSize)); + .body(RecordInfoWithBookmark.of(records, bookmarks)); } @PostMapping("/{recordId}") @@ -92,9 +99,12 @@ public ResponseEntity> getRecentRecordInfoWithBook @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { + Slice records = recordService.getRecentRecordsByUser(userId, cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); + return ResponseEntity .ok() - .body(recordService.getRecentRecordInfosWithBookmarksByUser(userId, cursorId, size)); + .body(RecordInfoWithBookmark.of(records, bookmarks)); } @GetMapping("/follow") @@ -103,8 +113,11 @@ public ResponseEntity> getSubscribingRecordInfosWi @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { + Slice records = recordService.getSubscribingRecords(userId, cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); + return ResponseEntity .ok() - .body(recordService.getSubscribingRecordInfosWithBookmarks(userId, cursorId, size)); + .body(RecordInfoWithBookmark.of(records, bookmarks)); } } diff --git a/src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java similarity index 92% rename from src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java rename to src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java index d20ea2fb..e30779ee 100644 --- a/src/main/java/org/recordy/server/record/domain/usecase/RecordInfo.java +++ b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfo.java @@ -1,4 +1,4 @@ -package org.recordy.server.record.domain.usecase; +package org.recordy.server.record.controller.dto.response; import org.recordy.server.record.service.dto.FileUrl; import org.recordy.server.record.domain.Record; diff --git a/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java similarity index 91% rename from src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java rename to src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java index 6c08f6f5..06ad36de 100644 --- a/src/main/java/org/recordy/server/record/domain/usecase/RecordInfoWithBookmark.java +++ b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java @@ -1,4 +1,4 @@ -package org.recordy.server.record.domain.usecase; +package org.recordy.server.record.controller.dto.response; import java.util.List; import org.recordy.server.record.domain.Record; diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index 2a47c033..3712e304 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -1,6 +1,6 @@ package org.recordy.server.record.service; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; @@ -16,8 +16,8 @@ public interface RecordService { // query void watch(long userId, long recordId); - Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, int pageNumber, int size); - Slice getRecentRecordInfosWithBookmarksByUser(long userId, long cursorId, int size); - Slice getRecentRecordInfosWithBookmarks(long userId, List keywords, Long cursorId, int size); - Slice getSubscribingRecordInfosWithBookmarks(long userId, long cursorId, int size); + Slice getFamousRecords(List keywords, int pageNumber, int size); + Slice getRecentRecordsByUser(long userId, long cursorId, int size); + Slice getRecentRecords(List keywords, Long cursorId, int size); + Slice getSubscribingRecords(long userId, long cursorId, int size); } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index 486bee45..a9cd0d43 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -6,7 +6,7 @@ import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record.service.FileService; @@ -73,16 +73,6 @@ public void watch(long userId, long recordId) { } @Override - public Slice getFamousRecordInfosWithBookmarks(long userId, List keywords, - int pageNumber, int size) { - - Slice records = getFamousRecords(keywords, pageNumber,size); - List bookmarks = recordStatService.findBookmarks(userId, records); - - return RecordInfoWithBookmark.of(records, bookmarks); - } - - public Slice getFamousRecords(List keywords, int pageNumber, int size) { if (Objects.isNull(keywords) || keywords.isEmpty()) { return getFamousRecords(pageNumber, size); @@ -100,27 +90,11 @@ private Slice getFamousRecordsWithKeywords(List keywords, int p } @Override - public Slice getRecentRecordInfosWithBookmarksByUser(long userId, long cursorId, int size) { - - Slice records = getRecentRecordsByUser(userId, cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); - - return RecordInfoWithBookmark.of(records, bookmarks); - } - public Slice getRecentRecordsByUser(long userId, long cursorId, int size) { return recordRepository.findAllByUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); } @Override - public Slice getRecentRecordInfosWithBookmarks(long userId,List keywords, Long cursorId, - int size) { - Slice records = getRecentRecords(keywords,cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); - - return RecordInfoWithBookmark.of(records, bookmarks); - } - public Slice getRecentRecords(List keywords, Long cursorId, int size) { if (Objects.isNull(keywords) || keywords.isEmpty()) { return getRecentRecords(cursorId, size); @@ -138,13 +112,6 @@ private Slice getRecentRecordsWithKeywords(List keywords, long } @Override - public Slice getSubscribingRecordInfosWithBookmarks(long userId, long cursorId, int size) { - Slice records = getSubscribingRecords(userId,cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); - - return RecordInfoWithBookmark.of(records, bookmarks); - } - public Slice getSubscribingRecords(long userId, long cursorId, int size) { return recordRepository.findAllBySubscribingUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); } diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java index a78c9d9c..56b3679b 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatApi.java @@ -7,7 +7,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record_stat.domain.usecase.Preference; import org.springframework.data.domain.Slice; import org.springframework.http.MediaType; diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java index 8fe76794..7782601d 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java @@ -1,8 +1,11 @@ package org.recordy.server.record_stat.controller; +import java.util.List; import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.Record; +import org.recordy.server.record.service.RecordService; import org.recordy.server.record_stat.domain.usecase.Preference; import org.recordy.server.record_stat.service.RecordStatService; import org.springframework.data.domain.Slice; @@ -63,8 +66,11 @@ public ResponseEntity> getBookmarkedRecords( @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { + Slice records = recordStatService.getBookmarkedRecords(userId, cursorId, size); + List bookmarks = recordStatService.findBookmarks(userId, records); + return ResponseEntity - .status(HttpStatus.OK) - .body(recordStatService.getBookmarkedRecordInfosWithBookmarks(userId,cursorId,size)); + .ok() + .body(RecordInfoWithBookmark.of(records, bookmarks)); } } diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index 1dae035a..1501702c 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -1,7 +1,7 @@ package org.recordy.server.record_stat.service; import java.util.List; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.usecase.Preference; @@ -15,6 +15,6 @@ public interface RecordStatService { // query Preference getPreference(long userId); - Slice getBookmarkedRecordInfosWithBookmarks(long userId, long cursorId, int size); + Slice getBookmarkedRecords(long userId, long cursorId, int size); List findBookmarks(long userId, Slice records); } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index aff95b47..bdc9bd84 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -4,8 +4,8 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.record.domain.usecase.RecordInfo; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfo; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; @@ -60,18 +60,6 @@ public Preference getPreference(long userId) { @Override - public Slice getBookmarkedRecordInfosWithBookmarks(long userId, long cursorId, int size) { - Slice records = getBookmarkedRecords(userId, cursorId, size); - List bookmarks = findBookmarks(userId, records); - - return records.map(record -> { - int index = records.getContent().indexOf(record); - Boolean isBookmarked = bookmarks.get(index); - RecordInfo recordInfo = RecordInfo.from(record); - return new RecordInfoWithBookmark(recordInfo, isBookmarked); - }); - } - public Slice getBookmarkedRecords(long userId, long cursorId, int size) { return bookmarkRepository.findAllByBookmarksOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)) .map(Bookmark::getRecord); diff --git a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java index 06fc7baa..6705a932 100644 --- a/src/test/java/org/recordy/server/record/service/RecordServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/RecordServiceTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.mock.FakeContainer; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; @@ -62,7 +62,7 @@ void init() { recordService.delete(1, record.getId()); // then - Slice result = recordService.getRecentRecordInfosWithBookmarks(1,null, 0L, 1); + Slice result = recordService.getRecentRecords(null, 0L, 1); assertAll( () -> assertThat(result.getContent()).hasSize(0), () -> assertThat(result.hasNext()).isFalse() @@ -84,7 +84,7 @@ void init() { } @Test - void findAllByUserIdOrderByCreatedAtDesc를_통해_userId를_기반으로_레코드_데이터를_조회할_수_있다() { + void getRecentRecordsByUser를_통해_userId를_기반으로_레코드_데이터를_조회할_수_있다() { //given recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); @@ -93,13 +93,13 @@ void init() { recordService.create(DomainFixture.createRecordCreateByOtherUser(), DomainFixture.createFile()); //when - Slice result = recordService.getRecentRecordInfosWithBookmarksByUser(1, Long.MAX_VALUE, 10); + Slice result = recordService.getRecentRecordsByUser(1, Long.MAX_VALUE, 10); //then assertAll( () -> assertThat(result.get()).hasSize(2), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(2L), - () -> assertThat(result.getContent().get(1).recordInfo().id()).isEqualTo(1L), + () -> assertThat(result.getContent().get(0).getId()).isEqualTo(2L), + () -> assertThat(result.getContent().get(1).getId()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } @@ -114,16 +114,16 @@ void init() { recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); // when - Slice result = recordService.getRecentRecordInfosWithBookmarks(1, null, 6L, 10); + Slice result = recordService.getRecentRecords(null, 6L, 10); // then assertAll( () -> assertThat(result.getContent()).hasSize(5), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(5L), - () -> assertThat(result.getContent().get(1).recordInfo().id()).isEqualTo(4L), - () -> assertThat(result.getContent().get(2).recordInfo().id()).isEqualTo(3L), - () -> assertThat(result.getContent().get(3).recordInfo().id()).isEqualTo(2L), - () -> assertThat(result.getContent().get(4).recordInfo().id()).isEqualTo(1L), + () -> assertThat(result.getContent().get(0).getId()).isEqualTo(5L), + () -> assertThat(result.getContent().get(1).getId()).isEqualTo(4L), + () -> assertThat(result.getContent().get(2).getId()).isEqualTo(3L), + () -> assertThat(result.getContent().get(3).getId()).isEqualTo(2L), + () -> assertThat(result.getContent().get(4).getId()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } @@ -136,7 +136,7 @@ void init() { recordService.create(DomainFixture.createRecordCreate(), DomainFixture.createFile()); // when - Slice result = recordService.getRecentRecordInfosWithBookmarks(1, null, 1L, 3); + Slice result = recordService.getRecentRecords(null, 1L, 3); // then assertAll( diff --git a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java index 8f2daf5d..71f49dc7 100644 --- a/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java +++ b/src/test/java/org/recordy/server/record_stat/service/RecordStatServiceTest.java @@ -7,7 +7,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.recordy.server.mock.FakeContainer; -import org.recordy.server.record.domain.usecase.RecordInfoWithBookmark; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; +import org.recordy.server.record.domain.Record; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.user.domain.UserStatus; @@ -55,7 +56,7 @@ void init() { recordStatService.deleteBookmark(1,1); // then - Slice result = recordStatService.getBookmarkedRecordInfosWithBookmarks(1, 7, 10); + Slice result = recordStatService.getBookmarkedRecords(1, 7, 10); assertAll( () -> assertThat(result.getContent()).hasSize(0) @@ -73,14 +74,14 @@ void init() { recordStatService.bookmark(2, 3); // when - Slice result = recordStatService.getBookmarkedRecordInfosWithBookmarks(1, 7, 10); + Slice result = recordStatService.getBookmarkedRecords(1, 7, 10); // then assertAll( () -> assertThat(result.getContent()).hasSize(3), - () -> assertThat(result.getContent().get(0).recordInfo().id()).isEqualTo(3L), - () -> assertThat(result.getContent().get(1).recordInfo().id()).isEqualTo(2L), - () -> assertThat(result.getContent().get(2).recordInfo().id()).isEqualTo(1L), + () -> assertThat(result.getContent().get(0).getId()).isEqualTo(3L), + () -> assertThat(result.getContent().get(1).getId()).isEqualTo(2L), + () -> assertThat(result.getContent().get(2).getId()).isEqualTo(1L), () -> assertThat(result.hasNext()).isFalse() ); } @@ -96,7 +97,7 @@ void init() { recordStatService.bookmark(2, 3); // when - Slice result = recordStatService.getBookmarkedRecordInfosWithBookmarks(1, 1, 10); + Slice result = recordStatService.getBookmarkedRecords(1, 1, 10); // then assertAll( From 68b7de31b7053ff2f36b0e59674f5204364754ba Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 03:44:57 +0900 Subject: [PATCH 27/55] [fix] findBookmarks find -> exist(#57) --- .../repository/BookmarkRepository.java | 10 ++++++---- .../repository/impl/BookmarkJpaRepository.java | 4 +--- .../repository/impl/BookmarkRepositoryImpl.java | 16 ++++++++++++---- .../service/impl/RecordStatServiceImpl.java | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java b/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java index d7d9ef58..441f9029 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java +++ b/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java @@ -1,17 +1,19 @@ package org.recordy.server.record_stat.repository; -import java.util.Optional; import org.recordy.server.record_stat.domain.Bookmark; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; +import org.recordy.server.record.domain.Record; -public interface BookmarkRepository { +import java.util.List; +public interface BookmarkRepository { // command Bookmark save(Bookmark bookmark); void delete(long userId, long recordId); - //query + // query Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable); - Optional findByUserIdAndRecordId(long userId, long recordId); + boolean existsByUserIdAndRecordId(Long userId, Long recordId); + List findBookmarks(long userId, Slice records); } diff --git a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkJpaRepository.java b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkJpaRepository.java index d01ec30a..420d490c 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkJpaRepository.java +++ b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkJpaRepository.java @@ -1,14 +1,12 @@ package org.recordy.server.record_stat.repository.impl; -import java.util.Optional; import org.recordy.server.record_stat.domain.BookmarkEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface BookmarkJpaRepository extends JpaRepository { - // command void deleteAllByUserIdAndRecordId(long userId, long recordId); // query - Optional findByUser_IdAndRecord_Id(long userId, long recordId); + boolean existsByUserIdAndRecordId(Long userId, Long recordId); } diff --git a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java index 71f0a64b..1c4209b1 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java +++ b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java @@ -1,7 +1,9 @@ package org.recordy.server.record_stat.repository.impl; -import java.util.Optional; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import org.recordy.server.record.domain.Record; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.domain.BookmarkEntity; import org.recordy.server.record_stat.repository.BookmarkRepository; @@ -36,8 +38,14 @@ public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, } @Override - public Optional findByUserIdAndRecordId(long userId, long recordId) { - return bookmarkJpaRepository.findByUser_IdAndRecord_Id(userId, recordId) - .map(BookmarkEntity::toDomain); + public boolean existsByUserIdAndRecordId(Long userId, Long recordId) { + return bookmarkJpaRepository.existsByUserIdAndRecordId(userId, recordId); + } + + @Override + public List findBookmarks(long userId, Slice records) { + return records.getContent().stream() + .map(record -> bookmarkJpaRepository.existsByUserIdAndRecordId(userId, record.getId())) + .collect(Collectors.toList()); } } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index bdc9bd84..f125b56a 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -49,7 +49,7 @@ public void deleteBookmark(long userId, long recordId) { @Override public List findBookmarks(long userId, Slice records) { return records.getContent().stream() - .map(record -> bookmarkRepository.findByUserIdAndRecordId(userId, record.getId()).isPresent()) + .map(record -> bookmarkRepository.existsByUserIdAndRecordId(userId, record.getId())) .collect(Collectors.toList()); } From dff2c014eff8e7c1813e11d4ddcd728f64d17760 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 00:05:25 +0900 Subject: [PATCH 28/55] =?UTF-8?q?[docs]=20USER=20swagger=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=84=B8=EC=84=B8=ED=9E=88=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/user/controller/UserApi.java | 347 +++++++++++++++--- 1 file changed, 303 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/recordy/server/user/controller/UserApi.java b/src/main/java/org/recordy/server/user/controller/UserApi.java index c5cf14c6..5c66945b 100644 --- a/src/main/java/org/recordy/server/user/controller/UserApi.java +++ b/src/main/java/org/recordy/server/user/controller/UserApi.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; +import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.user.controller.dto.request.UserSignInRequest; import org.recordy.server.user.controller.dto.request.UserSignUpRequest; import org.recordy.server.user.controller.dto.response.UserSignInResponse; @@ -22,8 +23,8 @@ public interface UserApi { @Operation( - summary = "유저 회원 가입 API", - description = "유저가 회원 가입하는 API입니다. ", + summary = "유저 로그인 API", + description = "사용자의 로그인 요청을 처리합니다.", responses = { @ApiResponse( responseCode = "200", @@ -34,6 +35,106 @@ public interface UserApi { implementation = UserSignInResponse.class ) ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 카카오 액세스 토큰의 정보를 조회하는 과정에서 오류가 발생하였습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token 토큰의 유효 기간이 만료되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token 토큰의 형식이 올바르지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token의 클레임 값이 올바르지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth Identity Token의 값이 올바르지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple jwt 토큰이 유효하지 않습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple OAuth 통신 암호화 과정 중 문제가 발생했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - Apple 로그인 중 public key 생성에 문제가 발생했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ) } ) @@ -44,41 +145,101 @@ public ResponseEntity signIn( @Operation( security = @SecurityRequirement(name = "Authorization"), - summary = "로그아웃 API", - description = "access token을 바탕으로 로그아웃을 진행하는 API입니다.", + summary = "유저 회원 가입 API", + description = "소셜 로그인 이후 닉네임 설정 및 동의 항목 체크하는 API입니다.", responses = { @ApiResponse( - responseCode = "200", - description = "요청이 성공했습니다." + responseCode = "201", + description = "요청이 성공했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE + ) ), @ApiResponse( - responseCode = "404", - description = "존재하지 않는 회원입니다.", - content = @Content + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 이미 존재하는 닉네임입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ), @ApiResponse( responseCode = "404", - description = "인증 정보를 찾을 수 없습니다.", - content = @Content + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ) } ) - public ResponseEntity signOut( - @UserId Long userId + public ResponseEntity signUp( + @UserId Long userId, + @RequestBody UserSignUpRequest request ); @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "유저 닉네임 중복체크 API", - description = "유저가 회원 가입할 때 닉네임을 중복체크해주는 API입니다.", + summary = "닉네임 중복 체크 API", + description = "닉네임 중복체크하는 API입니다.", responses = { @ApiResponse( responseCode = "200", - description = "성공", + description = "요청이 성공했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 이미 존재하는 닉네임입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ) @@ -89,74 +250,172 @@ public ResponseEntity checkDuplicateNickname( ); @Operation( - summary = "유저 회원 탈퇴 API", - description = "유저가 회원 탈퇴하는 API입니다.", + summary = "토큰 재발급 API", + description = "사용자의 토큰 리프레시 요청을 처리합니다. (refreshToken을 바탕으로 AccessToken을 재발급합니다.)", responses = { @ApiResponse( responseCode = "200", - description = "성공", + description = "요청이 성공했습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = UserReissueTokenResponse.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 회원입니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 인증 정보를 찾을 수 없습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ) } ) - public ResponseEntity delete( - @UserId Long userId + public ResponseEntity reissueToken( + @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken ); @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "access token 재발급 API", - description = "refresh token을 바탕으로 access token을 재발급 받는 API입니다.", + summary = "유저 회원 탈퇴 API", + description = "유저가 회원 탈퇴하는 API입니다.", responses = { @ApiResponse( - responseCode = "200", - description = "성공", + responseCode = "204", + description = "요청이 성공했습니다. 내용이 없습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = UserReissueTokenResponse.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ), @ApiResponse( responseCode = "404", - description = "존재하지 않는 회원입니다.", - content = @Content + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ), @ApiResponse( responseCode = "404", - description = "인증 정보를 찾을 수 없습니다.", - content = @Content + description = "Not Found - 인증 정보를 찾을 수 없습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) ) } ) - public ResponseEntity reissueToken( - @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken + public ResponseEntity delete( + @UserId Long userId ); @Operation( - summary = "유저 회원 등록 API", - description = "유저 회원 등록하는 API입니다.", + summary = "유저 로그아웃 API", + description = "유저의 로그아웃 요청을 처리합니다. 이후 logout에 사용한 accessToken을 클라이언트 내에서 삭제해주세요.", responses = { @ApiResponse( - responseCode = "200", - description = "성공", + responseCode = "204", + description = "요청이 성공했습니다. 내용이 없습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰이 만료되었습니다. 재발급 받아주세요.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 인증 정보를 찾을 수 없습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class ) ) ) } ) - public ResponseEntity signUp( - @UserId Long userId, - @RequestBody UserSignUpRequest request + public ResponseEntity signOut( + @UserId Long userId ); } \ No newline at end of file From 2fceffd9c2f067cecf0559e400707b41d2b51f49 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 01:07:09 +0900 Subject: [PATCH 29/55] [feat] RecordApi(#56) --- .../server/record/controller/RecordApi.java | 79 +++++++++++++++++- .../record/controller/RecordController.java | 4 +- test.mv.db | Bin 20480 -> 20480 bytes 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index e348b578..e41df0aa 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -1,9 +1,86 @@ package org.recordy.server.record.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.recordy.server.auth.security.UserId; +import org.recordy.server.common.message.ErrorMessage; +import org.recordy.server.record.controller.dto.RecordCreateRequest; +import org.recordy.server.record.domain.File; +import org.recordy.server.record.domain.Record; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; @Tag(name = "기록 관련 API") public interface RecordApi { - + @Operation( + summary = "레코드 생성 API", + description = "유저가 레코드를 생성하는 API입니다. 파일과 함께 레코드 정보를 전송합니다.", + responses = { + @ApiResponse( + responseCode = "201", + description = "레코드가 성공적으로 생성되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Record.class + ) + ) + ), + @ApiResponse( + responseCode = "400", + description = "Bad Request - 요청이 잘못되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 회원입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity createRecord( + @UserId Long uploaderId, + @RequestPart RecordCreateRequest recordCreateRequest, + @RequestPart File file + ); } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index bee77074..30a142a1 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -1,6 +1,5 @@ package org.recordy.server.record.controller; - import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; @@ -22,11 +21,12 @@ @RequiredArgsConstructor @RequestMapping("/api/v1/records") @RestController -public class RecordController { +public class RecordController implements RecordApi { private final RecordService recordService; private final RecordStatService recordStatService; + @Override @PostMapping public ResponseEntity createRecord( @UserId Long uploaderId, diff --git a/test.mv.db b/test.mv.db index 57a61dea6eac76e2ba994832163d1882a26fe246..0dc2c62d9d431a214d17705c7b7b3c2bc1016ba0 100644 GIT binary patch literal 20480 zcmeHP-E!MR7?o0*ic(4$hIP=t29&F@;Guxdc_5= zzyrVwz%2~V!0-gT1;Z_?l~<7*dmNaAPMFUZTCHcb`}ur2vX0JYZ%4$6`+4$GwcW#4 zJi-VeD|s;)zKm$*TgjNSf~OGidb6<>LV>B5ED;@zG&ElmoLqFOnC09C4T6 zICZ?+8oU4jKmZT`1ONd*01yBK00BS%5C8-K0YKojBe1P>ziL7MzxJF!0Du4>00;mA zfB+x>2mk_r03ZMe00Mx(Wg~EA^7r{L!q$i#@FVdoV8Biyk|5EJB22Auo)=M;CZa9? zA=k&qDh>x_od9-R8nadrz>uF5k!uxs5>f1#m-i}*34Xlsr*?Bi(^s?)%m>f9TRro$ z{jE-K>-obcJG+}EA79R}HBe_a|K? z#+{aDI95AB{ljDarA$_tq$*kEdwXKPPTMpU)9g9tvqu>XV{0;;9F^rADw|cmQ#`Fp zJG@4Q>(p9#l1xTyn4Ct4{!mBkO(UkQh()iCxH`RjQDdSa7PzTXtsQev#*CdbZJu!` zWYd@z#pub?&&yCVMn}hYvQ*B9Ql6r^LqzsPr#iby>@bnJPc`l1&nvclb?KaclBO4oa0^oQq1Kc4jaPg#G$H(9~TF=CNl zb*$_6v{k_}8`GO*L*%yFcjdk(x4zs4avQD=*?`;6@5n~1TTc0w>WEYxG^QE8FNc*FveEfbndA7#34@QS$?8bY zk90%km5i+C6A;KzoW&dwzgpExycnSjSHVpYTs)ah^icQoK&QH^`zx4=-2Hs(WTi=M zr>3@hL25g7L^qIpjcirIfq_mppwp!nt5o@KSEblvoBx&gXg=*|9Y|m=we<8rs zN|(?I{lD^?{++gRS2Hk6NI*hv5QlRwW6YqGU!Eia_G$g5^6oH}CiJ=68p~T0nEX|O3TyPO_cOA!AGorOPv8N)Br&76=s&)O5 zP>}if^#06Xp@;YLua&k{qu#h#(PwsaA!f24o))|_9?S{%?I-kjA4u(EnF^zW}oX0)PM@00;mAfWY-fU{-%O zh4k64=|iFa>6Pk#cjk^xS;}qwztFQe3)^k#|Euu-|GHlO|9dU}pVlU!b3v1k&UMq9 zx7?LUSQcw2H@$vr({kLBIn^5^qh8bhZ`K1e9XR2d*0lgsm3B0}^@jhy+}8XD{{IqV zb5V?Qjm*mbmoqB=zv@i=|E5d$U-|zO{Qqm~|G#Sa|D>iiy&$#KKd-b)d;X38pUinM zOEMJThX3EJ2WZl!`428+iT}U+Vsv5szwBzXD8#u}pUVGV$n5D_;QwF$`z81UfB+x> f2mk_r!2baOrT>-wK9gClRqOwh3;mC;MF0N{pWx(k literal 20480 zcmeHO&2QT_6qnL9@w#>!2JEh7X@g;!L6Q1C)mc&`K++YlTl7|t5|swEEyI!1q^BKr z8Fn6aUH^gYwq14|b{(*PXcQ&N@>kIQG2AOwwVGX5y_=K0G;2`?6uuc|Www0X^a;BC6k`XQ3yO0D5!~TG$+>X%@!Z7kL55 zvay5A?6}86+sA<=k^#m!0MzXBvn+JXER8~!CC24_L@vR~OZ~aFa!YGiG{RzR-oQ5J zZbE5;5Nz2Nwi|>7$VLfj*lrYXj{Sz?Bf>~xHJpID6nWx?Q%(XLH{8f&2#K%!gklFH zyTK{r2zz!Tv2738fxni-3Bm#WJRKf2pWrC|2+&a&AYdECm z>aEKH#F&yzj<%onkJLbTs(}!GKV@w(FR`Hy=wM^3o3cZm@FDLGnBQx-zhd|n@@ijcp$ z7jyVjK2Ha{-x<>WiC8_6e{)j2no-u}P4tm$lJVX^pdeoVP}WENINeW=nwF7Q!>U>) z_>@~CwCq@l6F!k6h0`P5k#CnHna}unsIi!q2xKdzs&Z7N$%Swwf{Q!Tu^#BI?(0N%bZ^DNV(org`*THG)!vsju}M6?x(n8N zVjnb*^O z^pPO6#824eacR}l4K+TS@&I!$HTU{TSFdzRqZuC$2gHwS9w$>?Vb1@BTc-xPgfjmx z!LQfOwCgLHzM_3*+qt?%^WsqwJAb7<_{Gwy%W zF?JsBwL5KNz1>c0L^f&N-;Qzq?f&af_jsu7T2mk_r03ZMe00LJQ zfoc9d=Kstb^M5AzKYgS8KbYWa1xK6Z|BGTgW2u8T&HrCqE&l)G1poIc{_iiz|Gl|< zx*nlhmjB1Ihc^}>E*VD@7sc!R8vpm^#p`PP|KbSfYw&-0+BA`FQjdYwLyC0~=LS6s z{x3UJA;qFHC#3k_`2Y71|1Z*Qs(Ag?iU0pK5&w59ZS|JaR(EbZoz&v#g|_CIRj-c! z$FpZ&7O`wv*Vb`5KwTBQnzp+0j>2m3|BJ25(((Tb%*!GP=h~AZ{=ZOJ%b_6te`UQM o5F8Ky1ONd*01)_pBcS-d;@@>9UGaaPBwVD}UP26gx{DkC0%Izui2wiq From 33b26ec5efcd849441eea9100b0bc06d45df1eae Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 01:41:14 +0900 Subject: [PATCH 30/55] =?UTF-8?q?[feat]=20Record=20api=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 52 ++++++++++++++++-- test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index e41df0aa..09f7413b 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -14,10 +14,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; @Tag(name = "기록 관련 API") public interface RecordApi { @@ -83,4 +80,51 @@ public ResponseEntity createRecord( @RequestPart RecordCreateRequest recordCreateRequest, @RequestPart File file ); + + @Operation( + summary = "레코드 삭제 API", + description = "주어진 record_id의 소유자라면 해당 record_id에 해당하는 레코드를 삭제합니다.", + responses = { + @ApiResponse( + responseCode = "204", + description = "레코드가 성공적으로 삭제되었습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "403", + description = "Forbidden - 삭제가 불가능한 기록입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 기록입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity deleteRecord( + @UserId Long uploaderId, + @PathVariable Long recordId + ); + } diff --git a/test.mv.db b/test.mv.db index 0dc2c62d9d431a214d17705c7b7b3c2bc1016ba0..4ae4f825a58e0f4515697d05f45a8295d0f8b603 100644 GIT binary patch literal 20480 zcmeHPO>f*p7`CG}HHDU5xSP;6LKthly#6?`rKu8>6qMbT-m0-ZPNVLwR~v6=IC0>@ zFW?SWBm`#!M{bBK7k&%lkMY`@-DWEis-Sld9?xbx^X7Tyas2psmF<97;UJBktG0Le zr3f%W$cmm#N6!Q1U@Mvko{2cXKJr~Zj$Jphl5{fUSwO90F*!O+N5#NoAhPJ0m;{_N z;kg)H*Wd#P00MvjAOHve0)PM@00;mAfB+x>2mk`F9f577`&A42|F!1?0ssU60YCr{ z00aO5KmZT`1ONd*01yBK&KrT5$v+UI09#{zAdcj_fFXYokO;|k9AIiq(liS&W=s|a zAmm7A-^vb$d7%KM%oS0q3ScB&WPxL4X%tW#n&u6g%KZ>w*9 zyua1$Z#}*DXlM7nNeJ68H*S2bm*1L?dRzPE&I9w|r+stl$xg4|GdFtO4YSwX?VFn% zhcqNU519xZl5{rB?QU<|+zf@RaPVR`q{MR&7Cd&sgmfq(+!Ze6!XwCGZW1CFhY^=Y zgc$AkE^-j^h_`8W@9*tA)HMCKD?jVny7oo^v&~qd&Kz`YC^Bvz#_Kt@HZB`dHqK9a zl^B*(e3)6w)OukTRVEc@N; zab4SiW*L?tRjIYoD4LG>C^`uc{a%IapekhA3R(8*kjwq$$|4gLvII`;wRX_uj>9aD zn_JGIZWZ*BAY~AFke$S72FY}ML+;`N1{8}J&3Z)cfV@}!kc5oO^nIjhAAC|$?(;ieZDV} zcZ%=Ru^9Cye00R4Ojhe0m6v8b90(h|T@1;@a4df%dHKzvKOM#CZhBy2Gw%j27g#wUYH*oCIFNi9-;xj`<*PJVZm9;5)^z978@nJt|?$Ma=i! zFDI)bJw4L#c_(LNJ)eZ27$tZp5OK>@J5eV@D8XfL6@tqr(~0iu9o^HZ?&$6srZRWG zYJaUYsVx+>S+XLvMO}H-q;``hCAFJ8S;7+P<$Jo#65>0^X;FJ2Yb2fP5-uhdvBv#Q zQG12E5k7S{n*9}NGyAODQG?m77#H4t$eGNpmMfX9eI=Q_FPSYF{`a2+!}YzgEjn-j z1ONd*01yBK00BVY!Vs9(-}R%IEW59(>BE??m?xccQ_}TB*VXz`i8b^;Egs_X=T0d} zn)<&`PVL7`%JRp`S=`8K=zpod>b3s$iPZmVf2>n&?WSg69ubfD!XQkDPQtlCDZvaA zW>D@Uh7x2joH*3;6N7akUkKtEN^BTPB^Zw2g8C#jlp-*cIx&=BFqHVXmc$8?uM1WY zcb9RDH78oL7j`A`L|iD>T(#bQAQfafIk_`8SnA>Z^b4hJ)u=01OXkdv&g4w?y^~CI zClh|6t~xK!%(>W#)ppa-fm(>n4Ol4VrEnAzF^WW?=s#TL643tw^grnT_S;C%{}=Z3 z022cOfB+x>2mk_rz-2^WUVk@r^i2OtTRZkHQvXYXrK$gy`Txr;n>ubeQ$zn>fd9XD zx%~ehTK<1rn}lLTlQ3Rrrjv%5UYdk?v4%3!>(@4OhTDSb4J_QSX%aT;0h$J!n7!d) z@yq>xX(FosDAC+gO<(gB{Qt9@&1FF@bTUi-znoI}|5dN@|64BMf8hUr1OES|_5Xiw z`TtQ(?RZ6MM-@-nr9Dlal+<3u|6lN877He;UuLB}&3b?)YvKmAqci;fv+qW);Qya- zJ6aaw!rM>j|G$*k&B`9||1aai62uG$00MvjAOHybPY{@ud6!zLsiSNC&oGyzP=t29&F@;Guxdc_5= zzyrVwz%2~V!0-gT1;Z_?l~<7*dmNaAPMFUZTCHcb`}ur2vX0JYZ%4$6`+4$GwcW#4 zJi-VeD|s;)zKm$*TgjNSf~OGidb6<>LV>B5ED;@zG&ElmoLqFOnC09C4T6 zICZ?+8oU4jKmZT`1ONd*01yBK00BS%5C8-K0YKojBe1P>ziL7MzxJF!0Du4>00;mA zfB+x>2mk_r03ZMe00Mx(Wg~EA^7r{L!q$i#@FVdoV8Biyk|5EJB22Auo)=M;CZa9? zA=k&qDh>x_od9-R8nadrz>uF5k!uxs5>f1#m-i}*34Xlsr*?Bi(^s?)%m>f9TRro$ z{jE-K>-obcJG+}EA79R}HBe_a|K? z#+{aDI95AB{ljDarA$_tq$*kEdwXKPPTMpU)9g9tvqu>XV{0;;9F^rADw|cmQ#`Fp zJG@4Q>(p9#l1xTyn4Ct4{!mBkO(UkQh()iCxH`RjQDdSa7PzTXtsQev#*CdbZJu!` zWYd@z#pub?&&yCVMn}hYvQ*B9Ql6r^LqzsPr#iby>@bnJPc`l1&nvclb?KaclBO4oa0^oQq1Kc4jaPg#G$H(9~TF=CNl zb*$_6v{k_}8`GO*L*%yFcjdk(x4zs4avQD=*?`;6@5n~1TTc0w>WEYxG^QE8FNc*FveEfbndA7#34@QS$?8bY zk90%km5i+C6A;KzoW&dwzgpExycnSjSHVpYTs)ah^icQoK&QH^`zx4=-2Hs(WTi=M zr>3@hL25g7L^qIpjcirIfq_mppwp!nt5o@KSEblvoBx&gXg=*|9Y|m=we<8rs zN|(?I{lD^?{++gRS2Hk6NI*hv5QlRwW6YqGU!Eia_G$g5^6oH}CiJ=68p~T0nEX|O3TyPO_cOA!AGorOPv8N)Br&76=s&)O5 zP>}if^#06Xp@;YLua&k{qu#h#(PwsaA!f24o))|_9?S{%?I-kjA4u(EnF^zW}oX0)PM@00;mAfWY-fU{-%O zh4k64=|iFa>6Pk#cjk^xS;}qwztFQe3)^k#|Euu-|GHlO|9dU}pVlU!b3v1k&UMq9 zx7?LUSQcw2H@$vr({kLBIn^5^qh8bhZ`K1e9XR2d*0lgsm3B0}^@jhy+}8XD{{IqV zb5V?Qjm*mbmoqB=zv@i=|E5d$U-|zO{Qqm~|G#Sa|D>iiy&$#KKd-b)d;X38pUinM zOEMJThX3EJ2WZl!`428+iT}U+Vsv5szwBzXD8#u}pUVGV$n5D_;QwF$`z81UfB+x> f2mk_r!2baOrT>-wK9gClRqOwh3;mC;MF0N{pWx(k From b39b664b8404a2e51c020ae8cabe6f3856fb83f7 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 02:22:10 +0900 Subject: [PATCH 31/55] =?UTF-8?q?[feat]=20Record=20api=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=93=B1=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 96 ++++++++++++++++++ test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 96 insertions(+) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 09f7413b..796571a0 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -11,11 +11,14 @@ import org.recordy.server.record.controller.dto.RecordCreateRequest; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; +import org.springframework.data.domain.Slice; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Tag(name = "기록 관련 API") public interface RecordApi { @@ -127,4 +130,97 @@ public ResponseEntity deleteRecord( @PathVariable Long recordId ); + @Operation( + summary = "최근 레코드 조회 API", + description = "사용자의 최근 레코드를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 카카오 액세스 토큰의 정보를 조회하는 과정에서 오류가 발생하였습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getRecentRecords( + @RequestParam(required = false) List keywords, + @RequestParam long cursorId, + @RequestParam int size + ); + + @Operation( + summary = "회원의 레코드 리스트 조회 API", + description = "회원의 최근 레코드 리스트를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getRecentRecordsByUser( + @UserId long userId, + @RequestParam long cursorId, + @RequestParam int size + ); } diff --git a/test.mv.db b/test.mv.db index 4ae4f825a58e0f4515697d05f45a8295d0f8b603..65d6aaba68f397974bd666374ebb27413cd55c30 100644 GIT binary patch literal 20480 zcmeHO-EQ1O7`3A|HHDVmaBo7|2w|+5@xQOw&{PRZ3d(Lvuc&6m<235-dbRO}286@~ zPXZ5sxI{wq4G>QNufq6e9PehAO(CHQ`u4)(S&e7DoNtcT$LGs-Of1&V_;b~E55E#I zMhIE_*<|=Uc3EQav7os~VjQ6;h>|1-xRqw(0nKB_Iu_%j!)#a%O#33|&%`+92ni7c z=%xlAKmZT`1ONd*01yBK00BS%5C8-K0YCr{c z2mk_r03ZMe00MvjAaKzLoSOW7F^sV_q6gwgz6%)87ct>Twxbw3);P=Z7?aeMg#ie8 z0Y+ASI4BAQywK+qPgMa7#fv=ltUTkfgPD0@pQ4!H$7?UO>nobRqP=V0d(z$NnIG?O zb$VM*Hy`cn-Zu$x*UYtB-|5x2=A-V`zPa43F;pni_gkr6-la+ReZN6&zrQ>nW(cTWL3s&_5#L3WKD*XqoTe;WwYvc^2beW z2XAGVsnl8-=aUf~@{<@jKQtlpI%H=mWZ7#%uJ%_Ti%e9=5;(Qjrh`t)n6aBA?JY+= zuMT=qkh~1iPrY`Ku8wcXU0hCy5|NqSG#V|DJ8=YDw%%41j_qtziD2>a<WdkZT>&e(Z(FVNQzgmct4R>FDgJ)O7>oM&bL_WKE=J zM|u(U3r05cNeIeOf--?fP_627pCOduD!3ZK#gpkok91!Tbw~H~UcfP0|!6=5C8-K0YCr{ z00b@#0VVU2S}V=1rcaTdy4b@PrlgyRZmRY9j8-coW%1l8B}rTVFBD^^adWGs|E2zF z*80~cQva{~w)&^Ga$7SnALFo-LJpHgZ#4#6%auHn!KxhO@3i&M`DqttMH9tlB0 zLx~MTsRY9lR5%ey45bJRrA`bb7z`yoZlpI$Kl@T?TQ%z1^@=&OqjNcvy?K(0&Uj2u)KwP+nmH3&x!P_vJWvaf znE`XfycCXNEQVZ^ivGj%Tmt%Efc|Ho|I1g$>eU|T|4Vy%fQbPCKmZT`1ONd*;3^_8 ztH0Yiy7_N<;rXePUaJ0QQ~H0A|G(I>IgOjO_5UUK|36i}t0pdZ}G6~!D0Br+~woJlkiT}Uc*L(&4f0?tnD9E`^ zX664^Q!4+z?$!SPluP&@`2XL4|9@rue`m`74;yMn=cINxx3uS<`TuiX%m#>(bc))i z^#E{N0YCr{00jOg X2q^up^mkiFH~K%JQvWBHqW}K_8`|ot literal 20480 zcmeHPO>f*p7`CG}HHDU5xSP;6LKthly#6?`rKu8>6qMbT-m0-ZPNVLwR~v6=IC0>@ zFW?SWBm`#!M{bBK7k&%lkMY`@-DWEis-Sld9?xbx^X7Tyas2psmF<97;UJBktG0Le zr3f%W$cmm#N6!Q1U@Mvko{2cXKJr~Zj$Jphl5{fUSwO90F*!O+N5#NoAhPJ0m;{_N z;kg)H*Wd#P00MvjAOHve0)PM@00;mAfB+x>2mk`F9f577`&A42|F!1?0ssU60YCr{ z00aO5KmZT`1ONd*01yBK&KrT5$v+UI09#{zAdcj_fFXYokO;|k9AIiq(liS&W=s|a zAmm7A-^vb$d7%KM%oS0q3ScB&WPxL4X%tW#n&u6g%KZ>w*9 zyua1$Z#}*DXlM7nNeJ68H*S2bm*1L?dRzPE&I9w|r+stl$xg4|GdFtO4YSwX?VFn% zhcqNU519xZl5{rB?QU<|+zf@RaPVR`q{MR&7Cd&sgmfq(+!Ze6!XwCGZW1CFhY^=Y zgc$AkE^-j^h_`8W@9*tA)HMCKD?jVny7oo^v&~qd&Kz`YC^Bvz#_Kt@HZB`dHqK9a zl^B*(e3)6w)OukTRVEc@N; zab4SiW*L?tRjIYoD4LG>C^`uc{a%IapekhA3R(8*kjwq$$|4gLvII`;wRX_uj>9aD zn_JGIZWZ*BAY~AFke$S72FY}ML+;`N1{8}J&3Z)cfV@}!kc5oO^nIjhAAC|$?(;ieZDV} zcZ%=Ru^9Cye00R4Ojhe0m6v8b90(h|T@1;@a4df%dHKzvKOM#CZhBy2Gw%j27g#wUYH*oCIFNi9-;xj`<*PJVZm9;5)^z978@nJt|?$Ma=i! zFDI)bJw4L#c_(LNJ)eZ27$tZp5OK>@J5eV@D8XfL6@tqr(~0iu9o^HZ?&$6srZRWG zYJaUYsVx+>S+XLvMO}H-q;``hCAFJ8S;7+P<$Jo#65>0^X;FJ2Yb2fP5-uhdvBv#Q zQG12E5k7S{n*9}NGyAODQG?m77#H4t$eGNpmMfX9eI=Q_FPSYF{`a2+!}YzgEjn-j z1ONd*01yBK00BVY!Vs9(-}R%IEW59(>BE??m?xccQ_}TB*VXz`i8b^;Egs_X=T0d} zn)<&`PVL7`%JRp`S=`8K=zpod>b3s$iPZmVf2>n&?WSg69ubfD!XQkDPQtlCDZvaA zW>D@Uh7x2joH*3;6N7akUkKtEN^BTPB^Zw2g8C#jlp-*cIx&=BFqHVXmc$8?uM1WY zcb9RDH78oL7j`A`L|iD>T(#bQAQfafIk_`8SnA>Z^b4hJ)u=01OXkdv&g4w?y^~CI zClh|6t~xK!%(>W#)ppa-fm(>n4Ol4VrEnAzF^WW?=s#TL643tw^grnT_S;C%{}=Z3 z022cOfB+x>2mk_rz-2^WUVk@r^i2OtTRZkHQvXYXrK$gy`Txr;n>ubeQ$zn>fd9XD zx%~ehTK<1rn}lLTlQ3Rrrjv%5UYdk?v4%3!>(@4OhTDSb4J_QSX%aT;0h$J!n7!d) z@yq>xX(FosDAC+gO<(gB{Qt9@&1FF@bTUi-znoI}|5dN@|64BMf8hUr1OES|_5Xiw z`TtQ(?RZ6MM-@-nr9Dlal+<3u|6lN877He;UuLB}&3b?)YvKmAqci;fv+qW);Qya- zJ6aaw!rM>j|G$*k&B`9||1aai62uG$00MvjAOHybPY{@ud6!zLsiSNC&oGyz Date: Sat, 13 Jul 2024 04:09:44 +0900 Subject: [PATCH 32/55] =?UTF-8?q?[feat]=20api=20=EB=AA=85=EC=84=B8?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 43 ++++++++++++++++-- test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 796571a0..0ac012d2 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -4,15 +4,13 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.record.controller.dto.RecordCreateRequest; +import org.recordy.server.record.controller.dto.request.RecordCreateRequest; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.springframework.data.domain.Slice; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -82,7 +80,7 @@ public ResponseEntity createRecord( @UserId Long uploaderId, @RequestPart RecordCreateRequest recordCreateRequest, @RequestPart File file - ); + ) ; @Operation( summary = "레코드 삭제 API", @@ -223,4 +221,41 @@ public ResponseEntity> getRecentRecordsByUser( @RequestParam long cursorId, @RequestParam int size ); + + @Operation( + summary = "레코드 시청 API", + description = "사용자가 특정 레코드를 시청했음을 기록합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content + ), + @ApiResponse( + responseCode = "404", + description = "Not Found - 존재하지 않는 사용자 또는 기록입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity watch( + @UserId long userId, + @RequestParam long recordId + ); + } diff --git a/test.mv.db b/test.mv.db index 65d6aaba68f397974bd666374ebb27413cd55c30..14523ff3f3f38429bf6419a90eb3f8d932274e55 100644 GIT binary patch literal 20480 zcmeHNO>f*p7`7vlm_kc0+)YRuA&fPi@%II`G*yCj?VuE_bZ7{*D& z38OB)p}`*@00;mAfB+x>2mk_r03ZMe00MvjAOHxwas+lj|G)AaKmdRMAOHve0)PM@ z00;mAfB+x>2mk_rz*Qqqnf%P^ihk@^19~J*<(@!~p2e6Wc^~5GFH^0`)Pt8Z|?E`c7f%)*$j=BA0x7}%*8|~JH*>3H1%q{9L z!f-^HE0~8-+icQ`Y)@$>)M+3x`NsENK{|Z^`6M7eUhvd*xF8c!sW^PUat}p zjmtCKnFMuDo{7&?vWg^?$tphEm)CXL#+j(H=g!F(idF58qTLId3uK8&yLFQ(qs5^lkNdHW2;J zkoHe0&to6=C~ZFS{o!_DxCOG z%@ohhbXVOyp2>PD&f_qp*uzLZG-x;WLPQuzoja;qfgv4S?3KE1fZQm2uNLn->2nXe?KKB_ysZ$0wMsV?9I@TlI*F&A?o*t|?MCR^i{fCt%wZod) z(Iu%Jj(LKosNLjAN$n<27O_MzdzvLtDsa@K_5#*K4Qhw;SQC6xQ+xT-$hq(|n*55) zFnh`4sLAYRjB_79csaAn=}Km6UrA;kNM=ihKmScJT;DIxssRT;01yBK00BS%5C8*)UId z{v7?^43f`NGNt}6hphDfxHZ=Q;}!m&>Hj}K|6g1E|KpVYr!}?NC8@o9pX~Dbf5|Rc zv9-5|HLOAHxw~c!{lENa^aA>S$>XT0|C=$+ef*UA|L>SRwX+BM|H|HIU|>K15C8-K z0YCr{Scbr?{+{UnWTOA2(ac?ZrTU*w>3^b3oWggKmSn^KUo6HZar37Bm;P(L*YK|| zr2oJ2>-wR#a!WHD%5jJzVPIDXKc&!cnDqttMH9tnX%qcR(f z$|W>BAziTuCr0H68kIX~RED8ZnUCvfk|J3ya2a#=I`*+!T`o4+jRgI_>?a@o4+sDPfB+x>2mk{A Za|9~=U+M3rj;{TGDZ9B;v{&K({{@3O=pg_A literal 20480 zcmeHO-EQ1O7`3A|HHDVmaBo7|2w|+5@xQOw&{PRZ3d(Lvuc&6m<235-dbRO}286@~ zPXZ5sxI{wq4G>QNufq6e9PehAO(CHQ`u4)(S&e7DoNtcT$LGs-Of1&V_;b~E55E#I zMhIE_*<|=Uc3EQav7os~VjQ6;h>|1-xRqw(0nKB_Iu_%j!)#a%O#33|&%`+92ni7c z=%xlAKmZT`1ONd*01yBK00BS%5C8-K0YCr{c z2mk_r03ZMe00MvjAaKzLoSOW7F^sV_q6gwgz6%)87ct>Twxbw3);P=Z7?aeMg#ie8 z0Y+ASI4BAQywK+qPgMa7#fv=ltUTkfgPD0@pQ4!H$7?UO>nobRqP=V0d(z$NnIG?O zb$VM*Hy`cn-Zu$x*UYtB-|5x2=A-V`zPa43F;pni_gkr6-la+ReZN6&zrQ>nW(cTWL3s&_5#L3WKD*XqoTe;WwYvc^2beW z2XAGVsnl8-=aUf~@{<@jKQtlpI%H=mWZ7#%uJ%_Ti%e9=5;(Qjrh`t)n6aBA?JY+= zuMT=qkh~1iPrY`Ku8wcXU0hCy5|NqSG#V|DJ8=YDw%%41j_qtziD2>a<WdkZT>&e(Z(FVNQzgmct4R>FDgJ)O7>oM&bL_WKE=J zM|u(U3r05cNeIeOf--?fP_627pCOduD!3ZK#gpkok91!Tbw~H~UcfP0|!6=5C8-K0YCr{ z00b@#0VVU2S}V=1rcaTdy4b@PrlgyRZmRY9j8-coW%1l8B}rTVFBD^^adWGs|E2zF z*80~cQva{~w)&^Ga$7SnALFo-LJpHgZ#4#6%auHn!KxhO@3i&M`DqttMH9tlB0 zLx~MTsRY9lR5%ey45bJRrA`bb7z`yoZlpI$Kl@T?TQ%z1^@=&OqjNcvy?K(0&Uj2u)KwP+nmH3&x!P_vJWvaf znE`XfycCXNEQVZ^ivGj%Tmt%Efc|Ho|I1g$>eU|T|4Vy%fQbPCKmZT`1ONd*;3^_8 ztH0Yiy7_N<;rXePUaJ0QQ~H0A|G(I>IgOjO_5UUK|36i}t0pdZ}G6~!D0Br+~woJlkiT}Uc*L(&4f0?tnD9E`^ zX664^Q!4+z?$!SPluP&@`2XL4|9@rue`m`74;yMn=cINxx3uS<`TuiX%m#>(bc))i z^#E{N0YCr{00jOg X2q^up^mkiFH~K%JQvWBHqW}K_8`|ot From 4606958a0b84ad2f30c013017dc5dcefb0ab9c79 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sat, 13 Jul 2024 04:14:41 +0900 Subject: [PATCH 33/55] =?UTF-8?q?[feat]=20api=20=EB=AA=85=EC=84=B8?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 42 ++++++++++++++++++ test.mv.db | Bin 20480 -> 20480 bytes 2 files changed, 42 insertions(+) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 0ac012d2..a1aa130f 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -258,4 +258,46 @@ public ResponseEntity watch( @RequestParam long recordId ); + @Operation( + summary = "인기 레코드 조회 API", + description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getFamousRecords( + @RequestParam(required = false) List keywords, + @RequestParam(required = false, defaultValue = "0") int pageNumber, + @RequestParam(required = false, defaultValue = "10") int pageSize + ); + } diff --git a/test.mv.db b/test.mv.db index 14523ff3f3f38429bf6419a90eb3f8d932274e55..47561bbbf05ad38724daf3fee8bfcb4fbeabcfc7 100644 GIT binary patch literal 20480 zcmeI3O>f*p7{~31Buk;C7w#ssjVg>aGk*7}8=5MCq@e7!^j6K-<235-dbRO}gcAp@ zi0=Rw#07CjAjBQ<3HU6G#~#P~l4h$WM3J5xJRWB}^UU9#XP@89cq<|%>t*pvm39uk z<`G5+nemJ9;AP}G)Qm@*<~)gTh(bS165o%_G#mA49@*v*9~~ZK16eTb@jQOPM^Q`z zoB0m9p}`+001AKtpa3WU3V;Hj04M+ofC8WZC;$pvxdK~?`&A13f91~v3;+c{0Z;%G z00lq+PyiGF1wa8%02BZPE?R-pMgATiMA#hCeSRob_51WV^2H{AJ{?BbHb+^ON7yBS z*cgDYlO)K@5BkMMff$k0o!kX5;KzC7nt2vSUg{bb_9r$IEd9NDUt7ARwJ?oIKtkRk z4(DD9*=vyr?fZb z4{1)jCqsT6%a~LB%8#w5<>n5a$j%iVyYq;~qSq&PrwR)Z_Oh>3_f@I4mdh7*x^ymT zvNld~-X4wUiMs2eL^GyrldbJ!gMHNynJOTR-^o}<^h><{yL5PGqnEKgp7IeN#QaXt z?~fO`WtZnvmR_VMnx_A@`kk)d)>gzQv#`BfBt#y|b61{w^61NBAdlh7fcCld{9Ty{ zQ;UARqcXz&`dswkeR(|_@{U;WjN?CZtT>1uzdY%fS?Z@wY>o%x!(!`}a@1wMovX*^I$>iASD?JMnZ@yVNC)vrg!~_B zlf%knd%|R5o|=rM$s|VdT4Ay{6)$%2D>7xXBaL=_T>qG`G{7FJY(C4zP}*o?*0ho6 z_@?@OLJ3dMX^t?L6uGiF!W=4m(l?s+(Vj>jXxhL3h*Uh#-7=LKIDi7604M+ofC8WZ zC~#>Cs92Cz0oB~y^a;hG9bY6$D<;38+7G7!x+3l@g19PjQ(@+rA=|0lp$hW~{ufc2 zYU<6?;$wnemOs;$mo$Az`@p#Oth3oQKH1xBcQ>DJJlWoPXb|G88EZGc)yu2Klg{Rz zvHi$+{CU^de74=`c8s-7d(G&yce=(p#mr^`=$XSsjF@`s##XztWvnwUzHkT{IM@AD{QruPT{Q>%e`&D{R16A$0-yjW01AKtizzV8-%XCL zzosVy2O^qt-W;K)YpD63Eyn+|1Q{b6d%O`svPV+LCh(`5)H*tLf*p7`7vlm_kc0+)YRuA&fPi@%II`G*yCj?VuE_bZ7{*D& z38OB)p}`*@00;mAfB+x>2mk_r03ZMe00MvjAOHxwas+lj|G)AaKmdRMAOHve0)PM@ z00;mAfB+x>2mk_rz*Qqqnf%P^ihk@^19~J*<(@!~p2e6Wc^~5GFH^0`)Pt8Z|?E`c7f%)*$j=BA0x7}%*8|~JH*>3H1%q{9L z!f-^HE0~8-+icQ`Y)@$>)M+3x`NsENK{|Z^`6M7eUhvd*xF8c!sW^PUat}p zjmtCKnFMuDo{7&?vWg^?$tphEm)CXL#+j(H=g!F(idF58qTLId3uK8&yLFQ(qs5^lkNdHW2;J zkoHe0&to6=C~ZFS{o!_DxCOG z%@ohhbXVOyp2>PD&f_qp*uzLZG-x;WLPQuzoja;qfgv4S?3KE1fZQm2uNLn->2nXe?KKB_ysZ$0wMsV?9I@TlI*F&A?o*t|?MCR^i{fCt%wZod) z(Iu%Jj(LKosNLjAN$n<27O_MzdzvLtDsa@K_5#*K4Qhw;SQC6xQ+xT-$hq(|n*55) zFnh`4sLAYRjB_79csaAn=}Km6UrA;kNM=ihKmScJT;DIxssRT;01yBK00BS%5C8*)UId z{v7?^43f`NGNt}6hphDfxHZ=Q;}!m&>Hj}K|6g1E|KpVYr!}?NC8@o9pX~Dbf5|Rc zv9-5|HLOAHxw~c!{lENa^aA>S$>XT0|C=$+ef*UA|L>SRwX+BM|H|HIU|>K15C8-K z0YCr{Scbr?{+{UnWTOA2(ac?ZrTU*w>3^b3oWggKmSn^KUo6HZar37Bm;P(L*YK|| zr2oJ2>-wR#a!WHD%5jJzVPIDXKc&!cnDqttMH9tnX%qcR(f z$|W>BAziTuCr0H68kIX~RED8ZnUCvfk|J3ya2a#=I`*+!T`o4+jRgI_>?a@o4+sDPfB+x>2mk{A Za|9~=U+M3rj;{TGDZ9B;v{&K({{@3O=pg_A From a48c8d3f46d242dadb52485d495228b8f7e30260 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Sun, 14 Jul 2024 21:16:09 +0900 Subject: [PATCH 34/55] [docs] --- test.mv.db | Bin 20480 -> 20480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test.mv.db b/test.mv.db index 47561bbbf05ad38724daf3fee8bfcb4fbeabcfc7..c386a2c42289b93cb66cac558b12b598996577d6 100644 GIT binary patch literal 20480 zcmeI3L2ukd6vyp|q}zlRF5D0@p>2dP)_6Q#dwlAarb?uwRM~CSLs2xg$4Qi3d$sX~ zh7$)q0B1Pz0T6d2?i~0CoDrXb=keO>?50hiO{<`{hq1>Qd*1wZ{4)RdW;X(AhW#u$ z44m@VJ@`fjHX+1}_Q&aA;QPXiMpEQ54s1@i$K%-ZA~VTG1ChgB$8vOZkfo|&(wBL( zFGm3ru^lGNTh{P{1dsp{Kmter2_OL^fCP{L5fCP{L z51DgpJ{#gE7TezvUY!OkPa@nFx z%61||%W81o3@{Trsd)4@3l`KDj;97$EFqUsuDgTD`MaPT<+rIXua_ zcaqD_Xe3UmyIvPGW5zbs+g6tDRUOfp24MVF7ItA=F#Wg1@YcP47VgMIj$|6iTgA9P zzsN1yG8d}#MMeT-eqQ-XUtG}i1?^+w&eQIC&-h|zz0+IYz4v%?>%IZ++p4j8<2${) zYCP_)?--j8jE7(LjP<9R-CoyN?RHj;ZfC1!tO+}GLYST*lc7tK_L{NL>24Tnp@jW9 ze(Z$~^<8315xZeR+YX_^lb$1_Pl?OCB!u@NjEc8{5azVGM_fXD>aQ7{``eojHBJBR z#)k{ql6GA=4a@hv`pmyJfT3Fl@lxR_EW13=^5FiWS8m3uHyfRHH~oWS`AE5*!sV2% zr?|Ea=d}}>_?3w-vZFa)BodEvX^zwJQL$U8^i9d6-pMDE8Fni94S(fTj>^oUXgm~Y zbP^Enr`lwHVlq4BA*nev*;XclYgE??lPR1}Jm+bn;Sa@!3%7QlV04(+=NRcLBN_FZ zMpE6r0Y15WBn@3s)Rc!NP@~gYEF%H4?ORRzYzMx^yPEdr?@))+CgE6>HtsE1!V=*MGhKqo%*FErDH@%@&ITRi&d!SCws5daCqQ$(K?wkk;Hy-dP=YH}Wm^pEb5MOBsO#BKroE9!k3jFj?;DQFTXPZirA6LTO>#LHf^LM{Z>st@ zjkB$6&$5l88r0Rv4=8H=L2YGDu&a6sW_!A$?w<5y9?FxTibKJp97$MdyVDIc3!te(UFPKlNBv6$MWoNUTR-k9!ZDl=y)ANfQ+f?zxqV4KQE zI;VJ@Y2aaWu<&9U+D|T$GadOAC-Rbhezol>i;Taf%^YV{kOz^ zkN^@u0!RP}AOR$B^$E=C@2UP5Q~hr<$!HS4vVfj{K&}778F^AA;Xq(F^Z)ZXx6pGS z-`EgDVN?HKLjM0R%>Q4~UIWbkzxn+C?$yfwe{?GU&+7n=xL^S1{AfrSz$vyKos<86 z@m{29{=f81^RW@p@KSl!vbK|78vH|5tyZ lfFnQxNB{{S0VIF~{x<|F{a@+tss0bA`ac5w&n`#*{{tdt^5g&j literal 20480 zcmeI3O>f*p7{~31Buk;C7w#ssjVg>aGk*7}8=5MCq@e7!^j6K-<235-dbRO}gcAp@ zi0=Rw#07CjAjBQ<3HU6G#~#P~l4h$WM3J5xJRWB}^UU9#XP@89cq<|%>t*pvm39uk z<`G5+nemJ9;AP}G)Qm@*<~)gTh(bS165o%_G#mA49@*v*9~~ZK16eTb@jQOPM^Q`z zoB0m9p}`+001AKtpa3WU3V;Hj04M+ofC8WZC;$pvxdK~?`&A13f91~v3;+c{0Z;%G z00lq+PyiGF1wa8%02BZPE?R-pMgATiMA#hCeSRob_51WV^2H{AJ{?BbHb+^ON7yBS z*cgDYlO)K@5BkMMff$k0o!kX5;KzC7nt2vSUg{bb_9r$IEd9NDUt7ARwJ?oIKtkRk z4(DD9*=vyr?fZb z4{1)jCqsT6%a~LB%8#w5<>n5a$j%iVyYq;~qSq&PrwR)Z_Oh>3_f@I4mdh7*x^ymT zvNld~-X4wUiMs2eL^GyrldbJ!gMHNynJOTR-^o}<^h><{yL5PGqnEKgp7IeN#QaXt z?~fO`WtZnvmR_VMnx_A@`kk)d)>gzQv#`BfBt#y|b61{w^61NBAdlh7fcCld{9Ty{ zQ;UARqcXz&`dswkeR(|_@{U;WjN?CZtT>1uzdY%fS?Z@wY>o%x!(!`}a@1wMovX*^I$>iASD?JMnZ@yVNC)vrg!~_B zlf%knd%|R5o|=rM$s|VdT4Ay{6)$%2D>7xXBaL=_T>qG`G{7FJY(C4zP}*o?*0ho6 z_@?@OLJ3dMX^t?L6uGiF!W=4m(l?s+(Vj>jXxhL3h*Uh#-7=LKIDi7604M+ofC8WZ zC~#>Cs92Cz0oB~y^a;hG9bY6$D<;38+7G7!x+3l@g19PjQ(@+rA=|0lp$hW~{ufc2 zYU<6?;$wnemOs;$mo$Az`@p#Oth3oQKH1xBcQ>DJJlWoPXb|G88EZGc)yu2Klg{Rz zvHi$+{CU^de74=`c8s-7d(G&yce=(p#mr^`=$XSsjF@`s##XztWvnwUzHkT{IM@AD{QruPT{Q>%e`&D{R16A$0-yjW01AKtizzV8-%XCL zzosVy2O^qt-W;K)YpD63Eyn+|1Q{b6d%O`svPV+LCh(`5)H*tL Date: Mon, 15 Jul 2024 00:28:46 +0900 Subject: [PATCH 35/55] =?UTF-8?q?[feat]=20=EC=B5=9C=EA=B7=BC=20=EB=A0=88?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A1=B0=ED=9A=8C=20API(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 73 ++++++++----------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index a1aa130f..3f5b85cf 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -129,8 +129,8 @@ public ResponseEntity deleteRecord( ); @Operation( - summary = "최근 레코드 조회 API", - description = "사용자의 최근 레코드를 조회합니다.", + summary = "회원의 레코드 리스트 조회 API", + description = "회원의 최근 레코드 리스트를 조회합니다.", responses = { @ApiResponse( responseCode = "200", @@ -144,17 +144,7 @@ public ResponseEntity deleteRecord( ), @ApiResponse( responseCode = "401", - description = "Unauthorized - 액세스 토큰의 형식이 올바르지 않습니다. Bearer 타입을 확인해 주세요.", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = ErrorMessage.class - ) - ) - ), - @ApiResponse( - responseCode = "401", - description = "Unauthorized - 카카오 액세스 토큰의 정보를 조회하는 과정에서 오류가 발생하였습니다.", + description = "Unauthorized - 인증이 필요합니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( @@ -174,29 +164,24 @@ public ResponseEntity deleteRecord( ) } ) - public ResponseEntity> getRecentRecords( - @RequestParam(required = false) List keywords, + public ResponseEntity> getRecentRecordsByUser( + @UserId long userId, @RequestParam long cursorId, @RequestParam int size ); @Operation( - summary = "회원의 레코드 리스트 조회 API", - description = "회원의 최근 레코드 리스트를 조회합니다.", + summary = "레코드 시청 API", + description = "사용자가 특정 레코드를 시청했음을 기록합니다.", responses = { @ApiResponse( responseCode = "200", description = "요청이 성공적으로 처리되었습니다.", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = Slice.class - ) - ) + content = @Content ), @ApiResponse( - responseCode = "401", - description = "Unauthorized - 인증이 필요합니다.", + responseCode = "404", + description = "Not Found - 존재하지 않는 사용자 또는 기록입니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( @@ -216,24 +201,28 @@ public ResponseEntity> getRecentRecords( ) } ) - public ResponseEntity> getRecentRecordsByUser( + public ResponseEntity watch( @UserId long userId, - @RequestParam long cursorId, - @RequestParam int size + @RequestParam long recordId ); @Operation( - summary = "레코드 시청 API", - description = "사용자가 특정 레코드를 시청했음을 기록합니다.", + summary = "인기 레코드 조회 API", + description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", responses = { @ApiResponse( responseCode = "200", description = "요청이 성공적으로 처리되었습니다.", - content = @Content + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) ), @ApiResponse( - responseCode = "404", - description = "Not Found - 존재하지 않는 사용자 또는 기록입니다.", + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( @@ -253,14 +242,15 @@ public ResponseEntity> getRecentRecordsByUser( ) } ) - public ResponseEntity watch( - @UserId long userId, - @RequestParam long recordId + public ResponseEntity> getFamousRecords( + @RequestParam(required = false) List keywords, + @RequestParam(required = false, defaultValue = "0") int pageNumber, + @RequestParam(required = false, defaultValue = "10") int pageSize ); @Operation( - summary = "인기 레코드 조회 API", - description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", + summary = "최근 레코드 조회 API", + description = "사용자가 최근 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 최근 레코드를 조회합니다.", responses = { @ApiResponse( responseCode = "200", @@ -294,10 +284,9 @@ public ResponseEntity watch( ) } ) - public ResponseEntity> getFamousRecords( + public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") int pageNumber, - @RequestParam(required = false, defaultValue = "10") int pageSize + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ); - } From bb04ec8774ee2044f52a333629d84ca1987d24e3 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:43:30 +0900 Subject: [PATCH 36/55] =?UTF-8?q?[del]=20test.mv.db=EC=82=AD=EC=A0=9C=20(#?= =?UTF-8?q?56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.mv.db | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.mv.db diff --git a/test.mv.db b/test.mv.db deleted file mode 100644 index c386a2c42289b93cb66cac558b12b598996577d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI3L2ukd6vyp|q}zlRF5D0@p>2dP)_6Q#dwlAarb?uwRM~CSLs2xg$4Qi3d$sX~ zh7$)q0B1Pz0T6d2?i~0CoDrXb=keO>?50hiO{<`{hq1>Qd*1wZ{4)RdW;X(AhW#u$ z44m@VJ@`fjHX+1}_Q&aA;QPXiMpEQ54s1@i$K%-ZA~VTG1ChgB$8vOZkfo|&(wBL( zFGm3ru^lGNTh{P{1dsp{Kmter2_OL^fCP{L5fCP{L z51DgpJ{#gE7TezvUY!OkPa@nFx z%61||%W81o3@{Trsd)4@3l`KDj;97$EFqUsuDgTD`MaPT<+rIXua_ zcaqD_Xe3UmyIvPGW5zbs+g6tDRUOfp24MVF7ItA=F#Wg1@YcP47VgMIj$|6iTgA9P zzsN1yG8d}#MMeT-eqQ-XUtG}i1?^+w&eQIC&-h|zz0+IYz4v%?>%IZ++p4j8<2${) zYCP_)?--j8jE7(LjP<9R-CoyN?RHj;ZfC1!tO+}GLYST*lc7tK_L{NL>24Tnp@jW9 ze(Z$~^<8315xZeR+YX_^lb$1_Pl?OCB!u@NjEc8{5azVGM_fXD>aQ7{``eojHBJBR z#)k{ql6GA=4a@hv`pmyJfT3Fl@lxR_EW13=^5FiWS8m3uHyfRHH~oWS`AE5*!sV2% zr?|Ea=d}}>_?3w-vZFa)BodEvX^zwJQL$U8^i9d6-pMDE8Fni94S(fTj>^oUXgm~Y zbP^Enr`lwHVlq4BA*nev*;XclYgE??lPR1}Jm+bn;Sa@!3%7QlV04(+=NRcLBN_FZ zMpE6r0Y15WBn@3s)Rc!NP@~gYEF%H4?ORRzYzMx^yPEdr?@))+CgE6>HtsE1!V=*MGhKqo%*FErDH@%@&ITRi&d!SCws5daCqQ$(K?wkk;Hy-dP=YH}Wm^pEb5MOBsO#BKroE9!k3jFj?;DQFTXPZirA6LTO>#LHf^LM{Z>st@ zjkB$6&$5l88r0Rv4=8H=L2YGDu&a6sW_!A$?w<5y9?FxTibKJp97$MdyVDIc3!te(UFPKlNBv6$MWoNUTR-k9!ZDl=y)ANfQ+f?zxqV4KQE zI;VJ@Y2aaWu<&9U+D|T$GadOAC-Rbhezol>i;Taf%^YV{kOz^ zkN^@u0!RP}AOR$B^$E=C@2UP5Q~hr<$!HS4vVfj{K&}778F^AA;Xq(F^Z)ZXx6pGS z-`EgDVN?HKLjM0R%>Q4~UIWbkzxn+C?$yfwe{?GU&+7n=xL^S1{AfrSz$vyKos<86 z@m{29{=f81^RW@p@KSl!vbK|78vH|5tyZ lfFnQxNB{{S0VIF~{x<|F{a@+tss0bA`ac5w&n`#*{{tdt^5g&j From 57dec9e55b75c458b9dae41ced53d25765dd360d Mon Sep 17 00:00:00 2001 From: Jin Geonwoo Date: Sun, 14 Jul 2024 17:47:06 +0900 Subject: [PATCH 37/55] =?UTF-8?q?[test]=20=EA=B5=AC=EB=8F=85=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B0=80=EC=A7=9C=20=EB=A6=AC=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=20=EB=B0=8F=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recordy/server/mock/FakeContainer.java | 8 ++ .../subscribe/FakeSubscribeRepository.java | 77 +++++++++++++++++ .../service/SubscribeServiceTest.java | 85 +++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 src/test/java/org/recordy/server/mock/subscribe/FakeSubscribeRepository.java create mode 100644 src/test/java/org/recordy/server/subscribe/service/SubscribeServiceTest.java diff --git a/src/test/java/org/recordy/server/mock/FakeContainer.java b/src/test/java/org/recordy/server/mock/FakeContainer.java index 8f7418a6..537c792c 100644 --- a/src/test/java/org/recordy/server/mock/FakeContainer.java +++ b/src/test/java/org/recordy/server/mock/FakeContainer.java @@ -12,6 +12,7 @@ import org.recordy.server.auth.service.impl.token.AuthTokenParser; import org.recordy.server.auth.service.impl.token.AuthTokenServiceImpl; import org.recordy.server.auth.service.impl.token.AuthTokenSigningKeyProvider; +import org.recordy.server.mock.subscribe.FakeSubscribeRepository; import org.recordy.server.record.service.S3Service; import org.recordy.server.keyword.repository.KeywordRepository; import org.recordy.server.keyword.service.KeywordService; @@ -34,6 +35,9 @@ import org.recordy.server.record_stat.repository.ViewRepository; import org.recordy.server.record_stat.service.RecordStatService; import org.recordy.server.record_stat.service.impl.RecordStatServiceImpl; +import org.recordy.server.subscribe.repository.SubscribeRepository; +import org.recordy.server.subscribe.service.SubscribeService; +import org.recordy.server.subscribe.service.impl.SubscribeServiceImpl; import org.recordy.server.user.controller.UserController; import org.recordy.server.user.repository.UserRepository; import org.recordy.server.user.service.UserService; @@ -53,6 +57,7 @@ public class FakeContainer { public final KeywordRepository keywordRepository; public final BookmarkRepository bookmarkRepository; public final ViewRepository viewRepository; + public final SubscribeRepository subscribeRepository; // infrastructure public final AuthTokenSigningKeyProvider authTokenSigningKeyProvider; @@ -72,6 +77,7 @@ public class FakeContainer { public final KeywordService keywordService; public final RecordStatService recordStatService; public final S3Service s3Service; + public final SubscribeService subscribeService; // security public final AuthFilterExceptionHandler authFilterExceptionHandler; @@ -87,6 +93,7 @@ public FakeContainer() { this.keywordRepository = new FakeKeywordRepository(); this.bookmarkRepository = new FakeBookmarkRepository(); this.viewRepository = new FakeViewRepository(); + this.subscribeRepository = new FakeSubscribeRepository(); this.authTokenSigningKeyProvider = new AuthTokenSigningKeyProvider(DomainFixture.TOKEN_SECRET); this.authTokenGenerator = new AuthTokenGenerator(authTokenSigningKeyProvider); @@ -115,6 +122,7 @@ public FakeContainer() { this.keywordService = new KeywordServiceImpl(keywordRepository); this.recordStatService = new RecordStatServiceImpl(userRepository, recordRepository, bookmarkRepository); this.recordService = new RecordServiceImpl(recordRepository, viewRepository, fileService, userService, recordStatService); + this.subscribeService = new SubscribeServiceImpl(subscribeRepository, userRepository); this.s3Service = mock(S3Service.class); // S3Service mock 사용 diff --git a/src/test/java/org/recordy/server/mock/subscribe/FakeSubscribeRepository.java b/src/test/java/org/recordy/server/mock/subscribe/FakeSubscribeRepository.java new file mode 100644 index 00000000..6e760d84 --- /dev/null +++ b/src/test/java/org/recordy/server/mock/subscribe/FakeSubscribeRepository.java @@ -0,0 +1,77 @@ +package org.recordy.server.mock.subscribe; + +import org.recordy.server.subscribe.domain.Subscribe; +import org.recordy.server.subscribe.repository.SubscribeRepository; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FakeSubscribeRepository implements SubscribeRepository { + + public long subscribeAutoIncrementId = 1L; + private final Map subscribes = new HashMap<>(); + + @Override + public void save(Subscribe subscribe) { + Subscribe realSubscribe = Subscribe.builder() + .id(subscribeAutoIncrementId) + .subscribingUser(subscribe.getSubscribingUser()) + .subscribedUser(subscribe.getSubscribedUser()) + .build(); + subscribes.put(subscribeAutoIncrementId++, realSubscribe); + } + + @Override + public void delete(long subscribingUserId, long subscribedUserId) { + subscribes.values() + .removeIf(subscribe -> + subscribe.getSubscribingUser().getId() == subscribingUserId && + subscribe.getSubscribedUser().getId() == subscribedUserId + ); + } + + @Override + public Slice findAllBySubscribingUserId(long subscribingUserId, long cursor, Pageable pageable) { + List content = subscribes.values().stream() + .filter(subscribe -> + subscribe.getSubscribingUser().getId() == subscribingUserId && + subscribe.getSubscribedUser().getId() < cursor + ) + .sorted(Comparator.comparing(Subscribe::getId).reversed()) + .toList(); + + if (content.size() <= pageable.getPageSize()) { + return new SliceImpl<>(content, pageable, false); + } + + return new SliceImpl<>(content, pageable, true); + } + + @Override + public boolean existsBySubscribingUserIdAndSubscribedUserId(long subscribingUserId, long subscribedUserId) { + return subscribes.values().stream() + .anyMatch(subscribe -> + subscribe.getSubscribingUser().getId() == subscribingUserId && + subscribe.getSubscribedUser().getId() == subscribedUserId + ); + } + + @Override + public long countSubscribingUsers(long subscribedUserId) { + return subscribes.values().stream() + .filter(subscribe -> subscribe.getSubscribedUser().getId() == subscribedUserId) + .count(); + } + + @Override + public long countSubscribedUsers(long subscribingUserId) { + return subscribes.values().stream() + .filter(subscribe -> subscribe.getSubscribingUser().getId() == subscribingUserId) + .count(); + } +} diff --git a/src/test/java/org/recordy/server/subscribe/service/SubscribeServiceTest.java b/src/test/java/org/recordy/server/subscribe/service/SubscribeServiceTest.java new file mode 100644 index 00000000..502c2268 --- /dev/null +++ b/src/test/java/org/recordy/server/subscribe/service/SubscribeServiceTest.java @@ -0,0 +1,85 @@ +package org.recordy.server.subscribe.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.recordy.server.mock.FakeContainer; +import org.recordy.server.subscribe.domain.Subscribe; +import org.recordy.server.subscribe.domain.usecase.SubscribeCreate; +import org.recordy.server.subscribe.repository.SubscribeRepository; +import org.recordy.server.user.domain.User; +import org.recordy.server.user.repository.UserRepository; +import org.recordy.server.util.DomainFixture; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +class SubscribeServiceTest { + + private SubscribeService subscribeService; + private SubscribeRepository subscribeRepository; + private UserRepository userRepository; + + @BeforeEach + void init() { + FakeContainer fakeContainer = new FakeContainer(); + subscribeService = fakeContainer.subscribeService; + subscribeRepository = fakeContainer.subscribeRepository; + userRepository = fakeContainer.userRepository; + } + + @Test + void subscribe를_통해_사용자_간_구독할_수_있다() { + // given + userRepository.save(DomainFixture.createUser(1)); + userRepository.save(DomainFixture.createUser(2)); + + // when + subscribeService.subscribe(new SubscribeCreate(1, 2)); + Slice result = subscribeRepository.findAllBySubscribingUserId(1, 20, PageRequest.ofSize(3)); + + // then + assertAll( + () -> assertThat(result.getContent().size()).isEqualTo(1), + () -> assertThat(result.getContent().get(0).getSubscribedUser().getId()).isEqualTo(2) + ); + } + + @Test + void unsubscribe를_통해_사용자_간_구독을_취소할_수_있다() { + // given + userRepository.save(DomainFixture.createUser(1)); + userRepository.save(DomainFixture.createUser(2)); + subscribeService.subscribe(new SubscribeCreate(1, 2)); + + // when + subscribeService.unsubscribe(1, 2); + + // then + assertAll( + () -> assertThat(subscribeRepository.existsBySubscribingUserIdAndSubscribedUserId(1, 2)).isFalse() + ); + } + + @Test + void getSubscribedUsers를_통해_구독한_사용자를_조회할_수_있다() { + // given + userRepository.save(DomainFixture.createUser(1)); + userRepository.save(DomainFixture.createUser(2)); + userRepository.save(DomainFixture.createUser(3)); + + subscribeService.subscribe(new SubscribeCreate(1, 2)); + subscribeService.subscribe(new SubscribeCreate(1, 3)); + + // when + Slice result = subscribeService.getSubscribedUsers(1, 20, 3); + + // then + assertAll( + () -> assertThat(result.getContent().size()).isEqualTo(2), + () -> assertThat(result.getContent().get(0).getId()).isEqualTo(3), + () -> assertThat(result.getContent().get(1).getId()).isEqualTo(2) + ); + } +} \ No newline at end of file From 2306d66bddb33a350b06d3f93239b17fa7640bb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=84=B8=EB=B9=88?= <94737768+sebbbin@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:32:02 +0900 Subject: [PATCH 38/55] [docs] README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e0fee2c2..940e284c 100644 --- a/README.md +++ b/README.md @@ -52,10 +52,12 @@ ## 👤 팀원 +![서버파트 사진](https://github.com/user-attachments/assets/a1f90c12-4c08-4734-9d64-dac155cc6643) + | | || |:---------:|:---------:|:---------:| -|[나세빈](https://github.com/sebbbin)|[박수빈](https://github.com/elive7)|[진건우](https://github.com/jinkonu)| +|[@sebbbin](https://github.com/sebbbin)|[@elive7](https://github.com/elive7)|[@jinkonu](https://github.com/jinkonu)| | `나세빈` | `박수빈` | `👑 진건우` |
From 73dca20f669c759ee3a091ca6d5e73879ef4f4e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=84=B8=EB=B9=88?= <94737768+sebbbin@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:35:02 +0900 Subject: [PATCH 39/55] [docs] README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 940e284c..a8fed81e 100644 --- a/README.md +++ b/README.md @@ -52,10 +52,10 @@ ## 👤 팀원 -![서버파트 사진](https://github.com/user-attachments/assets/a1f90c12-4c08-4734-9d64-dac155cc6643) - -| | || + +
+| | | | |:---------:|:---------:|:---------:| |[@sebbbin](https://github.com/sebbbin)|[@elive7](https://github.com/elive7)|[@jinkonu](https://github.com/jinkonu)| | `나세빈` | `박수빈` | `👑 진건우` | From f80b34c2bb5cadb3a517d3b0a21e1e8209f383b3 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:00:34 +0900 Subject: [PATCH 40/55] [feat] S3 presignedURL(#59) --- .../server/common/config/S3Config.java | 29 +++-- .../record/controller/RecordController.java | 8 ++ .../recordy/server/record/domain/File.java | 16 +++ .../server/record/service/S3Service.java | 4 +- .../record/service/impl/FileServiceImpl.java | 7 +- .../record/service/impl/S3ServiceImpl.java | 102 ++++++------------ 6 files changed, 83 insertions(+), 83 deletions(-) diff --git a/src/main/java/org/recordy/server/common/config/S3Config.java b/src/main/java/org/recordy/server/common/config/S3Config.java index 129157ff..3f898311 100644 --- a/src/main/java/org/recordy/server/common/config/S3Config.java +++ b/src/main/java/org/recordy/server/common/config/S3Config.java @@ -7,28 +7,35 @@ import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; @Configuration public class S3Config { - private final String accessKey; - private final String secretKey; - private final String regionString; + @Value("${aws-property.access-key}") + private String accessKey; - public S3Config(@Value("${aws-property.access-key}") final String accessKey, - @Value("${aws-property.secret-key}") final String secretKey, - @Value("${aws-property.aws-region}") final String regionString) { - this.accessKey = accessKey; - this.secretKey = secretKey; - this.regionString = regionString; - } + @Value("${aws-property.secret-key}") + private String secretKey; + + @Value("${aws-property.aws-region}") + private String regionString; @Bean - public S3Client getS3Client() { + public S3Client s3Client() { AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey); return S3Client.builder() .region(Region.of(regionString)) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build(); } + + @Bean + public S3Presigner s3Presigner() { + AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey); + return S3Presigner.builder() + .region(Region.of(regionString)) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + } } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 30a142a1..40d1455a 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -10,12 +10,14 @@ import org.recordy.server.record.domain.usecase.RecordCreate; import org.recordy.server.record.service.RecordService; import org.recordy.server.record_stat.service.RecordStatService; +import org.recordy.server.record.service.S3Service; import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; @RequiredArgsConstructor @@ -120,4 +122,10 @@ public ResponseEntity> getSubscribingRecordInfosWi .ok() .body(RecordInfoWithBookmark.of(records, bookmarks)); } + @GetMapping("/file/{filename}") + public ResponseEntity getFile(@PathVariable(value = "filename") String fileName) throws IOException { + String url = s3Service.getPresignUrl(fileName); + return new ResponseEntity<>(url, HttpStatus.OK); + } } + diff --git a/src/main/java/org/recordy/server/record/domain/File.java b/src/main/java/org/recordy/server/record/domain/File.java index 5dddbb23..9b048426 100644 --- a/src/main/java/org/recordy/server/record/domain/File.java +++ b/src/main/java/org/recordy/server/record/domain/File.java @@ -2,6 +2,8 @@ import org.springframework.web.multipart.MultipartFile; +import java.util.UUID; + public record File( MultipartFile video, MultipartFile thumbnail @@ -10,4 +12,18 @@ public record File( public static File of(MultipartFile video, MultipartFile thumbnail) { return new File(video, thumbnail); } + + public String generateFileName(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + String extension = originalFilename.substring(originalFilename.lastIndexOf('.')); + return UUID.randomUUID() + extension; + } + + public String getVideoFileName() { + return generateFileName(video); + } + + public String getThumbnailFileName() { + return generateFileName(thumbnail); + } } diff --git a/src/main/java/org/recordy/server/record/service/S3Service.java b/src/main/java/org/recordy/server/record/service/S3Service.java index 29e4679e..a675c879 100644 --- a/src/main/java/org/recordy/server/record/service/S3Service.java +++ b/src/main/java/org/recordy/server/record/service/S3Service.java @@ -7,8 +7,8 @@ public interface S3Service { // command - public String uploadFile(MultipartFile file) throws IOException; - void deleteFile(String key) throws IOException; + public String getPresignUrl(String filename); + String uploadFile(byte[] fileData, String fileName) throws IOException; // query diff --git a/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java index 6042def5..36ec5b83 100644 --- a/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/FileServiceImpl.java @@ -20,8 +20,11 @@ public class FileServiceImpl implements FileService { @Override public FileUrl save(File file) { try { - String videoUrl = s3Service.uploadFile(file.video()); - String thumbnailUrl = s3Service.uploadFile(file.thumbnail()); + String videoFileName = file.getVideoFileName(); + String thumbnailFileName = file.getThumbnailFileName(); + + String videoUrl = s3Service.uploadFile(file.video().getBytes(), "videos/" + videoFileName); + String thumbnailUrl = s3Service.uploadFile(file.thumbnail().getBytes(), "thumbnails/" + thumbnailFileName); return new FileUrl(videoUrl, thumbnailUrl); } catch (IOException e) { diff --git a/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java index 484f0313..c95704b6 100644 --- a/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/S3ServiceImpl.java @@ -1,95 +1,61 @@ package org.recordy.server.record.service.impl; -import org.recordy.server.common.config.S3Config; -import org.recordy.server.common.message.ErrorMessage; -import org.recordy.server.common.exception.ExternalException; +import lombok.RequiredArgsConstructor; import org.recordy.server.record.service.S3Service; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; +import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.UUID; +import java.time.Duration; @Component +@RequiredArgsConstructor public class S3ServiceImpl implements S3Service { - private String bucketName; - private S3Config s3Config; - private S3Client s3Client; - private static final List FILE_EXTENSIONS = Arrays.asList("image/jpeg", "image/png", "image/jpg", "image/webp", "video/mp4", "video/mov", "video/quicktime"); - private static final Long MAX_SIZE = 100 * 1024 * 1024L; // 100MB + @Value("${aws-property.s3-bucket-name}") + private String bucket; - public S3ServiceImpl(@Value("${aws-property.s3-bucket-name}") final String bucketName, S3Config s3Config) { - this.bucketName = bucketName; - this.s3Config = s3Config; - this.s3Client = s3Config.getS3Client(); - } + private final S3Client s3Client; + private final S3Presigner presigner; @Override - public String uploadFile(MultipartFile file) throws IOException { - validateFileExtension(file); - validateFileSize(file); - final String url = getFileExtension(file); - PutObjectRequest request = PutObjectRequest.builder() - .bucket(bucketName) - .key(url) - .contentType(file.getContentType()) - .contentDisposition("inline") - .build(); - RequestBody requestBody = RequestBody.fromBytes(file.getBytes()); - s3Client.putObject(request, requestBody); - return url; - } + public String getPresignUrl(String filename) { + if (filename == null || filename.equals("")) { + return null; + } - public String getFileExtension(MultipartFile file) { - return UUID.randomUUID() + switch (Objects.requireNonNull(file.getContentType())) { - case "image/jpeg", "image/jpg" -> ".jpg"; - case "image/png" -> ".png"; - case "image/webp" -> ".webp"; - case "video/mp4" -> ".mp4"; - case "video/mov", "video/quicktime" -> ".mov"; - default -> throw new ExternalException(ErrorMessage.INVALID_FILE_TYPE); - }; - } + GetObjectRequest getObjectRequest = GetObjectRequest.builder() + .bucket(bucket) + .key(filename) + .build(); - @Override - public void deleteFile(String key) throws IOException { - s3Client.deleteObject(DeleteObjectRequest.builder() - .bucket(bucketName) - .key(key) - .build()); - } + GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(5)) + .getObjectRequest(getObjectRequest) + .build(); - public void setS3Client(S3Client s3Client) { - this.s3Client = s3Client; - } + PresignedGetObjectRequest presignedGetObjectRequest = presigner + .presignGetObject(getObjectPresignRequest); - private String generateImageFileName() { - return UUID.randomUUID() + ".jpg"; + return presignedGetObjectRequest.url().toString(); } - private String generateVideoFileName() { - return UUID.randomUUID() + ".mp4"; - } + @Override + public String uploadFile(byte[] fileData, String fileName) throws IOException { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucket) + .key(fileName) + .build(); - public void validateFileExtension(MultipartFile file) { - String contentType = file.getContentType(); - if (!FILE_EXTENSIONS.contains(contentType)) { - throw new ExternalException(ErrorMessage.INVALID_FILE_TYPE); - } - } + s3Client.putObject(putObjectRequest, RequestBody.fromBytes(fileData)); - public void validateFileSize(MultipartFile file) { - if (file.getSize() > MAX_SIZE) { - throw new ExternalException(ErrorMessage.INVALID_FILE_SIZE); - } + return getPresignUrl(fileName); } } From d60fdbed2665ce7efe518947bf34ce54ec8ede25 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:06:42 +0900 Subject: [PATCH 41/55] =?UTF-8?q?[del]=20test=ED=95=B4=EB=B3=B8=20api=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C(#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recordy/server/record/controller/RecordController.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 40d1455a..6cd191f7 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -122,10 +122,5 @@ public ResponseEntity> getSubscribingRecordInfosWi .ok() .body(RecordInfoWithBookmark.of(records, bookmarks)); } - @GetMapping("/file/{filename}") - public ResponseEntity getFile(@PathVariable(value = "filename") String fileName) throws IOException { - String url = s3Service.getPresignUrl(fileName); - return new ResponseEntity<>(url, HttpStatus.OK); - } } From f8a22aec2ee87551ce8b163113817792281ab576 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 00:15:31 +0900 Subject: [PATCH 42/55] =?UTF-8?q?[del]=20api=20=EC=82=AD=EC=A0=9C=20(#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../record/service/FileServiceTest.java | 4 +++ .../server/record/service/S3ServiceTest.java | 35 +++++++++---------- 2 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 src/test/java/org/recordy/server/record/service/FileServiceTest.java diff --git a/src/test/java/org/recordy/server/record/service/FileServiceTest.java b/src/test/java/org/recordy/server/record/service/FileServiceTest.java new file mode 100644 index 00000000..52e3f9f1 --- /dev/null +++ b/src/test/java/org/recordy/server/record/service/FileServiceTest.java @@ -0,0 +1,4 @@ +package org.recordy.server.record.service; + +public class FileServiceTest { +} diff --git a/src/test/java/org/recordy/server/record/service/S3ServiceTest.java b/src/test/java/org/recordy/server/record/service/S3ServiceTest.java index e5a52a75..bdd34e97 100644 --- a/src/test/java/org/recordy/server/record/service/S3ServiceTest.java +++ b/src/test/java/org/recordy/server/record/service/S3ServiceTest.java @@ -5,17 +5,17 @@ import org.recordy.server.common.config.S3Config; import org.recordy.server.common.exception.ExternalException; import org.recordy.server.record.service.impl.S3ServiceImpl; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -24,12 +24,16 @@ public class S3ServiceTest { private S3ServiceImpl s3Service; private S3Client s3ClientMock; + private S3Presigner presignerMock; + + @Value("${aws-property.s3-bucket-name}") + private String bucket = "recordy-bucket"; @BeforeEach void init() { - s3Service = new S3ServiceImpl("recordy-bucket", new S3Config("access-key", "secret-key", "ap-northeast-2")); s3ClientMock = mock(S3Client.class); - s3Service.setS3Client(s3ClientMock); + presignerMock = mock(S3Presigner.class); + s3Service = new S3ServiceImpl(bucket, s3ClientMock, presignerMock); } @Test @@ -43,10 +47,10 @@ void init() { .thenReturn(PutObjectResponse.builder().build()); // when - String result = s3Service.uploadFile(imageMock); + String result = s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg"); // then - assertThatCode(() -> s3Service.uploadFile(imageMock)).doesNotThrowAnyException(); + assertThatCode(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg")).doesNotThrowAnyException(); } @Test @@ -60,10 +64,10 @@ void init() { .thenReturn(PutObjectResponse.builder().build()); // when - String result = s3Service.uploadFile(videoMock); + String result = s3Service.uploadFile(videoMock.getBytes(), "test-video.mp4"); // then - assertThatCode(() -> s3Service.uploadFile(videoMock)).doesNotThrowAnyException(); + assertThatCode(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.mp4")).doesNotThrowAnyException(); } @Test @@ -73,12 +77,10 @@ void init() { when(imageMock.getContentType()).thenReturn("image/mov"); when(imageMock.getSize()).thenReturn(1024L); when(imageMock.getBytes()).thenReturn(new byte[1024]); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); //when //then - assertThatThrownBy(() -> s3Service.uploadFile(imageMock)) + assertThatThrownBy(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.mov")) .isInstanceOf(ExternalException.class); } @@ -89,12 +91,10 @@ void init() { when(videoMock.getContentType()).thenReturn("video/hwp"); when(videoMock.getSize()).thenReturn(1024L * 50); when(videoMock.getBytes()).thenReturn(new byte[1024 * 50]); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); //when //then - assertThatThrownBy(() -> s3Service.uploadFile(videoMock)) + assertThatThrownBy(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.hwp")) .isInstanceOf(ExternalException.class); } @@ -108,7 +108,7 @@ void init() { //when //then - assertThatThrownBy(() -> s3Service.uploadFile(imageMock)) + assertThatThrownBy(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg")) .isInstanceOf(ExternalException.class); } @@ -118,12 +118,11 @@ void init() { MultipartFile videoMock = mock(MultipartFile.class); when(videoMock.getContentType()).thenReturn("video/mov"); when(videoMock.getSize()).thenReturn(1024L * 1024 * 200); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); + when(videoMock.getBytes()).thenReturn(new byte[1024 * 1024 * 200]); //when //then - assertThatThrownBy(() -> s3Service.uploadFile(videoMock)) + assertThatThrownBy(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.mov")) .isInstanceOf(ExternalException.class); } } From 6083ca8dfc24845d771e7ce3c768f924ba1007cc Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 01:40:31 +0900 Subject: [PATCH 43/55] [fix] build error (#56) --- .../server/record/controller/RecordApi.java | 20 +- .../record/controller/RecordController.java | 8 +- test.trace.db | 381 ++++++++++++++++++ 3 files changed, 398 insertions(+), 11 deletions(-) create mode 100644 test.trace.db diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 3f5b85cf..13efa069 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -14,6 +14,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -78,8 +79,9 @@ public interface RecordApi { ) public ResponseEntity createRecord( @UserId Long uploaderId, - @RequestPart RecordCreateRequest recordCreateRequest, - @RequestPart File file + @RequestPart RecordCreateRequest request, + @RequestPart MultipartFile thumbnail, + @RequestPart MultipartFile video ) ; @Operation( @@ -165,9 +167,9 @@ public ResponseEntity deleteRecord( } ) public ResponseEntity> getRecentRecordsByUser( - @UserId long userId, - @RequestParam long cursorId, - @RequestParam int size + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ); @Operation( @@ -202,8 +204,8 @@ public ResponseEntity> getRecentRecordsByUser( } ) public ResponseEntity watch( - @UserId long userId, - @RequestParam long recordId + @UserId Long userId, + @PathVariable Long recordId ); @Operation( @@ -246,7 +248,7 @@ public ResponseEntity> getFamousRecords( @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize - ); + ) ; @Operation( summary = "최근 레코드 조회 API", @@ -286,7 +288,7 @@ public ResponseEntity> getFamousRecords( ) public ResponseEntity> getRecentRecords( @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index 6cd191f7..bf2c92ac 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -56,11 +56,12 @@ public ResponseEntity deleteRecord( .build(); } + @Override @GetMapping("/recent") public ResponseEntity> getRecentRecordInfoWithBookmarks( @UserId Long userId, @RequestParam(required = false) List keywords, - @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecords(keywords, cursorId, size); @@ -69,6 +70,7 @@ public ResponseEntity> getRecentRecordInfoWithBook return ResponseEntity.ok().body(RecordInfoWithBookmark.of(records, bookmarks)); } + @Override @GetMapping("/famous") public ResponseEntity> getFamousRecordInfoWithBookmarks( @UserId Long userId, @@ -84,10 +86,11 @@ public ResponseEntity> getFamousRecordInfoWithBook .body(RecordInfoWithBookmark.of(records, bookmarks)); } + @Override @PostMapping("/{recordId}") public ResponseEntity watch( @UserId Long userId, - @PathVariable long recordId + @PathVariable Long recordId ) { recordService.watch(userId, recordId); return ResponseEntity @@ -95,6 +98,7 @@ public ResponseEntity watch( .build(); } + @Override @GetMapping public ResponseEntity> getRecentRecordInfoWithBookmarksByUser( @UserId Long userId, diff --git a/test.trace.db b/test.trace.db new file mode 100644 index 00000000..6bcbfcd2 --- /dev/null +++ b/test.trace.db @@ -0,0 +1,381 @@ +2024-07-15 00:49:49.858631+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 54 more +2024-07-15 00:49:51.822247+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) + at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) + at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 61 more +2024-07-15 00:50:07.445935+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 54 more +2024-07-15 00:50:09.424386+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) + at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) + at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 61 more +2024-07-15 00:50:45.292724+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 54 more +2024-07-15 00:50:47.312967+09:00 database: wrong user or password; user: "SA" +org.h2.message.DbException: Wrong user name or password [28000-224] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.message.DbException.get(DbException.java:188) + at org.h2.engine.Engine.openSession(Engine.java:154) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) + at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) + at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) + at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) + at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1421) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) + at org.recordy.server.ServerApplication.main(ServerApplication.java:11) +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 61 more From 3340b1fa342b440e48c255b3af8d5ce61554b3b0 Mon Sep 17 00:00:00 2001 From: sebbbin Date: Mon, 15 Jul 2024 01:41:03 +0900 Subject: [PATCH 44/55] [del] test.trace.db (#56) --- test.trace.db | 381 -------------------------------------------------- 1 file changed, 381 deletions(-) delete mode 100644 test.trace.db diff --git a/test.trace.db b/test.trace.db deleted file mode 100644 index 6bcbfcd2..00000000 --- a/test.trace.db +++ /dev/null @@ -1,381 +0,0 @@ -2024-07-15 00:49:49.858631+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) - at org.hibernate.boot.model.relational.Database.(Database.java:45) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 54 more -2024-07-15 00:49:51.822247+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) - at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) - at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1421) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 61 more -2024-07-15 00:50:07.445935+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) - at org.hibernate.boot.model.relational.Database.(Database.java:45) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 54 more -2024-07-15 00:50:09.424386+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) - at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) - at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1421) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 61 more -2024-07-15 00:50:45.292724+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) - at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) - at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) - at org.hibernate.boot.model.relational.Database.(Database.java:45) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) - at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) - at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 54 more -2024-07-15 00:50:47.312967+09:00 database: wrong user or password; user: "SA" -org.h2.message.DbException: Wrong user name or password [28000-224] - at org.h2.message.DbException.get(DbException.java:223) - at org.h2.message.DbException.get(DbException.java:199) - at org.h2.message.DbException.get(DbException.java:188) - at org.h2.engine.Engine.openSession(Engine.java:154) - at org.h2.engine.Engine.openSession(Engine.java:222) - at org.h2.engine.Engine.createSession(Engine.java:201) - at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) - at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) - at org.h2.Driver.connect(Driver.java:59) - at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) - at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) - at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) - at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) - at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) - at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) - at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) - at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) - at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:437) - at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.getIsolatedConnection(GenerationTargetToDatabase.java:60) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.jdbcStatement(GenerationTargetToDatabase.java:112) - at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:79) - at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) - at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropTables(SchemaDropperImpl.java:381) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropConstraintsTablesSequences(SchemaDropperImpl.java:253) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:215) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:185) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:155) - at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:115) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:238) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) - at java.base/java.util.HashMap.forEach(HashMap.java:1421) - at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) - at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) - at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) - at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) - at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) - at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) - at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) - at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) - at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1835) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) - at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) - at org.recordy.server.ServerApplication.main(ServerApplication.java:11) -Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-224] - at org.h2.message.DbException.getJdbcSQLException(DbException.java:522) - at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) - ... 61 more From 62707d05b112df28caa628037e769e32af7e834d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EC=84=B8=EB=B9=88?= <94737768+sebbbin@users.noreply.github.com> Date: Mon, 15 Jul 2024 01:23:32 +0900 Subject: [PATCH 45/55] [fix] @Override --- .../org/recordy/server/record/controller/RecordController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index bf2c92ac..b2033f6e 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -44,6 +44,7 @@ public ResponseEntity createRecord( .body(record); } + @Override @DeleteMapping("/{recordId}") public ResponseEntity deleteRecord( @UserId Long uploaderId, From ea266bf9976641a80c927199b0c2bacd05eff34b Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 07:18:48 +0900 Subject: [PATCH 46/55] =?UTF-8?q?[feat]=20=EC=A0=84=EC=B2=B4=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EB=8F=99=EC=98=81=EC=83=81=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=20=EA=B5=AC=ED=98=84=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 98 +++++++++++++++++-- .../record/controller/RecordController.java | 19 +++- .../dto/response/RecordInfoWithBookmark.java | 13 +++ .../record/repository/RecordRepository.java | 2 + .../impl/RecordQueryDslRepository.java | 9 ++ .../repository/impl/RecordRepositoryImpl.java | 10 ++ .../server/record/service/RecordService.java | 1 + .../service/impl/RecordServiceImpl.java | 31 +++++- .../service/RecordStatService.java | 1 + .../service/impl/RecordStatServiceImpl.java | 7 ++ .../mock/record/FakeRecordRepository.java | 5 + 11 files changed, 187 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 13efa069..bd22a89b 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -8,6 +8,7 @@ import org.recordy.server.auth.security.UserId; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.springframework.data.domain.Slice; @@ -166,9 +167,9 @@ public ResponseEntity deleteRecord( ) } ) - public ResponseEntity> getRecentRecordsByUser( + public ResponseEntity> getRecentRecordInfosWithBookmarksByUser( @UserId Long userId, - @RequestParam(required = false, defaultValue = "0") Long cursorId, + @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); @@ -209,7 +210,7 @@ public ResponseEntity watch( ); @Operation( - summary = "인기 레코드 조회 API", + summary = "인기 레코드 리스트 조회 API", description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", responses = { @ApiResponse( @@ -244,14 +245,15 @@ public ResponseEntity watch( ) } ) - public ResponseEntity> getFamousRecords( + public ResponseEntity> getFamousRecordInfoWithBookmarks( + @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize ) ; @Operation( - summary = "최근 레코드 조회 API", + summary = "최근 레코드 리스트 조회 API", description = "사용자가 최근 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 최근 레코드를 조회합니다.", responses = { @ApiResponse( @@ -286,9 +288,93 @@ public ResponseEntity> getFamousRecords( ) } ) - public ResponseEntity> getRecentRecords( + public ResponseEntity> getRecentRecordInfoWithBookmarks( + @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); + + @Operation( + summary = "구독 레코드 리스트 조회 API", + description = "구독 중인 유저의 레코드 리스트를 최신순으로 반환합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getSubscribingRecordInfosWithBookmarks( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size + ); + + @Operation( + summary = "전체 레코드 조회 API", + description = "전체 레코드 중 정해진 크기만큼 랜덤으로 만든 레코드 리스트를 반환합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getTotalRecordInfosWithBookmarks( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "10") int size + ); } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index b2033f6e..a8121a8e 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -100,8 +100,8 @@ public ResponseEntity watch( } @Override - @GetMapping - public ResponseEntity> getRecentRecordInfoWithBookmarksByUser( + @GetMapping("/user") + public ResponseEntity> getRecentRecordInfosWithBookmarksByUser( @UserId Long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size @@ -114,6 +114,7 @@ public ResponseEntity> getRecentRecordInfoWithBook .body(RecordInfoWithBookmark.of(records, bookmarks)); } + @Override @GetMapping("/follow") public ResponseEntity> getSubscribingRecordInfosWithBookmarks( @UserId Long userId, @@ -127,5 +128,19 @@ public ResponseEntity> getSubscribingRecordInfosWi .ok() .body(RecordInfoWithBookmark.of(records, bookmarks)); } + + @Override + @GetMapping + public ResponseEntity> getTotalRecordInfosWithBookmarks( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "10") int size + ){ + List records = recordService.getTotalRecords(size); + List bookmarks = recordStatService.findBookmarks(userId, records); + + return ResponseEntity + .ok() + .body(RecordInfoWithBookmark.of(records, bookmarks)); + } } diff --git a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java index 06ad36de..154659c6 100644 --- a/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java +++ b/src/main/java/org/recordy/server/record/controller/dto/response/RecordInfoWithBookmark.java @@ -1,6 +1,7 @@ package org.recordy.server.record.controller.dto.response; import java.util.List; +import java.util.stream.Collectors; import org.recordy.server.record.domain.Record; import org.springframework.data.domain.Slice; @@ -16,4 +17,16 @@ public static Slice of (Slice records, List of (List records, List bookmarks) { + return records.stream() + .map(record -> { + int index = records.indexOf(record); + Boolean isBookmarked = bookmarks.get(index); + RecordInfo recordInfo = RecordInfo.from(record); + return new RecordInfoWithBookmark(recordInfo, isBookmarked); + }) + .collect(Collectors.toCollection(java.util.ArrayList::new)); + } + } diff --git a/src/main/java/org/recordy/server/record/repository/RecordRepository.java b/src/main/java/org/recordy/server/record/repository/RecordRepository.java index 1b16b202..76725cff 100644 --- a/src/main/java/org/recordy/server/record/repository/RecordRepository.java +++ b/src/main/java/org/recordy/server/record/repository/RecordRepository.java @@ -24,4 +24,6 @@ public interface RecordRepository { Slice findAllByUserIdOrderByIdDesc(long userId, long cursor, Pageable pageable); Map countAllByUserIdGroupByKeyword(long userId); Slice findAllBySubscribingUserIdOrderByIdDesc(long userId, long cursor, Pageable pageable); + Optional findMaxId(); + Long count(); } diff --git a/src/main/java/org/recordy/server/record/repository/impl/RecordQueryDslRepository.java b/src/main/java/org/recordy/server/record/repository/impl/RecordQueryDslRepository.java index 6ce9431b..f35bbd29 100644 --- a/src/main/java/org/recordy/server/record/repository/impl/RecordQueryDslRepository.java +++ b/src/main/java/org/recordy/server/record/repository/impl/RecordQueryDslRepository.java @@ -194,4 +194,13 @@ public Slice findAllBySubscribingUserIdOrderByIdDesc(long userId, return new SliceImpl<>(recordEntities, pageable, QueryDslUtils.hasNext(pageable, recordEntities)); } + + public Optional findMaxId() { + return Optional.ofNullable(jpaQueryFactory + .select(recordEntity.id.max()) + .from(recordEntity) + .fetchOne() + ); + } + } diff --git a/src/main/java/org/recordy/server/record/repository/impl/RecordRepositoryImpl.java b/src/main/java/org/recordy/server/record/repository/impl/RecordRepositoryImpl.java index fceddf97..e28f9d12 100644 --- a/src/main/java/org/recordy/server/record/repository/impl/RecordRepositoryImpl.java +++ b/src/main/java/org/recordy/server/record/repository/impl/RecordRepositoryImpl.java @@ -115,4 +115,14 @@ public Slice findAllBySubscribingUserIdOrderByIdDesc(long userId, long c return recordQueryDslRepository.findAllBySubscribingUserIdOrderByIdDesc(userId, cursor, pageable) .map(RecordEntity::toDomain); } + + @Override + public Optional findMaxId() { + return recordQueryDslRepository.findMaxId(); + } + + @Override + public Long count() { + return recordJpaRepository.count(); + } } diff --git a/src/main/java/org/recordy/server/record/service/RecordService.java b/src/main/java/org/recordy/server/record/service/RecordService.java index 3712e304..61d18efb 100644 --- a/src/main/java/org/recordy/server/record/service/RecordService.java +++ b/src/main/java/org/recordy/server/record/service/RecordService.java @@ -20,4 +20,5 @@ public interface RecordService { Slice getRecentRecordsByUser(long userId, long cursorId, int size); Slice getRecentRecords(List keywords, Long cursorId, int size); Slice getSubscribingRecords(long userId, long cursorId, int size); + List getTotalRecords(int size); } diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index a9cd0d43..6244b4e3 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -1,12 +1,17 @@ package org.recordy.server.record.service.impl; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Optional; +import java.util.Random; +import java.util.Set; import lombok.RequiredArgsConstructor; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.keyword.domain.Keyword; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.recordy.server.record.domain.usecase.RecordCreate; -import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.exception.RecordException; import org.recordy.server.record.repository.RecordRepository; import org.recordy.server.record.service.FileService; @@ -115,4 +120,28 @@ private Slice getRecentRecordsWithKeywords(List keywords, long public Slice getSubscribingRecords(long userId, long cursorId, int size) { return recordRepository.findAllBySubscribingUserIdOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)); } + + @Override + public List getTotalRecords(int size) { + Optional maxId = recordRepository.findMaxId(); + Long count = recordRepository.count(); + + Set selectedIds = new HashSet<>(); + Random random = new Random(); + List records = new ArrayList<>(); + + while (records.size() < size && records.size() < count) { + long randomId = random.nextInt(maxId.get().intValue()) + 1; + + if (!selectedIds.contains(randomId)) { + selectedIds.add(randomId); + + Optional findRecord = recordRepository.findById(randomId); + findRecord.ifPresent(records::add); + } + } + + return records; + } + } diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index 1501702c..5022e18a 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -17,4 +17,5 @@ public interface RecordStatService { Preference getPreference(long userId); Slice getBookmarkedRecords(long userId, long cursorId, int size); List findBookmarks(long userId, Slice records); + List findBookmarks(long userId, List records); } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index f125b56a..f397ebd5 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -64,4 +64,11 @@ public Slice getBookmarkedRecords(long userId, long cursorId, int size) return bookmarkRepository.findAllByBookmarksOrderByIdDesc(userId, cursorId, PageRequest.ofSize(size)) .map(Bookmark::getRecord); } + + @Override + public List findBookmarks(long userId, List records) { + return records.stream() + .map(record -> bookmarkRepository.existsByUserIdAndRecordId(userId, record.getId())) + .collect(Collectors.toList()); + } } diff --git a/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java b/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java index 63dfc933..20b26db3 100644 --- a/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java +++ b/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java @@ -106,4 +106,9 @@ public Map countAllByUserIdGroupByKeyword(long userId) { public Slice findAllBySubscribingUserIdOrderByIdDesc(long userId, long cursor, Pageable pageable) { return null; } + + @Override + public Optional findMaxId() { + return records.keySet().stream().max(Long::compareTo); + } } From 84c7e0e02c428cd3a268fc47f5dbbdf0f435a462 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 14:15:21 +0900 Subject: [PATCH 47/55] =?UTF-8?q?[chore]=20BookmarkRepository=EC=9D=98find?= =?UTF-8?q?Bookmarks=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record_stat/repository/BookmarkRepository.java | 1 - .../repository/impl/BookmarkRepositoryImpl.java | 7 ------- .../server/mock/bookmark/FakeBookmarkRepository.java | 7 ------- 3 files changed, 15 deletions(-) diff --git a/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java b/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java index 441f9029..98c50053 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java +++ b/src/main/java/org/recordy/server/record_stat/repository/BookmarkRepository.java @@ -15,5 +15,4 @@ public interface BookmarkRepository { // query Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, Pageable pageable); boolean existsByUserIdAndRecordId(Long userId, Long recordId); - List findBookmarks(long userId, Slice records); } diff --git a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java index 1c4209b1..2cc89ba0 100644 --- a/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java +++ b/src/main/java/org/recordy/server/record_stat/repository/impl/BookmarkRepositoryImpl.java @@ -41,11 +41,4 @@ public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, public boolean existsByUserIdAndRecordId(Long userId, Long recordId) { return bookmarkJpaRepository.existsByUserIdAndRecordId(userId, recordId); } - - @Override - public List findBookmarks(long userId, Slice records) { - return records.getContent().stream() - .map(record -> bookmarkJpaRepository.existsByUserIdAndRecordId(userId, record.getId())) - .collect(Collectors.toList()); - } } diff --git a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java index d5f7a145..8e7700a8 100644 --- a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java +++ b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java @@ -50,11 +50,4 @@ public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, return new SliceImpl<>(content.subList(0, pageable.getPageSize()), pageable, true); } - - @Override - public Optional findByUserIdAndRecordId(long userId, long recordId) { - return bookmarks.values().stream() - .filter(bookmark -> bookmark.getUser().getId() == userId && bookmark.getRecord().getId() == recordId) - .findFirst(); - } } From dbb5a6a0905d0182fb48f2ca4cd5341adeb4646b Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 15:02:04 +0900 Subject: [PATCH 48/55] =?UTF-8?q?[fix]=20merge=20=ED=9B=84=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=20=ED=95=B4=EA=B2=B0=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordApi.java | 59 ++++++++++++++++--- .../record/controller/RecordController.java | 5 +- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordApi.java b/src/main/java/org/recordy/server/record/controller/RecordApi.java index 11806875..55069236 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordApi.java +++ b/src/main/java/org/recordy/server/record/controller/RecordApi.java @@ -8,6 +8,7 @@ import org.recordy.server.auth.security.UserId; import org.recordy.server.common.message.ErrorMessage; import org.recordy.server.record.controller.dto.request.RecordCreateRequest; +import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.File; import org.recordy.server.record.domain.Record; import org.springframework.data.domain.Slice; @@ -166,9 +167,9 @@ public ResponseEntity deleteRecord( ) } ) - public ResponseEntity> getRecentRecordsByUser( + public ResponseEntity> getRecentRecordInfosWithBookmarksByUser( @UserId Long userId, - @RequestParam(required = false, defaultValue = "0") Long cursorId, + @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); @@ -209,7 +210,7 @@ public ResponseEntity watch( ); @Operation( - summary = "인기 레코드 조회 API", + summary = "인기 레코드 리스트 조회 API", description = "사용자가 인기 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 인기 레코드를 조회합니다.", responses = { @ApiResponse( @@ -244,14 +245,15 @@ public ResponseEntity watch( ) } ) - public ResponseEntity> getFamousRecords( + public ResponseEntity> getFamousRecordInfoWithBookmarks( + @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "10") int pageSize - ); + ) ; @Operation( - summary = "최근 레코드 조회 API", + summary = "최근 레코드 리스트 조회 API", description = "사용자가 최근 레코드를 키워드와 함께 조회합니다. 키워드가 없으면 전체 최근 레코드를 조회합니다.", responses = { @ApiResponse( @@ -286,9 +288,52 @@ public ResponseEntity> getFamousRecords( ) } ) - public ResponseEntity> getRecentRecords( + public ResponseEntity> getRecentRecordInfosWithBookmarks( + @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") Long cursorId, @RequestParam(required = false, defaultValue = "10") int size ); + + @Operation( + summary = "구독 레코드 리스트 조회 API", + description = "구독 중인 유저의 레코드 리스트를 최신순으로 반환합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공적으로 처리되었습니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = Slice.class + ) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized - 인증이 필요합니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ), + @ApiResponse( + responseCode = "500", + description = "Internal Server Error - 서버 내부 오류입니다.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = ErrorMessage.class + ) + ) + ) + } + ) + public ResponseEntity> getSubscribingRecordInfosWithBookmarks( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size + ); } diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index e4dc8b90..48a6dbea 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -58,7 +58,7 @@ public ResponseEntity deleteRecord( @Override @GetMapping("/recent") - public ResponseEntity> getRecentRecordInfoWithBookmarks( + public ResponseEntity> getRecentRecordInfosWithBookmarks( @UserId Long userId, @RequestParam(required = false) List keywords, @RequestParam(required = false, defaultValue = "0") Long cursorId, @@ -100,7 +100,7 @@ public ResponseEntity watch( @Override @GetMapping - public ResponseEntity> getRecentRecordInfoWithBookmarksByUser( + public ResponseEntity> getRecentRecordInfosWithBookmarksByUser( @UserId Long userId, @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size @@ -113,6 +113,7 @@ public ResponseEntity> getRecentRecordInfoWithBook .body(RecordInfoWithBookmark.of(records, bookmarks)); } + @Override @GetMapping("/follow") public ResponseEntity> getSubscribingRecordInfosWithBookmarks( @UserId Long userId, From fc940b0e09070415ce39c87d7a782ab34e3c12f9 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 16:19:00 +0900 Subject: [PATCH 49/55] =?UTF-8?q?[chore]=20=ED=95=84=EC=9A=94=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=B6=9C=EB=A0=A5=20=EC=A0=9C=EA=B1=B0=20(#65)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recordy/server/subscribe/controller/SubscribeController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java b/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java index 948fe1fc..4d66beec 100644 --- a/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java +++ b/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java @@ -56,7 +56,6 @@ public ResponseEntity> getSubscribedUserInfos( @RequestParam(required = false, defaultValue = "0") long cursorId, @RequestParam(required = false, defaultValue = "10") int size ) { - System.out.println(subscribeService.getSubscribedUsers(userId, cursorId, size)); return ResponseEntity .status(HttpStatus.OK) From 902c4de4b62bca7e29546d6d4b80dd0a5a58a5d1 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 16:51:21 +0900 Subject: [PATCH 50/55] =?UTF-8?q?[refactor]=20UserAuthController=EC=99=80?= =?UTF-8?q?=20UserController=20(#65)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subscribe/controller/SubscribeApi.java | 98 ----------- .../controller/SubscribeController.java | 79 --------- .../server/user/controller/UserApi.java | 130 ++++---------- .../server/user/controller/UserAuthApi.java | 162 ++++++++++++++++++ .../user/controller/UserAuthController.java | 98 +++++++++++ .../user/controller/UserController.java | 103 +++++------ .../dto/response/UserInfoWithFollowing.java | 3 +- .../recordy/server/mock/FakeContainer.java | 6 +- ...=> UserAuthControllerIntegrationTest.java} | 2 +- ...rTest.java => UserAuthControllerTest.java} | 27 ++- 10 files changed, 353 insertions(+), 355 deletions(-) delete mode 100644 src/main/java/org/recordy/server/subscribe/controller/SubscribeApi.java delete mode 100644 src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java create mode 100644 src/main/java/org/recordy/server/user/controller/UserAuthApi.java create mode 100644 src/main/java/org/recordy/server/user/controller/UserAuthController.java rename src/main/java/org/recordy/server/{subscribe => user}/controller/dto/response/UserInfoWithFollowing.java (82%) rename src/test/java/org/recordy/server/user/controller/{UserControllerIntegrationTest.java => UserAuthControllerIntegrationTest.java} (95%) rename src/test/java/org/recordy/server/user/controller/{UserControllerTest.java => UserAuthControllerTest.java} (82%) diff --git a/src/main/java/org/recordy/server/subscribe/controller/SubscribeApi.java b/src/main/java/org/recordy/server/subscribe/controller/SubscribeApi.java deleted file mode 100644 index 1b90fde7..00000000 --- a/src/main/java/org/recordy/server/subscribe/controller/SubscribeApi.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.recordy.server.subscribe.controller; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.recordy.server.auth.security.UserId; -import org.recordy.server.record_stat.domain.usecase.Preference; -import org.recordy.server.subscribe.controller.dto.response.UserInfoWithFollowing; -import org.recordy.server.user.controller.dto.response.UserInfo; -import org.springframework.data.domain.Slice; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; - -@Tag(name = "구독 관련 API") -public interface SubscribeApi { - @Operation( - summary = "팔로우 API", - description = "특정 유저를 팔로우하는 API입니다. ", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공" - ) - } - ) - public ResponseEntity subscribe( - @UserId Long userId, - @PathVariable Long subscribedUserId - ); - - @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "팔로우 취소 API", - description = "특정 유저에 대한 팔로우을 취소하는 API입니다.", - responses = { - @ApiResponse( - responseCode = "204", - description = "요청이 성공했습니다." - ) - } - ) - public ResponseEntity unsubscribe( - @UserId Long userId, - @PathVariable Long subscribedUserId - ); - - @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "팔로잉 리스트 조회 API", - description = "사용자가 팔로우하고 있는 사람 리스트를 조회하는 API입니다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = Preference.class - ) - ) - ) - } - ) - public ResponseEntity> getSubscribedUserInfos( - @UserId Long userId, - @RequestParam(required = false, defaultValue = "0L") long cursorId, - @RequestParam(required = false, defaultValue = "10") int size - ); - - @Operation( - security = @SecurityRequirement(name = "Authorization"), - summary = "팔로우 리스트 조회 API", - description = "사용자를 팔로우하고 있는 사람 리스트를 조회하는 API입니다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = Preference.class - ) - ) - ) - } - ) - public ResponseEntity> getSubscribingUserInfos( - @UserId Long userId, - @RequestParam(required = false, defaultValue = "0L") long cursorId, - @RequestParam(required = false, defaultValue = "10") int size - ); - -} diff --git a/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java b/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java deleted file mode 100644 index 4d66beec..00000000 --- a/src/main/java/org/recordy/server/subscribe/controller/SubscribeController.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.recordy.server.subscribe.controller; - -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.recordy.server.auth.security.UserId; -import org.recordy.server.subscribe.controller.dto.response.UserInfoWithFollowing; -import org.recordy.server.subscribe.domain.usecase.SubscribeCreate; -import org.recordy.server.subscribe.service.SubscribeService; -import org.recordy.server.user.domain.User; -import org.recordy.server.user.controller.dto.response.UserInfo; -import org.springframework.data.domain.Slice; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RequiredArgsConstructor -@RequestMapping("/api/v1/users") -@RestController -public class SubscribeController implements SubscribeApi{ - private final SubscribeService subscribeService; - - @Override - @PostMapping("/follow/{followingId}") - public ResponseEntity subscribe( - @UserId Long userId, - @PathVariable Long followingId - ) { - subscribeService.subscribe(new SubscribeCreate(userId, followingId)); - return ResponseEntity - .status(HttpStatus.OK) - .build(); - } - - @Override - @DeleteMapping("/unfollow/{followingId}") - public ResponseEntity unsubscribe( - @UserId Long userId, - @PathVariable Long followingId - ) { - subscribeService.unsubscribe(userId, followingId); - return ResponseEntity - .status(HttpStatus.NO_CONTENT) - .build(); - } - - @Override - @GetMapping("/following") - public ResponseEntity> getSubscribedUserInfos( - @UserId Long userId, - @RequestParam(required = false, defaultValue = "0") long cursorId, - @RequestParam(required = false, defaultValue = "10") int size - ) { - - return ResponseEntity - .status(HttpStatus.OK) - .body(UserInfo.of(subscribeService.getSubscribedUsers(userId, cursorId, size))); - } - - @Override - @GetMapping("/follower") - public ResponseEntity> getSubscribingUserInfos( - @UserId Long userId, - @RequestParam(required = false, defaultValue = "0") long cursorId, - @RequestParam(required = false, defaultValue = "10") int size - ) { - Slice users = subscribeService.getSubscribingUsers(userId, cursorId, size); - List following = subscribeService.findSubscribes(userId, users); - - return ResponseEntity - .status(HttpStatus.OK) - .body(UserInfoWithFollowing.of(users, following)); - } -} diff --git a/src/main/java/org/recordy/server/user/controller/UserApi.java b/src/main/java/org/recordy/server/user/controller/UserApi.java index c5cf14c6..3f1a6ca9 100644 --- a/src/main/java/org/recordy/server/user/controller/UserApi.java +++ b/src/main/java/org/recordy/server/user/controller/UserApi.java @@ -7,90 +7,52 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.recordy.server.auth.security.UserId; -import org.recordy.server.user.controller.dto.request.UserSignInRequest; -import org.recordy.server.user.controller.dto.request.UserSignUpRequest; -import org.recordy.server.user.controller.dto.response.UserSignInResponse; -import org.recordy.server.user.controller.dto.response.UserReissueTokenResponse; -import org.springframework.http.HttpHeaders; +import org.recordy.server.record_stat.domain.usecase.Preference; +import org.recordy.server.user.controller.dto.response.UserInfoWithFollowing; +import org.recordy.server.user.controller.dto.response.UserInfo; +import org.springframework.data.domain.Slice; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; -@Tag(name = "유저 관련 API") +@Tag(name = "구독 관련 API") public interface UserApi { - @Operation( - summary = "유저 회원 가입 API", - description = "유저가 회원 가입하는 API입니다. ", + summary = "팔로우 API", + description = "특정 유저를 팔로우하는 API입니다. ", responses = { @ApiResponse( responseCode = "200", - description = "성공", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = UserSignInResponse.class - ) - ) + description = "성공" ) } ) - public ResponseEntity signIn( - @RequestHeader(HttpHeaders.AUTHORIZATION) String platformToken, - @RequestBody UserSignInRequest request + public ResponseEntity subscribe( + @UserId Long userId, + @PathVariable Long subscribedUserId ); @Operation( security = @SecurityRequirement(name = "Authorization"), - summary = "로그아웃 API", - description = "access token을 바탕으로 로그아웃을 진행하는 API입니다.", + summary = "팔로우 취소 API", + description = "특정 유저에 대한 팔로우을 취소하는 API입니다.", responses = { @ApiResponse( - responseCode = "200", + responseCode = "204", description = "요청이 성공했습니다." - ), - @ApiResponse( - responseCode = "404", - description = "존재하지 않는 회원입니다.", - content = @Content - ), - @ApiResponse( - responseCode = "404", - description = "인증 정보를 찾을 수 없습니다.", - content = @Content ) } ) - public ResponseEntity signOut( - @UserId Long userId + public ResponseEntity unsubscribe( + @UserId Long userId, + @PathVariable Long subscribedUserId ); @Operation( security = @SecurityRequirement(name = "Authorization"), - summary = "유저 닉네임 중복체크 API", - description = "유저가 회원 가입할 때 닉네임을 중복체크해주는 API입니다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = void.class - ) - ) - ) - } - ) - public ResponseEntity checkDuplicateNickname( - @RequestParam String nickname - ); - - @Operation( - summary = "유저 회원 탈퇴 API", - description = "유저가 회원 탈퇴하는 API입니다.", + summary = "팔로잉 리스트 조회 API", + description = "사용자가 팔로우하고 있는 사람 리스트를 조회하는 API입니다.", responses = { @ApiResponse( responseCode = "200", @@ -98,20 +60,22 @@ public ResponseEntity checkDuplicateNickname( content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = void.class + implementation = Preference.class ) ) ) } ) - public ResponseEntity delete( - @UserId Long userId + public ResponseEntity> getSubscribedUserInfos( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0L") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ); @Operation( security = @SecurityRequirement(name = "Authorization"), - summary = "access token 재발급 API", - description = "refresh token을 바탕으로 access token을 재발급 받는 API입니다.", + summary = "팔로우 리스트 조회 API", + description = "사용자를 팔로우하고 있는 사람 리스트를 조회하는 API입니다.", responses = { @ApiResponse( responseCode = "200", @@ -119,44 +83,16 @@ public ResponseEntity delete( content = @Content( mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema( - implementation = UserReissueTokenResponse.class + implementation = Preference.class ) ) - ), - @ApiResponse( - responseCode = "404", - description = "존재하지 않는 회원입니다.", - content = @Content - ), - @ApiResponse( - responseCode = "404", - description = "인증 정보를 찾을 수 없습니다.", - content = @Content ) } ) - public ResponseEntity reissueToken( - @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken - ); - - @Operation( - summary = "유저 회원 등록 API", - description = "유저 회원 등록하는 API입니다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content( - mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema( - implementation = void.class - ) - ) - ) - } - ) - public ResponseEntity signUp( + public ResponseEntity> getSubscribingUserInfos( @UserId Long userId, - @RequestBody UserSignUpRequest request + @RequestParam(required = false, defaultValue = "0L") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ); -} \ No newline at end of file + +} diff --git a/src/main/java/org/recordy/server/user/controller/UserAuthApi.java b/src/main/java/org/recordy/server/user/controller/UserAuthApi.java new file mode 100644 index 00000000..a1451057 --- /dev/null +++ b/src/main/java/org/recordy/server/user/controller/UserAuthApi.java @@ -0,0 +1,162 @@ +package org.recordy.server.user.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.recordy.server.auth.security.UserId; +import org.recordy.server.user.controller.dto.request.UserSignInRequest; +import org.recordy.server.user.controller.dto.request.UserSignUpRequest; +import org.recordy.server.user.controller.dto.response.UserSignInResponse; +import org.recordy.server.user.controller.dto.response.UserReissueTokenResponse; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +@Tag(name = "유저 관련 API") +public interface UserAuthApi { + + @Operation( + summary = "유저 회원 가입 API", + description = "유저가 회원 가입하는 API입니다. ", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = UserSignInResponse.class + ) + ) + ) + } + ) + public ResponseEntity signIn( + @RequestHeader(HttpHeaders.AUTHORIZATION) String platformToken, + @RequestBody UserSignInRequest request + ); + + @Operation( + security = @SecurityRequirement(name = "Authorization"), + summary = "로그아웃 API", + description = "access token을 바탕으로 로그아웃을 진행하는 API입니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "요청이 성공했습니다." + ), + @ApiResponse( + responseCode = "404", + description = "존재하지 않는 회원입니다.", + content = @Content + ), + @ApiResponse( + responseCode = "404", + description = "인증 정보를 찾을 수 없습니다.", + content = @Content + ) + } + ) + public ResponseEntity signOut( + @UserId Long userId + ); + + @Operation( + security = @SecurityRequirement(name = "Authorization"), + summary = "유저 닉네임 중복체크 API", + description = "유저가 회원 가입할 때 닉네임을 중복체크해주는 API입니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = void.class + ) + ) + ) + } + ) + public ResponseEntity checkDuplicateNickname( + @RequestParam String nickname + ); + + @Operation( + summary = "유저 회원 탈퇴 API", + description = "유저가 회원 탈퇴하는 API입니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = void.class + ) + ) + ) + } + ) + public ResponseEntity delete( + @UserId Long userId + ); + + @Operation( + security = @SecurityRequirement(name = "Authorization"), + summary = "access token 재발급 API", + description = "refresh token을 바탕으로 access token을 재발급 받는 API입니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = UserReissueTokenResponse.class + ) + ) + ), + @ApiResponse( + responseCode = "404", + description = "존재하지 않는 회원입니다.", + content = @Content + ), + @ApiResponse( + responseCode = "404", + description = "인증 정보를 찾을 수 없습니다.", + content = @Content + ) + } + ) + public ResponseEntity reissueToken( + @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken + ); + + @Operation( + summary = "유저 회원 등록 API", + description = "유저 회원 등록하는 API입니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = @Schema( + implementation = void.class + ) + ) + ) + } + ) + public ResponseEntity signUp( + @UserId Long userId, + @RequestBody UserSignUpRequest request + ); +} \ No newline at end of file diff --git a/src/main/java/org/recordy/server/user/controller/UserAuthController.java b/src/main/java/org/recordy/server/user/controller/UserAuthController.java new file mode 100644 index 00000000..fad193d4 --- /dev/null +++ b/src/main/java/org/recordy/server/user/controller/UserAuthController.java @@ -0,0 +1,98 @@ +package org.recordy.server.user.controller; + + +import lombok.RequiredArgsConstructor; +import org.recordy.server.auth.security.UserId; +import org.recordy.server.user.controller.dto.request.UserSignUpRequest; +import org.recordy.server.user.domain.usecase.UserSignIn; +import org.recordy.server.user.controller.dto.request.UserSignInRequest; +import org.recordy.server.user.controller.dto.response.UserReissueTokenResponse; +import org.recordy.server.user.controller.dto.response.UserSignInResponse; +import org.recordy.server.user.domain.usecase.UserSignUp; +import org.recordy.server.user.service.UserService; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RequiredArgsConstructor +@RequestMapping("/api/v1/users") +@RestController +public class UserAuthController implements UserAuthApi { + + private final UserService userService; + + @Override + @PostMapping("/signIn") + public ResponseEntity signIn( + @RequestHeader(HttpHeaders.AUTHORIZATION) String platformToken, + @RequestBody UserSignInRequest request + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body(UserSignInResponse.from( + userService.signIn(UserSignIn.of(platformToken, request.platformType())) + )); + } + + @Override + @PostMapping("/signUp") + public ResponseEntity signUp( + @UserId Long userId, + @RequestBody UserSignUpRequest request + ) { + userService.signUp(UserSignUp.of(userId, request.nickname(), request.termsAgreement())); + + return ResponseEntity. + status(HttpStatus.CREATED). + build(); + } + + @Override + @GetMapping("/check-nickname") + public ResponseEntity checkDuplicateNickname( + @RequestParam String nickname + ) { + userService.validateDuplicateNickname(nickname); + + return ResponseEntity + .status(HttpStatus.OK) + .build(); + } + + @Override + @PostMapping("/token") + public ResponseEntity reissueToken( + @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken + ) { + return ResponseEntity + .status(HttpStatus.OK) + .body(UserReissueTokenResponse.of( + userService.reissueToken(refreshToken) + )); + } + + @Override + @DeleteMapping("/logout") + public ResponseEntity signOut( + @UserId Long userId + ) { + userService.signOut(userId); + + return ResponseEntity + .noContent() + .build(); + } + + @Override + @DeleteMapping + public ResponseEntity delete( + @UserId Long userId + ) { + userService.delete(userId); + + return ResponseEntity + .noContent() + .build(); + } +} diff --git a/src/main/java/org/recordy/server/user/controller/UserController.java b/src/main/java/org/recordy/server/user/controller/UserController.java index c945bdd2..3252350d 100644 --- a/src/main/java/org/recordy/server/user/controller/UserController.java +++ b/src/main/java/org/recordy/server/user/controller/UserController.java @@ -1,98 +1,79 @@ package org.recordy.server.user.controller; - +import java.util.List; import lombok.RequiredArgsConstructor; import org.recordy.server.auth.security.UserId; -import org.recordy.server.user.controller.dto.request.UserSignUpRequest; -import org.recordy.server.user.domain.usecase.UserSignIn; -import org.recordy.server.user.controller.dto.request.UserSignInRequest; -import org.recordy.server.user.controller.dto.response.UserReissueTokenResponse; -import org.recordy.server.user.controller.dto.response.UserSignInResponse; -import org.recordy.server.user.domain.usecase.UserSignUp; -import org.recordy.server.user.service.UserService; -import org.springframework.http.HttpHeaders; +import org.recordy.server.user.controller.dto.response.UserInfoWithFollowing; +import org.recordy.server.subscribe.domain.usecase.SubscribeCreate; +import org.recordy.server.subscribe.service.SubscribeService; +import org.recordy.server.user.domain.User; +import org.recordy.server.user.controller.dto.response.UserInfo; +import org.springframework.data.domain.Slice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RequestMapping("/api/v1/users") @RestController public class UserController implements UserApi { - - private final UserService userService; - - @Override - @PostMapping("/signIn") - public ResponseEntity signIn( - @RequestHeader(HttpHeaders.AUTHORIZATION) String platformToken, - @RequestBody UserSignInRequest request - ) { - return ResponseEntity - .status(HttpStatus.OK) - .body(UserSignInResponse.from( - userService.signIn(UserSignIn.of(platformToken, request.platformType())) - )); - } + private final SubscribeService subscribeService; @Override - @PostMapping("/signUp") - public ResponseEntity signUp( + @PostMapping("/follow/{followingId}") + public ResponseEntity subscribe( @UserId Long userId, - @RequestBody UserSignUpRequest request + @PathVariable Long followingId ) { - userService.signUp(UserSignUp.of(userId, request.nickname(), request.termsAgreement())); - - return ResponseEntity. - status(HttpStatus.CREATED). - build(); - } - - @Override - @GetMapping("/check-nickname") - public ResponseEntity checkDuplicateNickname( - @RequestParam String nickname - ) { - userService.validateDuplicateNickname(nickname); - + subscribeService.subscribe(new SubscribeCreate(userId, followingId)); return ResponseEntity .status(HttpStatus.OK) .build(); } @Override - @PostMapping("/token") - public ResponseEntity reissueToken( - @RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken + @DeleteMapping("/unfollow/{followingId}") + public ResponseEntity unsubscribe( + @UserId Long userId, + @PathVariable Long followingId ) { + subscribeService.unsubscribe(userId, followingId); return ResponseEntity - .status(HttpStatus.OK) - .body(UserReissueTokenResponse.of( - userService.reissueToken(refreshToken) - )); + .status(HttpStatus.NO_CONTENT) + .build(); } @Override - @DeleteMapping("/logout") - public ResponseEntity signOut( - @UserId Long userId + @GetMapping("/following") + public ResponseEntity> getSubscribedUserInfos( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ) { - userService.signOut(userId); return ResponseEntity - .noContent() - .build(); + .status(HttpStatus.OK) + .body(UserInfo.of(subscribeService.getSubscribedUsers(userId, cursorId, size))); } @Override - @DeleteMapping - public ResponseEntity delete( - @UserId Long userId + @GetMapping("/follower") + public ResponseEntity> getSubscribingUserInfos( + @UserId Long userId, + @RequestParam(required = false, defaultValue = "0") long cursorId, + @RequestParam(required = false, defaultValue = "10") int size ) { - userService.delete(userId); + Slice users = subscribeService.getSubscribingUsers(userId, cursorId, size); + List following = subscribeService.findSubscribes(userId, users); return ResponseEntity - .noContent() - .build(); + .status(HttpStatus.OK) + .body(UserInfoWithFollowing.of(users, following)); } } diff --git a/src/main/java/org/recordy/server/subscribe/controller/dto/response/UserInfoWithFollowing.java b/src/main/java/org/recordy/server/user/controller/dto/response/UserInfoWithFollowing.java similarity index 82% rename from src/main/java/org/recordy/server/subscribe/controller/dto/response/UserInfoWithFollowing.java rename to src/main/java/org/recordy/server/user/controller/dto/response/UserInfoWithFollowing.java index 5df22a11..65561f49 100644 --- a/src/main/java/org/recordy/server/subscribe/controller/dto/response/UserInfoWithFollowing.java +++ b/src/main/java/org/recordy/server/user/controller/dto/response/UserInfoWithFollowing.java @@ -1,8 +1,7 @@ -package org.recordy.server.subscribe.controller.dto.response; +package org.recordy.server.user.controller.dto.response; import java.util.List; import org.recordy.server.user.domain.User; -import org.recordy.server.user.controller.dto.response.UserInfo; import org.springframework.data.domain.Slice; public record UserInfoWithFollowing( diff --git a/src/test/java/org/recordy/server/mock/FakeContainer.java b/src/test/java/org/recordy/server/mock/FakeContainer.java index cc471fbd..05bfb130 100644 --- a/src/test/java/org/recordy/server/mock/FakeContainer.java +++ b/src/test/java/org/recordy/server/mock/FakeContainer.java @@ -38,7 +38,7 @@ import org.recordy.server.subscribe.repository.SubscribeRepository; import org.recordy.server.subscribe.service.SubscribeService; import org.recordy.server.subscribe.service.impl.SubscribeServiceImpl; -import org.recordy.server.user.controller.UserController; +import org.recordy.server.user.controller.UserAuthController; import org.recordy.server.user.repository.UserRepository; import org.recordy.server.user.service.UserService; import org.recordy.server.user.service.impl.UserServiceImpl; @@ -84,7 +84,7 @@ public class FakeContainer { public final TokenAuthenticationFilter tokenAuthenticationFilter; // controller - public final UserController userController; + public final UserAuthController userAuthController; public FakeContainer() { this.userRepository = new FakeUserRepository(); @@ -134,6 +134,6 @@ public FakeContainer() { authFilterExceptionHandler ); - this.userController = new UserController(userService); + this.userAuthController = new UserAuthController(userService); } } diff --git a/src/test/java/org/recordy/server/user/controller/UserControllerIntegrationTest.java b/src/test/java/org/recordy/server/user/controller/UserAuthControllerIntegrationTest.java similarity index 95% rename from src/test/java/org/recordy/server/user/controller/UserControllerIntegrationTest.java rename to src/test/java/org/recordy/server/user/controller/UserAuthControllerIntegrationTest.java index 0e04e88e..f0edd33d 100644 --- a/src/test/java/org/recordy/server/user/controller/UserControllerIntegrationTest.java +++ b/src/test/java/org/recordy/server/user/controller/UserAuthControllerIntegrationTest.java @@ -15,7 +15,7 @@ @Sql(value = "/sql/clean-database.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) }) @AutoConfigureMockMvc -class UserControllerIntegrationTest { +class UserAuthControllerIntegrationTest { @Autowired private MockMvc mockMvc; diff --git a/src/test/java/org/recordy/server/user/controller/UserControllerTest.java b/src/test/java/org/recordy/server/user/controller/UserAuthControllerTest.java similarity index 82% rename from src/test/java/org/recordy/server/user/controller/UserControllerTest.java rename to src/test/java/org/recordy/server/user/controller/UserAuthControllerTest.java index 4c2ab974..edea091b 100644 --- a/src/test/java/org/recordy/server/user/controller/UserControllerTest.java +++ b/src/test/java/org/recordy/server/user/controller/UserAuthControllerTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.recordy.server.auth.domain.Auth; -import org.recordy.server.auth.domain.AuthEntity; import org.recordy.server.auth.domain.AuthPlatform; import org.recordy.server.auth.exception.AuthException; import org.recordy.server.mock.FakeContainer; @@ -22,17 +21,17 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; -public class UserControllerTest { +public class UserAuthControllerTest { private FakeContainer fakeContainer; - private UserController userController; + private UserAuthController userAuthController; private UserService userService; private UserRepository userRepository; @BeforeEach void init() { fakeContainer = new FakeContainer(); - userController = fakeContainer.userController; + userAuthController = fakeContainer.userAuthController; userService = fakeContainer.userService; userRepository = fakeContainer.userRepository; } @@ -44,7 +43,7 @@ void init() { UserSignInRequest request = new UserSignInRequest(AuthPlatform.Type.KAKAO); // when - ResponseEntity result = userController.signIn(platformToken, request); + ResponseEntity result = userAuthController.signIn(platformToken, request); // then assertAll( @@ -62,7 +61,7 @@ void init() { UserSignInRequest request = new UserSignInRequest(AuthPlatform.Type.APPLE); // when - ResponseEntity result = userController.signIn(platformToken, request); + ResponseEntity result = userAuthController.signIn(platformToken, request); // then assertAll( @@ -79,7 +78,7 @@ void init() { String nickname = "nickname"; // when - ResponseEntity result = userController.checkDuplicateNickname(nickname); + ResponseEntity result = userAuthController.checkDuplicateNickname(nickname); // then assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -97,7 +96,7 @@ void init() { .build()); // when - assertThatThrownBy(() -> userController.checkDuplicateNickname(duplicateNickname)) + assertThatThrownBy(() -> userAuthController.checkDuplicateNickname(duplicateNickname)) .isInstanceOf(UserException.class); } @@ -107,7 +106,7 @@ void init() { userService.signIn(DomainFixture.createUserSignIn(AuthPlatform.Type.KAKAO)); // when - ResponseEntity result = userController.delete(DomainFixture.USER_ID); + ResponseEntity result = userAuthController.delete(DomainFixture.USER_ID); // then assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); @@ -116,7 +115,7 @@ void init() { @Test void delete를_통해_존재하지_않는_사용자를_삭제하려고_하면_예외가_발생한다() { // when - assertThatThrownBy(() -> userController.delete(DomainFixture.USER_ID)) + assertThatThrownBy(() -> userAuthController.delete(DomainFixture.USER_ID)) .isInstanceOf(UserException.class); } @@ -126,7 +125,7 @@ void init() { userService.signIn(DomainFixture.createUserSignIn(AuthPlatform.Type.KAKAO)); //when - ResponseEntity result = userController.signOut(DomainFixture.USER_ID); + ResponseEntity result = userAuthController.signOut(DomainFixture.USER_ID); //then assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); @@ -136,7 +135,7 @@ void init() { void signOut을_통해_존재하지_않는_사용자를_로그아웃하려고_하면_예외가_발생한다() { //when - assertThatThrownBy(() -> userController.signOut(DomainFixture.USER_ID)) + assertThatThrownBy(() -> userAuthController.signOut(DomainFixture.USER_ID)) .isInstanceOf(UserException.class); } @@ -148,7 +147,7 @@ void init() { //when - ResponseEntity result = userController.reissueToken(refreshToken); + ResponseEntity result = userAuthController.reissueToken(refreshToken); //then assertAll( @@ -163,7 +162,7 @@ void init() { void reissueToken에서_refreshToken으로_인증정보를_찾을_수_없다면_에러가_발생한다() { //when - assertThatThrownBy(() -> userController.reissueToken(DomainFixture.REFRESH_TOKEN)) + assertThatThrownBy(() -> userAuthController.reissueToken(DomainFixture.REFRESH_TOKEN)) .isInstanceOf(AuthException.class); } } From a4e6d3717d35c42f0c2ce7cd76ce9326f87722e6 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 17:04:50 +0900 Subject: [PATCH 51/55] =?UTF-8?q?[fix]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mock/bookmark/FakeBookmarkRepository.java | 9 +- .../server/record/service/S3ServiceTest.java | 128 ------------------ .../BookmarkRepositoryIntegrationTest.java | 14 -- 3 files changed, 8 insertions(+), 143 deletions(-) delete mode 100644 src/test/java/org/recordy/server/record/service/S3ServiceTest.java diff --git a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java index 8e7700a8..352cca1d 100644 --- a/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java +++ b/src/test/java/org/recordy/server/mock/bookmark/FakeBookmarkRepository.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; -import java.util.Optional; import org.recordy.server.record_stat.domain.Bookmark; import org.recordy.server.record_stat.repository.BookmarkRepository; import org.springframework.data.domain.Pageable; @@ -50,4 +49,12 @@ public Slice findAllByBookmarksOrderByIdDesc(long userId, long cursor, return new SliceImpl<>(content.subList(0, pageable.getPageSize()), pageable, true); } + + @Override + public boolean existsByUserIdAndRecordId(Long userId, Long recordId) { + return bookmarks.values().stream() + .anyMatch(bookmark -> + bookmark.getUser().getId().equals(userId) && bookmark.getRecord().getId().equals(recordId) + ); + } } diff --git a/src/test/java/org/recordy/server/record/service/S3ServiceTest.java b/src/test/java/org/recordy/server/record/service/S3ServiceTest.java deleted file mode 100644 index bdd34e97..00000000 --- a/src/test/java/org/recordy/server/record/service/S3ServiceTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.recordy.server.record.service; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.recordy.server.common.config.S3Config; -import org.recordy.server.common.exception.ExternalException; -import org.recordy.server.record.service.impl.S3ServiceImpl; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.multipart.MultipartFile; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.PutObjectRequest; -import software.amazon.awssdk.services.s3.model.PutObjectResponse; -import software.amazon.awssdk.services.s3.presigner.S3Presigner; - -import java.io.IOException; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class S3ServiceTest { - - private S3ServiceImpl s3Service; - private S3Client s3ClientMock; - private S3Presigner presignerMock; - - @Value("${aws-property.s3-bucket-name}") - private String bucket = "recordy-bucket"; - - @BeforeEach - void init() { - s3ClientMock = mock(S3Client.class); - presignerMock = mock(S3Presigner.class); - s3Service = new S3ServiceImpl(bucket, s3ClientMock, presignerMock); - } - - @Test - void 이미지_업로드_성공() throws IOException { - // given - MultipartFile imageMock = mock(MultipartFile.class); - when(imageMock.getContentType()).thenReturn("image/jpeg"); - when(imageMock.getSize()).thenReturn(1024L); - when(imageMock.getBytes()).thenReturn(new byte[1024]); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); - - // when - String result = s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg"); - - // then - assertThatCode(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg")).doesNotThrowAnyException(); - } - - @Test - void 비디오_업로드_성공() throws IOException { - // given - MultipartFile videoMock = mock(MultipartFile.class); - when(videoMock.getContentType()).thenReturn("video/mp4"); - when(videoMock.getSize()).thenReturn(1024L * 50); - when(videoMock.getBytes()).thenReturn(new byte[1024 * 50]); - when(s3ClientMock.putObject(any(PutObjectRequest.class), any(software.amazon.awssdk.core.sync.RequestBody.class))) - .thenReturn(PutObjectResponse.builder().build()); - - // when - String result = s3Service.uploadFile(videoMock.getBytes(), "test-video.mp4"); - - // then - assertThatCode(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.mp4")).doesNotThrowAnyException(); - } - - @Test - void 이미지_업로드_실패_파일_확장자_유효성_검사_실패() throws IOException { - // given - MultipartFile imageMock = mock(MultipartFile.class); - when(imageMock.getContentType()).thenReturn("image/mov"); - when(imageMock.getSize()).thenReturn(1024L); - when(imageMock.getBytes()).thenReturn(new byte[1024]); - - //when - //then - assertThatThrownBy(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.mov")) - .isInstanceOf(ExternalException.class); - } - - @Test - void 비디오_업로드_실패_파일_확장자_유효성_검사_실패() throws IOException { - // given - MultipartFile videoMock = mock(MultipartFile.class); - when(videoMock.getContentType()).thenReturn("video/hwp"); - when(videoMock.getSize()).thenReturn(1024L * 50); - when(videoMock.getBytes()).thenReturn(new byte[1024 * 50]); - - //when - //then - assertThatThrownBy(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.hwp")) - .isInstanceOf(ExternalException.class); - } - - @Test - void 이미지_업로드_실패_파일_크기_유효성_검사_실패() throws IOException { - // given - long maxFileSize = 50 * 1024L; - MultipartFile imageMock = mock(MultipartFile.class); - when(imageMock.getContentType()).thenReturn("image/jpg"); - when(imageMock.getSize()).thenReturn(1024L * 1024 * 200); - - //when - //then - assertThatThrownBy(() -> s3Service.uploadFile(imageMock.getBytes(), "test-image.jpg")) - .isInstanceOf(ExternalException.class); - } - - @Test - void 비디오_업로드_실패_파일_크기_유효성_검사_실패() throws IOException { - // given - MultipartFile videoMock = mock(MultipartFile.class); - when(videoMock.getContentType()).thenReturn("video/mov"); - when(videoMock.getSize()).thenReturn(1024L * 1024 * 200); - when(videoMock.getBytes()).thenReturn(new byte[1024 * 1024 * 200]); - - //when - //then - assertThatThrownBy(() -> s3Service.uploadFile(videoMock.getBytes(), "test-video.mov")) - .isInstanceOf(ExternalException.class); - } -} diff --git a/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java b/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java index ad52c175..dde201c5 100644 --- a/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java +++ b/src/test/java/org/recordy/server/record_stat/repository/BookmarkRepositoryIntegrationTest.java @@ -113,18 +113,4 @@ public class BookmarkRepositoryIntegrationTest extends IntegrationTest { () -> assertThat(result.hasNext()).isFalse() ); } - - @Test - void findByUserAndRecord를_통해_북마크를_찾을_수_있다() { - //given - - //when - Bookmark bookmark = bookmarkRepository.findByUserIdAndRecordId(1,1).get(); - - //then - assertAll( - () -> assertThat(bookmark.getUser().getId()).isEqualTo(1), - () -> assertThat(bookmark.getRecord().getId()).isEqualTo(1) - ); - } } From fd6be11fbe7a1caedd408e56f2c70e594582caf0 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 17:14:52 +0900 Subject: [PATCH 52/55] =?UTF-8?q?[refactor]=20getTotalRecords=EC=97=90?= =?UTF-8?q?=EC=84=9C=20long->int=20=EB=B3=80=ED=99=98=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recordy/server/record/service/impl/RecordServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java index 6244b4e3..80814556 100644 --- a/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java +++ b/src/main/java/org/recordy/server/record/service/impl/RecordServiceImpl.java @@ -131,7 +131,7 @@ public List getTotalRecords(int size) { List records = new ArrayList<>(); while (records.size() < size && records.size() < count) { - long randomId = random.nextInt(maxId.get().intValue()) + 1; + long randomId = random.nextLong(maxId.get()) + 1; if (!selectedIds.contains(randomId)) { selectedIds.add(randomId); From 766c86cfdf5ae2a1d89118ad53e93bd1ae629275 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 17:32:19 +0900 Subject: [PATCH 53/55] =?UTF-8?q?[refactor]=20slice=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20findBookmarks=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/record/controller/RecordController.java | 8 ++++---- .../record_stat/controller/RecordStatController.java | 3 +-- .../server/record_stat/service/RecordStatService.java | 1 - .../record_stat/service/impl/RecordStatServiceImpl.java | 7 ------- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/recordy/server/record/controller/RecordController.java b/src/main/java/org/recordy/server/record/controller/RecordController.java index a8121a8e..a0aa3634 100644 --- a/src/main/java/org/recordy/server/record/controller/RecordController.java +++ b/src/main/java/org/recordy/server/record/controller/RecordController.java @@ -66,7 +66,7 @@ public ResponseEntity> getRecentRecordInfoWithBook @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecords(keywords, cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); + List bookmarks = recordStatService.findBookmarks(userId, records.getContent()); return ResponseEntity.ok().body(RecordInfoWithBookmark.of(records, bookmarks)); } @@ -80,7 +80,7 @@ public ResponseEntity> getFamousRecordInfoWithBook @RequestParam(required = false, defaultValue = "10") int pageSize ){ Slice records = recordService.getFamousRecords(keywords, pageNumber, pageSize); - List bookmarks = recordStatService.findBookmarks(userId, records); + List bookmarks = recordStatService.findBookmarks(userId, records.getContent()); return ResponseEntity .ok() @@ -107,7 +107,7 @@ public ResponseEntity> getRecentRecordInfosWithBoo @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getRecentRecordsByUser(userId, cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); + List bookmarks = recordStatService.findBookmarks(userId, records.getContent()); return ResponseEntity .ok() @@ -122,7 +122,7 @@ public ResponseEntity> getSubscribingRecordInfosWi @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordService.getSubscribingRecords(userId, cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); + List bookmarks = recordStatService.findBookmarks(userId, records.getContent()); return ResponseEntity .ok() diff --git a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java index 7782601d..78adcf2d 100644 --- a/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java +++ b/src/main/java/org/recordy/server/record_stat/controller/RecordStatController.java @@ -5,7 +5,6 @@ import org.recordy.server.auth.security.UserId; import org.recordy.server.record.controller.dto.response.RecordInfoWithBookmark; import org.recordy.server.record.domain.Record; -import org.recordy.server.record.service.RecordService; import org.recordy.server.record_stat.domain.usecase.Preference; import org.recordy.server.record_stat.service.RecordStatService; import org.springframework.data.domain.Slice; @@ -67,7 +66,7 @@ public ResponseEntity> getBookmarkedRecords( @RequestParam(required = false, defaultValue = "10") int size ) { Slice records = recordStatService.getBookmarkedRecords(userId, cursorId, size); - List bookmarks = recordStatService.findBookmarks(userId, records); + List bookmarks = recordStatService.findBookmarks(userId, records.getContent()); return ResponseEntity .ok() diff --git a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java index 5022e18a..1ef9669b 100644 --- a/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java +++ b/src/main/java/org/recordy/server/record_stat/service/RecordStatService.java @@ -16,6 +16,5 @@ public interface RecordStatService { // query Preference getPreference(long userId); Slice getBookmarkedRecords(long userId, long cursorId, int size); - List findBookmarks(long userId, Slice records); List findBookmarks(long userId, List records); } diff --git a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java index f397ebd5..49135e00 100644 --- a/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java +++ b/src/main/java/org/recordy/server/record_stat/service/impl/RecordStatServiceImpl.java @@ -46,13 +46,6 @@ public void deleteBookmark(long userId, long recordId) { bookmarkRepository.delete(userId, recordId); } - @Override - public List findBookmarks(long userId, Slice records) { - return records.getContent().stream() - .map(record -> bookmarkRepository.existsByUserIdAndRecordId(userId, record.getId())) - .collect(Collectors.toList()); - } - @Override public Preference getPreference(long userId) { return Preference.of(userId, recordRepository.countAllByUserIdGroupByKeyword(userId)); From 3d2373d351a9ef29a74435a0b517c7d9628c80f0 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 17:48:45 +0900 Subject: [PATCH 54/55] =?UTF-8?q?[fix]=20FakeRecordRepository=EC=97=90=20c?= =?UTF-8?q?ount=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/recordy/server/mock/record/FakeRecordRepository.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java b/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java index 20b26db3..80c7cc12 100644 --- a/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java +++ b/src/test/java/org/recordy/server/mock/record/FakeRecordRepository.java @@ -111,4 +111,9 @@ public Slice findAllBySubscribingUserIdOrderByIdDesc(long userId, long c public Optional findMaxId() { return records.keySet().stream().max(Long::compareTo); } + + @Override + public Long count() { + return (long) records.size(); + } } From 276de1b51889e238df612b79b33452a09c1188f5 Mon Sep 17 00:00:00 2001 From: elive7 Date: Mon, 15 Jul 2024 17:54:09 +0900 Subject: [PATCH 55/55] =?UTF-8?q?[fix]=20=ED=9A=8C=EC=9B=90=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/recordy/server/user/controller/UserAuthController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/recordy/server/user/controller/UserAuthController.java b/src/main/java/org/recordy/server/user/controller/UserAuthController.java index fad193d4..137fe9f7 100644 --- a/src/main/java/org/recordy/server/user/controller/UserAuthController.java +++ b/src/main/java/org/recordy/server/user/controller/UserAuthController.java @@ -85,7 +85,7 @@ public ResponseEntity signOut( } @Override - @DeleteMapping + @DeleteMapping("/delete") public ResponseEntity delete( @UserId Long userId ) {