From 00a198e33ab7d572f8938cca35a166d8558b6566 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 20 Jan 2025 21:01:14 +0900 Subject: [PATCH 001/256] =?UTF-8?q?apiResponse=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=A0=9C=EC=99=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 202229 -> 202229 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 37697 -> 38147 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 25195 -> 25535 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 8 bytes .../converter/MemoConverter.java | 12 ++++++++++ .../repository/MemoRepository.java | 8 +++++++ .../service/memo/MemoCommandService.java | 7 ++++++ .../service/memo/MemoCommandServiceImpl.java | 22 ++++++++++++++++++ .../controller/ResourceRestController.java | 20 +++++++++++++--- .../web/dto/memo/MemoRequestDTO.java | 2 -- 13 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin index 8f79d0f9670c04f5b39fd7e432a83898b020e88e..233d489b47a6077a4a9591d8a8bbdfa6d8b7f92f 100644 GIT binary patch delta 1141 zcmeymn&<0ko(&JqIC9OMotbV@k(F1Tm!6hVn37tUS(ufRot#>fSyd?TA@7ciXi(|- zONUP_sBY8WFxwPEXtUzku4Rng(?7N|7ECVKm_B`LGmv4hRbX=Zrs(Z)rHpYrD!!?? z`Of)yWvN9asYQBOiDik*0`3WU_Y*>c1w6N1`{B?_7iX5_7ga*d==ygt>N-njvgOHB6VDo~**rO6tNir(NsQbqAm!WZCo^{Q zPA)#=I=x{!qwe&+1&nNZxj=~+h%LFfiFql(sYPX($*E8SFR&>J&64qSDi;6oGe=GL z%=C|s85O2~kY(Z!2WiyD)HwO#aW91NCOC}u%q_@)S|K#A=w!gbFZR!)*|eS%m>V%3 zo9-yVq$Z8Se2~uRdzUemPA{0p$T5AkER)>!1q&JXu?nc%3wyh)v#jybuDjn~ughOP zIdP}L^Z*qmwe4G$Gy1a%{CoP3Rj|5Xi|Wm#)3bO>HcU_4#Hc>~fE5$>cGtCxlh_1e zWE3QCwjJ8GG+OlSt)xlDlle|*Z0Fy?IEzIW;!jwFCFdj-7c&UV`yd?keZjZra3w9< zb1^sf9i2US_6eg&Jkyu&U^Eht{?T>d^KD<|kIXX{;~o`~x2hqgEDXDnr| z2L%!1Oo-c1A`faPubyDIf68CBMM5@uX`vO?O>;mFoXx^G7gG;7Mxgpi)~zV8IL|;l(Mf1R$d>abh^vHqN7JSy;x%e&yVW!l87w9d#=e>qQXzj%uA8f(m*_7`Rj zH}4-@@Jev?RkfSkK%XpK7v{Z%@2$oe-CFqtGp2$(XB>U)+q}PdPmlR7E?%>J*({(? zh{MLnH9zC~XF4CWV)uD+8z^*lg4_GU;RfOS>lt3_J-uKxeY-HT=60QnjE5NI^K>*= uRdyT=JTf8Rz0)sVhxhYAA%1BAI}0NNBiE|QOV4Pvuf5K=eeHE74?6&L0PxcQ delta 826 zcmcK1eJs>*9Kdm(yWd?A_9I5OX=ie=G!I>IEqO>WY>1^SPmL@Wj$9rxDVIZ{?xycJ zY#5rSDXSkP8F^|PyK{G@$wS6@oQHWRmVWnlfA`;O@6SJ<&pz7?y4wx9Ez?78^wSbv z9G9IE9d|A&J?de6Tue+_f+PPzWc-7qd${S0<0hI7Zj%SjhvsguhRSXKNv-C?`Lz_! zK4dP01TpVz43V7-96e;a0s2JsQ}}8?coaj19tx@l9%5F&Q6w>=oFp7-pp%A6p9rL> zEM19f$L99D_2Er%WIK~!HUOVyn3Tf`xH6n+LJM>Dib$L6fKK$vk79|sE>eyWsumE@ zap5mciC^z@U|+QHzIfdYDco&G)XgjZD0B6$*&@4ltpk zjc(xKpB4rBmwI$)EEiZ033yXMB=!KGin#p{giFPu;J^UgS^F+p70u(|E-}&%B4GIB zT~)Kj=bHR~4tDv>cIRv^$V3AUolKCR1WO776%RrHp1-!FIE>!k8ZA!rT9@bQ5Ick5 zgc+4d?WdSUg>}H$wo^OCw+YlT5ptJ;jgFAifWsOU-lI|ug^e1e@Eo_uwVc@umuTB8 zX~#y(ntTY)5m3@@KdKqAm~c&b7BlsOYnD3aM%BW(V0Qh?Y}KFE{Vb~qx?qY-Cf_Za z6#hMatEnra-tFvWGG&AlyNux8qEKfur$v{YT{3m;?apvjEN_KOUZhkf-67Hxunf$I zl~m(#&emij!!_(3X2U32)2vrraRdV`ptEaHiZA(u6LK)bzAT6ek*yp!*awa7%fSX4 z(5OrfzF5{gsTIvMTO;c+2*>g?Di{NItUx2#7@U1vNNT|0fKIM->JmC9C`w z#Rj(w$@D)j#_AGy$tY6+r_l6qY7R10f+H$7qNbyECD=m`s$7N;bY2Cv!e$i^%_@rL F<-a+Fet`f0 diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock index 22e662fe8e55faf3e603c5f3df660a86f967ad70..42e278700011213af35d91ec040eafc4a3ede886 100644 GIT binary patch literal 17 UcmZS9y0STQ;)ksv3=kj#06DD$!~g&Q literal 17 UcmZS9y0STQ;)ksv3=kj=06C}xzW@LL diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin index d6ae3b6ffd1d5cc39f224256298747101ec6de5b..830e71188321369884b279b2340cfc3b479c9911 100644 GIT binary patch delta 1546 zcmZXTdrVVz9L3x6O4nhlbqlFe9s&YtnGfcp4g`~p@fehi6@kPM5Y`x+1&V;WhB32% zGy{%*j1dElRNMnsyc=^WGDevowv_2aU@pQ$AR$BC92Nbve4wVpPuhI=l9F+ z-rIFfRPmX}yxm7w$wm0=7fEXlhUtgZkplLCi94y#dP-Xo@248hweey!H{mCClddd! zw_V>mO5*83ZesnISUN4KyAv;I;KfFCY&OdRh61bQnsGZXin)WzEgn)yop0RYfe-o4 zA+}0T&1h*yvkmlNnq^L$U&fg4NGDlGkX@qEYCya zC2J?15`2d(Y6V*2*lIuEKp|_oj#?MY#WAH9Pe|#*sUij5iD!Wu*k8oPHykR1E_AqH zmf(B%>)EIqZxC3pHi0P?BoXwWJV60#0xNCBnqoG-i9`Y`3@&IRu%Ro3dF*)ZD1$+~ zO7J5}32xzYg4?)9@DrpZ%zPKo1jA6j$&^u;NckBADYhUaWp7bw1#%F^w99`(Qm5?A*q0 zyr6~fkQ|RR>@k={=y6s$ho@Qv^vBt`Pr^v*6gmkWV~*f=oJmu1>JuVwzda*O@0;Zd z5r53@Z62De_N9ewnY7OH#Ta{CUY9H9>Z?XXJ|F$vl2;lK`;6Y+U2wsaltE^z9jA;+ z_lg|rZLY((=du>Q z?IEw{Dwp@aV;Xs7M`wa=;BjMC$xOLHSIH+9`Sz;i32)^}O;XO1=O?T7D05RwRFtqe pk4NCxoM_GRNYRD!M|NLVW-D5k23G9MD(52`oe_b+tH|-C{1;I$BnDd4Bvqo`;uncaG1_@C$Au zcSo%^cJu0t)U)%M*`ifF)|Cp#%B=cDvF}i2_cX8OJ--EPc(Zuh+{Nw9SafPjyQ>Bl z+y7__#cK4PUO+r-(5|jGArqExuf#;pgq@{n!c?CkOcaV{ye|XSPnCU0L`Y;mo<<~$ z_lvLv%vg+&`T^vqXTjF?tc^;T4Y&}D5?{u{0lK6Hn*p-qFn$dvhz9E@cMmF944N@U z!w0cENW+Klje!-GA*xt$hJg*H5ZPlxm`)iJAqlwd* n`8sS^Y5bXgA)UJLN^nRT4fi-5TdG3vh6ED~+MDw}XyN}4nTbAH diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock index dcf9cebf97b705baa0f65bfca949acd48edc257a..f9f348ff20ef8ca19694fd9f09675769952ac8bd 100644 GIT binary patch literal 17 UcmZSP?6eWNlCPG{00vAq0U`JUl>h($ literal 17 UcmZSP?6eWNlCPG{00vCi03nJ4CjbBd diff --git a/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin b/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin index 71e1bdf6416f7b8bb8cf83dece7fa62cdeb4ccb7..fdb2d4da83e8ee516d6f8d8a3cf13f34c77d4049 100644 GIT binary patch delta 592 zcmaETgmM3I#tkMCjOQntN~{o=y7ukP1EnT&8NeWE{o<<MtHE)o;Kj{z)if9dBIc;v+~RoG6e^m%d9V5l zMu8m9+4Jp>H48yRldC7s)l?8DdiLPhgKim4*Kuj!|?Nnv-$wCnEo*X#0^W2*S~^dGBWb-@@s?}=sQ>_V CDzotb delta 72 zcmV-O0Js0Y#{uia0kAX}0mYLw7^t)L82AK}9Ue%teICFAvsEH!1e4V!V6#mpAOW+5 eDBuB;eJU7}tt$Eg5{a=P_!qG-kOi|rNGcjg#vGgg diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 85acc83aadb79c8e74d28d26d3e2296fe87e8f5a..e1c32b1539b59fbd03d6074cf938a26f66ec1012 100644 GIT binary patch literal 17 UcmZS9*uy@Xee#Fp3=mKc04!_-IsgCw literal 17 UcmZS9*uy@Xee#Fp3=ohF04!JpCIA2c diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe index 0b5d8b0466db62ebe6909852e2120f3fd4d68147..cbbb6824861d083b5de1d9298b4d13724f8e7b21 100644 GIT binary patch literal 8 PcmZQzV4Tt%V{`)m2TlTi literal 8 PcmZQzV4Tu4YvU6D2@V5C diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java new file mode 100644 index 00000000..03c45b59 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java @@ -0,0 +1,12 @@ +package learningFlow.learningFlow_BE.converter; + +import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; +import learningFlow.learningFlow_BE.web.dto.memo.MemoResponseDTO; + +public class MemoConverter { + public static MemoResponseDTO.MemoInfoDTO createMemo(MemoRequestDTO.MemoJoinDTO request){ + return MemoResponseDTO.MemoInfoDTO.builder() + .memoContents(request.getContents()) + .build(); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java new file mode 100644 index 00000000..aacabbc1 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java @@ -0,0 +1,8 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.Memo; +import learningFlow.learningFlow_BE.domain.MemoId; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemoRepository extends JpaRepository { +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java new file mode 100644 index 00000000..d33a374e --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java @@ -0,0 +1,7 @@ +package learningFlow.learningFlow_BE.service.memo; + +import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; + +public interface MemoCommandService { + public void saveMemo(String loginId,Long episodeId, MemoRequestDTO.MemoJoinDTO request); +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java new file mode 100644 index 00000000..cb170a14 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java @@ -0,0 +1,22 @@ +package learningFlow.learningFlow_BE.service.memo; + +import learningFlow.learningFlow_BE.domain.Memo; +import learningFlow.learningFlow_BE.domain.MemoId; +import learningFlow.learningFlow_BE.repository.MemoRepository; +import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MemoCommandServiceImpl implements MemoCommandService{ + private final MemoRepository memoRepository; + + @Override + public void saveMemo(String loginId, Long episodeId, MemoRequestDTO.MemoJoinDTO request) { + MemoId memoId = new MemoId(episodeId, loginId); + Memo memo = new Memo(memoId, request.getContents()); + + memoRepository.save(memo); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index d5d6b421..e7a5cce5 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -8,11 +8,17 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.UserHandler; +import learningFlow.learningFlow_BE.converter.MemoConverter; +import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.service.memo.MemoCommandService; import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; import learningFlow.learningFlow_BE.web.dto.memo.MemoResponseDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -23,7 +29,7 @@ @Slf4j @Tag(name = "Resource", description = "Collection 내에 특정 resource 관련해서 기능하는 API") public class ResourceRestController { - + private final MemoCommandService memoCommandService; @GetMapping("/{episode-id}") @Operation(summary = "강의 시청, 강좌로 이동 API", description = "강의 에피소드를 시청하기 위해 강좌로 이동하는 API, 그리고 강의를 시청 처리하는 로직도 포함") @ApiResponses({ @@ -50,11 +56,19 @@ public ApiResponse watchEpisode(@PathVariabl @Parameters({ @Parameter(name = "episode-id", description = "메모를 추가할 강의 에피소드 ID") }) - public ApiResponse createMemo(@PathVariable("episode-id") Long episodeId, @RequestBody MemoRequestDTO.MemoJoinDTO request) { + public ApiResponse createMemo( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable("episode-id") Long episodeId, + @RequestBody MemoRequestDTO.MemoJoinDTO request) { /** * 메모를 생성하고 저장하게 되면 자신이 쓴 메모를 보여주는게 맞을 것 같아서 일단 메모 contents를 반환하게 해놓았어요. */ // TODO: 강의 메모 생성 로직 구현 - return ApiResponse.onSuccess(null); + String loginId = principalDetails.getUser().getLoginId(); + // User 핸들러가 에러 코드 기준? Controller 기준? + if (loginId == null) throw new UserHandler(ErrorStatus.USER_NOT_FOUND); + memoCommandService.saveMemo(loginId, episodeId, request); + + return ApiResponse.onSuccess(MemoConverter.createMemo(request)); } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java index a81c9c2b..83606c60 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java @@ -7,9 +7,7 @@ public class MemoRequestDTO { @Getter public static class MemoJoinDTO { - @NotBlank(message = "메모 내용은 필수입니다.") private String contents; - } } From 45d5114ac7d5d884f9688f68c929a1e99d0c5f5b Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 20 Jan 2025 21:15:44 +0900 Subject: [PATCH 002/256] =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 202229 -> 202229 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 37697 -> 37897 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 8 bytes learningFlow/.idea/compiler.xml | 14 ++++++++++++++ 7 files changed, 14 insertions(+) create mode 100644 learningFlow/.idea/compiler.xml diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin index 8f79d0f9670c04f5b39fd7e432a83898b020e88e..c6162c6378cc8edbe1354d1c7d6c048a363c6f84 100644 GIT binary patch delta 1478 zcmXApe@xVM7{~Yi@+k6!kp<-0CMuCXQQ>|FfL!9Dv@vv(fa_u-yHyC$3dTzX&K%&HD$-rkxwJj>tu z>iNlS75&r|JW{4y7m!5bLia9UK3#5Sink(N?_=_s^J7t@X7(aheQL!s`k)~WMB=1M z>B9`=V3C?6rrnC!6cBoBMGBR4FeO)UMvKt4D!fHEI+^OLu#oNwJ*a}2{uY{R!(18@ z+HAxAun>dKhBZ_s6jRL&{w1`!8Y?Jxg(!|1wQ)e|+(=WdLBNg0<=x6qISGszMqFt3fK|Npxy0 zX3#%@M3q7vGa^1q@ zHCKl78#wor7OOH{TzKd*o3mYbje5kf&c(sQLQ!rkr4G5uD{gG0W8zoh#(cfh7|Iq7 zrEbLWvTwOLjYrIn+&DmwB>4S$KHt%9reEu^f!spl^~j=JNw}o}Y4qh)rqTxP|3{g# zr2#vrN3twx#4b7}){;hSqHl$U8?jd}XY!hTalE*V3B0(Ri(L4N9yS+W!~*>Ulh+)0 zgYUiSXG~Gs6SN8Hj`&oF&-g`{^+Cg@{5ei>_zYs6_+&P*&qMLaZo+1L)bRONgG>3E z`K!3ogk-9dE~YhORb->l#pMWiAokg+pqalAtJs^Gv6dV{(H<IQIcC_;Sa;`B&`gpz?!*MVgXVlX^B&d8JOnQSMh9dBd zh%u^xMe<1Wbst`$T#1hNBU3MC;vY#gPN|%9ZJH|ab9AX89*%%TZCj(IsJniyeN1A| z#!tFXD6Ne@rtgHZ+xTzLB~PNV4J-8^lh^#&6#S$*)@g}qdVoKYZbKXm$7ywMy*69z zV3B+h^HBgV(={P`fEOAPdKf^Ge!~bUo&;-gCco~LLB6-ec&ndB;|D`42x5Aq)zG+E z4_Hi8*MnH1I}NdFDk@l;r!v~PoLk=Io9%pqMkZT+JKokzH|Gra!z=|`KG>9d+%{{* V3!}Z#{iW}}nizs@Vo1A}{y&detZo1R delta 1478 zcmXApdrXye7{~X0eH3|NWFdKEQ!ntv$WP46iym5 zQHme1*_L^MorZuO&ixz?0_T1}spdagUhsl?m@+aGvFCaH@3Zf7{XNg~zQdN(VM}WB zjp)2jN9dp_G+Ji&Br=_7T0lfAF#*5-J{yh9V_YLO{U2XETbB+ZgOCjUe6RX zpEjdKVHgXQ!@-@N6myRQ3-mLFxyb~VDofQ~Ra2eF)$bYN?F<}$A?|a+LNAKrclC(>2yUX-NkPo7FzDY9CAp+M=oU1plHWjm_?U`ye@8bL};uVuhVm(95?$7 zNyIyD%+MbjEriG8oH{y2GpklNPkq!7Thmdee59GwEf%Tt7RQXZkxOSKI@g1lbWUiS zhbJ5|DtkD0T*&T0AytTV)WhSf6q@hFIx3eeUkiON6!u~s9T9r!#WMXzrl7eciEp6! zC2gWA@^N9iBrNvfZE6%puaAS9g;LwGlm=ugZ?$6sRfu10JLc*hE*CW0lAzSz89eM8 z?Xn9oKWWE4vP$r$eqNtn=&T>>>59;EKQ>WV629Mod^&iWsjh?j?~wjO9oRuf z*hQ6Mt-XMEsaoja1(fJ@OhI!bg9o=Eiw9TQ$%TIxb4@4a=?TLee~-@sGl}`o@wx@NH>2Kce}8VERteM zH&&!H8D;)RMgU^ZR#n~ng`5(5S2tEugHT!ki>X;?b%0;v5^4${kGw+n0@zGJq4hzm zpoq}XAa;{qXe5X=)G4$k#QTd0?GN#S%B96eYTusB0q?ZFcLk|DND zhK02`YE3Vf`%~`ngI?ajWhUF(d4c{|B46%F_S< diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock index 22e662fe8e55faf3e603c5f3df660a86f967ad70..cec4ce4c1d501741803cadacf98812e8ec929916 100644 GIT binary patch literal 17 UcmZS9y0STQ;)ksv3=kj%06D7!!Tk^5aEU_$A_Fvp%ViNy79`2R4-lI~*3P)0ZO8OPR)*eT5RrN0E(ms`RbV~bbjlBFRVQjDMP z+UsIT_Zz*QZ(pczwA)fsQ2eAN48WLQv|QKVe%js`uyy@Y3yxOqszcINm4vTQW<@un z9&=WBzfLn}p|JvtbLe24$6_7LG@weYM4o!NbZDb^LFollaNPtG<09l~RDF%)P(m}x zLzU2{Eq4$%FY$A>8H6s`8BL+i(s7s3!=v9|-U^>ECBE23zwJB3?x&NkpoH-~X17t& zf%}|vB0pV;)F4{uL}WVEU1CaTK?|c5Ggi1~P}PQ=jBnu)?8T z>Z=H0T!Y?<2F4F)-$66oSn(d=IszFz$YS)Oj$y(u<3}hmY4|4uSP}LHB{xyS$2)0E*HNAfd5SacM$qeM#=0CDo4|as5*a!4hZ{u!r+=W0F^O4*fQmQ8h3Y$f zFfryKkCc+}a5NtxBw&)Eh1+3DUWJ;m9R|iH@QR|U5wQew97-4|Xed%*I7)mf)#h~6 z>y=PM(?yPWp|TZI+|qkXZ3Uc;NT-+uv_wk~)R-YmtbqG&DVg*_Kg~=Iz}`T~82lOc zk;-_4DuR%RkQh2=AM}LD1T-+Bko-Qa2cn#D5Iz zy%qI|ge&-saRE+Alw86!p6SFtj9=mP0aZhYWlW=l@fZB}QZ3;g^{FaEObVd{ zMT}3;PMC^7R!Z0HUiV~_~5Wv`psdp%e!z!%=VLieazVtDx&`O^y!4H0= zRBwis@d_$Sm8(aep15w?SR9oRo{NhftJlh8@(+(z-^-@&61nLn?BOB(KbVFsUc%aN zh5oK{)PvK1M@KyIjDPR${#IIu@9E$#pGC{WpQ>lYhjrrJUAiwFcy+F}6$_ncSVOF{4JyEn`HsR=7sYxw)Ysk?V(JME8BaG|4 zCBq*r8CVl(IpWKR91QV27(X8D`zy76sjoG2@Buch+iVH#i(BS%Zb)Cj&JA;cH>aYg z+&DmKQAFV6t!(;=3_AQa=Y2(X|23MP23t_u&8Zm17Gc>ZlgFtlHY>55E;exQ3nw8j zhD*if@h2FSERKc$uW2rWvw7*{yUaY1?nYU%g4sNC$x8lgwBgEMEiT({<5GSMtx{gj z(0(aD$&4bNxF(sz^SmN~=mK+30!4C7q^-bUw7`6rLDZ|#PNHxTZpBl06v+&4HqWOJ zaX`8$Jf}#dc@g~z8xsmU)`L=Bg;SA+tHfNB&KVt~^Rr?#!OhZLL(U>gZM+z|&w6q z-F7pD&?BT{_K5#B)R7%izRLIqu|3MLDwq&$oPhT%u$ABJh62!yV?tYiGT{*GYo{qIXI8 z6h(?3X;a)K>n(}?phj@fphvNsF-0PlPU-Y>{uRNeOe)S0x?3jaxT>82<`kDneOsb0 zs8D=Ew_*gx9*KsjSA0#MVwAEIW^^%#PQ^nEDIQ@)@hEZcNGFWZD#1$sS0oGXlU6O5 zXG%K(M0H6gnLifX3! z%A}FlS`*$8T#E1HGwZ1}zbx+$#cl>rRVm#~K#3#lx+r2?4MnHh& Wz4nsNtmM}jL=zEM-|rxh-2VXDi^B;3 diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock index dcf9cebf97b705baa0f65bfca949acd48edc257a..c2aca231c6d9b94d6e31031c0b3f9e3b637f72ca 100644 GIT binary patch literal 17 UcmZSP?6eWNlCPG{00zuD03l5R=>Px# literal 17 UcmZSP?6eWNlCPG{00vCi03nJ4CjbBd diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 85acc83aadb79c8e74d28d26d3e2296fe87e8f5a..42a1bbd84254ce5c106739710b2a431e1f033ddc 100644 GIT binary patch literal 17 UcmZS9*uy@Xee#Fp3=mKR04!ewEdT%j literal 17 UcmZS9*uy@Xee#Fp3=ohF04!JpCIA2c diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe index 0b5d8b0466db62ebe6909852e2120f3fd4d68147..ae369ee1fcf75999a04de9c5ef457efedbf5a5d8 100644 GIT binary patch literal 8 PcmZQzV4Tvt=*(9D32_5_ literal 8 PcmZQzV4Tu4YvU6D2@V5C diff --git a/learningFlow/.idea/compiler.xml b/learningFlow/.idea/compiler.xml new file mode 100644 index 00000000..cb931fb1 --- /dev/null +++ b/learningFlow/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file From c22291af15f9bd96219b2d5fe72779944569ef03 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 20 Jan 2025 21:27:42 +0900 Subject: [PATCH 003/256] =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 202229 -> 202229 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 37697 -> 37897 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 8 bytes learningFlow/.idea/compiler.xml | 15 +++++++++++++++ learningFlow/.idea/misc.xml | 10 ++++++++++ learningFlow/.idea/modules.xml | 8 ++++++++ 9 files changed, 33 insertions(+) create mode 100644 learningFlow/.idea/compiler.xml create mode 100644 learningFlow/.idea/misc.xml create mode 100644 learningFlow/.idea/modules.xml diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin index 8f79d0f9670c04f5b39fd7e432a83898b020e88e..fce7a754d7de7c056b57bff4b1dbd0eacd45f0be 100644 GIT binary patch delta 1478 zcmXApdrXye7{~X0dA#t#$O01EL?sebP&p}1Ehl(sI{2fQvRvk6sgb$H#C2I~5;?V` zffzrmIa3KG5;(}=TsUyJ9nO0=hl`S~?dG|XzcIM=Lw0+OQw?BMq+m_tC-8)kkZhvoA-hxRnzb?A3u4X&>vu2DD{aA&**KYcsmRy zRLXTsS1uOm&Pk5xvmt>V360v2LWj$l<~Q(*UZG75c$3;Im|7b!mjXf~4X{wZ&@4M< z(Pg3acI47sp@1DL>5)*RgDdPf&9uUSWpw-prhN{qp(~iuIs-NYz4a?1F9D5?>xe!BE zNm%6KR>mZaN9exLT^DB1pipEZH~;PTOv@TEoBoh2?=~WiJ{Rq9BNFL?_%%0jv2M}E zx$!*tg_7Lt=a3w)xe>27nIRF{EisSXNTrLC zFSQ9X=@+5RO*~?!35_;m zi9W<+SgaHH2x_0wqEwcL6CaTWb3AyJ4xMFc_HghwLg6h~Lz0!hA@(Pu;V2=LK z9JYM|l)4hl!yatmXZ{lN-z~_aQxcrp%Im8Us%b@Lh`?AYvgv2p@`g4nC2KX)(KarB zuN3HS!&W*dwajbBHu8wItR3str=7-RwK+~3r*4T)Ia}0N2P}GlReUO*<0tYf5&6U?%ga88*rIa0Sg#kEKL2X) zs6Z!w6}P;YPX&@@YA4dd4lo&(i=psA>%TJ@mf}#9s`E>=XjR_DUELS6tBconMEVO0aDO(_aVP?n>gfRDRAB%ydXp*k zhvI7yBUKxV)Fsga0lY+I5*-^vmhLsDQy77AwKrXxs>*^K?Kj2zP}HeSE437LC&;;N z5`%8OXphj+ZvK{nLOI?1GZ>YVuy$j){wI@R`E)YAQ|H%c@oHKRe5jbgTMZK67 z_NA$Du|BXEuLgRtKrb=HhAF6GZMIt7$LUJtF5l?m9h5QI3;VD|i@BP3I~Y<|v|-P> aeI@pp(_aXEMrI>1uhM&auL>EUmQ$g_Fie zkm3hywq>X=8dneJ&fy@Jb2xB7sK!59D&A0G$jA(Yp6B(y&%V#~_dL)0PS%7@)`ZsI z?pgCm_J^vjQvKTkS%?6Xg^7DV1mexh#eu?}Y5-J3tYyyyJ7 zrUkt<_o(CMz&YiON90}V;_wQd7817o(fGg!$dPeD=k<_dAFH% zTX38Th5Qz5qY|NTD|hG=+G@oX`s)tUX)AV8zi0ziY^7_%Op9&UM5SWgW5Wu)g2`*T zWI}_&BodU(#;sP0xzC1m`enmh8wrQX4b@&%(RL*14-N5N1kS$@PuLMjqY_hO=ckNF z8Mn}|(5M~D=(Q9Xpy62-w70=O3s?o_~pE1P7aFi=IX_4wKiQY!$sfUU%ZTB*<+O9%-^ErTClMe0C|Hdj3m zpC{ro+YXanao;$jC{B@Ejqn#fnH}tNfh{Vl1H1K0hR<^iZsqUfui`-m5~xN}Ea^mQ zNUc%kk6?5`>~X57lfRIQV(;k0cB&Ez>%w}f7uw#%uW<;~c3~s62tDk=Uh)d1dyz_h zp<*wNl1FITiyhQ1w8O{i>lHfb7%3_ly&IO^?G+tzPycMiu%IsXsTw!C+K~7_Qn_q#TL4;l~?P zBNW|(Ox@1JKawz1s+=@!i7M;iXqO@82BT5!-=-z1hdo@oL1NI$7i|{W+{@pRM<}b8 ze+G}_BpP~=qTgron!a6xi|X1=EmkcJ@HaAQi2ntlN{#K(;?yA)>5jyl3gAr|7qSI- zpd&*61Q4%J7$K$eVJ^+&<4)=0efy15{Vog_46UdSOG5&N#?5wt#aMNt4;%CWLu_7* z8rD{+9sOMHPr1tv`gsRKOqRla9MmEYJUSIIv~lA4Z&4}x8Yw>N?5K4A>(6KA4Z<>S IP#a78AJYxWg8%>k diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock index 22e662fe8e55faf3e603c5f3df660a86f967ad70..cec4ce4c1d501741803cadacf98812e8ec929916 100644 GIT binary patch literal 17 UcmZS9y0STQ;)ksv3=kj%06D7!!TUUe^6{H8MgC5^7K{<08X? zMHzlusizjH3;>KejLUE|QO^fxiPEDy%3WG|L_DGNLo{;vC?;hn^Qd$LS;?|5tK9`N=9jf9upC?^e{Z%qVlJRlwoGH zqff@zOVrZ=?QTLRUSxEkn9+?M#%Gw8p)R84&k-Uc=4DE(Xy@b@uE}sJrcy707{`&r z=tC3Z1gKOyL$T*2b#+UFbq2|*_WemZTK*he7%8M9C(N{MS3 z2KN$9;aA2Pc^~YMR0wGlCu~#N)Ws;N6`ELpKVg&eh$~EM_Uh7sg!6t5X|UDE@KES1i=@P z$+X8GW`g??`WSbR^)4;^2@M48DoiluvBY=){$-S3~Ar#4sNK_NF-(id~jht6$;UJnAU*ifvn~CxRv^gKA2|_$(8QbCg9&JuX3?m1N zskEmKey>rf5~+*^JoG-5oDj~~g1rRoUG#FY8#4r<4OMA0-iuMjG!_V&8|XeLl|1}0 zMGzElE~m}q*i7))3=<bf-|Yqhg?QKS{Ub%SS6Kov8Z4eG0fP3 zImRyd9HyQ;Ok@%2#0!cL0RPts!MM#mVeqV`f(Fp6r%C5#b- zdnm4vO2Y5xVJu;qF$c9pDtRnN2toJ@v%4s9gm(^2sSv|hN!M9pj&x}W8U)o+SwId$ zho)NnsvjTw<vBQ%gcG0xvUE8N6K!;|7+op|?=?k+c8cxE)hG8*>C UD+5zY?IY`@5rx9BKs*@!1#uHIZU6uP delta 1653 zcmXxje@s<%7{_t0P|2`v4A|%p5C$j#7eOHrFUB7&<%e*MhG>Xnrhvc@Nl6ePEs==u z-P+7C#+GR#lY5V@F{4JyEn`HsR=CEPb8|yOBG(Vci0*lw?)~Sy&hzg^C&41nwY`w^@-pgmOhKJ&J?4yA39{glhx692j?~NSlVoCwQ zM`iK_!`m%*rkEADe<0>%nYg$i9nS{@waMf|oQjXAQ=Fq;ahHNJ>D;4LQH5LaDwXXL zm2pPV$e3b?MMWK{Z%St?lRE^>*vkd2R~}1ZDs;ia?^@vLe%tOA*RKg_PHl@`^+WR47*Q#M{=yeTO`OXDKa; zVJ<3SxhXKy>Dnd7bNEV8#+<-BLbHq2edn z6!*wHDbXKP3oaS-DwZ>@h{x6`odGVqCisjg#aV*)$mBfNv@^)O;tI*{Nc1J;if`#r zjN;rY(Fk>lZ|GNyQQBoimjdWiJi@TzF=iEy6Z5WgLKv$Qtn_|HvhV?^Re}Ykwc|%b zw{#LIP^_a>;q?CZB}%2NT98h+B8L%yxsRszWZ_;06tzq$c4P06sGb}}6*K!}(m-^L z1)U5k$HdeQ{%ZEo`597&(HRLd-3OX Q@@fqt3G=TTaN + + + + + + + + + + + + + + \ No newline at end of file diff --git a/learningFlow/.idea/misc.xml b/learningFlow/.idea/misc.xml new file mode 100644 index 00000000..5147a0b0 --- /dev/null +++ b/learningFlow/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/learningFlow/.idea/modules.xml b/learningFlow/.idea/modules.xml new file mode 100644 index 00000000..4b679589 --- /dev/null +++ b/learningFlow/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From dce9b1bac54ba247ffcc20106831483d705da60a Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:42:07 +0900 Subject: [PATCH 004/256] =?UTF-8?q?feat=20:=20mediaType=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=95=98=EA=B3=A0=20=ED=95=B4=EB=8B=B9=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=20=EB=82=B4=EB=B6=80=20resource=EC=9D=98=20T?= =?UTF-8?q?EXT,=20VIDEO=20=EB=B9=84=EC=9C=A8=EC=9D=84=20=EA=B0=80=EC=A7=84?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=EC=9D=B8=20resourceTypeRatio=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/Collection.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java index 46a286a3..4656be64 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java @@ -2,7 +2,6 @@ import jakarta.persistence.*; import learningFlow.learningFlow_BE.domain.enums.InterestField; -import learningFlow.learningFlow_BE.domain.enums.MediaType; import lombok.*; @@ -27,16 +26,11 @@ public class Collection extends BaseEntity { @Column(nullable = false) private String creator; - @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "collection_keywords", joinColumns = @JoinColumn(name = "collection_id")) @Column(name = "keyword") private List keywords = new ArrayList<>(); - @Column(nullable = false) - private String keyword; - - @Enumerated(EnumType.STRING) @Column(nullable = false) private InterestField interestField; @@ -44,7 +38,6 @@ public class Collection extends BaseEntity { @Column(name = "detail_information", nullable = false) private String detailInformation; - @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "collection_difficulties", joinColumns = @JoinColumn(name = "collection_id")) @Column(name = "difficulty") @@ -53,9 +46,8 @@ public class Collection extends BaseEntity { @Column(nullable = false) private Integer amount; - @Enumerated(EnumType.STRING) @Column(nullable = false) - private MediaType mediaType; + private Integer resourceTypeRatio; //영상 기준 -> 100개 중 영상이 70개면 70으로 저장 -> 따라서 최댓값이 100이어야함. @ManyToOne @JoinColumn(name = "image_id") From 8ddba55f3dd559271ddf28195aa36ae3e0db6d11 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:42:31 +0900 Subject: [PATCH 005/256] =?UTF-8?q?feat=20:=20QueryDsl=EC=9A=A9=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QBaseEntity.java | 39 --------- .../learningFlow_BE/domain/QCollection.java | 81 ------------------ .../domain/QCollectionEpisode.java | 58 ------------- .../domain/QEmailVerificationToken.java | 53 ------------ .../learningFlow_BE/domain/QImage.java | 48 ----------- .../learningFlow_BE/domain/QMemo.java | 59 ------------- .../learningFlow_BE/domain/QMemoId.java | 39 --------- .../domain/QPasswordResetToken.java | 61 ------------- .../learningFlow_BE/domain/QResource.java | 60 ------------- .../learningFlow_BE/domain/QUser.java | 85 ------------------- .../domain/QUserCollection.java | 58 ------------- 11 files changed, 641 deletions(-) delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java delete mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java deleted file mode 100644 index dd141e5b..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntity is a Querydsl query type for BaseEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntity extends EntityPathBase { - - private static final long serialVersionUID = -301952604L; - - public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); - - public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); - - public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); - - public QBaseEntity(String variable) { - super(BaseEntity.class, forVariable(variable)); - } - - public QBaseEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntity(PathMetadata metadata) { - super(BaseEntity.class, metadata); - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java deleted file mode 100644 index 8f03d1ca..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java +++ /dev/null @@ -1,81 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QCollection is a Querydsl query type for Collection - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCollection extends EntityPathBase { - - private static final long serialVersionUID = -819230162L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QCollection collection = new QCollection("collection"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath amount = createNumber("amount", Integer.class); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath creator = createString("creator"); - - public final StringPath detailInformation = createString("detailInformation"); - - public final ListPath> difficulty = this.>createList("difficulty", Integer.class, NumberPath.class, PathInits.DIRECT2); - - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); - - public final NumberPath id = createNumber("id", Long.class); - - public final QImage image; - - public final EnumPath interestField = createEnum("interestField", learningFlow.learningFlow_BE.domain.enums.InterestField.class); - - public final StringPath keyword = createString("keyword"); - - public final ListPath keywords = this.createList("keywords", String.class, StringPath.class, PathInits.DIRECT2); - - public final EnumPath mediaType = createEnum("mediaType", learningFlow.learningFlow_BE.domain.enums.MediaType.class); - - public final StringPath title = createString("title"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); - - public QCollection(String variable) { - this(Collection.class, forVariable(variable), INITS); - } - - public QCollection(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QCollection(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QCollection(PathMetadata metadata, PathInits inits) { - this(Collection.class, metadata, inits); - } - - public QCollection(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java deleted file mode 100644 index a0cd685b..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java +++ /dev/null @@ -1,58 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QCollectionEpisode is a Querydsl query type for CollectionEpisode - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCollectionEpisode extends EntityPathBase { - - private static final long serialVersionUID = -297427987L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QCollectionEpisode collectionEpisode = new QCollectionEpisode("collectionEpisode"); - - public final QCollection collection; - - public final StringPath episodeName = createString("episodeName"); - - public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); - - public final NumberPath id = createNumber("id", Long.class); - - public final QResource resource; - - public QCollectionEpisode(String variable) { - this(CollectionEpisode.class, forVariable(variable), INITS); - } - - public QCollectionEpisode(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QCollectionEpisode(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QCollectionEpisode(PathMetadata metadata, PathInits inits) { - this(CollectionEpisode.class, metadata, inits); - } - - public QCollectionEpisode(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; - this.resource = inits.isInitialized("resource") ? new QResource(forProperty("resource")) : null; - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java deleted file mode 100644 index 39ab4679..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java +++ /dev/null @@ -1,53 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QEmailVerificationToken is a Querydsl query type for EmailVerificationToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QEmailVerificationToken extends EntityPathBase { - - private static final long serialVersionUID = -1162432526L; - - public static final QEmailVerificationToken emailVerificationToken = new QEmailVerificationToken("emailVerificationToken"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath email = createString("email"); - - public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); - - public final StringPath password = createString("password"); - - public final StringPath token = createString("token"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final BooleanPath verified = createBoolean("verified"); - - public QEmailVerificationToken(String variable) { - super(EmailVerificationToken.class, forVariable(variable)); - } - - public QEmailVerificationToken(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QEmailVerificationToken(PathMetadata metadata) { - super(EmailVerificationToken.class, metadata); - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java deleted file mode 100644 index 83f4cd1e..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java +++ /dev/null @@ -1,48 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QImage is a Querydsl query type for Image - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QImage extends EntityPathBase { - - private static final long serialVersionUID = -41036853L; - - public static final QImage image = new QImage("image"); - - public final ListPath collections = this.createList("collections", Collection.class, QCollection.class, PathInits.DIRECT2); - - public final NumberPath fileSize = createNumber("fileSize", java.math.BigInteger.class); - - public final StringPath fileType = createString("fileType"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath imageURL = createString("imageURL"); - - public final ListPath users = this.createList("users", User.class, QUser.class, PathInits.DIRECT2); - - public QImage(String variable) { - super(Image.class, forVariable(variable)); - } - - public QImage(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QImage(PathMetadata metadata) { - super(Image.class, metadata); - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java deleted file mode 100644 index 228ad549..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java +++ /dev/null @@ -1,59 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QMemo is a Querydsl query type for Memo - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QMemo extends EntityPathBase { - - private static final long serialVersionUID = -1386685238L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QMemo memo = new QMemo("memo"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath contents = createString("contents"); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final QMemoId id; - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public QMemo(String variable) { - this(Memo.class, forVariable(variable), INITS); - } - - public QMemo(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QMemo(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QMemo(PathMetadata metadata, PathInits inits) { - this(Memo.class, metadata, inits); - } - - public QMemo(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.id = inits.isInitialized("id") ? new QMemoId(forProperty("id")) : null; - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java deleted file mode 100644 index 9874dad6..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QMemoId is a Querydsl query type for MemoId - */ -@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") -public class QMemoId extends BeanPath { - - private static final long serialVersionUID = -1164649595L; - - public static final QMemoId memoId = new QMemoId("memoId"); - - public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); - - public final StringPath userId = createString("userId"); - - public QMemoId(String variable) { - super(MemoId.class, forVariable(variable)); - } - - public QMemoId(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QMemoId(PathMetadata metadata) { - super(MemoId.class, metadata); - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java deleted file mode 100644 index b1c17280..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java +++ /dev/null @@ -1,61 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QPasswordResetToken is a Querydsl query type for PasswordResetToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QPasswordResetToken extends EntityPathBase { - - private static final long serialVersionUID = -1219280267L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QPasswordResetToken passwordResetToken = new QPasswordResetToken("passwordResetToken"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); - - public final StringPath token = createString("token"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final QUser user; - - public QPasswordResetToken(String variable) { - this(PasswordResetToken.class, forVariable(variable), INITS); - } - - public QPasswordResetToken(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QPasswordResetToken(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QPasswordResetToken(PathMetadata metadata, PathInits inits) { - this(PasswordResetToken.class, metadata, inits); - } - - public QPasswordResetToken(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java deleted file mode 100644 index 067289e9..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java +++ /dev/null @@ -1,60 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QResource is a Querydsl query type for Resource - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QResource extends EntityPathBase { - - private static final long serialVersionUID = 2055422878L; - - public static final QResource resource = new QResource("resource"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath embeddedUrl = createString("embeddedUrl"); - - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath resourceDetails = createString("resourceDetails"); - - public final NumberPath runtime = createNumber("runtime", Integer.class); - - public final StringPath title = createString("title"); - - public final EnumPath type = createEnum("type", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final StringPath url = createString("url"); - - public QResource(String variable) { - super(Resource.class, forVariable(variable)); - } - - public QResource(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QResource(PathMetadata metadata) { - super(Resource.class, metadata); - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java deleted file mode 100644 index 2ce1b859..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java +++ /dev/null @@ -1,85 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUser is a Querydsl query type for User - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUser extends EntityPathBase { - - private static final long serialVersionUID = -1386433701L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QUser user = new QUser("user"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final DatePath birthDay = createDate("birthDay", java.time.LocalDate.class); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath email = createString("email"); - - public final EnumPath gender = createEnum("gender", learningFlow.learningFlow_BE.domain.enums.Gender.class); - - public final QImage image; - - public final BooleanPath inactive = createBoolean("inactive"); - - public final ListPath> interestFields = this.>createList("interestFields", learningFlow.learningFlow_BE.domain.enums.InterestField.class, EnumPath.class, PathInits.DIRECT2); - - public final EnumPath job = createEnum("job", learningFlow.learningFlow_BE.domain.enums.Job.class); - - public final StringPath loginId = createString("loginId"); - - public final StringPath name = createString("name"); - - public final EnumPath preferType = createEnum("preferType", learningFlow.learningFlow_BE.domain.enums.MediaType.class); - - public final StringPath providerId = createString("providerId"); - - public final StringPath pw = createString("pw"); - - public final EnumPath role = createEnum("role", learningFlow.learningFlow_BE.domain.enums.Role.class); - - public final EnumPath socialType = createEnum("socialType", learningFlow.learningFlow_BE.domain.enums.SocialType.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); - - public QUser(String variable) { - this(User.class, forVariable(variable), INITS); - } - - public QUser(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QUser(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QUser(PathMetadata metadata, PathInits inits) { - this(User.class, metadata, inits); - } - - public QUser(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; - } - -} - diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java deleted file mode 100644 index ffa8f829..00000000 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java +++ /dev/null @@ -1,58 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUserCollection is a Querydsl query type for UserCollection - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUserCollection extends EntityPathBase { - - private static final long serialVersionUID = -1884551079L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QUserCollection userCollection = new QUserCollection("userCollection"); - - public final QCollection collection; - - public final NumberPath id = createNumber("id", Long.class); - - public final DatePath lastAccessedAt = createDate("lastAccessedAt", java.time.LocalDate.class); - - public final QUser user; - - public final NumberPath userCollectionStatus = createNumber("userCollectionStatus", Integer.class); - - public QUserCollection(String variable) { - this(UserCollection.class, forVariable(variable), INITS); - } - - public QUserCollection(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QUserCollection(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QUserCollection(PathMetadata metadata, PathInits inits) { - this(UserCollection.class, metadata, inits); - } - - public QUserCollection(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; - this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; - } - -} - From 80f24745a2d0a9212d153e16d83a17eb253122bb Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:43:02 +0900 Subject: [PATCH 006/256] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A1=9C=20Collection=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=20resource=EC=9D=98=20=EC=A0=95=EB=B3=B4=20=EB=8B=B4=EC=9D=84?= =?UTF-8?q?=20DTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/resource/ResourceResponseDTO.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 96d0e9f5..4a29e750 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -14,4 +14,15 @@ public class ResourceResponseDTO { public static class ResourceUrlDTO { String embeddedUrl; } + + @Getter + @AllArgsConstructor + @NoArgsConstructor + @Builder + public static class SearchResultResourceDTO { + String episodeName; + String url; + String resourceSource; + Integer episodeNumber; + } } From 90820eb4cf11381c539ec931e5ee8115f933e95e Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:43:16 +0900 Subject: [PATCH 007/256] =?UTF-8?q?feat=20:=20ResourceType=EC=97=90=20Gett?= =?UTF-8?q?er=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/enums/ResourceType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java index 77b2808f..555fbf48 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java @@ -1,5 +1,8 @@ package learningFlow.learningFlow_BE.domain.enums; +import lombok.Getter; + +@Getter public enum ResourceType { VIDEO, TEXT } From 4bdc2e104e135c0141d06fe789dd895610936ecb Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:45:32 +0900 Subject: [PATCH 008/256] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A1=9C=20=EB=B3=B4=EC=97=AC=EC=A4=84=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EC=97=90=20=EB=8B=B4=EC=9D=84?= =?UTF-8?q?=EA=B0=92=EB=93=A4=EC=9D=B4=20=EC=B6=94=EA=B0=80=EB=90=A8?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=9D=B4=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EC=B6=B0=20=ED=95=84=EB=93=9C=20=EB=B3=80=ED=99=98=ED=95=B4?= =?UTF-8?q?=EC=A3=BC=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=93=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.=20Collection=EC=9D=98=20=EB=B6=84=EC=95=BC,?= =?UTF-8?q?=20Collection=20=EB=82=B4=EB=B6=80=20Resource=EB=93=A4=EC=9D=98?= =?UTF-8?q?=20=EB=A7=A4=EC=B2=B4=20=EA=B0=AF=EC=88=98,=20Collection=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20Resource=EC=9D=98=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/SearchConverter.java | 60 +++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java index 62ff59fe..83cf672e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java @@ -3,7 +3,9 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.domain.Resource; -import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; @@ -13,13 +15,15 @@ public class SearchConverter { public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( String keyword, - MediaType mediaType, + List interestFields, + Integer preferMediaType, List difficulties, List amounts ) { return SearchRequestDTO.SearchConditionDTO.builder() .keyword(keyword) - .mediaType(mediaType) + .interestFields(interestFields) + .preferMediaType(preferMediaType) .difficulties(difficulties) .amounts(amounts) .build(); @@ -44,15 +48,63 @@ public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Coll int totalHours = (int) Math.ceil(totalSeconds / 3600); + Integer textCount = countResourcesByType(collection,ResourceType.TEXT); + + Integer videoCount = countResourcesByType(collection, ResourceType.VIDEO); + + List resourceDTOList = getResourceDTOList(collection); + return SearchResponseDTO.CollectionPreviewDTO.builder() .id(collection.getId()) + .interestField(collection.getInterestField()) .title(collection.getTitle()) .creator(collection.getCreator()) .keywords(collection.getKeywords()) .difficulties(collection.getDifficulty()) - .mediaType(collection.getMediaType()) .amount(collection.getAmount()) .runtime(totalHours) + .textCount(textCount) + .videoCount(videoCount) + .resource(resourceDTOList) .build(); } + + private static List getResourceDTOList(Collection collection) { + + return collection.getEpisodes().stream() + .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .build()) + .toList(); + + } + + private static String extractResourceSource(String url) { + + String lowerCaseUrl = url.toLowerCase(); + + if (lowerCaseUrl.contains("youtube")) { + return "youtube"; + } else if (lowerCaseUrl.contains("brunch")) { + return "brunch"; + } else if (lowerCaseUrl.contains("naver")) { + return "naverBlog"; + } else if (lowerCaseUrl.contains("tistory")) { + return "tistory"; + } else { + return "unknown"; + } + } + + private static int countResourcesByType(Collection collection, ResourceType type) { + return (int) collection.getEpisodes().stream() + .map(CollectionEpisode::getResource) + .filter(resource -> resource.getType() == type) + .count(); + } + + } From 1cc55eedefb0e3c4bee459054d660d10ada0be10 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:46:33 +0900 Subject: [PATCH 009/256] =?UTF-8?q?feat=20:=20=EA=B4=80=EC=8B=AC=20?= =?UTF-8?q?=EB=B6=84=EC=95=BC=EC=97=90=20=EB=94=B0=EB=9D=BC=20Collection?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=EB=A7=81=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EB=A7=A4=EC=B2=B4=20=EC=84=A0=ED=98=B8=EB=8F=84?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=EB=A7=81=20=EA=B0=92=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/SearchRepositoryImpl.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java index d87b90b0..64439a42 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java @@ -1,13 +1,12 @@ package learningFlow.learningFlow_BE.repository.search; -import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.PageHandler; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.QCollectionEpisode; -import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -32,20 +31,29 @@ public List searchCollections(SearchRequestDTO.SearchConditionDTO co BooleanExpression cursorExp = createCursorExp(lastId); BooleanExpression keywordExp = createDynamicKeyword(condition.getKeyword()); - BooleanExpression mediaTypeExp = createDynamicMediaType(condition.getMediaType()); + BooleanExpression interestFieldExp = createDynamicInterestFields(condition.getInterestFields()); + BooleanExpression preferMediaTypeExp = createDynamicPreferMediaType(condition.getPreferMediaType()); BooleanExpression difficultyExp = createDynamicDifficulty(condition.getDifficulties()); BooleanExpression amountExp = createDynamicAmount(condition.getAmounts()); return jpaQueryFactory .select(episode.collection) .from(episode) - .where(cursorExp, keywordExp, mediaTypeExp, difficultyExp, amountExp) + .where(cursorExp, keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) .groupBy(episode.collection.id) - .orderBy(episode.collection.id.desc()) + .orderBy(episode.collection.resourceTypeRatio.desc()) .limit(pageable.getPageSize()) .fetch(); } + private BooleanExpression createDynamicInterestFields(List interestFields) { + if (interestFields == null) { + return null; + } + + return episode.collection.interestField.in(interestFields); + } + private BooleanExpression createCursorExp(Long lastId) { if (lastId == 0L) return null; return episode.collection.id.lt(lastId); @@ -62,12 +70,19 @@ private BooleanExpression createDynamicKeyword(String keyword) { .or(episode.episodeName.containsIgnoreCase(keyword)); } - private BooleanExpression createDynamicMediaType(MediaType mediaType) { - if (mediaType == null || mediaType == MediaType.NO_PREFERENCE) { + private BooleanExpression createDynamicPreferMediaType(Integer preferMediaType) { + + if (preferMediaType == null) { return null; } - return episode.collection.mediaType.eq(mediaType); + return switch (preferMediaType) { + case 1 -> episode.collection.resourceTypeRatio.eq(0); + case 2 -> episode.collection.resourceTypeRatio.loe(50); + case 4 -> episode.collection.resourceTypeRatio.goe(50); + case 5 -> episode.collection.resourceTypeRatio.eq(100); + default -> null; + }; } private BooleanExpression createDynamicDifficulty(List difficulties) { From aee5f9570f9fe9e720a87eeb781f7e49d4bdbdea Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:47:37 +0900 Subject: [PATCH 010/256] =?UTF-8?q?feat=20:=20=ED=95=84=ED=84=B0=EB=A7=81?= =?UTF-8?q?=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=ED=95=B4=EB=8B=B9=20=EA=B0=92=20=EB=B0=9B=EC=9D=84?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/dto/search/SearchRequestDTO.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java index 0ee05861..e6680fab 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java @@ -1,6 +1,6 @@ package learningFlow.learningFlow_BE.web.dto.search; -import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; import lombok.Builder; import lombok.Getter; @@ -12,7 +12,8 @@ public class SearchRequestDTO { @Builder public static class SearchConditionDTO { private String keyword; - private MediaType mediaType; + private List interestFields; + private Integer preferMediaType; private List difficulties; private List amounts; } From e74c2ea9a1ff2fa042224d43cbb961f2a065e18a Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:48:40 +0900 Subject: [PATCH 011/256] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=B4?= =?UTF-8?q?=EC=A4=84=20=ED=95=84=EB=93=9C=EB=93=A4=20=EC=9A=94=EA=B5=AC=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80.=20interestField,=20text=20=EA=B0=9C=EC=88=98,=20vide?= =?UTF-8?q?o=20=EA=B0=9C=EC=88=98,=20=EA=B0=81=20=ED=9A=8C=EC=B0=A8?= =?UTF-8?q?=EC=9D=98=20resource=20=EC=A0=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/dto/search/SearchResponseDTO.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java index 02c9f97e..fcecc715 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java @@ -1,6 +1,7 @@ package learningFlow.learningFlow_BE.web.dto.search; -import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -26,12 +27,15 @@ public static class SearchResultDTO { @AllArgsConstructor public static class CollectionPreviewDTO { Long id; + InterestField interestField; String title; String creator; List keywords; List difficulties; - MediaType mediaType; Integer amount; Integer runtime; + Integer textCount; + Integer videoCount; + List resource; } } From 2ce45b5ca2a582bab833c96d25ee9921cefeb733 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:48:53 +0900 Subject: [PATCH 012/256] =?UTF-8?q?feat=20:=20=ED=95=84=ED=84=B0=EB=A7=81?= =?UTF-8?q?=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/SearchRestController.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java index 3b938b74..41435052 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java @@ -9,12 +9,9 @@ import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; import learningFlow.learningFlow_BE.converter.SearchConverter; -import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.service.search.SearchService; import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; -import learningFlow.learningFlow_BE.domain.enums.MediaType; -import learningFlow.learningFlow_BE.validation.annotation.CheckPage; -import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -43,18 +40,20 @@ public class SearchRestController { }) @Parameters({ @Parameter(name = "keyword", description = "검색어 (컬렉션 제목, 크리에이터, 키워드, 에피소드 제목)"), - @Parameter(name = "mediaType", description = "미디어 타입 필터 (VIDEO, TEXT)"), + @Parameter(name = "InterestField", description = "검색할 관심 분야"), + @Parameter(name = "preferMediaType", description = "미디어 타입 필터 (1: 텍스트만, 2 : 텍스트 선호, 3: 상관 없음, 4: 영상 선호, 5: 영상만)"), @Parameter(name = "difficulties", description = "난이도 필터 (1: 입문, 2: 초급, 3: 중급, 4: 실무)"), @Parameter(name = "amounts", description = "강의량 필터 (SHORT(1-5), MEDIUM(5-10), LONG(11이상)"), @Parameter(name = "lastId", description = "마지막으로 조회된 컬렉션의 ID (첫 페이지는 0)") }) public ApiResponse searchEpisodes( @RequestParam(required = false) String keyword, - @RequestParam(required = false) MediaType mediaType, + @RequestParam(required = false) List interestFields, + @RequestParam(required = false) Integer preferMediaType, @RequestParam(required = false) List difficulties, @RequestParam(required = false) List amounts, @RequestParam(required = false, defaultValue = "0") Long lastId ) { - return ApiResponse.onSuccess(searchService.search(SearchConverter.toSearchConditionDTO(keyword, mediaType, difficulties, amounts), lastId)); + return ApiResponse.onSuccess(searchService.search(SearchConverter.toSearchConditionDTO(keyword, interestFields, preferMediaType, difficulties, amounts), lastId)); } } From 1d42e155cf8e79d5efb1f7a40594afc4ba681b2c Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:49:03 +0900 Subject: [PATCH 013/256] =?UTF-8?q?feat=20:=20Getter=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow/learningFlow_BE/domain/enums/SocialType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java index 8c20e574..a037123c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java @@ -1,5 +1,8 @@ package learningFlow.learningFlow_BE.domain.enums; +import lombok.Getter; + +@Getter public enum SocialType { GOOGLE, LOCAL } From 5ade0e052e95f82c5f9a0ec9881967817beba26f Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:50:06 +0900 Subject: [PATCH 014/256] =?UTF-8?q?feat=20:=20QueryDsl=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QBaseEntity.java | 39 +++++++++ .../learningFlow_BE/domain/QCollection.java | 79 +++++++++++++++++ .../domain/QCollectionEpisode.java | 58 +++++++++++++ .../domain/QEmailVerificationToken.java | 53 ++++++++++++ .../learningFlow_BE/domain/QImage.java | 48 +++++++++++ .../learningFlow_BE/domain/QMemo.java | 59 +++++++++++++ .../learningFlow_BE/domain/QMemoId.java | 39 +++++++++ .../domain/QPasswordResetToken.java | 61 +++++++++++++ .../learningFlow_BE/domain/QResource.java | 60 +++++++++++++ .../learningFlow_BE/domain/QUser.java | 85 +++++++++++++++++++ .../domain/QUserCollection.java | 58 +++++++++++++ 11 files changed, 639 insertions(+) create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java new file mode 100644 index 00000000..dd141e5b --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java @@ -0,0 +1,39 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = -301952604L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java new file mode 100644 index 00000000..34f40a27 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java @@ -0,0 +1,79 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QCollection is a Querydsl query type for Collection + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCollection extends EntityPathBase { + + private static final long serialVersionUID = -819230162L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QCollection collection = new QCollection("collection"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath amount = createNumber("amount", Integer.class); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath creator = createString("creator"); + + public final StringPath detailInformation = createString("detailInformation"); + + public final ListPath> difficulty = this.>createList("difficulty", Integer.class, NumberPath.class, PathInits.DIRECT2); + + public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); + + public final NumberPath id = createNumber("id", Long.class); + + public final QImage image; + + public final EnumPath interestField = createEnum("interestField", learningFlow.learningFlow_BE.domain.enums.InterestField.class); + + public final ListPath keywords = this.createList("keywords", String.class, StringPath.class, PathInits.DIRECT2); + + public final NumberPath resourceTypeRatio = createNumber("resourceTypeRatio", Integer.class); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); + + public QCollection(String variable) { + this(Collection.class, forVariable(variable), INITS); + } + + public QCollection(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QCollection(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QCollection(PathMetadata metadata, PathInits inits) { + this(Collection.class, metadata, inits); + } + + public QCollection(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java new file mode 100644 index 00000000..a0cd685b --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java @@ -0,0 +1,58 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QCollectionEpisode is a Querydsl query type for CollectionEpisode + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCollectionEpisode extends EntityPathBase { + + private static final long serialVersionUID = -297427987L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QCollectionEpisode collectionEpisode = new QCollectionEpisode("collectionEpisode"); + + public final QCollection collection; + + public final StringPath episodeName = createString("episodeName"); + + public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final QResource resource; + + public QCollectionEpisode(String variable) { + this(CollectionEpisode.class, forVariable(variable), INITS); + } + + public QCollectionEpisode(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QCollectionEpisode(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QCollectionEpisode(PathMetadata metadata, PathInits inits) { + this(CollectionEpisode.class, metadata, inits); + } + + public QCollectionEpisode(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; + this.resource = inits.isInitialized("resource") ? new QResource(forProperty("resource")) : null; + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java new file mode 100644 index 00000000..39ab4679 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java @@ -0,0 +1,53 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QEmailVerificationToken is a Querydsl query type for EmailVerificationToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QEmailVerificationToken extends EntityPathBase { + + private static final long serialVersionUID = -1162432526L; + + public static final QEmailVerificationToken emailVerificationToken = new QEmailVerificationToken("emailVerificationToken"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); + + public final StringPath password = createString("password"); + + public final StringPath token = createString("token"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final BooleanPath verified = createBoolean("verified"); + + public QEmailVerificationToken(String variable) { + super(EmailVerificationToken.class, forVariable(variable)); + } + + public QEmailVerificationToken(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QEmailVerificationToken(PathMetadata metadata) { + super(EmailVerificationToken.class, metadata); + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java new file mode 100644 index 00000000..83f4cd1e --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java @@ -0,0 +1,48 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QImage is a Querydsl query type for Image + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QImage extends EntityPathBase { + + private static final long serialVersionUID = -41036853L; + + public static final QImage image = new QImage("image"); + + public final ListPath collections = this.createList("collections", Collection.class, QCollection.class, PathInits.DIRECT2); + + public final NumberPath fileSize = createNumber("fileSize", java.math.BigInteger.class); + + public final StringPath fileType = createString("fileType"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath imageURL = createString("imageURL"); + + public final ListPath users = this.createList("users", User.class, QUser.class, PathInits.DIRECT2); + + public QImage(String variable) { + super(Image.class, forVariable(variable)); + } + + public QImage(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QImage(PathMetadata metadata) { + super(Image.class, metadata); + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java new file mode 100644 index 00000000..228ad549 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java @@ -0,0 +1,59 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemo is a Querydsl query type for Memo + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemo extends EntityPathBase { + + private static final long serialVersionUID = -1386685238L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemo memo = new QMemo("memo"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath contents = createString("contents"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final QMemoId id; + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMemo(String variable) { + this(Memo.class, forVariable(variable), INITS); + } + + public QMemo(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemo(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemo(PathMetadata metadata, PathInits inits) { + this(Memo.class, metadata, inits); + } + + public QMemo(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.id = inits.isInitialized("id") ? new QMemoId(forProperty("id")) : null; + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java new file mode 100644 index 00000000..9874dad6 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java @@ -0,0 +1,39 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMemoId is a Querydsl query type for MemoId + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QMemoId extends BeanPath { + + private static final long serialVersionUID = -1164649595L; + + public static final QMemoId memoId = new QMemoId("memoId"); + + public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); + + public final StringPath userId = createString("userId"); + + public QMemoId(String variable) { + super(MemoId.class, forVariable(variable)); + } + + public QMemoId(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMemoId(PathMetadata metadata) { + super(MemoId.class, metadata); + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java new file mode 100644 index 00000000..b1c17280 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java @@ -0,0 +1,61 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QPasswordResetToken is a Querydsl query type for PasswordResetToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPasswordResetToken extends EntityPathBase { + + private static final long serialVersionUID = -1219280267L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QPasswordResetToken passwordResetToken = new QPasswordResetToken("passwordResetToken"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); + + public final StringPath token = createString("token"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final QUser user; + + public QPasswordResetToken(String variable) { + this(PasswordResetToken.class, forVariable(variable), INITS); + } + + public QPasswordResetToken(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QPasswordResetToken(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QPasswordResetToken(PathMetadata metadata, PathInits inits) { + this(PasswordResetToken.class, metadata, inits); + } + + public QPasswordResetToken(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java new file mode 100644 index 00000000..067289e9 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java @@ -0,0 +1,60 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QResource is a Querydsl query type for Resource + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResource extends EntityPathBase { + + private static final long serialVersionUID = 2055422878L; + + public static final QResource resource = new QResource("resource"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath embeddedUrl = createString("embeddedUrl"); + + public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath resourceDetails = createString("resourceDetails"); + + public final NumberPath runtime = createNumber("runtime", Integer.class); + + public final StringPath title = createString("title"); + + public final EnumPath type = createEnum("type", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final StringPath url = createString("url"); + + public QResource(String variable) { + super(Resource.class, forVariable(variable)); + } + + public QResource(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResource(PathMetadata metadata) { + super(Resource.class, metadata); + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java new file mode 100644 index 00000000..2ce1b859 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java @@ -0,0 +1,85 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QUser is a Querydsl query type for User + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUser extends EntityPathBase { + + private static final long serialVersionUID = -1386433701L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QUser user = new QUser("user"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final DatePath birthDay = createDate("birthDay", java.time.LocalDate.class); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final EnumPath gender = createEnum("gender", learningFlow.learningFlow_BE.domain.enums.Gender.class); + + public final QImage image; + + public final BooleanPath inactive = createBoolean("inactive"); + + public final ListPath> interestFields = this.>createList("interestFields", learningFlow.learningFlow_BE.domain.enums.InterestField.class, EnumPath.class, PathInits.DIRECT2); + + public final EnumPath job = createEnum("job", learningFlow.learningFlow_BE.domain.enums.Job.class); + + public final StringPath loginId = createString("loginId"); + + public final StringPath name = createString("name"); + + public final EnumPath preferType = createEnum("preferType", learningFlow.learningFlow_BE.domain.enums.MediaType.class); + + public final StringPath providerId = createString("providerId"); + + public final StringPath pw = createString("pw"); + + public final EnumPath role = createEnum("role", learningFlow.learningFlow_BE.domain.enums.Role.class); + + public final EnumPath socialType = createEnum("socialType", learningFlow.learningFlow_BE.domain.enums.SocialType.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); + + public QUser(String variable) { + this(User.class, forVariable(variable), INITS); + } + + public QUser(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QUser(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QUser(PathMetadata metadata, PathInits inits) { + this(User.class, metadata, inits); + } + + public QUser(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java new file mode 100644 index 00000000..ffa8f829 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java @@ -0,0 +1,58 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QUserCollection is a Querydsl query type for UserCollection + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUserCollection extends EntityPathBase { + + private static final long serialVersionUID = -1884551079L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QUserCollection userCollection = new QUserCollection("userCollection"); + + public final QCollection collection; + + public final NumberPath id = createNumber("id", Long.class); + + public final DatePath lastAccessedAt = createDate("lastAccessedAt", java.time.LocalDate.class); + + public final QUser user; + + public final NumberPath userCollectionStatus = createNumber("userCollectionStatus", Integer.class); + + public QUserCollection(String variable) { + this(UserCollection.class, forVariable(variable), INITS); + } + + public QUserCollection(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QUserCollection(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QUserCollection(PathMetadata metadata, PathInits inits) { + this(UserCollection.class, metadata, inits); + } + + public QUserCollection(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; + this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; + } + +} + From 82ffe87af6ebc339f88e9feee5c92e6d94e9afd0 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 16:53:27 +0900 Subject: [PATCH 015/256] =?UTF-8?q?=EA=B0=81=EC=A2=85=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 429694 -> 910423 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 39997 -> 77065 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 26147 -> 31757 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../buildOutputCleanup/outputFiles.bin | Bin 19415 -> 20099 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 8 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin index 10ba61846b4459c1abc9df67f58c43512ca0c538..1031d43020179fe0d3350e3a2e0a62cef5276f19 100644 GIT binary patch literal 910423 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 z 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≥RGhKGOVwYVMh~FA`oV7wK29Np2C~4Ltm9H^ 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

v21Y+2LNK}F8 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

9fk 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�d_T{A_x)-E{NzWZ{)q@8 zwC)d|05hwr$~DbPwx_2EP39El!!nC2B*+b1+2qkNn4xWHu1a}AyS6>!b+E2%*iQx_ z+dj4m?;p2{cWFhBpXw9@Xs?hku!0E?iJ&!y&^n>fwk5K+ecmM5E_Jd$A|2ad4QF|% z@D70E8$UQK^d2$gr6m3y;W^}JD%#2$fB0PR^A3OYiAM?c^_}EmL*gEk2y~70x=1&@ ZTP_y5t5?0~z2g8281x@ej8VfC{{wBR>s0^% delta 620 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 delta 389 zcmWO1JuCxZ7{GDu&Q|vx{W^7}^xS*>Ld#%kJDiOTXE3r61_pZ*$v?H#A`**)G;BT= zofvB~kQkd-h=q8DU!G_CKTqQ)bovy!%&TzU8@^KPiwmW(O_OD_iZi5Wh})ran!_I7 z!!Gkt#b(swCVI|J%%B^qQ;HjG#5G@Wg`LoBCKT5qlGJP`19~!j%j4Kmbi}vi(i&N3 zFtx^6YLC)rKxfpY-&QP%XS>EqI-r}bQ5@5}j_uMK4{$P?Mn=)i1o#t*=0t!!skxp! zVms?`mo?~R>nu73`;JM+k(NkLX||?ZK4h-A@{fq=8cnTu)VghZR*2P{!CB7aC0E7I z*XiUH1BG2q3Yx#dJ>8;2OA-~YC6DFlHGZcb=*^hKXBCU$V75wsSutN;=ceousYtL= b=dL1$$?ne`h9j9P>&Lj#pW*gG?LGDn6~K^a diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 8b7496e541a8f99835210d47043ff09f075c760c..8bb47045479c8a536de6077d5a6c27a2aa717920 100644 GIT binary patch literal 17 VcmZS9*uy@Xee#Fp3}C=m1^_H&1Tp{s literal 17 UcmZS9*uy@Xee#Fp3=q%{04#h2N&o-= diff --git a/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin b/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin index 90e24392cdf42e35ee74ca9b29e1ae383c1bcbc3..0fc3f40034e366214600d0213d338fade115d646 100644 GIT binary patch delta 949 zcmcaUow0c?;|3E6$H<1bKdUZT_17|hfp_hHC}@i4;85HnTmljIV}*;azH#?#Nqa6t z+*fz9tAv6;EBnTGEBU{jh8psFa;$_Uzq#?p83JD-AYwl0lY1pH`74gp_wT&B;2Ff*J=m zt)1Dp#aIBU_cBb)k&+)%MZ@i7p?ZBMn@TDOTuu}5K4hMA6RMbZvae)=#^da!hPd!r zW{9BgOqdBTq<>9FyLW#hRPp-BM0783{}iI*;cASKy>k5*4626#UO&- z*C%h43eb>c{kCeRWCqmnK67ElDiocx;0m^13pL^VizrJTJhzd{A=VTzTP z%I9ytoe=^Rm!2#t-JoHZmb6kV*zyQO(B~;kvEj-SlCz!IpwZ#uJh@l8kv~!3$f~_i zmofMlPG*&{&~RUCyQ-+=#~O$Me%3Gp+|Q>wd=vo6@Q3tG}yqu+0kPf^W=Q5(8&oNb(7`1b0!;jPni7A6NJrxV&VYm?2jk_ delta 137 zcmZpk%Xob{;|3E6LF0zFKdUZT_17|hfp_iXQVE60Yb6XPf0IaP<1zWE3{XzCV)9kl%E@VR`jd~!NlfOI_n4e3FEM#85Q{2E eOm)3=AwcH!A)R-)P_UJFf3H$?J literal 8 PcmZQzV4Tu+UCs#r2n_;L From 4c7afa1662d2e97eacd770951962920a85b76065 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 17:13:22 +0900 Subject: [PATCH 016/256] =?UTF-8?q?style=20:=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/auth/oauth/OAuth2UserRegistrationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java index 873dee3d..6c70341a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java @@ -97,7 +97,7 @@ public UserResponseDTO.UserLoginResponseDTO updateAdditionalInfo( log.info("Access 토큰 발급 : {}", accessToken); String refreshToken = jwtTokenProvider.createRefreshToken(authentication); - response.addHeader("Refersh-Token", refreshToken); + response.addHeader("Refresh-Token", refreshToken); log.info("자동 로그인 활성화, Refresh Token 발급 : {}", refreshToken); //임시 토큰 블랙리스트에 저장 From d1d30d4f2f6b944e000c7178e4b77150ca5063d4 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 17:49:50 +0900 Subject: [PATCH 017/256] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EB=A7=81=EC=97=90=EC=84=9C=20=EA=B4=80?= =?UTF-8?q?=EC=8B=AC=EB=B6=84=EC=95=BC=201=EA=B0=9C=EB=A7=8C=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=9E=88=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/SearchConverter.java | 2 +- .../repository/search/SearchRepositoryImpl.java | 4 ++-- .../learningFlow_BE/web/controller/SearchRestController.java | 2 +- .../learningFlow_BE/web/dto/search/SearchRequestDTO.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java index 83cf672e..2bea8bb4 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java @@ -15,7 +15,7 @@ public class SearchConverter { public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( String keyword, - List interestFields, + InterestField interestFields, Integer preferMediaType, List difficulties, List amounts diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java index 64439a42..8359ab81 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java @@ -46,12 +46,12 @@ public List searchCollections(SearchRequestDTO.SearchConditionDTO co .fetch(); } - private BooleanExpression createDynamicInterestFields(List interestFields) { + private BooleanExpression createDynamicInterestFields(InterestField interestFields) { if (interestFields == null) { return null; } - return episode.collection.interestField.in(interestFields); + return episode.collection.interestField.eq(interestFields); } private BooleanExpression createCursorExp(Long lastId) { diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java index 41435052..bd4e195a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java @@ -48,7 +48,7 @@ public class SearchRestController { }) public ApiResponse searchEpisodes( @RequestParam(required = false) String keyword, - @RequestParam(required = false) List interestFields, + @RequestParam(required = false) InterestField interestFields, @RequestParam(required = false) Integer preferMediaType, @RequestParam(required = false) List difficulties, @RequestParam(required = false) List amounts, diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java index e6680fab..847fe591 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java @@ -12,7 +12,7 @@ public class SearchRequestDTO { @Builder public static class SearchConditionDTO { private String keyword; - private List interestFields; + private InterestField interestFields; private Integer preferMediaType; private List difficulties; private List amounts; From 59d5008c663a5526828289c5be7d64d80423439b Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 22:28:45 +0900 Subject: [PATCH 018/256] Remove .gradle files from tracking --- learningFlow/.DS_Store | Bin 6148 -> 0 bytes .../.gradle/8.11.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/checksums/md5-checksums.bin | Bin 41347 -> 0 bytes .../8.11.1/checksums/sha1-checksums.bin | Bin 95333 -> 0 bytes .../executionHistory/executionHistory.bin | Bin 910423 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 77065 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 31757 -> 0 bytes learningFlow/.gradle/8.11.1/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 -- .../.gradle/buildOutputCleanup/outputFiles.bin | Bin 20099 -> 0 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 0 bytes learningFlow/.gradle/vcs-1/gc.properties | 0 16 files changed, 2 deletions(-) delete mode 100644 learningFlow/.DS_Store delete mode 100644 learningFlow/.gradle/8.11.1/checksums/checksums.lock delete mode 100644 learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/checksums/sha1-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileChanges/last-build.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin delete mode 100644 learningFlow/.gradle/8.11.1/gc.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 learningFlow/.gradle/buildOutputCleanup/cache.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 learningFlow/.gradle/file-system.probe delete mode 100644 learningFlow/.gradle/vcs-1/gc.properties diff --git a/learningFlow/.DS_Store b/learningFlow/.DS_Store deleted file mode 100644 index 6ae37d3a3c48ab4ed538004cca55a91b4e0fa156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%SyvQ6rE|SO({Ya3SADkE!b-Cftyh44;ayfN=;1BV9b;xHH%WnT7Sqd@q4^? zW&#$o7P0rj%(>5*%z?~%uMXB z1AcpxWh`Y6LGk_j<0#7qgHPUQwl+4~R@>@YcixjMyxh;{*~m|C(7Kc|4l3ObuA*r% zvA54;lKW9IO;te@P9f#?I!Z!WjO08CGga&9fYq@&6T7!qIL=XD92^gqeX%&%AM}ND z=q#5VYiD=w^kVWHza;Wa)5(EtC0hn7cn8I-=G9A+SSF9)sj{mqLSldzAO?tm^=81F z3s!f%X`s~;1H?cL1Gqm3Xo#-CQlr{Bpu_7k##@LepyOKtQ5bX$mKq@f!gVR2F6HKl z!F4(Kg~@XbmKt?A<7#FY$IM(kUbvba{6eKO?rNl-7$62#8E9(L#`FIiewo@w{%Q$X z!~iky&lupXu{R#UqRiR)V|jSi3TXGxP%y7V1qAe!O8^+SkMvYf#|7$;=Nc?E;wb1> Q<$!b%P=ruN4EzEEUx!3Vi2wiq diff --git a/learningFlow/.gradle/8.11.1/checksums/checksums.lock b/learningFlow/.gradle/8.11.1/checksums/checksums.lock deleted file mode 100644 index 63e0cd500da796398d36dd917b3317edc08e45de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS1EmnK{d1>KI1~6b<1^_yu1$qDg diff --git a/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin b/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin deleted file mode 100644 index e1270cf78a2cc9a74024893bc66f72bf92c63131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41347 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

DfV;vvP^#+kcwY3{ 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 z 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≥RGhKGOVwYVMh~FA`oV7wK29Np2C~4Ltm9H^ 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

v21Y+2LNK}F8 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

9fk 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 diff --git a/learningFlow/.gradle/8.11.1/gc.properties b/learningFlow/.gradle/8.11.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 8bb47045479c8a536de6077d5a6c27a2aa717920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS9*uy@Xee#Fp3}C=m1^_H&1Tp{s diff --git a/learningFlow/.gradle/buildOutputCleanup/cache.properties b/learningFlow/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index a5e72f1b..00000000 --- a/learningFlow/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 09 13:28:54 KST 2025 -gradle.version=8.11.1 diff --git a/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin b/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 0fc3f40034e366214600d0213d338fade115d646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20099 zcmeI&e^AVM7{Ku*DUp8NW-DE}F0P|<-5w=e3fb+uTiB9r$c5WoN=>Ppxk81Ap;I@t z{cz|Svt@IMV~&ssHKfu}rem*S26x>Y(GQF+_j#VLx!HeAbIlm@>`e8Y*FO8~e&73@ z?T?x#5Qr@M;U;)}6TUvABPu`zr~nn90#twsPys4H1*iZOpaN8Y3Qz$mKn17(6`%rC z;9V&YGH@bh>|{h!hQB(n*dP#mI%eP?Y)klylIz}kliA%|GXDJ_b?FY%31@8LnFkv4 zUfOcIEDW>Wr_)}s3g?0=5FJ+auM%48utuk;c69*3)& zO=3>nVe^um=$W44N4b_ymNJ*Ac;7P1%h5k_9L#s1fA?#z`=8?Tjm)Kb^n#E>8N233 z*D&WQ&<{9f`2|IpS%ACn{!MjK)J4Z>%;jCYUpMZ&RFkgv& z$SQT;^Om9%n4iu2riQbZAMcn6^Q+Lc+IvQcLBU={EEx<$K%(&!}6l#~l5J(aJWe0QlDD)A|osZX?(5qliG5W}J;T65L_g90bppUk1 zx7KN+5|~R(c$ch8*Yud?!F&w5d2WAcgVZYx=5x@6MU}>-s!m(xTr;}uiHC(Q9ibWE z7t!tFbj`nYIeY^9IduEh-5-S9z4jT*N1{6#cb91F)Np;u3elb8YQ4-9J~}opuScJ7 z@k>vq7n~pL??iX8Ew-P_ZF~yzKD-w@#hh$a2ZKAHf7re~$igP*GIQx^bXWhER*G5v z(XhW2eWEn@f?Cz*%Up5}eNxB6j|jEJG|95 zIdQff{2Ji)qWew}+~2=?nvm_0xy+@b_&g8vbHRrJ+bStfyZPrRb~D<84kw*^g)QlCRN~CS7?+ zQq6kU^8kHq!X%+%v>L9rz;WoY4^B6py1Rcgo0siEk5jZddsL3hXD)B!{fg<)vrl@Q zm`m+=?=|XIdTjK7Jyqxl_WKILb6xwG2TVdwS})FfA`!von>+zMSrfZLwJKvf>~TWJ zp8|pD8g?Ijrvg-f3Qz$mKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#tws zPys4H1*iZOpaN8Y3Qz$mKm~@PfOuf(tAF4h248})|B+YxF3P}Z4bgcGZu8JR%5d}G z#PCWm++#TNCh~vnF?_DUZ63Nu4c%tLbAQ|9Z9Dg&dp(Am4aM-?F`OBk3~uwAJj!t9 GU-<{b^Ne%= diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe deleted file mode 100644 index e357f339c9be4e950182ae0e94f43c49031aa009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4TwS>UJFf3H$?J diff --git a/learningFlow/.gradle/vcs-1/gc.properties b/learningFlow/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29b..00000000 From 55ea3773ad434136e35fc4288a3e7b895e3a99d7 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 23:15:00 +0900 Subject: [PATCH 019/256] Remove .gradle from tracking and update .gitignore --- .../.gradle/8.11.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/checksums/md5-checksums.bin | Bin 41997 -> 0 bytes .../8.11.1/checksums/sha1-checksums.bin | Bin 96791 -> 0 bytes .../executionHistory/executionHistory.bin | Bin 595977 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 76265 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 26827 -> 0 bytes learningFlow/.gradle/8.11.1/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 -- .../.gradle/buildOutputCleanup/outputFiles.bin | Bin 19847 -> 0 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 0 bytes learningFlow/.gradle/vcs-1/gc.properties | 0 15 files changed, 2 deletions(-) delete mode 100644 learningFlow/.gradle/8.11.1/checksums/checksums.lock delete mode 100644 learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/checksums/sha1-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileChanges/last-build.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin delete mode 100644 learningFlow/.gradle/8.11.1/gc.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 learningFlow/.gradle/buildOutputCleanup/cache.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 learningFlow/.gradle/file-system.probe delete mode 100644 learningFlow/.gradle/vcs-1/gc.properties diff --git a/learningFlow/.gradle/8.11.1/checksums/checksums.lock b/learningFlow/.gradle/8.11.1/checksums/checksums.lock deleted file mode 100644 index 1f74cc1695bae529d3803b07dcabbb23f5966326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS1EmnK{d1>KI1~6c~1OPhD1*QN1 diff --git a/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin b/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin deleted file mode 100644 index 9de44878212c5a966db72fc636c23666d8a57a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41997 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

4E+E^zB1~qUH5r=7|H_EUv*yi$UEJEz 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

7nyq(D%I{dR%&~)!{@_qGNKVqb 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 icbVz)?e1E^d{Sx$ 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 b*jK7e{|~xzo@Zjg;2SU7wL!#?G57utG8_!W diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock deleted file mode 100644 index bff1cbd6db8fe3e1d4a3b89acf50224a20ce58ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9y0STQ;)ksv3=m)k06EVD<^TWy diff --git a/learningFlow/.gradle/8.11.1/fileChanges/last-build.bin b/learningFlow/.gradle/8.11.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin deleted file mode 100644 index 37c081bbeb9c67b33dee1e828f84653009d28c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76265 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

PY15r0s@jUXXq5bH+^J|#>@Xuzj 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%0DlbTs=Kk-Skk$kS-|& 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 diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock deleted file mode 100644 index 82d6d142f614f6f98bd24b35c8a270b182dabd50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZSP?6eWNlCPG{00wO403lui_W%F@ diff --git a/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin b/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 8858027cc5fd6036a1196fbf35c21397f611a0bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26827 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 diff --git a/learningFlow/.gradle/8.11.1/gc.properties b/learningFlow/.gradle/8.11.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 029002651286f1e18b028538a515175c518ab0da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9*uy@Xee#Fp3=r@K04(VQw*UYD diff --git a/learningFlow/.gradle/buildOutputCleanup/cache.properties b/learningFlow/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index a5e72f1b..00000000 --- a/learningFlow/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 09 13:28:54 KST 2025 -gradle.version=8.11.1 diff --git a/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin b/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 8be0f275e1a39372a9de71b143022fba16d46df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19847 zcmeI&YfMvT7{Ku&%qoJc5VXLs0|dtunHEdO@KVHj+EW5Ti^I4Y5Cw%{bbw)w0Wvj1 z0w^q?fK#~`*(!0!R2If%ag)fMO|~%Y08Jc&4+wIZ&JOav&oN8CEJPAwo+iM_uTP)$ z{9F2^_2=<~uN&xv_u^vv;t-Fp02aUkSO5!P0W5$8umBdo0$2bGU;!+E1+V}XzyeqR z3t)j)rGRGYM9j&_2v^OUKCn8>p*lw~4b=;O8B4{Q_gnt*E9;mUoU4R~2*K`Pxux$@{@{e>nI>!O_!Ce=SL) zz8<_J?B*9Ar}<~nJyGDL2~iuh5!y}EMc`jAZ*5mj#_y%B0oVB?RbEIe)l=^Rzgnx^ zH9B0~Oq_iRUe(h0!-%iR0G)pbUh||*9C0%{hj_q7@Y;hp>WN8r199ds=S7Q5?RqO5 z>7GjPdWng8G%Myh-Qxh>*i~w9liKd2o&etFUA|tbYNgMMYMk@!m;4gXit@?4;uv^) z++a(Mpj=Mx_at~%nEP6Df%AU4e;fEOrV)uum&}DYBja2*-lLUT3=wAq;P=};*)Y#3 zbcA{scyC@%PWlyNa|_ei|qTXb(dokh%5MSz!38T_H`U z^ZDRQst1Z)`nP8gXK#Vq9ny9GKH{*N?qR|0dorCh4_epK`517gTRXf(&saY?KLozK z?|7hB+hnv@Y|>cCg@4_xaGtvy1VT?f8;aO07J z4Q5TmRcpXKi(|!cLbro-{|De=C+*{h86DPiPdB*NXEvt8I*EjMz(R0ISg*#r$>TZQ zW6Jr&jz+Kd1e@ueKf%4Lc`aUJl5gldutDl>VVmFMN*}+n39j&ozRQa9?C9Gun++~o z#d~xvavlAwmMH|^a>duZFC;yM-tSg$xlq(n7|;KdI1>WC)jyf73{R#1*D6bJ)t>bE z{h4W{WIkXwxH`8+ZLMBPUk}U^aLwIoP0LnlL+QK+_)gJ1r*jQUiixW>a~{)`Viu-{ z_oWWbEBu*BH=9jlUU{AKKZJqb=HH{wi{c~jh%(E(y~T;=$vk@jeD{fXn;WtAZxCnp zfJb}UM*fxemYBGz0sPRN1(n~Aj*EyZ?7$Q3PZwzmTqlVuSAfG`9*=KFuEXD001IFN zEPw^D02aUkSO5!P0W5$8umBdo0$2bGU;!+E1+V}XzyeqR3t#~(fCaDs7Qg~n01IFN zEPw^D02Y}01*X45IsJuy6Z*qj{2!U-S5c-;YnIMyW}9d4R>qrWCdRJ><2}YR|3_Zd b9^?C(+2+~1)$DCHKKHpMbM4$;>f`wr%Y4?X diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe deleted file mode 100644 index d8a548832646b0cc5a52bf75f1d0f84e7dd81aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4TwK_fQA`2h0Lq diff --git a/learningFlow/.gradle/vcs-1/gc.properties b/learningFlow/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29b..00000000 From a197505f0c578da76e803fd39500f939e87f603e Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 21 Jan 2025 23:42:34 +0900 Subject: [PATCH 020/256] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=82=98=ED=83=80=EB=82=BC=EB=95=8C=20=ED=98=84?= =?UTF-8?q?=EC=9E=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=99=80=20=EC=B4=9D=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B0=9C=EC=88=98=20=EB=82=98?= =?UTF-8?q?=ED=83=80=EB=82=B4=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EA=B3=BC=20=ED=95=84=EB=93=9C=EB=93=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/SearchConverter.java | 10 ++++- .../search/SearchRepositoryCustom.java | 2 + .../search/SearchRepositoryImpl.java | 39 ++++++++++++++++++- .../service/search/SearchService.java | 21 +++++++++- .../web/dto/search/SearchResponseDTO.java | 2 + 5 files changed, 70 insertions(+), 4 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java index 2bea8bb4..a6e84b29 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java @@ -29,7 +29,13 @@ public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( .build(); } - public static SearchResponseDTO.SearchResultDTO toSearchResultDTO(List collections, Long lastId, boolean hasNext) { + public static SearchResponseDTO.SearchResultDTO toSearchResultDTO( + List collections, + Long lastId, + boolean hasNext, + int totalPages, + int currentPage + ) { List list = collections.stream().map(SearchConverter::toCollectionPreviewDTO).toList(); @@ -37,6 +43,8 @@ public static SearchResponseDTO.SearchResultDTO toSearchResultDTO(List searchCollections(SearchRequestDTO.SearchConditionDTO condition, Long lastId, Pageable pageable); + Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition); + Integer getCountGreaterThanId(Long lastId, SearchRequestDTO.SearchConditionDTO condition); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java index 8359ab81..60a85a52 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java @@ -41,11 +41,48 @@ public List searchCollections(SearchRequestDTO.SearchConditionDTO co .from(episode) .where(cursorExp, keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) .groupBy(episode.collection.id) - .orderBy(episode.collection.resourceTypeRatio.desc()) + .orderBy(episode.collection.id.desc()) .limit(pageable.getPageSize()) .fetch(); } + @Override + public Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition) { + BooleanExpression keywordExp = createDynamicKeyword(condition.getKeyword()); + BooleanExpression interestFieldExp = createDynamicInterestFields(condition.getInterestFields()); + BooleanExpression preferMediaTypeExp = createDynamicPreferMediaType(condition.getPreferMediaType()); + BooleanExpression difficultyExp = createDynamicDifficulty(condition.getDifficulties()); + BooleanExpression amountExp = createDynamicAmount(condition.getAmounts()); + + Long count = jpaQueryFactory + .select(episode.collection.countDistinct()) + .from(episode) + .where(keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) + .fetchOne(); + + return count != null ? count.intValue() : 0; + } + + @Override + public Integer getCountGreaterThanId(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { + BooleanExpression keywordExp = createDynamicKeyword(condition.getKeyword()); + BooleanExpression interestFieldExp = createDynamicInterestFields(condition.getInterestFields()); + BooleanExpression preferMediaTypeExp = createDynamicPreferMediaType(condition.getPreferMediaType()); + BooleanExpression difficultyExp = createDynamicDifficulty(condition.getDifficulties()); + BooleanExpression amountExp = createDynamicAmount(condition.getAmounts()); + + // lastId보다 큰 ID를 가진 컬렉션만 카운트 + BooleanExpression greaterThanExp = lastId == 0L ? null : episode.collection.id.gt(lastId); + + Long count = jpaQueryFactory + .select(episode.collection.countDistinct()) + .from(episode) + .where(greaterThanExp, keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) + .fetchOne(); + + return count != null ? count.intValue() : 0; + } + private BooleanExpression createDynamicInterestFields(InterestField interestFields) { if (interestFields == null) { return null; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java index 0d9c7757..3ab36881 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java @@ -25,13 +25,30 @@ public SearchResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchCondition if (collections.isEmpty()) { - return SearchConverter.toSearchResultDTO(collections, null, false); + return SearchConverter.toSearchResultDTO(collections, null, false, 0, 0); } Long lastCollectionId = collections.getLast().getId(); boolean hasNext = hasNextPage(condition,lastCollectionId); - return SearchConverter.toSearchResultDTO(collections, lastCollectionId, hasNext); + Integer totalCount = searchRepository.getTotalCount(condition); + int totalPages = (int) Math.ceil((double) totalCount / PAGE_SIZE); + + int currentPage = calculateCurrentPage(lastId, condition); + + return SearchConverter.toSearchResultDTO(collections, lastCollectionId, hasNext, totalPages, currentPage); + } + + private int calculateCurrentPage(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { + if (lastId == 0L) { + return 1; // 첫 페이지 + } + + // lastId보다 큰 ID를 가진 컬렉션의 수를 조회 + Integer greaterCount = searchRepository.getCountGreaterThanId(lastId, condition); + + // 페이지 번호 계산 (1부터 시작) + return greaterCount / PAGE_SIZE + 2; } private boolean hasNextPage(SearchRequestDTO.SearchConditionDTO condition, long lastCollectionId) { diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java index fcecc715..d11ca328 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java @@ -19,6 +19,8 @@ public static class SearchResultDTO { List searchResults; Long lastId; // 마지막 컬렉션의 ID Boolean hasNext; // 다음 페이지 존재 여부 + Integer currentPage; //현재 페이지 + Integer totalPages; //전체 페이지 수 } @Getter From 3115fd3e002741d773a42bad29e0a3c1798697e2 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 00:14:35 +0900 Subject: [PATCH 021/256] =?UTF-8?q?feat:=20User=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EB=82=B4=EB=B6=80=20=EC=83=9D=EC=9D=BC=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C=EB=A1=9C=20=EC=9D=B8=ED=95=B4=20?= =?UTF-8?q?QueryDsl=20=EA=B0=9D=EC=B2=B4=20=EC=9E=AC=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generated/learningFlow/learningFlow_BE/domain/QUser.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java index 2ce1b859..dfa13a9a 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java @@ -24,8 +24,6 @@ public class QUser extends EntityPathBase { public final QBaseEntity _super = new QBaseEntity(this); - public final DatePath birthDay = createDate("birthDay", java.time.LocalDate.class); - //inherited public final DateTimePath createdAt = _super.createdAt; From cb644ac130960f936f39644f5b1612af03a1d685 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 00:14:52 +0900 Subject: [PATCH 022/256] =?UTF-8?q?feat:=20User=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EB=82=B4=EB=B6=80=20=EC=83=9D=EC=9D=BC=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C=EB=A1=9C=20=EC=9D=B8=ED=95=B4=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/learningFlow/learningFlow_BE/domain/User.java | 3 --- .../service/auth/local/LocalUserAuthService.java | 1 - .../service/auth/oauth/OAuth2UserRegistrationService.java | 3 +-- .../learningFlow_BE/web/dto/user/UserRequestDTO.java | 6 ------ 4 files changed, 1 insertion(+), 12 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java index 916f7ba8..d8b2065d 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -49,9 +49,6 @@ public class User extends BaseEntity { @Column(name = "interest_field", nullable = false) private List interestFields; - @Column(name = "birth_day", nullable = false) // 년도 포함 ???년 ??월 ??일 - private LocalDate birthDay; // TODO: 생년월일 자체를 삭제할 것 - @Enumerated(EnumType.STRING) @Column(nullable = false) private Gender gender; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java index afc3cdd8..43f24fe1 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java @@ -111,7 +111,6 @@ public UserResponseDTO.UserLoginResponseDTO completeRegister( .name(requestDTO.getName()) .job(requestDTO.getJob()) .interestFields(requestDTO.getInterestFields()) - .birthDay(requestDTO.getBirthDay()) .gender(requestDTO.getGender()) .preferType(requestDTO.getPreferType()) .socialType(SocialType.LOCAL) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java index 6c70341a..20bea7b1 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java @@ -43,7 +43,7 @@ public Map getAdditionalInfoRequirements() { Map response = new HashMap<>(); response.put("message", "추가 정보 입력이 필요합니다"); response.put("requiredFields", Arrays.asList( - "job", "interestFields", "birthDay", "gender", "preferType" + "job", "interestFields", "gender", "preferType" )); return response; @@ -75,7 +75,6 @@ public UserResponseDTO.UserLoginResponseDTO updateAdditionalInfo( .socialType(socialType) .job(additionalInfo.getJob()) .interestFields(additionalInfo.getInterestFields()) - .birthDay(additionalInfo.getBirthDay()) .gender(additionalInfo.getGender()) .preferType(additionalInfo.getPreferType()) .role(Role.USER) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java index b4e4af2a..2c4b9749 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java @@ -38,9 +38,6 @@ public static class CompleteRegisterDTO { @Size(max = 3, message = "관심 분야는 최대 3개까지만 선택이 가능합니다.") List interestFields; - @NotNull(message = "생년월일은 필수 입력값입니다") - LocalDate birthDay; - @NotNull(message = "성별은 필수 선택값입니다") Gender gender; @@ -68,9 +65,6 @@ public static class AdditionalInfoDTO { @Size(max = 3, message = "관심 분야는 최대 3개까지만 선택이 가능합니다.") List interestFields; - @NotNull(message = "생년월일은 필수 입력값입니다") - LocalDate birthDay; - @NotNull(message = "성별은 필수 선택값입니다") Gender gender; From fee8d1d2af5869a49af94fb1901ae1267ab51842 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Wed, 22 Jan 2025 00:42:32 +0900 Subject: [PATCH 023/256] =?UTF-8?q?error=20=EC=B2=98=EB=A6=AC=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C.=20memo=20api=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 202229 -> 270808 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 38147 -> 39447 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 25535 -> 26113 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 8 bytes .../apiPayload/code/status/ErrorStatus.java | 2 +- .../apiPayload/exception/ExceptionAdvice.java | 1 - .../exception/handler/ResourceHandler.java | 8 +++++++ .../config/security/SecurityConfig.java | 2 +- .../learningFlow_BE/domain/MemoId.java | 6 ++--- .../service/memo/MemoCommandService.java | 3 ++- .../service/memo/MemoCommandServiceImpl.java | 10 ++++---- .../web/controller/LoginController.java | 1 + .../controller/ResourceRestController.java | 22 ++++++++++-------- 16 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin index 233d489b47a6077a4a9591d8a8bbdfa6d8b7f92f..002dbff206f6d9ae6d6998bc47a89826adc0e59c 100644 GIT binary patch delta 4652 zcmeH}eK^$V8pqw^X)z}IOKj2#*4$wP#|yC8W_QTcNfW!dBE% zQH}IUo1_|MFc|TZe4Z!jD*)PJ`cHGtojWA0<5scG1o8)7@h#*lAD|C)z%vK$ov^3s+=YoFL!nd^~B8z*JJb*5j(S`mCMzbJpgAH9AEpF(1s0z-?-h zRd3SZV!_$0Mc(}{Z&q|DId+E)E+=sgM_$sk<40?1FzLc=FND&`7joy?r>=BZbDv1f z`XW7k`%vh&IZ>5n)}M9bF>-K5JzR$pFOh=-8tNfgcFBQ7@vjIeq*}QW#-lh|>~j+5)Teqwntxme5*Lcshk5xq z_=bo!Zq#6`zhl4lSmDXEWMB=mVJm7=%4pm-@8cQ8@G&|=D~l@zCzMI4uo$KwCC&Z1 z7_3kQCG!%p9T#ctB_*VuJW5+iz!PQD+{zNLGr6X2)P7^Kui?|Bg6QfW<)*e(dvk5a z-vue2IZ|^pHZLW8xJq-lm%@BhNNHaw*rN(c1*K%Ga!F;lvy^N>6V+^0M2n@_R;s`U z{YH{^YQ8_LM0U3^W3e<%Y9 zKZ#7{*gFEqz`91faX9`489qT*l->Yu)Jm!A2K)tGr$=K!Ik+Lk5TW>TQq6PP4|zFw z8?OsyPOW)yukb^kuO2LOjGie|ceMKSPMSnAou>0fv4NKV5+72xX7K?>#A5_)OE*JtZAdum$@=ii?7^z4o$ zL`sNIjmOh{R*%||UaemjU5aZeNPTx{eR>=$L$Q_Q`UG&W9`#YJnIrr9CMHRN1(l@J z(pW<7m0)2!`&NgZf9ZS;&g*cr?h2O~z3S=}_K=FhEP2NGP$g+fJq^#Q1g9~N2yyHK z6H>wv#Q98@%c?~;vXi7IksC5GJh5G zZ^9VeG_}~M0~J73YdmDjGsTuwB;RgYs9P0$#6O@8dTIb^G{z90tRiRUG#yq{ff!X# zvbY6P(Je}%Td3KCdel_&X@VpIn{6<0?`$7}0;bT*I z&iLYOvd&|*n5+kyNaxu{E$9c9veBLC1{I-FBSo)k=}t&Y5oyXoPut|v+R=y6|H57W^;s%6!~4Aeul7xmzd zzM`7r9n$DnN+Ea16-c3!c86S*MEZ3)>1Z;g2@UW$IzcI+fjkZwlIXO@IzAHDqDR1jOvuE@UjX>@(kqWf^Tg3%A&6b%XyYDI6 zKPJ+$VAhRIO>af(nl=^ql{d(?G(rcMiKVi;HSFJX40m>G3J#TtPSw%dRhq7afS8NS zEIh3VZ1-Gh0@= z-xXzkiQiKRBfJ{l_n?lG+WbKxjv@Xm&$}F(?}4!7@SFhIP6?QzKjk5kf$7?N!7gyr zNaq&0@26~UQx2YK$ulEHLl=L&4fwL^D0q(tE$YQ_*E4blW^{tK)nf6+u*e8s@jOwe zUx+xuAy~9Yq{&2ArsP=P33U&YX?OS(=2qYwoqw;T|NdK(u<0d;{MVWWvXE_Xna3=& zF0EL;IXX_e_shJWwN8IX9fuiC+zwheJQ{Rlt74#b_5P?Tz0a)(YG@c4Ci;NaN0bcJk<=6FM&2QU@SRT=ka8T0l(} z$L`XBLrcWIkr6?XEwjTy{euF2tLEyeVZ$us$}gj$wEF9Ub1YsKCsc9l5g)R2*yFqF zo-EUvX4hgTg?qkvxKjbvW2i&p*wcn2Kr2MQPrTgGYvp2HMm6iaE_Ns&R`8v1duQDK zuZ`Ol{+?n@J-yk(j=dQ)w9q*+puXTgIR0njcHGF!%P{k1?Q_pb?ep4~roA(6?~L1@ zHg3B6jkyR$=&rY*BH%>+#=g%|ujej|i6GK?&V706H)m4zzGU}5 z$XlaBq&dQU*WH8`lH)U#OA|^SrTl8#Oigxf-=C#u?kGxHHgajtcP*JJ`pfX;DYbFa GZTknBepEI9 delta 2067 zcmZXUc~sL^7RU3*1vEhT0f~gLgjA2Bgn-csDgt6_%Lui!F5{t24+1JJQYecQr-k$Y zT@;!j;u}G0>I&kpl(FnfKx)(o7_Cw(q9YU=WSgp}6`gl;`rqWQPwx7C_rCY*@8TX+ z+G|7(JoXdwcyF%e@$&Z9%A+NGp7E!;49QJ@#jeb4OS4r;J9lnN_#`uKM_^WBW_Eh^ zvW%1rZl8Y;uQ>VkwSWAaZkjGnkDpby=grsnK+Sq>UDrBqbx7ilrCA>&?@r#aJw7!) zAvH1egQO4R5=q8UDWL<@UJO*_5VzD^2_QZ4QI*hcSq?@AJ3&%Nj2?e=p)=MN`h#A7$N6)({WFZ$4K0%xH6uBn(tHxLC}KvFjl zUzk9uX&~W(CyWfLLJ=vU@*yIkTqAK7{9!Sg?Z|g@@h}sX!UtzCV@?4d7Qh%%Eg$3( zou_eK@flsUecaCdO>=|F_x=Z~6)d1;7N^u&{(bGn=W&Np?hJOH-=eCJ)XuJc`g#a6 zsdW#ECL1#ri-PKSo%??Kl!gM#qoGZNgK?HfcLOM48mR(61uu}Ao5(`QyT|B$6Y=8` zPMKv26tZnh_05DZ20WDqG&R=b4%pb4~tvS z^HVbkfx%%$t}P@2y34d>w9y89q0iF62G+opA?EeBg%xlB<96ACkD!#1L3L6^YAJa{ z0%)%-o6d1`Yg&oF;FQH(B_Yj}XvrKp*h-ecD7uqpF?Hie(QRxAW~`lyG=x;$M&vMn zv~V^X@*|{|ZDbKNVuoKkc?BlWRz4eipdTrxoveZ9NbUld3ontzSX{vG772%ElftNk zT^~inE8~)4)6#g{`Z*7tPn$Q|4d*Yv^S6$5-wO&*ug8%gVbXO;qWDT+x0}@xtEbarIE4?=iNJd?MTwjAJj7k z!ePPZJffpvE_^qdX%7;}!yc_FdF2Tj!vxV=me2c2c^^I_3<+{ zN1cO}+c##d{QQu%%%Ca*a+s=*6Ia!rV^6OtPg!wZ87KYMOs_B~R$XZcdnjZhx+^(l zZ6^(Oxn8m-ar97NLP` z1T9jFGwgzcNPaGCd)JU+UD!Owkyc$G^CZDHb$K-|&t82v9d_)-$UfOEi-gAt+T+5e zQ+nT2d_V*N?nfCIRKIvKWnCTOx7y18IMFhoi835ieoxnlAQVor09qu1O@c~R+n|~f zlGAkcCH9RFioqSKEF#44KAb?(h~afXxg~H!L=It~m>#)ABv6BHZVn_sGtwt>U^%oQ z#Tv<0fx(h8AY-*_R8|Y=T35E7OXz;j6?O>p7I(gkRMV6tRz6gBnN>W8ZYK#l^<|{7 z%Oo25@D@=C+u1dw^Ad=JB0Pbs8|$Y*df7w#K#LU6OQN70N!?2}!BeafAcZiPL6Y^6 z#gL2M3Mm8&Dj6A6Mk~@nr}~H|JsfW3MHjg{aWL2CuNM)C0V2fA?UW?jv=0KroCmI^f9$K8&Vu6IlgQNd8yJaxf$5J=w8-N1F0v z$GU`W0-DA^!t6 Cd#NV? diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock index 42e278700011213af35d91ec040eafc4a3ede886..b754d2244d47d512c6d6d08ee5df78c24463ec8e 100644 GIT binary patch literal 17 UcmZS9y0STQ;)ksv3=j|i06F0V_y7O^ literal 17 UcmZS9y0STQ;)ksv3=kj#06DD$!~g&Q diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin index 830e71188321369884b279b2340cfc3b479c9911..6156ae55ccb67c5002b197dbeaba140046478675 100644 GIT binary patch delta 4201 zcmZvfd03Ry7sqD?5M-Od0l`sVh`kgZQxYW+TplGL79j;iL`ot=1VLG67*Rlx^@}VS zDxjt)0S%c*ES98$Aujz;Su!n36i`#kROI)*_r8BY_j#E4yyu?px#vB1nM+2EptMm? zKi`C3t#mRmQ4>0&8Q#hxtz4m8F*99FbkhHej7~RedulED2Q6mhLbH;O)@b7~ zwUy?=+q_Kl^gk|>AgRgh!P+M6R zzOj^wF5fvAbMAHg2C`K7205p8Qr23B3H0qtQtgxbE^uLT|&y|265{UfQh#8K%zKT#m^swrK%=AVrkoE2z!Z=q0S7jeG8sfN>E#>jgrp-WhZ zb((HCwUsrYc0s+}df%aWt2(Sw zoPCr|i|z>owm}URXSI~>tKPL$&rtSkMZ_ux3gr}HaGAn3j8TY%qlZL#;6-Dk{-*Nk z08^{!^*URb<-{+}HgWxlhSxriNDmuVCgOH#PJh+yGFskPi(^sO)!-mZz0h+NSsU4{FkzlWnA#2^qJP>ONDrk2Kx??5MI9KWQ z!pfg{{*N_J&i#9CJsWlJrZ=B3Lo!Vyz!F~)H3^ZvM4yg>z7oje40V~P3hE~4Lu{lN zXMDx#nXg;lpo?*3U>xIAvm0~$B>3_JlF5FAZfCpO)KSO)6D1cI_xU+iZ7ee#yQ=)_69z>G)64?ML1r z3#${z$O4#pkwAOlLt!5jUJ`V9kpZ`0<_^+b1aAs}oI)`gD3sv5Kk+#Tqn!jQu#&=uHkhD5eX=n-v--H4Ofo->3GbQw&*w z0Xk9~*ah`Hjm(b(KT3?pYsBpOxB&Z9BJRL=qy!16WR}h$ms*?AMnQ!q6gp9{)atVa%$ip<|fptl?#2pF_Fi4k38`o=SSeEJ@ox z-mP_AyHwO)UCNVcti4K#JYHo;6`FTZ8%kdC7(#ZlL1i__Cy>^L^As*3dLtQlHV#v8 z#x(+Ij@Y}0q~e5T0nuE0q%Y% zF4`<+@=L#tihb+=>G#l0VF>&jVwsNG%>-uQ4uvT&h#(dNsHl$>UQt+yIr~YM7eXn7 zppZfY7Jo{*{18LoBUDm|Mo=!>CG$ZJg+R1W2*)D|TVRn#e72)2lEit$oB#xxF!wV8 ztr#Lc=@&3FpIDy3n}9+OathO!&Bt~rcnFCipoM%2#yC$vo{6Lawo9IfQxtMAKw&$C zg`_JV?i3Ul*+MMEFpp+IrUyR?VzSXIqS?JIGlNSJ>9#~P1v?xrl1NQ6WCf?1Z#`_y z3ls-D{iC1mZ3}vb;a^jS4s6(S(Fkf_^_ffH1P3`|;jTV>>&a8^aHuz1CKRba1S0#R;{n# zSWMn(8N!O$9bU!WRG7x!$9zoK;ZdK7sy2+?Zkgqm-xug8cOzMiS1n-uc|5^#T+0#5 z&kc@=e)%*+u(f~3q5T(spn2T4q&`#GJLH6@4wpvyj;6fx#3tCH_u4Kk<~qwS&b)Oo zj4ITaAF7Fp#A=s2Lfash^^rY#y|)u=s6s`m!(5Tgye3O@!b8og8=iU29^U1mKI*Ja zBz=}ldTi5T@1_&d8crNnKYF6lx@Lu@PJBU+FQ?c{1U%!~$qIYLPY)a988_lQ>psjs z@%j)s0W4dZ% zuXpV?*m3*VmHzGo^UMvy+?#w(1U%6SC@({fy%h14#rJ=UxTqe~$0TTS zRECY}mKjXjoG=p$V_I_PB4uc${bMv23l;`^kSl zpkX_2QH5?0{Jh2H%i{L={b;;eIAcrC7K>f~a6`LMAH8hcjS$Nl4}b4c)Y7>ai@ma% zBW*dK<r-SiBPHIh=ysG{V zP7%ubGbJ$i6&72?e)^_;1*_vuJl30;*cXlU`EI%0 zH68_$7ETdJ1U%gpqy$gjIs5Ny@yj8N<6}OVU*>W??94JvE1Hx*CHnLJ$BFG%Tc_>u zS!lwXB~0;esn|1(X=*jh$ApnXD_jb`3(L#cxoFy%9HYGbtRh?gop#orVP=jeDo!T$ gr{AA(X>*uUTg$`CuS|$yM!-haUyG?4TMLK(0}}>}wEzGB delta 2245 zcmZA1dr(wW90%~-g*1m0Y%%o`B83F03u|pY@P#u@_&`|06qRsOP*g+`eCvupiAcD7 z9m^a-G6u~-*u7{fB4TWcxPWFpGBoVrE8WN(4c+YA-w*!b&fL47`+J;wX3stMvr0|o zH=2sK`>AteL%)7*a)QrlH#{0(!Iysd^2C8B-QXM0AJYQ*VnaYE>;Wc>9puEszq6y2y3f@}2#tU}bRV+y{pG{@h3>N9o#h%-kIVGD0R%suCu~ zA)pg>#$j|%rJ8S193>$qiUvI*ZYX*Tg`BQJQ>p~NXi8UMcr>MtB8hPvyQ3wTKk|M_ z%;bcM4$U>BCTVdvTB}U&1RPvigXfHs&>JO`PNpHhNBjyJ@-!@+Xq!xtGkC<2dgP`_ zNSQ(nXAzr5>9ZnAs6}-roT9GWNOh-h+DPf|@LoEh4!%=65XG<~W2ywlRB9-L&q_+4 zLnOlib0@5fM$}HHnr8G_ML3Ul85gjI@dFMpE~16;BRp4A@fCzKuEH2Yk!vX7$j`Xk zi5_bx)q*g_btE%>K@p=B=NUKAI)jRTh4y`&vIf8L8Vm@7C0pxPKPO_a<@L;l#Ql4N zf+|W?D)o-c1$!oNjh7R}YXg-v`W+2xX_!CYV%$c^I*QzZiSZ{=XG$nr=j|>=m<9Vf zdfWpZN}UAt5-t9kNlWfT@Oo-)!}BBw>FeqLy@foE-bM}MZ?rKUqHvaIh^erniBS)A zEJd6+x`FTn_ZUy%yOAPy5yiNVjExfd%odM{v3g+WY$a{gBA&4f7RD-A^Ch%!-A0s| zC3w!ErYvzoO?kM%0D5ndP{QfssGg&wZ8zW~SexNLmm)@7-9*?4j|{>W7{mA)DU4DS zGwvZWj%psj%vcO7V*!#jQz{O-8R>8^j^a5Z1^P^?nT3`Q20IdYsfV}zC9*!DD9NGxhv)I3dQrWmhu$@BB z93^54!8n4Pi&O^Sn?S|85XHENj0Ew*#>gEn?2tyz#4e$f9&t+u2IMosQA?1QV$F6Ma1jnLmZ61_ z08b00QW4HrjQdL|vI2g|3TzE9G8$<|7A7m3&~^b~1(d#oWX2T~6-Wb@4GDT7;E3H= zw>{c9p}psLUZo}{t&+NVIy^vMu}5%&=wF`R7Y69enGsT5$Jc3)_|?57F2UmTS5B|) z-9S4YQWYEZeo z*`)(FF-iGUnh>&smd*~-4qcj9!)M%~-rA)@%&MoZ_spmTu5MqwJX)7HV|5rmqfwcS lI5a-u(q&d@2lp)>by_!HDswgU8ez)l=om~5s_tn@$N&BqciaE~ diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock index f9f348ff20ef8ca19694fd9f09675769952ac8bd..61f1b6d8005b890dbf13c8c10d9488aad5c0af46 100644 GIT binary patch literal 17 UcmZSP?6eWNlCPG{00yi-03sa&w*UYD literal 17 UcmZSP?6eWNlCPG{00vAq0U`JUl>h($ diff --git a/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin b/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin index fdb2d4da83e8ee516d6f8d8a3cf13f34c77d4049..d6028d0775fe04ca82f045a4a58c1fd1f9ade686 100644 GIT binary patch delta 926 zcmdmgoU!o?;|3E6#s`y4B_;^;D{hPqyc#u=0Sr<;Zr&>)!00ef*H3pv!Lu0<(d38! zp&^>)>3D2G~f zfAd>K4R(Rpxq70GlV6^LidJss)hu8X$X8xDafVYUOl|n&QY}UP`1R+`B>tC#suZ5w zt93%4%GhmI9Zz~L)PDELzShVekXeEtEO7XnK|ROh^`e>*54akhJZYQk7%E&JWY{q$w=k}!w~p%pm!b|(A)2mJ z3+^6THPhq8=j!~lYr$MAFjZ*Jd3U$-^R~#zny+gOxhg+msyKPIajC{u2^{zf&rSzuoQSJxmqKW}D6i zrSCn&Gv^D>`g0PqCNK07uHR&yyF@x^`nLLznBrgGVlj2`PLnwh&Nxl3Ja$uh+dihx zm?|3fsvb)}blx>;=Z4SRjdi;*RS2C8V~+W^$A9*l560i_cP>Y$kbpV=7pMB}td;f+ zJQHW0)ZXy-&E&!eVg8PlIvL`^CU_k^dY|h delta 94 zcmV-k0HObZ%mKg00kAX}0nd{)7?88w7zhEgEgEP6v&9>L0kd5l`2mw|AE=WqAYYTE zAYii{A>aYC6(b-AvrQ^!0h7%u8I%4izmwH0Fq0iEA_5b6u_5>uu`r+nvq4CH8>pfq ALjV8( diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock index e1c32b1539b59fbd03d6074cf938a26f66ec1012..dbfe1be49c386df63141358d344e9ed367a32772 100644 GIT binary patch literal 17 VcmZS9*uy@Xee#Fp3}C=01OO}n1I_>d literal 17 UcmZS9*uy@Xee#Fp3=mKc04!_-IsgCw diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe index cbbb6824861d083b5de1d9298b4d13724f8e7b21..a8a5c164449d48375057f1675403337010ce631e 100644 GIT binary patch literal 8 PcmZQzV4TwF$-)c(1^fYT literal 8 PcmZQzV4Tt%V{`)m2TlTi diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index c5dcffc5..fe65be5a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -37,7 +37,7 @@ public enum ErrorStatus implements BaseErrorCode { ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "ARTICLE4001", "게시글이 없습니다."), EMAIL_ALREADY_EXISTS(HttpStatus.BAD_REQUEST,"EMAIL4001" ,"이미 동일한 이메일로 생성된 계정이 존재합니다."), - INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."),; + INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."); private final HttpStatus httpStatus; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java index 88b7a568..25ccb12c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java @@ -26,7 +26,6 @@ @RestControllerAdvice(annotations = {RestController.class}) public class ExceptionAdvice extends ResponseEntityExceptionHandler { - @ExceptionHandler public ResponseEntity validation(ConstraintViolationException e, WebRequest request) { String errorMessage = e.getConstraintViolations().stream() diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java new file mode 100644 index 00000000..2e4dc24d --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java @@ -0,0 +1,8 @@ +package learningFlow.learningFlow_BE.apiPayload.exception.handler; + +import learningFlow.learningFlow_BE.apiPayload.code.BaseErrorCode; +import learningFlow.learningFlow_BE.apiPayload.exception.GeneralException; + +public class ResourceHandler extends GeneralException { + public ResourceHandler(BaseErrorCode code) { super(code);} +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index 3b8c1834..8da5fe98 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -48,7 +48,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticat "/register","/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", "/home/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") - .requestMatchers("/user/**").authenticated() + .requestMatchers("/user/**", "/resources/**").authenticated() ) .formLogin(AbstractHttpConfigurer::disable) .oauth2Login(oauth2 -> oauth2 diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java index 80bf93ab..efbc9b3a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java @@ -2,10 +2,7 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import java.io.Serializable; @@ -13,6 +10,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor +@EqualsAndHashCode // equals와 hashCode 메소드 자동생성 public class MemoId implements Serializable { @Column(name = "collection_episode_id") private Long collectionEpisodeId; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java index d33a374e..4327595a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java @@ -1,7 +1,8 @@ package learningFlow.learningFlow_BE.service.memo; +import learningFlow.learningFlow_BE.domain.Memo; import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; public interface MemoCommandService { - public void saveMemo(String loginId,Long episodeId, MemoRequestDTO.MemoJoinDTO request); + public Memo saveMemo(String loginId, Long episodeId, MemoRequestDTO.MemoJoinDTO request); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java index cb170a14..b92fd283 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java @@ -5,18 +5,20 @@ import learningFlow.learningFlow_BE.repository.MemoRepository; import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; import lombok.RequiredArgsConstructor; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import java.util.Optional; + @Service @RequiredArgsConstructor public class MemoCommandServiceImpl implements MemoCommandService{ private final MemoRepository memoRepository; @Override - public void saveMemo(String loginId, Long episodeId, MemoRequestDTO.MemoJoinDTO request) { + public Memo saveMemo(String loginId, Long episodeId, MemoRequestDTO.MemoJoinDTO request) { MemoId memoId = new MemoId(episodeId, loginId); - Memo memo = new Memo(memoId, request.getContents()); - - memoRepository.save(memo); + Memo memo = new Memo(memoId, request.getContents()); // 메모가 이미 존재하는 경우도, 존재하지 않는 경우도 새롭게 저장 + return memoRepository.save(memo); } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java index c6afeccc..62ad48e2 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java @@ -142,3 +142,4 @@ public ApiResponse testLogout( } } } + diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index e7a5cce5..65de5b5a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -7,8 +7,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; import learningFlow.learningFlow_BE.apiPayload.exception.handler.UserHandler; import learningFlow.learningFlow_BE.converter.MemoConverter; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; @@ -18,10 +20,16 @@ import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.*; +import static org.springframework.data.redis.connection.ReactiveStreamCommands.AddStreamRecord.body; + @RestController @RequiredArgsConstructor @Validated @@ -59,16 +67,10 @@ public ApiResponse watchEpisode(@PathVariabl public ApiResponse createMemo( @AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable("episode-id") Long episodeId, - @RequestBody MemoRequestDTO.MemoJoinDTO request) { - /** - * 메모를 생성하고 저장하게 되면 자신이 쓴 메모를 보여주는게 맞을 것 같아서 일단 메모 contents를 반환하게 해놓았어요. - */ - // TODO: 강의 메모 생성 로직 구현 + @Valid @RequestBody MemoRequestDTO.MemoJoinDTO request) { String loginId = principalDetails.getUser().getLoginId(); - // User 핸들러가 에러 코드 기준? Controller 기준? - if (loginId == null) throw new UserHandler(ErrorStatus.USER_NOT_FOUND); + log.info("로그인 상태 확인 {}", loginId); memoCommandService.saveMemo(loginId, episodeId, request); - - return ApiResponse.onSuccess(MemoConverter.createMemo(request)); + return ApiResponse.onSuccess(MemoConverter.createMemo(request)); // 성공 시 200 OK 반환 } -} +} \ No newline at end of file From 2a2f41c85e06b6a34c1d3ec83067e1fc416d08e8 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Wed, 22 Jan 2025 00:53:45 +0900 Subject: [PATCH 024/256] =?UTF-8?q?.gradle=20=EC=B6=94=EC=A0=81=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gradle/8.11.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/checksums/md5-checksums.bin | Bin 41347 -> 0 bytes .../8.11.1/checksums/sha1-checksums.bin | Bin 95333 -> 0 bytes .../executionHistory/executionHistory.bin | Bin 270808 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 39447 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 26113 -> 0 bytes learningFlow/.gradle/8.11.1/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 -- .../.gradle/buildOutputCleanup/outputFiles.bin | Bin 19361 -> 0 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 0 bytes learningFlow/.gradle/vcs-1/gc.properties | 0 15 files changed, 2 deletions(-) delete mode 100644 learningFlow/.gradle/8.11.1/checksums/checksums.lock delete mode 100644 learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/checksums/sha1-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileChanges/last-build.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin delete mode 100644 learningFlow/.gradle/8.11.1/gc.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 learningFlow/.gradle/buildOutputCleanup/cache.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 learningFlow/.gradle/file-system.probe delete mode 100644 learningFlow/.gradle/vcs-1/gc.properties diff --git a/learningFlow/.gradle/8.11.1/checksums/checksums.lock b/learningFlow/.gradle/8.11.1/checksums/checksums.lock deleted file mode 100644 index 63e0cd500da796398d36dd917b3317edc08e45de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS1EmnK{d1>KI1~6b<1^_yu1$qDg diff --git a/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin b/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin deleted file mode 100644 index e1270cf78a2cc9a74024893bc66f72bf92c63131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41347 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

DfV;vvP^#+kcwY3{ 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 diff --git a/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock b/learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock deleted file mode 100644 index b754d2244d47d512c6d6d08ee5df78c24463ec8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9y0STQ;)ksv3=j|i06F0V_y7O^ diff --git a/learningFlow/.gradle/8.11.1/fileChanges/last-build.bin b/learningFlow/.gradle/8.11.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin b/learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin deleted file mode 100644 index 6156ae55ccb67c5002b197dbeaba140046478675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39447 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 diff --git a/learningFlow/.gradle/8.11.1/gc.properties b/learningFlow/.gradle/8.11.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index dbfe1be49c386df63141358d344e9ed367a32772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS9*uy@Xee#Fp3}C=01OO}n1I_>d diff --git a/learningFlow/.gradle/buildOutputCleanup/cache.properties b/learningFlow/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index a5e72f1b..00000000 --- a/learningFlow/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 09 13:28:54 KST 2025 -gradle.version=8.11.1 diff --git a/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin b/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index a55505f87fe51cb70a604d0a0dc170a39f61a79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19361 zcmeI&Sx8iI6vy#vTAG>Wh%{KG@Lq>yI+xEqbDaCd`!o|FN$N3u z^pFN0u7ig-LID&&0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(16!>2X#P(l^y|@^) z->`uLr>&AS%c1{Z)-Gdj>EqDDJH%;a2Y-IB$JBXA6+LaF@JLtooXn!xcWt9+Uf02X z$fGvPc5~%hF)#0D&)pRk;;Bs~7qGjfmA!cV#bXA|E9~yg2Peh8ub(4aNn)RPe|fN1uM$r4?d(%pbM#Iw z`iHdtCcC%xr*ll0HihP!*?n||dx`6NG{WUO>{Hu5UU?CBYnyN-kbUN<9v9MnVnq7zNkFRw>2g^i{9sAcCFg0t}xwpr*Juj-H>;~pfZd-K>m$=MbeWjn|Kr7 z7fog_jgWhMTo#J?$m?c*r`BI9c%u@o+rqwPU%E?WvimsNzm7ev#_rsM@<$r?Z9?O|Ok-xRa@^1}o^Iv_{FC;g3pa1{> diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe deleted file mode 100644 index a8a5c164449d48375057f1675403337010ce631e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4TwF$-)c(1^fYT diff --git a/learningFlow/.gradle/vcs-1/gc.properties b/learningFlow/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29b..00000000 From 197ee3e118c17afa011d5a279d2fcfa490cc739b Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:50:01 +0900 Subject: [PATCH 025/256] =?UTF-8?q?feat:=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?request,=20response=20DTO=20=EA=B0=9D=EC=B2=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/bookmark/BookmarkDTO.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java new file mode 100644 index 00000000..71221881 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java @@ -0,0 +1,22 @@ +package learningFlow.learningFlow_BE.web.dto.bookmark; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class BookmarkDTO { + + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class BookmarkRequestDTO{ + Long collectionId; + } + + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class BookmarkResponseDTO { + boolean isBookmarked; // true: 북마크 됨, false: 북마크 해제됨 + } +} From be3b3e835d0e0fe273934ee44c6df9d3997e6573 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:50:52 +0900 Subject: [PATCH 026/256] =?UTF-8?q?feat:=20Collection=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EB=82=B4=EB=B6=80=EC=97=90=20=EB=AA=87=EB=AA=85=EC=9D=98=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EA=B0=80=20=EB=B6=81=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EB=A5=BC=20=ED=96=88=EB=8A=94=EC=A7=80=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EC=84=B8=EB=8A=94=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?bookmarkCount=20=EC=B6=94=EA=B0=80,=20=ED=95=B4=EB=8B=B9=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EA=B0=9C=EC=88=98+,-=20=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/Collection.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java index 4656be64..970366c4 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java @@ -3,6 +3,8 @@ import jakarta.persistence.*; import learningFlow.learningFlow_BE.domain.enums.InterestField; import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; import java.util.ArrayList; @@ -11,6 +13,8 @@ @Getter @NoArgsConstructor @AllArgsConstructor +@DynamicInsert +@DynamicUpdate @Builder @Entity @Table(name = "collection") @@ -49,6 +53,9 @@ public class Collection extends BaseEntity { @Column(nullable = false) private Integer resourceTypeRatio; //영상 기준 -> 100개 중 영상이 70개면 70으로 저장 -> 따라서 최댓값이 100이어야함. + @Column(nullable = false, columnDefinition = "INTEGER DEFAULT 0") + private Integer bookmarkCount = 0; + @ManyToOne @JoinColumn(name = "image_id") private Image image; @@ -59,6 +66,14 @@ public class Collection extends BaseEntity { @OneToMany(mappedBy = "collection", cascade = CascadeType.ALL) private List episodes; + public void incrementBookmarkCount() { + this.bookmarkCount++; + } + + public void decrementBookmarkCount() { + this.bookmarkCount--; + } + public void setImage(Image image) { // 기존 이미지와의 관계 제거 if (this.image != null) { From 12104eda3ebe8c9ba76be03743d0cef59bd650bb Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:51:21 +0900 Subject: [PATCH 027/256] =?UTF-8?q?feat:=20login=20=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9D=80=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=ED=95=B4=EC=A3=BC=EB=8A=94=20Han?= =?UTF-8?q?dler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/exception/handler/LoginHandler.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java new file mode 100644 index 00000000..07384d61 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java @@ -0,0 +1,10 @@ +package learningFlow.learningFlow_BE.apiPayload.exception.handler; + +import learningFlow.learningFlow_BE.apiPayload.code.BaseErrorCode; +import learningFlow.learningFlow_BE.apiPayload.exception.GeneralException; + +public class LoginHandler extends GeneralException { + public LoginHandler(BaseErrorCode code) { + super(code); + } +} From e6ee20be2233e4f84c994c0dc3ca3113bc089817 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:51:53 +0900 Subject: [PATCH 028/256] =?UTF-8?q?feat:=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BB=AC=EB=A0=89=EC=85=98?= =?UTF-8?q?=EC=9D=84=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8A=94=20Handler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/handler/CollectionHandler.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java new file mode 100644 index 00000000..33babf94 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java @@ -0,0 +1,10 @@ +package learningFlow.learningFlow_BE.apiPayload.exception.handler; + +import learningFlow.learningFlow_BE.apiPayload.code.BaseErrorCode; +import learningFlow.learningFlow_BE.apiPayload.exception.GeneralException; + +public class CollectionHandler extends GeneralException { + public CollectionHandler(BaseErrorCode code) { + super(code); + } +} From 304e6015428e0319862573a18321e800ad91d276 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:52:15 +0900 Subject: [PATCH 029/256] =?UTF-8?q?feat:=20Collection=EC=9D=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8A=94=20Repositor?= =?UTF-8?q?y=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CollectionRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java new file mode 100644 index 00000000..5c3ff351 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java @@ -0,0 +1,10 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.Collection; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CollectionRepository extends JpaRepository { + List findByIdIn(List ids); +} From 8e06cc6b364d8fcf285d690c47aa09c3233aa70d Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:52:36 +0900 Subject: [PATCH 030/256] =?UTF-8?q?feat:=20ErrorStatus=EC=97=90=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EC=9D=80=20=EC=82=AC=EC=9A=A9=EC=9E=90=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=97=90=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/apiPayload/code/status/ErrorStatus.java | 1 + 1 file changed, 1 insertion(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index 4688bd1d..a328b4c2 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -36,6 +36,7 @@ public enum ErrorStatus implements BaseErrorCode { NO_MORE_COLLECTION(HttpStatus.NOT_FOUND,"COLLECTION4002","더 이상 컬렉션이 존재하지 않습니다."), //계정 로그인 관련 에러 + LOGIN_REQUIRED(HttpStatus.UNAUTHORIZED, "AUTH4001", "로그인이 필요한 서비스입니다."), // 예시,,, ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "ARTICLE4001", "게시글이 없습니다."), From 1d3a14fa0571ae2132ec980ef7e9ad446a0603f1 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:53:09 +0900 Subject: [PATCH 031/256] =?UTF-8?q?feat:=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=B4=EC=84=9C=20QueryDsl=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow/learningFlow_BE/domain/QCollection.java | 2 ++ .../generated/learningFlow/learningFlow_BE/domain/QUser.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java index 34f40a27..0cd82658 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java @@ -26,6 +26,8 @@ public class QCollection extends EntityPathBase { public final NumberPath amount = createNumber("amount", Integer.class); + public final NumberPath bookmarkCount = createNumber("bookmarkCount", Integer.class); + //inherited public final DateTimePath createdAt = _super.createdAt; diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java index dfa13a9a..d8faf04c 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java @@ -24,6 +24,8 @@ public class QUser extends EntityPathBase { public final QBaseEntity _super = new QBaseEntity(this); + public final ListPath> bookmarkedCollectionIds = this.>createList("bookmarkedCollectionIds", Long.class, NumberPath.class, PathInits.DIRECT2); + //inherited public final DateTimePath createdAt = _super.createdAt; From 142f8a03c2825ca2bb0cf23cdd87cc05746839e4 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:55:13 +0900 Subject: [PATCH 032/256] =?UTF-8?q?feat:=20User=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=EC=97=90=20=EC=96=B4=EB=96=A4=20collection=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=B4=EC=84=9C=20=EB=B6=81=EB=A7=88=ED=81=AC?= =?UTF-8?q?=EB=A5=BC=20=ED=96=88=EB=8A=94=EC=A7=80=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=82=B4=EB=B6=80=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EC=99=80,=20=EB=B6=81=EB=A7=88=ED=81=AC=EB=A5=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EB=A9=B4=20=ED=95=B4=EB=8B=B9=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=EC=97=90=20CollectionId=EB=A5=BC=20=EB=84=A3=EC=96=B4?= =?UTF-8?q?=EC=A3=BC=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C,=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=EB=A5=BC=20=ED=95=B4=EC=A0=9C=ED=95=98?= =?UTF-8?q?=EB=A9=B4=20=ED=95=B4=EB=8B=B9=20=ED=95=84=EB=93=9C=EC=97=90=20?= =?UTF-8?q?CollectionId=EB=A5=BC=20=EC=A0=9C=EA=B1=B0=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C,=20=EA=B7=B8=EB=A6=AC?= =?UTF-8?q?=EA=B3=A0=20=ED=8A=B9=EC=A0=95=20Collection=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=B4=20=EB=B6=81=EB=A7=88=ED=81=AC=EB=A5=BC=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EA=B3=A0=20=EC=9E=88=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/User.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java index d8b2065d..9bcfd0d8 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -6,7 +6,7 @@ import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; -import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @Getter @@ -68,9 +68,31 @@ public class User extends BaseEntity { @JoinColumn(name = "image_id") private Image image; + @ElementCollection + @CollectionTable(name = "user_bookmarks", joinColumns = @JoinColumn(name = "user_id")) + @Column(name = "collection_id") + private List bookmarkedCollectionIds = new ArrayList<>(); + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List userCollections; + // added + public void addBookmark(Long collectionId) { + if (!bookmarkedCollectionIds.contains(collectionId)) { + bookmarkedCollectionIds.add(collectionId); + } + } + + // added + public void removeBookmark(Long collectionId) { + bookmarkedCollectionIds.remove(collectionId); + } + + // added + public boolean hasBookmarked(Long collectionId) { + return bookmarkedCollectionIds.contains(collectionId); + } + public void setImage(Image image) { //기존 이미지와의 연관관계 제거 if (this.image != null) { From 39033136867cbc71ffb53d59bec59a0b27c91b97 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:56:18 +0900 Subject: [PATCH 033/256] =?UTF-8?q?feat:=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EA=B3=A0=20=ED=95=B4=EC=A0=9C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20toggleBookmark=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C,=20=ED=8A=B9=EC=A0=95=20=EC=9C=A0=EC=A0=80=EA=B0=80?= =?UTF-8?q?=20=EC=9E=90=EC=8B=A0=EC=9D=98=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20Collection=EC=9D=84=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20getBookmarkedCollections=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/UserService.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 502d2292..822591d8 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -1,10 +1,16 @@ package learningFlow.learningFlow_BE.service.user; import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; import learningFlow.learningFlow_BE.apiPayload.exception.handler.UserHandler; +import learningFlow.learningFlow_BE.converter.SearchConverter; import learningFlow.learningFlow_BE.converter.UserConverter; +import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.repository.CollectionRepository; import learningFlow.learningFlow_BE.repository.UserRepository; +import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; +import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; @@ -13,6 +19,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.util.ArrayList; +import java.util.List; + @Slf4j @Service @RequiredArgsConstructor @@ -21,6 +30,9 @@ public class UserService { private final UserRepository userRepository; private final UserConverter userConverter; + private final CollectionRepository collectionRepository; + + private static final int BOOKMARK_PAGE_SIZE = 8; public UserInfoDTO getUserInfo(String loginId) { User user = userRepository.findById(loginId) @@ -52,4 +64,78 @@ public UserInfoDTO updateUserInfo(String loginId, UpdateUserDTO updateUserDTO, M return getUserInfo(loginId); } + + @Transactional + public BookmarkDTO.BookmarkResponseDTO toggleBookmark(String loginId, Long collectionId) { + User user = userRepository.findById(loginId) + .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); + + Collection collection = collectionRepository.findById(collectionId) + .orElseThrow(() -> new CollectionHandler(ErrorStatus.COLLECTION_NOT_FOUND)); + + boolean isCurrentlyBookmarked = user.hasBookmarked(collectionId); + + if (isCurrentlyBookmarked) { + user.removeBookmark(collectionId); + collection.decrementBookmarkCount(); + } else { + user.addBookmark(collectionId); + collection.incrementBookmarkCount(); + } + + return new BookmarkDTO.BookmarkResponseDTO(!isCurrentlyBookmarked); + } + + @Transactional(readOnly = true) + public SearchResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId, Long lastId) { + User user = userRepository.findById(loginId) + .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); + + // 북마크된 컬렉션 ID 목록 가져오기 + List bookmarkedIds = user.getBookmarkedCollectionIds(); + + if (bookmarkedIds.isEmpty()) { + return SearchConverter.toSearchResultDTO(new ArrayList<>(), null, false, 0, 0, user); + } + + // lastId 이후의 컬렉션만 필터링 + List collections; + if (lastId == 0) { + collections = collectionRepository.findByIdIn( + bookmarkedIds.stream() + .limit(BOOKMARK_PAGE_SIZE) + .toList() + ); + } else { + int startIndex = bookmarkedIds.indexOf(lastId) + 1; + if (startIndex == 0 || startIndex >= bookmarkedIds.size()) { + return SearchConverter.toSearchResultDTO(new ArrayList<>(), null, false, 0, 0, user); + } + collections = collectionRepository.findByIdIn( + bookmarkedIds.stream() + .skip(startIndex) + .limit(BOOKMARK_PAGE_SIZE) + .toList() + ); + } + + if (collections.isEmpty()) { + return SearchConverter.toSearchResultDTO(collections, null, false, 0, 0, user); + } + + Long lastCollectionId = collections.getLast().getId(); + boolean hasNext = (bookmarkedIds.indexOf(lastCollectionId) + 1) < bookmarkedIds.size(); + + int totalPages = (int) Math.ceil((double) bookmarkedIds.size() / BOOKMARK_PAGE_SIZE); + int currentPage = (lastId == 0) ? 1 : (bookmarkedIds.indexOf(lastId) / BOOKMARK_PAGE_SIZE) + 2; + + return SearchConverter.toSearchResultDTO( + collections, + lastCollectionId, + hasNext, + totalPages, + currentPage, + user + ); + } } \ No newline at end of file From 99c83a7045008243662130384488b6deb119b1d5 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:56:44 +0900 Subject: [PATCH 034/256] =?UTF-8?q?feat:=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80,=20=ED=95=B4=EC=A0=9C,=20=EB=B6=81=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EB=90=9C=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EB=8A=94=20API=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/UserRestController.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java index 52720479..e2f6abc9 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java @@ -1,14 +1,20 @@ package learningFlow.learningFlow_BE.web.controller; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.LoginHandler; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.service.user.UserService; +import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; +import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; @@ -57,4 +63,41 @@ public ApiResponse getUserInfo( userService.getUserInfo(principalDetails.getUser().getLoginId()) ); } + + @PostMapping("/bookmark") + @Operation(summary = "북마크 토글 API", description = "컬렉션의 북마크를 설정/해제하는 API") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "로그인이 필요한 서비스입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COLLECTION4001", description = "컬렉션을 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + public ApiResponse toggleBookmark( + @RequestBody @Valid BookmarkDTO.BookmarkRequestDTO request, + @AuthenticationPrincipal PrincipalDetails principalDetails + ) { + if (principalDetails == null) { + throw new LoginHandler(ErrorStatus.LOGIN_REQUIRED); + } + return ApiResponse.onSuccess(userService.toggleBookmark(principalDetails.getUser().getLoginId(), request.getCollectionId() + )); + } + + @GetMapping("/bookmarks") + @Operation(summary = "북마크한 컬렉션 조회 API", description = "사용자가 북마크한 컬렉션 목록을 조회하는 API") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "로그인이 필요한 서비스입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + @Parameters({ + @Parameter(name = "lastId", description = "마지막으로 조회된 컬렉션의 ID (첫 페이지는 0)"), + }) + public ApiResponse getBookmarkedCollections( + @RequestParam(required = false, defaultValue = "0") Long lastId, + @AuthenticationPrincipal PrincipalDetails principalDetails + ) { + if (principalDetails == null) { + throw new LoginHandler(ErrorStatus.LOGIN_REQUIRED); + } + return ApiResponse.onSuccess(userService.getBookmarkedCollections(principalDetails.getUser().getLoginId(), lastId)); + } } \ No newline at end of file From 72b10761fbff8d1fe5b3f91e2c9205cda67e8abf Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:57:25 +0900 Subject: [PATCH 035/256] =?UTF-8?q?feat:=20search/**=20=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EC=9D=80=20=EC=82=AC=EC=9A=A9=EC=9E=90=EB=8F=84=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=ED=95=B4=EC=95=BC=20=ED=95=B4=EC=84=9C=20SecurityConf?= =?UTF-8?q?ig=EC=97=90=20URI=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/config/security/SecurityConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index 09fdecc0..56d78245 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -43,8 +43,9 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte "/swagger-resources/**", "/webjars/**", "/find/**", - "/reset-password" - ).permitAll() + "/reset-password", + "/search/**" + ).permitAll() .requestMatchers( "/register","/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", "/home/**").permitAll() From b75d070ab8a85150d00983cc56d1c7b52cc9d7f1 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:57:57 +0900 Subject: [PATCH 036/256] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89=ED=95=A0=20?= =?UTF-8?q?=EB=95=8C=EC=97=90=EB=8F=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B2=BD=EC=9A=B0=20=EA=B2=80=EC=83=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EC=97=90=20=EB=B6=81=EB=A7=88=ED=81=AC=ED=96=88?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=EC=95=88=ED=96=88=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=8F=AC=ED=95=A8=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EA=B8=B0=EC=9C=84=ED=95=B4=20SearchService=EC=97=90=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/search/SearchService.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java index 3ab36881..f657e1a2 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java @@ -2,11 +2,14 @@ import learningFlow.learningFlow_BE.converter.SearchConverter; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.repository.search.SearchRepositoryCustom; +import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import java.util.List; @@ -18,25 +21,30 @@ public class SearchService { private final SearchRepositoryCustom searchRepository; private static final int PAGE_SIZE = 8; - public SearchResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchConditionDTO condition, Long lastId) { + public SearchResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchConditionDTO condition, Long lastId, Authentication authentication) { PageRequest pageRequest = PageRequest.of(0, PAGE_SIZE); List collections = searchRepository.searchCollections(condition, lastId, pageRequest); if (collections.isEmpty()) { - return SearchConverter.toSearchResultDTO(collections, null, false, 0, 0); + return SearchConverter.toSearchResultDTO(collections, null, false, 0, 0, null); } Long lastCollectionId = collections.getLast().getId(); - boolean hasNext = hasNextPage(condition,lastCollectionId); + boolean hasNext = hasNextPage(condition, lastCollectionId); Integer totalCount = searchRepository.getTotalCount(condition); int totalPages = (int) Math.ceil((double) totalCount / PAGE_SIZE); int currentPage = calculateCurrentPage(lastId, condition); - return SearchConverter.toSearchResultDTO(collections, lastCollectionId, hasNext, totalPages, currentPage); + User currentUser = null; + if (authentication != null && authentication.getPrincipal() instanceof PrincipalDetails) { + currentUser = ((PrincipalDetails) authentication.getPrincipal()).getUser(); + } + + return SearchConverter.toSearchResultDTO(collections, lastCollectionId, hasNext, totalPages, currentPage, currentUser); } private int calculateCurrentPage(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { From d6c22db4b758bd78cd835f80e04177aee66bc9d5 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:58:38 +0900 Subject: [PATCH 037/256] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89=ED=95=A0=20?= =?UTF-8?q?=EB=95=8C=EC=97=90=EB=8F=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EA=B2=BD=EC=9A=B0=20=EA=B2=80=EC=83=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EC=97=90=20=EB=B6=81=EB=A7=88=ED=81=AC=ED=96=88?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=EC=95=88=ED=96=88=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=8F=AC=ED=95=A8=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EA=B8=B0=EC=9C=84=ED=95=B4=20SearchRestController=EC=97=90=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/SearchRestController.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java index bd4e195a..00dc1545 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java @@ -10,10 +10,14 @@ import learningFlow.learningFlow_BE.apiPayload.ApiResponse; import learningFlow.learningFlow_BE.converter.SearchConverter; import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.service.search.SearchService; import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -52,8 +56,10 @@ public ApiResponse searchEpisodes( @RequestParam(required = false) Integer preferMediaType, @RequestParam(required = false) List difficulties, @RequestParam(required = false) List amounts, - @RequestParam(required = false, defaultValue = "0") Long lastId + @RequestParam(required = false, defaultValue = "0") Long lastId, + @AuthenticationPrincipal PrincipalDetails principalDetails ) { - return ApiResponse.onSuccess(searchService.search(SearchConverter.toSearchConditionDTO(keyword, interestFields, preferMediaType, difficulties, amounts), lastId)); + Authentication authentication = (principalDetails != null) ? SecurityContextHolder.getContext().getAuthentication() : null; + return ApiResponse.onSuccess(searchService.search(SearchConverter.toSearchConditionDTO(keyword, interestFields, preferMediaType, difficulties, amounts), lastId, authentication)); } } From b62a48d9a24dd85d0a85483c23e1c2f5984eba78 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 02:59:57 +0900 Subject: [PATCH 038/256] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EC=97=90=20=ED=95=B4=EB=8B=B9=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=EC=97=90=20=EB=8C=80=ED=95=9C=20bookmark=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=EC=99=80=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EB=90=98?= =?UTF-8?q?=EC=96=B4=EC=9E=88=EB=8A=94=EC=A7=80=20=EC=97=AC=EB=B6=80=20boo?= =?UTF-8?q?lean=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/dto/search/SearchResponseDTO.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java index d11ca328..032bab2a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java @@ -39,5 +39,7 @@ public static class CollectionPreviewDTO { Integer textCount; Integer videoCount; List resource; + Integer bookmarkCount; + boolean isBookmarked; } } From 67bf714e6cdedc0b7611d4d950be667a6e113139 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 03:00:23 +0900 Subject: [PATCH 039/256] =?UTF-8?q?feat:=20=ED=98=84=EC=9E=AC=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=ED=95=9C=20=EA=B2=BD=EC=9A=B0=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=99=80=EC=95=BC=20=ED=95=98=EA=B8=B0=20=EB=95=8C?= =?UTF-8?q?=EB=AC=B8=EC=97=90=20=ED=95=B4=EB=8B=B9=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=9B=EC=9D=84=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/SearchConverter.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java index a6e84b29..b13e7505 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java @@ -3,6 +3,7 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.domain.Resource; +import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; @@ -34,10 +35,12 @@ public static SearchResponseDTO.SearchResultDTO toSearchResultDTO( Long lastId, boolean hasNext, int totalPages, - int currentPage + int currentPage, + User currentUser ) { - List list - = collections.stream().map(SearchConverter::toCollectionPreviewDTO).toList(); + List list = collections.stream() + .map(collection -> toCollectionPreviewDTO(collection, currentUser)) + .toList(); return SearchResponseDTO.SearchResultDTO.builder() .searchResults(list) @@ -48,7 +51,7 @@ public static SearchResponseDTO.SearchResultDTO toSearchResultDTO( .build(); } - public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Collection collection) { + public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Collection collection, User currentUser) { int totalSeconds = collection.getEpisodes().stream() .map(CollectionEpisode::getResource) @@ -74,6 +77,8 @@ public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Coll .textCount(textCount) .videoCount(videoCount) .resource(resourceDTOList) + .bookmarkCount(collection.getBookmarkCount()) + .isBookmarked(currentUser != null && currentUser.hasBookmarked(collection.getId())) .build(); } From b8773242a32aad76f786cc0c9c96ebb48742a52e Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 22 Jan 2025 03:01:05 +0900 Subject: [PATCH 040/256] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=A0=81=EC=9A=A9=20=EC=95=88=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=A8=20=EC=95=88=EB=82=B4=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/jwt/JwtAuthenticationFilter.java | 135 ++++++++++-------- 1 file changed, 77 insertions(+), 58 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index c8fb16f1..8ec0c8f3 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -47,77 +47,95 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String jwt = getJwtFromRequest(request); log.info("요청에서 추출한 토큰: {}", jwt); - if (StringUtils.hasText(jwt)) { + if (!StringUtils.hasText(jwt)) { + log.info("토큰이 없는 요청"); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) + ) + ); + return; + } //AccessToken 검증 - if (jwtTokenProvider.validateToken(jwt)) { - log.info("유효한 Access Token"); - - //로그아웃 요청이 아닌 경우에만 블랙리스트 체크 - if (!request.getRequestURI().equals("/logout/test")) { - //TODO : 테스트 위해서 URI 설정을 /logout/test로 해놓음. 추후 수정 필요 - //Redis에서 블랙리스트 체크하기 - 로그아웃된 사용자인지 여부 파악 - Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); - log.info("블랙리스트 체크 결과: {}", isBlacklisted); - - if (Boolean.TRUE.equals(isBlacklisted)) { - throw new RuntimeException("이미 로그아웃된 토큰입니다."); - } - } + if (jwtTokenProvider.validateToken(jwt)) { - //유효한 토큰이면 인증 처리 - String email = jwtTokenProvider.getEmailFromToken(jwt); - log.info("토큰에서 추출한 이메일: {}", email); + log.info("유효한 Access Token"); - UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); - UsernamePasswordAuthenticationToken authentication - = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + //로그아웃 요청이 아닌 경우에만 블랙리스트 체크 + if (!request.getRequestURI().equals("/logout/test")) { + //TODO : 테스트 위해서 URI 설정을 /logout/test로 해놓음. 추후 수정 필요 + //Redis에서 블랙리스트 체크하기 - 로그아웃된 사용자인지 여부 파악 + Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); + log.info("블랙리스트 체크 결과: {}", isBlacklisted); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("인증 정보 SecurityContext에 저장"); - } else { - log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); - // Access Token이 만료된 경우, Refresh Token 확인 - String refreshToken = request.getHeader("Refresh-Token"); - log.info("전달받은 Refresh Token: {}", refreshToken); - - if (!StringUtils.hasText(refreshToken)) { - log.info("Refresh Token이 없음 - 재로그인 필요"); - response.setContentType("application/json"); - response.setCharacterEncoding("UTF-8"); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - String error = new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("401", "토큰이 만료되었습니다. 다시 로그인해주세요.", null) - ); - response.getWriter().write(error); - return; + if (Boolean.TRUE.equals(isBlacklisted)) { + throw new RuntimeException("이미 로그아웃된 토큰입니다."); } + } - if (jwtTokenProvider.validateToken(refreshToken)) { - log.info("유효한 Refresh Token. 새로운 Access Token을 발급 시작"); + //유효한 토큰이면 인증 처리 + String email = jwtTokenProvider.getEmailFromToken(jwt); + log.info("토큰에서 추출한 이메일: {}", email); + + UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + UsernamePasswordAuthenticationToken authentication + = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("인증 정보 SecurityContext에 저장"); + } else { + log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); + // Access Token이 만료된 경우, Refresh Token 확인 + String refreshToken = request.getHeader("Refresh-Token"); + log.info("전달받은 Refresh Token: {}", refreshToken); + + if (!StringUtils.hasText(refreshToken)) { + log.info("Refresh Token이 없음 - 재로그인 필요"); + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + String error = new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("401", "토큰이 만료되었습니다. 다시 로그인해주세요.", null) + ); + response.getWriter().write(error); + return; + } - // Refresh Token이 유효하면 새로운 Access Token 발급 - String email = jwtTokenProvider.getEmailFromToken(refreshToken); - UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + if (jwtTokenProvider.validateToken(refreshToken)) { + log.info("유효한 Refresh Token. 새로운 Access Token을 발급 시작"); - UsernamePasswordAuthenticationToken authentication - = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + // Refresh Token이 유효하면 새로운 Access Token 발급 + String email = jwtTokenProvider.getEmailFromToken(refreshToken); + UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); - //새로운 AccessToken 발급 및 헤더에 추가 - String newAccessToken = jwtTokenProvider.createAccessToken(authentication); - log.info("새로 발급된 Access Token: {}", newAccessToken); - response.addHeader("Authorization", "Bearer " + newAccessToken); + UsernamePasswordAuthenticationToken authentication + = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - //새로운 토큰으로 인증 처리 - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); - } + //새로운 AccessToken 발급 및 헤더에 추가 + String newAccessToken = jwtTokenProvider.createAccessToken(authentication); + log.info("새로 발급된 Access Token: {}", newAccessToken); + response.addHeader("Authorization", "Bearer " + newAccessToken); + + //새로운 토큰으로 인증 처리 + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); } } } catch (Exception e) { - log.error("Security Context에서 사용자 인증을 설정할 수 없습니다.", e); + log.error("Security Context에서 사용자 인증을 설정할 수 없습니다: {}", e.getMessage()); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) + ) + ); + return; } filterChain.doFilter(request, response); @@ -142,6 +160,7 @@ private boolean isPermitAllUrl(String requestURI) { requestURI.startsWith("/swagger-resources") || requestURI.startsWith("/webjars") || requestURI.startsWith("/find") || + requestURI.startsWith("/search") || requestURI.equals("/reset-password"); } } From e254c1b011d7b90cf40ec38873f77fe65e3a0324 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Wed, 22 Jan 2025 15:20:42 +0900 Subject: [PATCH 041/256] =?UTF-8?q?.gradle=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a5d5eb5b..60cd8bbb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ HELP.md -learningFlow/learningFlow-BE/.gradle +.gradle build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ From 7db62662ee87eb1cb1829cfffa25f50b3eed0884 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Wed, 22 Jan 2025 19:43:36 +0900 Subject: [PATCH 042/256] =?UTF-8?q?getUserEpisodeProgress=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 7 ++- .../converter/ResourceConverter.java | 18 ++++++ .../converter/SearchConverter.java | 2 +- .../learningFlow_BE/domain/Resource.java | 6 +- .../domain/UserEpisodeProgress.java | 31 +++++++++++ .../domain/UserEpisodeProgressId.java | 21 +++++++ .../CollectionEpisodeRepository.java | 9 +++ .../UserEpisodeProgressRepository.java | 8 +++ .../service/resource/ResourceService.java | 55 +++++++++++++++++++ .../controller/ResourceRestController.java | 18 +++--- .../web/dto/resource/ResourceResponseDTO.java | 29 ++++++++-- 11 files changed, 185 insertions(+), 19 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgressId.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionEpisodeRepository.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index 328e8925..88973c39 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -26,7 +26,7 @@ public enum ErrorStatus implements BaseErrorCode { //Resources 관련 에어 RESOURCES_NOT_FOUND(HttpStatus.NOT_FOUND,"RESOURCE4001","강의 에피소드를 찾을 수 없습니다."), - + QUANTITY_IS_NULL(HttpStatus.BAD_REQUEST, "RESOURCE4002", "분량이 존재하지 않습니다"), //페이징 시 페이지 범위를 벗어났을 때 PAGE_OUT_OF_RANGE(HttpStatus.BAD_REQUEST, "PAGE4001","페이지 범위에 맞지 않는 페이지 값 입니다."), @@ -43,7 +43,10 @@ public enum ErrorStatus implements BaseErrorCode { EMAIL_ALREADY_EXISTS(HttpStatus.BAD_REQUEST,"EMAIL4001" ,"이미 동일한 이메일로 생성된 계정이 존재합니다."), - INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."); + INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."), + + // 컬렉션 에피소드 에러 + EPISODE_NOT_FOUND(HttpStatus.NOT_FOUND, "EPISODE4001", "존재하지 않는 에피소드 입니다."); private final HttpStatus httpStatus; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java new file mode 100644 index 00000000..9cf98d44 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -0,0 +1,18 @@ +package learningFlow.learningFlow_BE.converter; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; + +public class ResourceConverter { + public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress){ + return ResourceResponseDTO.ResourceUrlDTO.builder() + .collectionTitle(collection.getTitle()) + .interestField(collection.getInterestField()) + .resourceType(userProgress.getResourceType()) + .clientUrl() + .progress(userProgress.getCurrentProgress()) + .memoContents() + .episodeInformationList().build(); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java index b13e7505..fcde536b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java @@ -55,7 +55,7 @@ public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Coll int totalSeconds = collection.getEpisodes().stream() .map(CollectionEpisode::getResource) - .mapToInt(Resource::getRuntime).sum(); + .mapToInt(Resource::getResourceQuantity).sum(); int totalHours = (int) Math.ceil(totalSeconds / 3600); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java index 445c8c10..b0e3899b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java @@ -31,14 +31,14 @@ public class Resource extends BaseEntity { @Column(nullable = false) private String url; // 자료 링크 - @Column(name = "embedded_url",nullable = false) - private String embeddedUrl; // 임베드 url + @Column(name = "client_url") + private String clientUrl; // 클라이언트에게 보내줄 url @OneToMany(mappedBy = "resource", cascade = CascadeType.ALL) private List episodes; @Column(nullable = false) - private Integer runtime; //초단위로 저장(유튜브 동영상이 초단위이기 때문) + private Integer resourceQuantity; //초단위로 저장(유튜브 동영상이 초단위이기 때문) public void addEpisode(CollectionEpisode episode) { this.episodes.add(episode); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java new file mode 100644 index 00000000..c15862ee --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java @@ -0,0 +1,31 @@ +package learningFlow.learningFlow_BE.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Entity +@Table(name = "user_episode_progress") +public class UserEpisodeProgress extends BaseEntity{ + @EmbeddedId + private UserEpisodeProgressId userEpisodeProgressId; + @Column(nullable = false) + private int episodeNumber; + + private Integer currentProgress; + @Column(nullable = false) + private Integer totalProgress; + @Column(nullable = false) + private ResourceType resourceType; + +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgressId.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgressId.java new file mode 100644 index 00000000..7318fe6c --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgressId.java @@ -0,0 +1,21 @@ +package learningFlow.learningFlow_BE.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Embeddable +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserEpisodeProgressId implements Serializable { + @Column(name = "collection_episode_id") + private Long collectionEpisodeId; + + @Column(name = "user_id") + private String userId; +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionEpisodeRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionEpisodeRepository.java new file mode 100644 index 00000000..742e97e1 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionEpisodeRepository.java @@ -0,0 +1,9 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface CollectionEpisodeRepository extends JpaRepository { +} \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java new file mode 100644 index 00000000..b49b10c9 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java @@ -0,0 +1,8 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; +import learningFlow.learningFlow_BE.domain.UserEpisodeProgressId; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserEpisodeProgressRepository extends JpaRepository { +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java new file mode 100644 index 00000000..899e296a --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -0,0 +1,55 @@ +package learningFlow.learningFlow_BE.service.resource; + +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; +import learningFlow.learningFlow_BE.domain.*; +import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; +import learningFlow.learningFlow_BE.repository.UserEpisodeProgressRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class ResourceService { + private final UserEpisodeProgressRepository userEpisodeProgressRepository; + private final CollectionEpisodeRepository collectionEpisodeRepository; + // 유저 + 에피소드 조회 + // 존재하지 않을 경우 -> 처음 -> 객체 생성 -> 저장 + // 있을 경우 -> 에피소드 정보 불러오기 + // 처음인 경우 -> currentProgress = 0, embeddedUrl 생성 + // 처음이 아닐 경우 -> embeddedUrl, currentProgress 조회 + @Transactional + public UserEpisodeProgress getUserEpisodeProgress(Long episodeId, String loginId){ + UserEpisodeProgressId userEpisodeProgressId = new UserEpisodeProgressId(episodeId, loginId); + + Optional episodeProgress = userEpisodeProgressRepository.findById(userEpisodeProgressId); + + return episodeProgress.orElseGet(() -> { + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + Integer resourceQuantity = episode.getResource().getResourceQuantity(); + if (resourceQuantity == null) throw new ResourceHandler(ErrorStatus.QUANTITY_IS_NULL); + UserEpisodeProgress userEpisodeProgress = new UserEpisodeProgress(userEpisodeProgressId, episode.getEpisodeNumber(), 0, episode.getResource().getResourceQuantity(), episode.getResource().getType()); + return userEpisodeProgressRepository.save(userEpisodeProgress); + }); + } + + public Collection getCollection(Long episodeId) { + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + return episode.getCollection(); + } + + // 분량 체크 + public Integer getResourceQuantity(Long episodeId){ + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId).get(); + Integer resourceQuantity = episode.getResource().getResourceQuantity(); + if (resourceQuantity == null){ + + } + } +} \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index 65de5b5a..0ca17149 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -13,23 +13,19 @@ import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; import learningFlow.learningFlow_BE.apiPayload.exception.handler.UserHandler; import learningFlow.learningFlow_BE.converter.MemoConverter; +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.service.memo.MemoCommandService; +import learningFlow.learningFlow_BE.service.resource.ResourceService; import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; import learningFlow.learningFlow_BE.web.dto.memo.MemoResponseDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.*; - -import static org.springframework.data.redis.connection.ReactiveStreamCommands.AddStreamRecord.body; - @RestController @RequiredArgsConstructor @Validated @@ -38,6 +34,7 @@ @Tag(name = "Resource", description = "Collection 내에 특정 resource 관련해서 기능하는 API") public class ResourceRestController { private final MemoCommandService memoCommandService; + private final ResourceService resourceService; @GetMapping("/{episode-id}") @Operation(summary = "강의 시청, 강좌로 이동 API", description = "강의 에피소드를 시청하기 위해 강좌로 이동하는 API, 그리고 강의를 시청 처리하는 로직도 포함") @ApiResponses({ @@ -47,10 +44,15 @@ public class ResourceRestController { @Parameters({ @Parameter(name = "episode-id", description = "시청할 강의 에피소드 ID") }) - public ApiResponse watchEpisode(@PathVariable("episode-id") Long episodeId) { + public ApiResponse watchEpisode( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable("episode-id") Long episodeId) { /** * 강의 시청 하는 API로 강좌로 이동하는 API 이기 때문에 일단 Resource의 Url을 반환하게 해놓았어요. */ + String loginId = principalDetails.getUser().getLoginId(); + UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); + Collection collection = resourceService.getCollection(episodeId); // TODO: 강의 시청 로직 구현, 반환 DTO로 converting return ApiResponse.onSuccess(null); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 4a29e750..bc09ecd6 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -1,18 +1,37 @@ package learningFlow.learningFlow_BE.web.dto.resource; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import jakarta.validation.constraints.NotBlank; +import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; +import lombok.*; + +import java.util.List; public class ResourceResponseDTO { @Getter + @Setter @AllArgsConstructor @NoArgsConstructor @Builder public static class ResourceUrlDTO { - String embeddedUrl; + String collectionTitle; + InterestField interestField; + ResourceType resourceType; + @NotBlank + String clientUrl; + String urlTitle; + Integer progress; + String memoContents; + List episodeInformationList; + } + @Getter + @AllArgsConstructor + @NoArgsConstructor + @Builder + public static class episodeInformation { + Integer episodeNumber; + String urlTitle; } @Getter From 5049face916c62bd2d19352328715cb551bceaa4 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Wed, 22 Jan 2025 20:23:49 +0900 Subject: [PATCH 043/256] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=EC=9E=84=EB=B2=A0=EB=93=9C=20url=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/embed/YoutubeUrlEmbedService.java | 54 +++++++++++++++++++ .../service/resource/ResourceService.java | 10 +--- 2 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java new file mode 100644 index 00000000..6b563d9c --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java @@ -0,0 +1,54 @@ +package learningFlow.learningFlow_BE.service.embed; + +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.domain.Resource; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; +import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.net.URI; +import java.net.URISyntaxException; + +@Service +@RequiredArgsConstructor +@Transactional +public class YoutubeUrlEmbedService { + private final CollectionEpisodeRepository collectionEpisodeRepository; + public Resource getResource(Long episodeId){ + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + Resource resource = episode.getResource(); + // 유튜브고 임베드 url 미 생성인 경우 + if (resource.getType() == ResourceType.VIDEO + && resource.getClientUrl() == null) { + String url = EmbedUrl(resource.getUrl()); + + } + } + + public String EmbedUrl(String youtubeUrl){ + try { + URI uri = new URI(youtubeUrl); + String host = uri.getHost(); + String query = uri.getQuery(); + // 기본 형식: https://www.youtube.com/watch?v= + if (host.contains("youtube.com") && query != null && query.contains("v=")){ + String[] params = query.split("&"); + for (String param : params) { + if (param.startsWith("v=")){ + String videoId = param.substring(2); + return "https://www.youtube.com/embed/" + videoId; + } + } + } + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index 899e296a..8e1f6532 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -3,6 +3,7 @@ import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; import learningFlow.learningFlow_BE.domain.*; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; import learningFlow.learningFlow_BE.repository.UserEpisodeProgressRepository; import lombok.RequiredArgsConstructor; @@ -43,13 +44,4 @@ public Collection getCollection(Long episodeId) { .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); return episode.getCollection(); } - - // 분량 체크 - public Integer getResourceQuantity(Long episodeId){ - CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId).get(); - Integer resourceQuantity = episode.getResource().getResourceQuantity(); - if (resourceQuantity == null){ - - } - } } \ No newline at end of file From 6a96b2ed6ed14a70935116810a15512556467765 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Wed, 22 Jan 2025 21:52:53 +0900 Subject: [PATCH 044/256] =?UTF-8?q?youtube=20=EC=9E=84=EB=B2=A0=EB=93=9C?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 7 ++++- .../converter/ResourceConverter.java | 31 ++++++++++++++++--- .../learningFlow_BE/domain/Resource.java | 5 +++ .../repository/MemoRepository.java | 4 +++ .../repository/ResourceRepository.java | 7 +++++ .../service/embed/YoutubeUrlEmbedService.java | 17 ++++++++-- .../service/resource/ResourceService.java | 14 ++++++++- .../controller/ResourceRestController.java | 19 +++++++++--- 8 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/ResourceRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index 88973c39..3d9d0a78 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -46,7 +46,12 @@ public enum ErrorStatus implements BaseErrorCode { INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."), // 컬렉션 에피소드 에러 - EPISODE_NOT_FOUND(HttpStatus.NOT_FOUND, "EPISODE4001", "존재하지 않는 에피소드 입니다."); + EPISODE_NOT_FOUND(HttpStatus.NOT_FOUND, "EPISODE4001", "존재하지 않는 에피소드 입니다."), + + //URI 에러 + URI_SYNTAX_ERROR(HttpStatus.BAD_REQUEST, "URI4001", "잘못된 형태의 URI 입니다"), + // 임베드 에러 + YOUTUBE_URI_SYNTAX_ERROR(HttpStatus.BAD_REQUEST, "EMBED4001", "유튜브 URI 형식이 아닙니다."); private final HttpStatus httpStatus; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 9cf98d44..168b440c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -1,18 +1,41 @@ package learningFlow.learningFlow_BE.converter; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.domain.Resource; import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + public class ResourceConverter { - public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress){ + public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress, Resource resource, String memoContents){ + + return ResourceResponseDTO.ResourceUrlDTO.builder() .collectionTitle(collection.getTitle()) .interestField(collection.getInterestField()) .resourceType(userProgress.getResourceType()) - .clientUrl() + .clientUrl(resource.getClientUrl()) .progress(userProgress.getCurrentProgress()) - .memoContents() - .episodeInformationList().build(); + .memoContents(memoContents) + .episodeInformationList(episodeInformationList(collection)) + .build(); + } + + public static List episodeInformationList(Collection collection) { + List episodeInformationList = new ArrayList<>(); + + for (CollectionEpisode episode : collection.getEpisodes()) { + episodeInformationList.add(new ResourceResponseDTO.episodeInformation( + episode.getEpisodeNumber(), + episode.getResource().getTitle() + )); + } + Collections.sort(episodeInformationList, Comparator.comparingInt(ResourceResponseDTO.episodeInformation::getEpisodeNumber)); + return episodeInformationList; } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java index b0e3899b..5b06e8a7 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java @@ -53,4 +53,9 @@ public void removeEpisode(CollectionEpisode episode) { episode.setResource(null); } } + + public void setClientUrl(String clientUrl) { + if (this.clientUrl != null) return; + this.clientUrl = clientUrl; + } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java index aacabbc1..f34c7ade 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java @@ -3,6 +3,10 @@ import learningFlow.learningFlow_BE.domain.Memo; import learningFlow.learningFlow_BE.domain.MemoId; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface MemoRepository extends JpaRepository { + @Query("SELECT m.contents FROM Memo m WHERE m.id.collectionEpisodeId = :episodeId") + String findByEpisodeId(@Param("episodeId") Long episodeId); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/ResourceRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/ResourceRepository.java new file mode 100644 index 00000000..bf5b98ef --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/ResourceRepository.java @@ -0,0 +1,7 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.Resource; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResourceRepository extends JpaRepository { +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java index 6b563d9c..2b18e3a2 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java @@ -6,6 +6,7 @@ import learningFlow.learningFlow_BE.domain.Resource; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; +import learningFlow.learningFlow_BE.repository.ResourceRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,6 +19,7 @@ @Transactional public class YoutubeUrlEmbedService { private final CollectionEpisodeRepository collectionEpisodeRepository; + private final ResourceRepository resourceRepository; public Resource getResource(Long episodeId){ CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); @@ -26,8 +28,11 @@ public Resource getResource(Long episodeId){ if (resource.getType() == ResourceType.VIDEO && resource.getClientUrl() == null) { String url = EmbedUrl(resource.getUrl()); - + resource.setClientUrl(url); + return resourceRepository.save(resource); } + // 이미 생성된 경우 + return resource; } public String EmbedUrl(String youtubeUrl){ @@ -35,6 +40,7 @@ public String EmbedUrl(String youtubeUrl){ URI uri = new URI(youtubeUrl); String host = uri.getHost(); String query = uri.getQuery(); + String path = uri.getPath(); // 기본 형식: https://www.youtube.com/watch?v= if (host.contains("youtube.com") && query != null && query.contains("v=")){ String[] params = query.split("&"); @@ -45,8 +51,15 @@ public String EmbedUrl(String youtubeUrl){ } } } + // 축약형: https://youtu.be/ + if (host.contains("youtube.be") && path != null && path.length() > 1) { + String videoId = path.substring(1); // 맨 앞 "/" 제거 + return "https://youtu.be/embed/" + videoId; + } + + throw new ResourceHandler(ErrorStatus.YOUTUBE_URI_SYNTAX_ERROR); } catch (URISyntaxException e) { - throw new RuntimeException(e); + throw new ResourceHandler(ErrorStatus.URI_SYNTAX_ERROR); } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index 8e1f6532..0a64431d 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -5,6 +5,7 @@ import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; +import learningFlow.learningFlow_BE.repository.MemoRepository; import learningFlow.learningFlow_BE.repository.UserEpisodeProgressRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -18,6 +19,7 @@ public class ResourceService { private final UserEpisodeProgressRepository userEpisodeProgressRepository; private final CollectionEpisodeRepository collectionEpisodeRepository; + private final MemoRepository memoRepository; // 유저 + 에피소드 조회 // 존재하지 않을 경우 -> 처음 -> 객체 생성 -> 저장 // 있을 경우 -> 에피소드 정보 불러오기 @@ -38,10 +40,20 @@ public UserEpisodeProgress getUserEpisodeProgress(Long episodeId, String loginId return userEpisodeProgressRepository.save(userEpisodeProgress); }); } - + @Transactional public Collection getCollection(Long episodeId) { CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); return episode.getCollection(); } + @Transactional + public ResourceType getResourceType(Long episodeId) { + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + return episode.getResource().getType(); + } + @Transactional + public String getMemoContents(Long episodeId){ + return memoRepository.findByEpisodeId(episodeId); + } } \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index 0ca17149..aedb3404 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -9,13 +9,14 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; -import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; -import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; -import learningFlow.learningFlow_BE.apiPayload.exception.handler.UserHandler; import learningFlow.learningFlow_BE.converter.MemoConverter; +import learningFlow.learningFlow_BE.converter.ResourceConverter; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.Resource; import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.service.embed.YoutubeUrlEmbedService; import learningFlow.learningFlow_BE.service.memo.MemoCommandService; import learningFlow.learningFlow_BE.service.resource.ResourceService; import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; @@ -35,6 +36,7 @@ public class ResourceRestController { private final MemoCommandService memoCommandService; private final ResourceService resourceService; + private final YoutubeUrlEmbedService youtubeUrlEmbedService; @GetMapping("/{episode-id}") @Operation(summary = "강의 시청, 강좌로 이동 API", description = "강의 에피소드를 시청하기 위해 강좌로 이동하는 API, 그리고 강의를 시청 처리하는 로직도 포함") @ApiResponses({ @@ -53,8 +55,15 @@ public ApiResponse watchEpisode( String loginId = principalDetails.getUser().getLoginId(); UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); Collection collection = resourceService.getCollection(episodeId); - // TODO: 강의 시청 로직 구현, 반환 DTO로 converting - return ApiResponse.onSuccess(null); + ResourceType resourceType = resourceService.getResourceType(episodeId); + String memoContents = resourceService.getMemoContents(episodeId); + Resource resource = null; + + if (resourceType == ResourceType.VIDEO) { + resource = youtubeUrlEmbedService.getResource(episodeId); + } // TEXT 일 경우도 처리 + + return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memoContents)); } @PostMapping("/{episode-id}/memo") From b027f1ef606c7ace206a152dda036323d54e148e Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Thu, 23 Jan 2025 02:55:23 +0900 Subject: [PATCH 045/256] =?UTF-8?q?=EC=88=98=EA=B0=95=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QResource.java | 6 +- .../domain/QUserEpisodeProgress.java | 65 +++++++++++++++++++ .../domain/QUserEpisodeProgressId.java | 39 +++++++++++ .../converter/ResourceConverter.java | 10 ++- .../learningFlow_BE/domain/BaseEntity.java | 5 +- .../domain/UserCollection.java | 14 +++- .../repository/MemoRepository.java | 4 +- .../repository/UserCollectionRepository.java | 12 ++++ .../service/resource/ResourceService.java | 49 +++++++++++--- .../controller/ResourceRestController.java | 5 +- .../src/main/resources/application.yml | 2 +- 11 files changed, 186 insertions(+), 25 deletions(-) create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java create mode 100644 learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java index 067289e9..aaa543ce 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java @@ -22,18 +22,18 @@ public class QResource extends EntityPathBase { public final QBaseEntity _super = new QBaseEntity(this); + public final StringPath clientUrl = createString("clientUrl"); + //inherited public final DateTimePath createdAt = _super.createdAt; - public final StringPath embeddedUrl = createString("embeddedUrl"); - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); public final NumberPath id = createNumber("id", Long.class); public final StringPath resourceDetails = createString("resourceDetails"); - public final NumberPath runtime = createNumber("runtime", Integer.class); + public final NumberPath resourceQuantity = createNumber("resourceQuantity", Integer.class); public final StringPath title = createString("title"); diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java new file mode 100644 index 00000000..6b9e370c --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java @@ -0,0 +1,65 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QUserEpisodeProgress is a Querydsl query type for UserEpisodeProgress + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUserEpisodeProgress extends EntityPathBase { + + private static final long serialVersionUID = 820001901L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QUserEpisodeProgress userEpisodeProgress = new QUserEpisodeProgress("userEpisodeProgress"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath currentProgress = createNumber("currentProgress", Integer.class); + + public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); + + public final EnumPath resourceType = createEnum("resourceType", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); + + public final NumberPath totalProgress = createNumber("totalProgress", Integer.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final QUserEpisodeProgressId userEpisodeProgressId; + + public QUserEpisodeProgress(String variable) { + this(UserEpisodeProgress.class, forVariable(variable), INITS); + } + + public QUserEpisodeProgress(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QUserEpisodeProgress(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QUserEpisodeProgress(PathMetadata metadata, PathInits inits) { + this(UserEpisodeProgress.class, metadata, inits); + } + + public QUserEpisodeProgress(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.userEpisodeProgressId = inits.isInitialized("userEpisodeProgressId") ? new QUserEpisodeProgressId(forProperty("userEpisodeProgressId")) : null; + } + +} + diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java new file mode 100644 index 00000000..2ed90664 --- /dev/null +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java @@ -0,0 +1,39 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QUserEpisodeProgressId is a Querydsl query type for UserEpisodeProgressId + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QUserEpisodeProgressId extends BeanPath { + + private static final long serialVersionUID = 2042814056L; + + public static final QUserEpisodeProgressId userEpisodeProgressId = new QUserEpisodeProgressId("userEpisodeProgressId"); + + public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); + + public final StringPath userId = createString("userId"); + + public QUserEpisodeProgressId(String variable) { + super(UserEpisodeProgressId.class, forVariable(variable)); + } + + public QUserEpisodeProgressId(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QUserEpisodeProgressId(PathMetadata metadata) { + super(UserEpisodeProgressId.class, metadata); + } + +} + diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 168b440c..1d44a7a8 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -1,9 +1,6 @@ package learningFlow.learningFlow_BE.converter; -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.domain.Resource; -import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; +import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import java.util.ArrayList; @@ -12,8 +9,9 @@ import java.util.List; public class ResourceConverter { - public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress, Resource resource, String memoContents){ - + public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress, Resource resource, Memo memo){ + String memoContents = memo.getContents(); + if (memoContents == null) memoContents = "작성하신 글의 첫 줄은 노트의 제목이 됩니다, 최대 2,000자까지 입력하실 수 있어요"; return ResourceResponseDTO.ResourceUrlDTO.builder() .collectionTitle(collection.getTitle()) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java index a47ffb40..0417b701 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java @@ -14,10 +14,11 @@ @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { @CreatedDate - @Column(nullable = false, updatable = false) + @Column(nullable = true, updatable = false) private LocalDateTime createdAt; @LastModifiedDate - @Column(nullable = false) + @Column(nullable = true) private LocalDateTime updatedAt; + // 다시 바꿀것 } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java index 3ea0b30c..c74ade1b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java @@ -10,7 +10,8 @@ @AllArgsConstructor @Builder @Entity -@Table(name = "user_collection") +@Table(name = "user_collection", + uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "collection_id"})) public class UserCollection { @Id @@ -54,5 +55,16 @@ public void setCollection(Collection collection) { collection.getUserCollections().add(this); } } + + public void setUserCollection(User user, Collection collection, Integer userCollectionStatus) { + this.user = user; + this.collection = collection; + this.userCollectionStatus = userCollectionStatus; + } + + public void setUserCollectionStatus(Integer userCollectionStatus) { + if(this.userCollectionStatus != null) + this.userCollectionStatus = userCollectionStatus; + } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java index f34c7ade..60538a7d 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java @@ -7,6 +7,6 @@ import org.springframework.data.repository.query.Param; public interface MemoRepository extends JpaRepository { - @Query("SELECT m.contents FROM Memo m WHERE m.id.collectionEpisodeId = :episodeId") - String findByEpisodeId(@Param("episodeId") Long episodeId); + @Query("SELECT m FROM Memo m WHERE m.id.collectionEpisodeId = :episodeId") + Memo findByEpisodeId(@Param("episodeId") Long episodeId); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java new file mode 100644 index 00000000..3ffe7374 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -0,0 +1,12 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.UserCollection; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserCollectionRepository extends JpaRepository { + Optional findByUserAndCollection(User user, Collection collection); +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index 0a64431d..8437e396 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -4,9 +4,7 @@ import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.enums.ResourceType; -import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; -import learningFlow.learningFlow_BE.repository.MemoRepository; -import learningFlow.learningFlow_BE.repository.UserEpisodeProgressRepository; +import learningFlow.learningFlow_BE.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,23 +18,30 @@ public class ResourceService { private final UserEpisodeProgressRepository userEpisodeProgressRepository; private final CollectionEpisodeRepository collectionEpisodeRepository; private final MemoRepository memoRepository; + private final UserCollectionRepository userCollectionRepository; + private final UserRepository userRepository; // 유저 + 에피소드 조회 - // 존재하지 않을 경우 -> 처음 -> 객체 생성 -> 저장 + // 존재하지 않을 경우 -> 처음 -> 객체 생성 -> 저장 && 유저-컬렉션에 등록 // 있을 경우 -> 에피소드 정보 불러오기 // 처음인 경우 -> currentProgress = 0, embeddedUrl 생성 - // 처음이 아닐 경우 -> embeddedUrl, currentProgress 조회 + // 처음이 아닐 경우 -> embeddedUrl, currentProgress 조회 -> 진도 저장 @Transactional public UserEpisodeProgress getUserEpisodeProgress(Long episodeId, String loginId){ UserEpisodeProgressId userEpisodeProgressId = new UserEpisodeProgressId(episodeId, loginId); Optional episodeProgress = userEpisodeProgressRepository.findById(userEpisodeProgressId); + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + + updateUserCollection(episode, loginId); + return episodeProgress.orElseGet(() -> { - CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) - .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + Integer resourceQuantity = episode.getResource().getResourceQuantity(); if (resourceQuantity == null) throw new ResourceHandler(ErrorStatus.QUANTITY_IS_NULL); UserEpisodeProgress userEpisodeProgress = new UserEpisodeProgress(userEpisodeProgressId, episode.getEpisodeNumber(), 0, episode.getResource().getResourceQuantity(), episode.getResource().getType()); + return userEpisodeProgressRepository.save(userEpisodeProgress); }); } @@ -53,7 +58,35 @@ public ResourceType getResourceType(Long episodeId) { return episode.getResource().getType(); } @Transactional - public String getMemoContents(Long episodeId){ + public Memo getMemoContents(Long episodeId){ return memoRepository.findByEpisodeId(episodeId); } + + @Transactional + public UserCollection updateUserCollection(CollectionEpisode episode, String loginId) { + // UserCollection 조회 + Collection collection = episode.getCollection(); + User user = userRepository.findById(loginId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.USER_NOT_FOUND)); + + // UserCollection 조회 + Optional optionalUserCollection = userCollectionRepository.findByUserAndCollection(user, collection); + + Integer episodeNumber = episode.getEpisodeNumber(); + UserCollection userCollection; + + if (optionalUserCollection.isPresent()) { + // UserCollection 이 존재하는 경우 episodeNumber 만 업데이트 + userCollection = optionalUserCollection.get(); + userCollection.setUserCollectionStatus(episodeNumber); + } else { + // UserCollection 이 존재하지 않는 경우 새로 생성 + userCollection = new UserCollection(); + userCollection.setUser(user); + userCollection.setCollection(collection); + userCollection.setUserCollectionStatus(episodeNumber); + } + // 저장 + return userCollectionRepository.save(userCollection); + } } \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index aedb3404..c383b078 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -12,6 +12,7 @@ import learningFlow.learningFlow_BE.converter.MemoConverter; import learningFlow.learningFlow_BE.converter.ResourceConverter; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.Memo; import learningFlow.learningFlow_BE.domain.Resource; import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; import learningFlow.learningFlow_BE.domain.enums.ResourceType; @@ -56,14 +57,14 @@ public ApiResponse watchEpisode( UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); Collection collection = resourceService.getCollection(episodeId); ResourceType resourceType = resourceService.getResourceType(episodeId); - String memoContents = resourceService.getMemoContents(episodeId); + Memo memo = resourceService.getMemoContents(episodeId); Resource resource = null; if (resourceType == ResourceType.VIDEO) { resource = youtubeUrlEmbedService.getResource(episodeId); } // TEXT 일 경우도 처리 - return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memoContents)); + return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memo)); } @PostMapping("/{episode-id}/memo") diff --git a/learningFlow/src/main/resources/application.yml b/learningFlow/src/main/resources/application.yml index ae85686d..aa925a08 100644 --- a/learningFlow/src/main/resources/application.yml +++ b/learningFlow/src/main/resources/application.yml @@ -6,7 +6,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? jpa: hibernate: - ddl-auto: update # ??? ?? ???? (?? ????? ??) + ddl-auto: update # ??? ?? ???? (?? ????? ??) show-sql: true # SQL ?? ?? sql: init: From 092f9eefe1d6554f8a45a38fb45f5209f66012a9 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Thu, 23 Jan 2025 03:47:09 +0900 Subject: [PATCH 046/256] =?UTF-8?q?=EC=9C=A0=ED=8A=9C=EB=B8=8C=20=EC=9E=84?= =?UTF-8?q?=EB=B2=A0=EB=93=9C=20=EB=B0=8F=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 15 ++++++----- .../domain/UserCollection.java | 12 ++++----- .../repository/MemoRepository.java | 4 ++- .../service/resource/ResourceService.java | 25 ++++++++++++++----- .../controller/ResourceRestController.java | 6 ++++- 5 files changed, 40 insertions(+), 22 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 1d44a7a8..baae624b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -1,23 +1,22 @@ package learningFlow.learningFlow_BE.converter; import learningFlow.learningFlow_BE.domain.*; +import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import java.util.*; public class ResourceConverter { - public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress, Resource resource, Memo memo){ - String memoContents = memo.getContents(); - if (memoContents == null) memoContents = "작성하신 글의 첫 줄은 노트의 제목이 됩니다, 최대 2,000자까지 입력하실 수 있어요"; - + public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress, Resource resource, Optional memo){ + String memoContents = "작성하신 글의 첫 줄은 노트의 제목이 됩니다, 최대 2,000자까지 입력하실 수 있어요"; + if (!memo.isEmpty()) + memoContents = memo.get().getContents(); return ResourceResponseDTO.ResourceUrlDTO.builder() .collectionTitle(collection.getTitle()) .interestField(collection.getInterestField()) .resourceType(userProgress.getResourceType()) .clientUrl(resource.getClientUrl()) + .urlTitle(resource.getTitle()) .progress(userProgress.getCurrentProgress()) .memoContents(memoContents) .episodeInformationList(episodeInformationList(collection)) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java index c74ade1b..e2107eee 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java @@ -12,7 +12,7 @@ @Entity @Table(name = "user_collection", uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "collection_id"})) -public class UserCollection { +public class UserCollection{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -29,9 +29,9 @@ public class UserCollection { @Column(name = "user_collection_status", nullable = false) private Integer userCollectionStatus; + @Column(name = "last_accessed_at", nullable = false) private LocalDate lastAccessedAt; - public void setUser(User user) { // 기존 유저와의 관계 제거 if (this.user != null) { @@ -60,11 +60,11 @@ public void setUserCollection(User user, Collection collection, Integer userColl this.user = user; this.collection = collection; this.userCollectionStatus = userCollectionStatus; + this.lastAccessedAt = LocalDate.now(); } - - public void setUserCollectionStatus(Integer userCollectionStatus) { - if(this.userCollectionStatus != null) - this.userCollectionStatus = userCollectionStatus; + public void updateUserCollection(Integer userCollectionStatus) { + this.userCollectionStatus = userCollectionStatus; + this.lastAccessedAt = LocalDate.now(); } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java index 60538a7d..e4bf088e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java @@ -6,7 +6,9 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.Optional; + public interface MemoRepository extends JpaRepository { @Query("SELECT m FROM Memo m WHERE m.id.collectionEpisodeId = :episodeId") - Memo findByEpisodeId(@Param("episodeId") Long episodeId); + Optional findByEpisodeId(@Param("episodeId") Long episodeId); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index 8437e396..eb6ebac7 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -6,6 +6,7 @@ import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.repository.*; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,6 +14,7 @@ @Service @RequiredArgsConstructor +@Slf4j @Transactional(readOnly = true) public class ResourceService { private final UserEpisodeProgressRepository userEpisodeProgressRepository; @@ -58,35 +60,46 @@ public ResourceType getResourceType(Long episodeId) { return episode.getResource().getType(); } @Transactional - public Memo getMemoContents(Long episodeId){ + public Optional getMemoContents(Long episodeId){ return memoRepository.findByEpisodeId(episodeId); } @Transactional public UserCollection updateUserCollection(CollectionEpisode episode, String loginId) { + log.info("Received loginId: {}", loginId); + log.info("Received episode: {}", episode); // UserCollection 조회 Collection collection = episode.getCollection(); + log.info("Extracted collection: {}", collection); + User user = userRepository.findById(loginId) .orElseThrow(() -> new ResourceHandler(ErrorStatus.USER_NOT_FOUND)); + log.info("Found user: {}", user); // UserCollection 조회 Optional optionalUserCollection = userCollectionRepository.findByUserAndCollection(user, collection); + log.info("UserCollection found: {}", optionalUserCollection.isPresent()); Integer episodeNumber = episode.getEpisodeNumber(); + log.info("Episode number: {}", episodeNumber); + UserCollection userCollection; if (optionalUserCollection.isPresent()) { // UserCollection 이 존재하는 경우 episodeNumber 만 업데이트 userCollection = optionalUserCollection.get(); - userCollection.setUserCollectionStatus(episodeNumber); + log.info("Updating existing UserCollection with id: {}", userCollection.getId()); + + userCollection.updateUserCollection(episodeNumber); } else { // UserCollection 이 존재하지 않는 경우 새로 생성 userCollection = new UserCollection(); - userCollection.setUser(user); - userCollection.setCollection(collection); - userCollection.setUserCollectionStatus(episodeNumber); + userCollection.setUserCollection(user, collection, episodeNumber); + log.info("Created new UserCollection"); } // 저장 - return userCollectionRepository.save(userCollection); + UserCollection savedCollection = userCollectionRepository.save(userCollection); + log.info("Saved UserCollection: {}", savedCollection); + return savedCollection; } } \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index c383b078..8eb0dc95 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -28,6 +28,9 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; + +import java.util.Optional; + @RestController @RequiredArgsConstructor @Validated @@ -57,7 +60,8 @@ public ApiResponse watchEpisode( UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); Collection collection = resourceService.getCollection(episodeId); ResourceType resourceType = resourceService.getResourceType(episodeId); - Memo memo = resourceService.getMemoContents(episodeId); + Optional memo = resourceService.getMemoContents(episodeId); + // log.info("Memo= ", memo.get().getContents()); Resource resource = null; if (resourceType == ResourceType.VIDEO) { From 2fb425bf0a9a8c92d9fb44c3b41d78b9b8f194ec Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:09:08 +0900 Subject: [PATCH 047/256] =?UTF-8?q?style=20:=20SearchConverter=EC=97=90?= =?UTF-8?q?=EC=84=9C=20CollectionConverter=EB=A1=9C=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{SearchConverter.java => CollectionConverter.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/{SearchConverter.java => CollectionConverter.java} (99%) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java similarity index 99% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java rename to learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index b13e7505..795c48c6 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/SearchConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -12,7 +12,7 @@ import java.util.List; -public class SearchConverter { +public class CollectionConverter { public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( String keyword, From eec9c7b84e85b5750d257f712ad054d7f0617bb4 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:09:38 +0900 Subject: [PATCH 048/256] =?UTF-8?q?style=20:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20collection=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20CollectionRepositoryCustom=20=EC=83=81=EC=86=8D?= =?UTF-8?q?=EB=B0=9B=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/{ => collection}/CollectionRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/{ => collection}/CollectionRepository.java (71%) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java similarity index 71% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java rename to learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java index 5c3ff351..f75f1063 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/CollectionRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java @@ -1,10 +1,10 @@ -package learningFlow.learningFlow_BE.repository; +package learningFlow.learningFlow_BE.repository.collection; import learningFlow.learningFlow_BE.domain.Collection; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -public interface CollectionRepository extends JpaRepository { +public interface CollectionRepository extends JpaRepository, CollectionRepositoryCustom { List findByIdIn(List ids); } From 809772569e75807846e85173fdc84e0dd682a040 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:09:53 +0900 Subject: [PATCH 049/256] =?UTF-8?q?style=20:=20Repository=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20Search=EC=97=90=EC=84=9C=20Collection?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionRepositoryCustom.java} | 4 ++-- .../CollectionRepositoryImpl.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/{search/SearchRepositoryCustom.java => collection/CollectionRepositoryCustom.java} (82%) rename learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/{search/SearchRepositoryImpl.java => collection/CollectionRepositoryImpl.java} (97%) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryCustom.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java similarity index 82% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryCustom.java rename to learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java index 9c229943..e1eaf2f9 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryCustom.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java @@ -1,4 +1,4 @@ -package learningFlow.learningFlow_BE.repository.search; +package learningFlow.learningFlow_BE.repository.collection; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; @@ -6,7 +6,7 @@ import java.util.List; -public interface SearchRepositoryCustom { +public interface CollectionRepositoryCustom { List searchCollections(SearchRequestDTO.SearchConditionDTO condition, Long lastId, Pageable pageable); Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition); Integer getCountGreaterThanId(Long lastId, SearchRequestDTO.SearchConditionDTO condition); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java similarity index 97% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java rename to learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java index 60a85a52..91c88b2b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/search/SearchRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java @@ -1,4 +1,4 @@ -package learningFlow.learningFlow_BE.repository.search; +package learningFlow.learningFlow_BE.repository.collection; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -17,7 +17,7 @@ @Repository @RequiredArgsConstructor -public class SearchRepositoryImpl implements SearchRepositoryCustom { +public class CollectionRepositoryImpl implements CollectionRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; private final QCollectionEpisode episode = QCollectionEpisode.collectionEpisode; From 49d400630ff4f123aa66dbf7509aa9b51be01813 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:12:19 +0900 Subject: [PATCH 050/256] =?UTF-8?q?feat=20:=20SearchResponseDTO=EC=97=90?= =?UTF-8?q?=EC=84=9C=20CollectionResponseDTO=EB=A1=9C=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=ED=9B=84=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=98=EA=B3=A0=20=EA=B8=B0=EC=A1=B4=20Sea?= =?UTF-8?q?rchResponseDTO=EB=8A=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/search/SearchResponseDTO.java | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java deleted file mode 100644 index 032bab2a..00000000 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchResponseDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package learningFlow.learningFlow_BE.web.dto.search; - -import learningFlow.learningFlow_BE.domain.enums.InterestField; -import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -public class SearchResponseDTO { - - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class SearchResultDTO { - List searchResults; - Long lastId; // 마지막 컬렉션의 ID - Boolean hasNext; // 다음 페이지 존재 여부 - Integer currentPage; //현재 페이지 - Integer totalPages; //전체 페이지 수 - } - - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class CollectionPreviewDTO { - Long id; - InterestField interestField; - String title; - String creator; - List keywords; - List difficulties; - Integer amount; - Integer runtime; - Integer textCount; - Integer videoCount; - List resource; - Integer bookmarkCount; - boolean isBookmarked; - } -} From 146b2f37c98f5dc41545c39eed8a0ba1f30adb6b Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:12:46 +0900 Subject: [PATCH 051/256] =?UTF-8?q?feat=20:=20SearchService=EC=97=90?= =?UTF-8?q?=EC=84=9C=20CollectionService=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=9B=84=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=98=EA=B3=A0=20=EA=B8=B0=EC=A1=B4=20Sea?= =?UTF-8?q?rchService=EB=8A=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/search/SearchService.java | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java deleted file mode 100644 index f657e1a2..00000000 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/search/SearchService.java +++ /dev/null @@ -1,71 +0,0 @@ -package learningFlow.learningFlow_BE.service.search; - -import learningFlow.learningFlow_BE.converter.SearchConverter; -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.User; -import learningFlow.learningFlow_BE.repository.search.SearchRepositoryCustom; -import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; -import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class SearchService { - - private final SearchRepositoryCustom searchRepository; - private static final int PAGE_SIZE = 8; - - public SearchResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchConditionDTO condition, Long lastId, Authentication authentication) { - - PageRequest pageRequest = PageRequest.of(0, PAGE_SIZE); - List collections = searchRepository.searchCollections(condition, lastId, pageRequest); - - - if (collections.isEmpty()) { - return SearchConverter.toSearchResultDTO(collections, null, false, 0, 0, null); - } - - Long lastCollectionId = collections.getLast().getId(); - boolean hasNext = hasNextPage(condition, lastCollectionId); - - Integer totalCount = searchRepository.getTotalCount(condition); - int totalPages = (int) Math.ceil((double) totalCount / PAGE_SIZE); - - int currentPage = calculateCurrentPage(lastId, condition); - - User currentUser = null; - if (authentication != null && authentication.getPrincipal() instanceof PrincipalDetails) { - currentUser = ((PrincipalDetails) authentication.getPrincipal()).getUser(); - } - - return SearchConverter.toSearchResultDTO(collections, lastCollectionId, hasNext, totalPages, currentPage, currentUser); - } - - private int calculateCurrentPage(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { - if (lastId == 0L) { - return 1; // 첫 페이지 - } - - // lastId보다 큰 ID를 가진 컬렉션의 수를 조회 - Integer greaterCount = searchRepository.getCountGreaterThanId(lastId, condition); - - // 페이지 번호 계산 (1부터 시작) - return greaterCount / PAGE_SIZE + 2; - } - - private boolean hasNextPage(SearchRequestDTO.SearchConditionDTO condition, long lastCollectionId) { - List nextCollections = searchRepository.searchCollections( - condition, - lastCollectionId, - PageRequest.of(0, 1) - ); - - return !nextCollections.isEmpty(); - } -} From acce2aa88a741de524cc084c5693045c7ae06e3a Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:13:07 +0900 Subject: [PATCH 052/256] =?UTF-8?q?feat=20:=20=EA=B8=B0=EC=A1=B4=20SearchS?= =?UTF-8?q?ervice=EC=97=90=EC=84=9C=20CollectionService=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/collection/CollectionService.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java new file mode 100644 index 00000000..b8ebf30e --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -0,0 +1,89 @@ +package learningFlow.learningFlow_BE.service.collection; + +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; +import learningFlow.learningFlow_BE.converter.CollectionConverter; +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; +import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CollectionService { + + private final CollectionRepository collectionRepository; + private static final int PAGE_SIZE = 8; + + public CollectionResponseDTO.CollectionPreviewDTO CollectionDetails(Long collectionId, PrincipalDetails principalDetails) { + + Authentication authentication = (principalDetails != null) ? SecurityContextHolder.getContext().getAuthentication() : null; + + Collection collection = collectionRepository.findById(collectionId) + .orElseThrow(() -> new CollectionHandler(ErrorStatus.COLLECTION_NOT_FOUND)); + + User currentUser = null; + if (authentication != null && authentication.getPrincipal() instanceof PrincipalDetails) { + currentUser = ((PrincipalDetails) authentication.getPrincipal()).getUser(); + } + + return CollectionConverter.toCollectionPreviewDTO(collection, currentUser); + } + + public CollectionResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchConditionDTO condition, Long lastId, PrincipalDetails principalDetails) { + + Authentication authentication = (principalDetails != null) ? SecurityContextHolder.getContext().getAuthentication() : null; + + PageRequest pageRequest = PageRequest.of(0, PAGE_SIZE); + List collections = collectionRepository.searchCollections(condition, lastId, pageRequest); + + if (collections.isEmpty()) { + return CollectionConverter.toSearchResultDTO(collections, null, false, 0, 0, null); + } + + Long lastCollectionId = collections.getLast().getId(); + boolean hasNext = hasNextPage(condition, lastCollectionId); + + Integer totalCount = collectionRepository.getTotalCount(condition); + int totalPages = (int) Math.ceil((double) totalCount / PAGE_SIZE); + + int currentPage = calculateCurrentPage(lastId, condition); + + User currentUser = null; + if (authentication != null && authentication.getPrincipal() instanceof PrincipalDetails) { + currentUser = ((PrincipalDetails) authentication.getPrincipal()).getUser(); + } + + return CollectionConverter.toSearchResultDTO(collections, lastCollectionId, hasNext, totalPages, currentPage, currentUser); + } + + private int calculateCurrentPage(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { + if (lastId == 0L) { + return 1; // 첫 페이지 + } + + // lastId보다 큰 ID를 가진 컬렉션의 수를 조회 + Integer greaterCount = collectionRepository.getCountGreaterThanId(lastId, condition); + + // 페이지 번호 계산 (1부터 시작) + return greaterCount / PAGE_SIZE + 2; + } + + private boolean hasNextPage(SearchRequestDTO.SearchConditionDTO condition, long lastCollectionId) { + List nextCollections = collectionRepository.searchCollections( + condition, + lastCollectionId, + PageRequest.of(0, 1) + ); + return !nextCollections.isEmpty(); + } +} From 86c5b31282f85c0c7e2e618e9724d9f91e9786d3 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:13:50 +0900 Subject: [PATCH 053/256] =?UTF-8?q?feat=20:=20BookmarkDTO=EC=97=90?= =?UTF-8?q?=EC=84=9C=20collectionId=EA=B0=92=EC=9D=80=20requestBody?= =?UTF-8?q?=EB=B3=B4=EB=8B=A4=20=EA=B2=BD=EB=A1=9C=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=9B=EB=8A=94=EA=B2=8C=20=EB=A7=9E=EB=8B=A4?= =?UTF-8?q?=EA=B3=A0=20=ED=8C=90=EB=8B=A8=ED=95=B4=EC=84=9C=20BookmarkRequ?= =?UTF-8?q?estDTO=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/dto/bookmark/BookmarkDTO.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java index 71221881..8d686a8f 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java @@ -6,13 +6,6 @@ public class BookmarkDTO { - @Getter - @AllArgsConstructor - @NoArgsConstructor - public static class BookmarkRequestDTO{ - Long collectionId; - } - @Getter @AllArgsConstructor @NoArgsConstructor From f764703811c47b6ba4ffabe48242e04ca8b62797 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:14:26 +0900 Subject: [PATCH 054/256] =?UTF-8?q?style=20:=20=EA=B8=B0=EC=A1=B4=20Search?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20DTO=EB=93=A4,=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EB=93=B1=EB=93=B1=20=EC=A0=84?= =?UTF-8?q?=EB=B6=80=20Collection=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/CollectionConverter.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index 795c48c6..3884e86b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -8,7 +8,7 @@ import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; -import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import java.util.List; @@ -30,7 +30,7 @@ public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( .build(); } - public static SearchResponseDTO.SearchResultDTO toSearchResultDTO( + public static CollectionResponseDTO.SearchResultDTO toSearchResultDTO( List collections, Long lastId, boolean hasNext, @@ -38,11 +38,11 @@ public static SearchResponseDTO.SearchResultDTO toSearchResultDTO( int currentPage, User currentUser ) { - List list = collections.stream() + List list = collections.stream() .map(collection -> toCollectionPreviewDTO(collection, currentUser)) .toList(); - return SearchResponseDTO.SearchResultDTO.builder() + return CollectionResponseDTO.SearchResultDTO.builder() .searchResults(list) .lastId(lastId) .hasNext(hasNext) @@ -51,7 +51,7 @@ public static SearchResponseDTO.SearchResultDTO toSearchResultDTO( .build(); } - public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Collection collection, User currentUser) { + public static CollectionResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Collection collection, User currentUser) { int totalSeconds = collection.getEpisodes().stream() .map(CollectionEpisode::getResource) @@ -65,7 +65,7 @@ public static SearchResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Coll List resourceDTOList = getResourceDTOList(collection); - return SearchResponseDTO.CollectionPreviewDTO.builder() + return CollectionResponseDTO.CollectionPreviewDTO.builder() .id(collection.getId()) .interestField(collection.getInterestField()) .title(collection.getTitle()) From 08f17afe1db884a71afc8baa59bb4fe6c1a42fff Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:15:08 +0900 Subject: [PATCH 055/256] =?UTF-8?q?feat=20:=20=EA=B8=B0=EC=A1=B4=20SearchR?= =?UTF-8?q?esponseDTO=EC=97=90=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8D=98=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20DTO=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4?= =?UTF-8?q?=20=EC=A0=84=EB=B6=80=20CollectionResponseDTO=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/collection/CollectionResponseDTO.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java index af805278..373f0f01 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java @@ -1,5 +1,7 @@ package learningFlow.learningFlow_BE.web.dto.collection; +import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -13,21 +15,31 @@ public class CollectionResponseDTO { @Builder @NoArgsConstructor @AllArgsConstructor - public static class CollectionListDto { - List collectionList; - Integer listSize; - boolean isFirst; - boolean isLast; - Integer totalPage; - Long totalElements; + public static class SearchResultDTO { + List searchResults; + Long lastId; // 마지막 컬렉션의 ID + Boolean hasNext; // 다음 페이지 존재 여부 + Integer currentPage; //현재 페이지 + Integer totalPages; //전체 페이지 수 } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class CollectionDto { + public static class CollectionPreviewDTO { + Long id; + InterestField interestField; String title; - // TODO: collection 조회 시 조회할 필드 들 구체적으로 정해서 넣어야 합니다. + String creator; + List keywords; + List difficulties; + Integer amount; + Integer runtime; + Integer textCount; + Integer videoCount; + List resource; + Integer bookmarkCount; + boolean isBookmarked; } } From 2fd1af76f7bc1cd1877c87f97461a694c6f0eb13 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:16:00 +0900 Subject: [PATCH 056/256] =?UTF-8?q?feat=20:=20CollectionRestController=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=EC=97=90=20=EC=83=81=EC=84=B8=20Collection?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20?= =?UTF-8?q?API=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EC=97=90=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=ED=95=98=EB=8D=98=20=EA=B8=B0=EB=8A=A5=20UserRestController?= =?UTF-8?q?=EC=97=90=EC=84=9C=20CollectionRestController=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CollectionRestController.java | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java index a6893644..e7d388bb 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java @@ -8,37 +8,67 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.LoginHandler; +import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.service.collection.CollectionService; +import learningFlow.learningFlow_BE.service.user.UserService; +import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @RequestMapping("/collections") @Validated @Slf4j -@Tag(name = "Collection", description = "특정 컬렉션 조회할 수 있는 API") +@Tag(name = "Collection", description = "컬렉션 관련 API") public class CollectionRestController { - @GetMapping("{collection-id}") + private final UserService userService; + private final CollectionService collectionService; + + @GetMapping("/{collectionId}") @Operation(summary = "컬렉션 조회 API", description = "특정 컬렉션을 조회하는 API입니다.") @ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COLLECTION4001", description = "존재하지 않는 컬렉션입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), }) @Parameters({ - @Parameter(name = "collection-id", description = "컬렉션 ID"), + @Parameter(name = "collectionId", description = "컬렉션 ID"), }) - public ApiResponse getCollection( - @PathVariable("collection-id") Long collectionId + public ApiResponse getCollection( + @PathVariable("collectionId") Long collectionId, + @AuthenticationPrincipal PrincipalDetails principalDetails ) { - // TODO: 컬렉션 조회 로직 구현 - return ApiResponse.onSuccess(null); + return ApiResponse.onSuccess( + collectionService.CollectionDetails(collectionId, principalDetails) + ); } + @PostMapping("{collectionId}/bookmark") + @Operation(summary = "북마크 설정,해제 API", description = "컬렉션의 북마크를 설정,해제하는 API") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "로그인이 필요한 서비스입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COLLECTION4001", description = "컬렉션을 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + @Parameters({ + @Parameter(name = "collectionId", description = "컬렉션 ID"), + }) + public ApiResponse toggleBookmark( + @PathVariable("collectionId") Long collectionId, + @AuthenticationPrincipal PrincipalDetails principalDetails + ) { + if (principalDetails == null) { + throw new LoginHandler(ErrorStatus.LOGIN_REQUIRED); + } + return ApiResponse.onSuccess( + userService.toggleBookmark(principalDetails.getUser().getLoginId(), collectionId) + ); + } } From 3a5862ad08484f34cfd0070bdddda3afd130ac13 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:16:29 +0900 Subject: [PATCH 057/256] =?UTF-8?q?feat=20:=20@ElementCollection=20fetchTy?= =?UTF-8?q?pe=20LAZY=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/learningFlow/learningFlow_BE/domain/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java index 9bcfd0d8..c5299b90 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -68,7 +68,7 @@ public class User extends BaseEntity { @JoinColumn(name = "image_id") private Image image; - @ElementCollection + @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "user_bookmarks", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "collection_id") private List bookmarkedCollectionIds = new ArrayList<>(); From b582db5d083e49fa0f312c3379f888a1ceb8e7b1 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:17:02 +0900 Subject: [PATCH 058/256] =?UTF-8?q?feat=20:=20=EA=B8=B0=EC=A1=B4=EC=97=90?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=EC=97=90=20=EB=8C=80=ED=95=B4=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=20=EB=93=B1=EB=A1=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20API=EB=A5=BC=20UserRestController=EC=97=90=EC=84=9C?= =?UTF-8?q?=20CollectionRestController=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/UserRestController.java | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java index e2f6abc9..7a1ba068 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java @@ -13,8 +13,7 @@ import learningFlow.learningFlow_BE.apiPayload.exception.handler.LoginHandler; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.service.user.UserService; -import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; -import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; @@ -64,24 +63,6 @@ public ApiResponse getUserInfo( ); } - @PostMapping("/bookmark") - @Operation(summary = "북마크 토글 API", description = "컬렉션의 북마크를 설정/해제하는 API") - @ApiResponses({ - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "로그인이 필요한 서비스입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COLLECTION4001", description = "컬렉션을 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) - }) - public ApiResponse toggleBookmark( - @RequestBody @Valid BookmarkDTO.BookmarkRequestDTO request, - @AuthenticationPrincipal PrincipalDetails principalDetails - ) { - if (principalDetails == null) { - throw new LoginHandler(ErrorStatus.LOGIN_REQUIRED); - } - return ApiResponse.onSuccess(userService.toggleBookmark(principalDetails.getUser().getLoginId(), request.getCollectionId() - )); - } - @GetMapping("/bookmarks") @Operation(summary = "북마크한 컬렉션 조회 API", description = "사용자가 북마크한 컬렉션 목록을 조회하는 API") @ApiResponses({ @@ -91,13 +72,15 @@ public ApiResponse toggleBookmark( @Parameters({ @Parameter(name = "lastId", description = "마지막으로 조회된 컬렉션의 ID (첫 페이지는 0)"), }) - public ApiResponse getBookmarkedCollections( + public ApiResponse getBookmarkedCollections( @RequestParam(required = false, defaultValue = "0") Long lastId, @AuthenticationPrincipal PrincipalDetails principalDetails ) { if (principalDetails == null) { throw new LoginHandler(ErrorStatus.LOGIN_REQUIRED); } - return ApiResponse.onSuccess(userService.getBookmarkedCollections(principalDetails.getUser().getLoginId(), lastId)); + return ApiResponse.onSuccess( + userService.getBookmarkedCollections(principalDetails.getUser().getLoginId(), lastId) + ); } } \ No newline at end of file From ee0b3ff0ce84c2480047f821bce097c70857343c Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:17:21 +0900 Subject: [PATCH 059/256] =?UTF-8?q?style=20:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EB=B0=8F=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/UserService.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 822591d8..af385d1c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -3,14 +3,14 @@ import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; import learningFlow.learningFlow_BE.apiPayload.exception.handler.UserHandler; -import learningFlow.learningFlow_BE.converter.SearchConverter; +import learningFlow.learningFlow_BE.converter.CollectionConverter; import learningFlow.learningFlow_BE.converter.UserConverter; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; -import learningFlow.learningFlow_BE.repository.CollectionRepository; +import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.repository.UserRepository; import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; -import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; @@ -87,7 +87,7 @@ public BookmarkDTO.BookmarkResponseDTO toggleBookmark(String loginId, Long colle } @Transactional(readOnly = true) - public SearchResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId, Long lastId) { + public CollectionResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId, Long lastId) { User user = userRepository.findById(loginId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); @@ -95,7 +95,7 @@ public SearchResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId List bookmarkedIds = user.getBookmarkedCollectionIds(); if (bookmarkedIds.isEmpty()) { - return SearchConverter.toSearchResultDTO(new ArrayList<>(), null, false, 0, 0, user); + return CollectionConverter.toSearchResultDTO(new ArrayList<>(), null, false, 0, 0, user); } // lastId 이후의 컬렉션만 필터링 @@ -109,7 +109,7 @@ public SearchResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId } else { int startIndex = bookmarkedIds.indexOf(lastId) + 1; if (startIndex == 0 || startIndex >= bookmarkedIds.size()) { - return SearchConverter.toSearchResultDTO(new ArrayList<>(), null, false, 0, 0, user); + return CollectionConverter.toSearchResultDTO(new ArrayList<>(), null, false, 0, 0, user); } collections = collectionRepository.findByIdIn( bookmarkedIds.stream() @@ -120,7 +120,7 @@ public SearchResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId } if (collections.isEmpty()) { - return SearchConverter.toSearchResultDTO(collections, null, false, 0, 0, user); + return CollectionConverter.toSearchResultDTO(collections, null, false, 0, 0, user); } Long lastCollectionId = collections.getLast().getId(); @@ -129,7 +129,7 @@ public SearchResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId int totalPages = (int) Math.ceil((double) bookmarkedIds.size() / BOOKMARK_PAGE_SIZE); int currentPage = (lastId == 0) ? 1 : (bookmarkedIds.indexOf(lastId) / BOOKMARK_PAGE_SIZE) + 2; - return SearchConverter.toSearchResultDTO( + return CollectionConverter.toSearchResultDTO( collections, lastCollectionId, hasNext, From 2ecfb5d8fde40ad966fb44f726ed56a8149fe782 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:18:07 +0900 Subject: [PATCH 060/256] =?UTF-8?q?feat=20:=20=EB=B6=81=EB=A7=88=ED=81=AC?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B0=8F=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=95=B4=EB=8B=B9=20?= =?UTF-8?q?URI=EB=A5=BC=20spring=20security=EC=97=90=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=B4=20=ED=95=84=EC=9A=94=ED=95=9C=20=EA=B2=BD=EB=A1=9C,?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EC=97=90=20=EA=B0=81=EA=B0=81=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/config/security/SecurityConfig.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index 953b1ebf..ea7d02f6 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -44,13 +44,14 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte "/webjars/**", "/find/**", "/reset-password", - "/search/**" - ).permitAll() + "/search/**", + "/collections/{collectionId:[\\d]+}" + ).permitAll() .requestMatchers( - "/register","/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", + "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", "/home/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") - .requestMatchers("/user/**", "/resources/**").authenticated() + .requestMatchers("/user/**", "/resources/**", "/collections/{collectionId}/bookmark").authenticated() .anyRequest().permitAll() ) .formLogin(AbstractHttpConfigurer::disable) From d197be9d80f8352609d45bb72f293371eae30a75 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:18:43 +0900 Subject: [PATCH 061/256] =?UTF-8?q?feat=20:=20swagger=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=B0=91=ED=84=B0=20=EC=9D=B4=EB=A6=84=20=EC=9D=BC=EC=B9=98=20?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20=EB=B0=8F=20Authentiaction=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20CollectionService=20=EB=82=B4=EB=B6=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/SearchRestController.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java index 00dc1545..046b2156 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java @@ -8,16 +8,14 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; -import learningFlow.learningFlow_BE.converter.SearchConverter; +import learningFlow.learningFlow_BE.converter.CollectionConverter; import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.service.search.SearchService; -import learningFlow.learningFlow_BE.web.dto.search.SearchResponseDTO; +import learningFlow.learningFlow_BE.service.collection.CollectionService; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.Authentication; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -34,7 +32,7 @@ @Tag(name = "Search", description = "검색 API") public class SearchRestController { - private final SearchService searchService; + private final CollectionService collectionService; @GetMapping @Operation(summary = "강의 검색 API", description = "키워드로 강의 에피소드를 검색하는 API") @@ -44,13 +42,13 @@ public class SearchRestController { }) @Parameters({ @Parameter(name = "keyword", description = "검색어 (컬렉션 제목, 크리에이터, 키워드, 에피소드 제목)"), - @Parameter(name = "InterestField", description = "검색할 관심 분야"), + @Parameter(name = "interestFields", description = "검색할 관심 분야"), @Parameter(name = "preferMediaType", description = "미디어 타입 필터 (1: 텍스트만, 2 : 텍스트 선호, 3: 상관 없음, 4: 영상 선호, 5: 영상만)"), @Parameter(name = "difficulties", description = "난이도 필터 (1: 입문, 2: 초급, 3: 중급, 4: 실무)"), @Parameter(name = "amounts", description = "강의량 필터 (SHORT(1-5), MEDIUM(5-10), LONG(11이상)"), @Parameter(name = "lastId", description = "마지막으로 조회된 컬렉션의 ID (첫 페이지는 0)") }) - public ApiResponse searchEpisodes( + public ApiResponse searchEpisodes( @RequestParam(required = false) String keyword, @RequestParam(required = false) InterestField interestFields, @RequestParam(required = false) Integer preferMediaType, @@ -59,7 +57,10 @@ public ApiResponse searchEpisodes( @RequestParam(required = false, defaultValue = "0") Long lastId, @AuthenticationPrincipal PrincipalDetails principalDetails ) { - Authentication authentication = (principalDetails != null) ? SecurityContextHolder.getContext().getAuthentication() : null; - return ApiResponse.onSuccess(searchService.search(SearchConverter.toSearchConditionDTO(keyword, interestFields, preferMediaType, difficulties, amounts), lastId, authentication)); + return ApiResponse.onSuccess( + collectionService.search( + CollectionConverter.toSearchConditionDTO(keyword, interestFields, preferMediaType, difficulties, amounts), + lastId, principalDetails) + ); } } From 0faa32a841cb4cda5e89785b5c370478df19b1d3 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 11:19:18 +0900 Subject: [PATCH 062/256] =?UTF-8?q?feat=20:=20jwt=20=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EB=82=B4=EB=B6=80=EC=97=90=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=EC=9D=B4=20=ED=95=84=EC=9A=94=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9D=80=20=EA=B2=BD=EB=A1=9C=EC=97=90=20=EC=9D=BC?= =?UTF-8?q?=EB=B0=98=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20URI=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/security/jwt/JwtAuthenticationFilter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index 8ec0c8f3..2399a229 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -161,6 +161,7 @@ private boolean isPermitAllUrl(String requestURI) { requestURI.startsWith("/webjars") || requestURI.startsWith("/find") || requestURI.startsWith("/search") || + requestURI.matches("/collections/\\d+$") || requestURI.equals("/reset-password"); } } From 78dfe5825204700449e16729a0cf2407cd2f1000 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Thu, 23 Jan 2025 13:10:03 +0900 Subject: [PATCH 063/256] =?UTF-8?q?feat=20:=20search=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=20=EA=B8=B0=EC=A4=80=EC=9D=84=20id=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20bookmark=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=ED=95=A8=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=BB=A4=EC=84=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=EC=8B=9C=20=EA=B8=B0=EC=A4=80=EC=9D=84=20id=EA=B0=80?= =?UTF-8?q?=20=EC=95=84=EB=8B=88=EB=9D=BC=20bookmarkCount=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EB=A9=B4=EC=84=9C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=A1=9C=EC=A7=81=EB=93=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionRepositoryCustom.java | 3 +- .../collection/CollectionRepositoryImpl.java | 102 +++++++++++------- .../service/collection/CollectionService.java | 29 ++--- 3 files changed, 73 insertions(+), 61 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java index e1eaf2f9..5db2bf75 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java @@ -9,5 +9,6 @@ public interface CollectionRepositoryCustom { List searchCollections(SearchRequestDTO.SearchConditionDTO condition, Long lastId, Pageable pageable); Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition); - Integer getCountGreaterThanId(Long lastId, SearchRequestDTO.SearchConditionDTO condition); + List searchNextPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection, Pageable pageable); + Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, SearchRequestDTO.SearchConditionDTO condition); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java index 91c88b2b..0bdc1e23 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java @@ -1,10 +1,12 @@ package learningFlow.learningFlow_BE.repository.collection; +import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; -import learningFlow.learningFlow_BE.apiPayload.exception.handler.PageHandler; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.QCollection; import learningFlow.learningFlow_BE.domain.QCollectionEpisode; import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; @@ -21,65 +23,92 @@ public class CollectionRepositoryImpl implements CollectionRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; private final QCollectionEpisode episode = QCollectionEpisode.collectionEpisode; + private final QCollection collection = QCollection.collection; @Override public List searchCollections(SearchRequestDTO.SearchConditionDTO condition, Long lastId, Pageable pageable) { - if (lastId == null) { - throw new PageHandler(ErrorStatus.NO_MORE_COLLECTION); + BooleanExpression searchConditions = createSearchConditions(condition); + + if (lastId == 0L) { + return jpaQueryFactory + .select(episode.collection) + .from(episode) + .where(searchConditions) + .groupBy(episode.collection.id) + .orderBy( + episode.collection.bookmarkCount.desc(), + episode.collection.id.desc() + ) + .limit(pageable.getPageSize()) + .fetch(); } - BooleanExpression cursorExp = createCursorExp(lastId); - BooleanExpression keywordExp = createDynamicKeyword(condition.getKeyword()); - BooleanExpression interestFieldExp = createDynamicInterestFields(condition.getInterestFields()); - BooleanExpression preferMediaTypeExp = createDynamicPreferMediaType(condition.getPreferMediaType()); - BooleanExpression difficultyExp = createDynamicDifficulty(condition.getDifficulties()); - BooleanExpression amountExp = createDynamicAmount(condition.getAmounts()); + Collection lastCollection = jpaQueryFactory + .selectFrom(collection) + .where(collection.id.eq(lastId)) + .fetchOne(); - return jpaQueryFactory - .select(episode.collection) - .from(episode) - .where(cursorExp, keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) - .groupBy(episode.collection.id) - .orderBy(episode.collection.id.desc()) - .limit(pageable.getPageSize()) - .fetch(); + if (lastCollection == null) { + throw new CollectionHandler(ErrorStatus.COLLECTION_NOT_FOUND); + } + + return searchNextPage(condition, lastCollection, pageable); + } + + private BooleanExpression createSearchConditions(SearchRequestDTO.SearchConditionDTO condition) { + return (BooleanExpression) ExpressionUtils.allOf( + createDynamicKeyword(condition.getKeyword()), + createDynamicInterestFields(condition.getInterestFields()), + createDynamicPreferMediaType(condition.getPreferMediaType()), + createDynamicDifficulty(condition.getDifficulties()), + createDynamicAmount(condition.getAmounts()) + ); } @Override public Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition) { - BooleanExpression keywordExp = createDynamicKeyword(condition.getKeyword()); - BooleanExpression interestFieldExp = createDynamicInterestFields(condition.getInterestFields()); - BooleanExpression preferMediaTypeExp = createDynamicPreferMediaType(condition.getPreferMediaType()); - BooleanExpression difficultyExp = createDynamicDifficulty(condition.getDifficulties()); - BooleanExpression amountExp = createDynamicAmount(condition.getAmounts()); Long count = jpaQueryFactory .select(episode.collection.countDistinct()) .from(episode) - .where(keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) + .where(createSearchConditions(condition)) .fetchOne(); - return count != null ? count.intValue() : 0; } @Override - public Integer getCountGreaterThanId(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { - BooleanExpression keywordExp = createDynamicKeyword(condition.getKeyword()); - BooleanExpression interestFieldExp = createDynamicInterestFields(condition.getInterestFields()); - BooleanExpression preferMediaTypeExp = createDynamicPreferMediaType(condition.getPreferMediaType()); - BooleanExpression difficultyExp = createDynamicDifficulty(condition.getDifficulties()); - BooleanExpression amountExp = createDynamicAmount(condition.getAmounts()); + public List searchNextPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection, Pageable pageable) { + BooleanExpression searchConditions = createSearchConditions(condition); + BooleanExpression cursorCondition = episode.collection.bookmarkCount.lt(lastCollection.getBookmarkCount()) + .or(episode.collection.bookmarkCount.eq(lastCollection.getBookmarkCount()) + .and(episode.collection.id.lt(lastCollection.getId()))); - // lastId보다 큰 ID를 가진 컬렉션만 카운트 - BooleanExpression greaterThanExp = lastId == 0L ? null : episode.collection.id.gt(lastId); + return jpaQueryFactory + .select(episode.collection) + .from(episode) + .where(searchConditions, cursorCondition) + .groupBy(episode.collection.id) + .orderBy( + episode.collection.bookmarkCount.desc(), + episode.collection.id.desc() + ) + .limit(pageable.getPageSize()) + .fetch(); + } + @Override + public Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, SearchRequestDTO.SearchConditionDTO condition) { Long count = jpaQueryFactory .select(episode.collection.countDistinct()) .from(episode) - .where(greaterThanExp, keywordExp, interestFieldExp, preferMediaTypeExp, difficultyExp, amountExp) + .where( + createSearchConditions(condition), + episode.collection.bookmarkCount.gt(bookmarkCount) + .or(episode.collection.bookmarkCount.eq(bookmarkCount) + .and(episode.collection.id.gt(lastId))) + ) .fetchOne(); - return count != null ? count.intValue() : 0; } @@ -91,11 +120,6 @@ private BooleanExpression createDynamicInterestFields(InterestField interestFiel return episode.collection.interestField.eq(interestFields); } - private BooleanExpression createCursorExp(Long lastId) { - if (lastId == 0L) return null; - return episode.collection.id.lt(lastId); - } - private BooleanExpression createDynamicKeyword(String keyword) { if (!StringUtils.hasText(keyword)) { return null; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index b8ebf30e..31aed43c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -50,40 +50,27 @@ public CollectionResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchCondi return CollectionConverter.toSearchResultDTO(collections, null, false, 0, 0, null); } - Long lastCollectionId = collections.getLast().getId(); - boolean hasNext = hasNextPage(condition, lastCollectionId); + Collection lastCollection = collections.getLast(); + boolean hasNext = hasNextPage(condition, lastCollection); Integer totalCount = collectionRepository.getTotalCount(condition); int totalPages = (int) Math.ceil((double) totalCount / PAGE_SIZE); - int currentPage = calculateCurrentPage(lastId, condition); + int currentPage = calculateCurrentPage(condition, lastCollection); User currentUser = null; if (authentication != null && authentication.getPrincipal() instanceof PrincipalDetails) { currentUser = ((PrincipalDetails) authentication.getPrincipal()).getUser(); } - return CollectionConverter.toSearchResultDTO(collections, lastCollectionId, hasNext, totalPages, currentPage, currentUser); + return CollectionConverter.toSearchResultDTO(collections, lastCollection.getId(), hasNext, totalPages, currentPage, currentUser); } - private int calculateCurrentPage(Long lastId, SearchRequestDTO.SearchConditionDTO condition) { - if (lastId == 0L) { - return 1; // 첫 페이지 - } - - // lastId보다 큰 ID를 가진 컬렉션의 수를 조회 - Integer greaterCount = collectionRepository.getCountGreaterThanId(lastId, condition); - - // 페이지 번호 계산 (1부터 시작) - return greaterCount / PAGE_SIZE + 2; + private int calculateCurrentPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection) { + return collectionRepository.getCountGreaterThanBookmark(lastCollection.getBookmarkCount(),lastCollection.getId(), condition) / PAGE_SIZE + 1; } - private boolean hasNextPage(SearchRequestDTO.SearchConditionDTO condition, long lastCollectionId) { - List nextCollections = collectionRepository.searchCollections( - condition, - lastCollectionId, - PageRequest.of(0, 1) - ); - return !nextCollections.isEmpty(); + private boolean hasNextPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection) { + return !collectionRepository.searchNextPage(condition, lastCollection, PageRequest.of(0, 1)).isEmpty(); } } From aac15731ad516e05a3970d2dd81d3b11a3395402 Mon Sep 17 00:00:00 2001 From: JungJaehoon0430 <80247965+JungJaehoon0430@users.noreply.github.com> Date: Thu, 23 Jan 2025 14:14:38 +0900 Subject: [PATCH 064/256] =?UTF-8?q?home=20=EA=B8=B0=EB=8A=A5=20=EC=99=84?= =?UTF-8?q?=EC=84=B1(=EC=B6=94=EC=B2=9C=EC=95=8C=EA=B3=A0=EB=A6=AC?= =?UTF-8?q?=EC=A6=98=20=EC=88=98=EC=A0=95=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HomeRepository, HomeRepositoryImpl 생성 UserCollectionRepository 생성 JwtAuthenticationFilter isPermitAllUrl에 \home 추가 HomeService 생성 HomeRestController 수정 HomeResponseDTO 일부 추가 및 수정 --- learningFlow/build.gradle | 30 ++---- .../repository/UserCollectionRepository.java | 16 +++ .../repository/home/HomeRepository.java | 11 +++ .../repository/home/HomeRepositoryImpl.java | 40 ++++++++ .../security/jwt/JwtAuthenticationFilter.java | 1 + .../service/home/HomeService.java | 98 +++++++++++++++++++ .../web/controller/HomeRestController.java | 31 ++---- .../web/dto/home/HomeResponseDTO.java | 24 ++++- 8 files changed, 208 insertions(+), 43 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java diff --git a/learningFlow/build.gradle b/learningFlow/build.gradle index e061575a..3cf381cf 100644 --- a/learningFlow/build.gradle +++ b/learningFlow/build.gradle @@ -13,12 +13,6 @@ java { } } -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - repositories { mavenCentral() } @@ -50,10 +44,15 @@ dependencies { // 템플릿 엔진 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - // 유틸리티 + // Lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + // API 문서화 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' @@ -62,23 +61,14 @@ dependencies { // 테스트 testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - - - //QueryDsl - implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' - annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" - annotationProcessor "jakarta.annotation:jakarta.annotation-api" - annotationProcessor "jakarta.persistence:jakarta.persistence-api" - } tasks.named('test') { useJUnitPlatform() } - -// QueryDsl 추가 설정 -def generated = 'src/main/generated' +// QueryDSL 설정 +def generated = file('build/generated/querydsl') // QueryDSL 생성 파일 경로 설정 sourceSets { main { java { @@ -88,12 +78,12 @@ sourceSets { } tasks.withType(JavaCompile).configureEach { - options.generatedSourceOutputDirectory = file(generated) + options.annotationProcessorGeneratedSourcesDirectory = generated } +// configurations 설정 configurations { compileOnly { extendsFrom annotationProcessor } } - diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java new file mode 100644 index 00000000..106246e5 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -0,0 +1,16 @@ +package learningFlow.learningFlow_BE.repository; + + +import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.UserCollection; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface UserCollectionRepository extends JpaRepository { + @Query("SELECT uc FROM UserCollection uc WHERE uc.user = :user ORDER BY uc.lastAccessedAt DESC") + List findRecentByUser(@Param("user") User user, Pageable pageable); +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java new file mode 100644 index 00000000..7e32cef0 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java @@ -0,0 +1,11 @@ +package learningFlow.learningFlow_BE.repository.home; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; + +import java.util.List; + +public interface HomeRepository { + List findTopBookmarkedCollections(int limit); + List findRecentEpisodes(Long collectionId, int currentEpisode, int limit); +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java new file mode 100644 index 00000000..34b880d8 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java @@ -0,0 +1,40 @@ +package learningFlow.learningFlow_BE.repository.home; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.domain.QCollection; +import learningFlow.learningFlow_BE.domain.QCollectionEpisode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class HomeRepositoryImpl implements HomeRepository { + private final JPAQueryFactory queryFactory; + private final QCollection collection = QCollection.collection; + private final QCollectionEpisode episode = QCollectionEpisode.collectionEpisode; + + @Override + public List findTopBookmarkedCollections(int limit) { + return queryFactory + .selectFrom(collection) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit) + .fetch(); + } + + @Override + public List findRecentEpisodes(Long collectionId, int currentEpisode, int limit) { + int startEpisode = Math.max(1, currentEpisode - (limit - 1)); + + return queryFactory + .selectFrom(episode) + .where(episode.collection.id.eq(collectionId) + .and(episode.episodeNumber.between(startEpisode, startEpisode + limit - 1))) + .orderBy(episode.episodeNumber.asc()) + .fetch(); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index 8ec0c8f3..feb76f84 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -161,6 +161,7 @@ private boolean isPermitAllUrl(String requestURI) { requestURI.startsWith("/webjars") || requestURI.startsWith("/find") || requestURI.startsWith("/search") || + requestURI.startsWith("/home") || requestURI.equals("/reset-password"); } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java new file mode 100644 index 00000000..5c70cf3e --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java @@ -0,0 +1,98 @@ +package learningFlow.learningFlow_BE.service.home; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.repository.UserCollectionRepository; +import learningFlow.learningFlow_BE.repository.home.HomeRepository; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.EpisodeDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecentLearningDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecommendedCollectionDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class HomeService { + private final HomeRepository homeRepository; + private final UserCollectionRepository userCollectionRepository; + + private static final int RECOMMENDED_SIZE = 6; + private static final int RECENT_EPISODES_SIZE = 4; + + public HomeInfoDTO getHomeInfo(User user) { + List recommendedCollections = getRecommendedCollections(); + RecentLearningDTO recentLearning = user != null ? getRecentLearning(user) : null; + + return HomeInfoDTO.builder() + .recommendedCollections(recommendedCollections) + .recentLearning(recentLearning) + .build(); + } + + private List getRecommendedCollections() { + // TODO: 추후 추천 알고리즘 개선 예정 + List collections = homeRepository.findTopBookmarkedCollections(RECOMMENDED_SIZE); + + return collections.stream() + .map(collection -> RecommendedCollectionDTO.builder() + .collectionId(collection.getId()) + .title(collection.getTitle()) + .creator(collection.getCreator()) + .image(collection.getImage()) + .difficulty(collection.getDifficulty().getFirst()) // 우선 0번째 사용하게 + .category(collection.getInterestField().toString()) + .detailInformation(collection.getDetailInformation()) + .collectionUrl("/collections/" + collection.getId()) + .build()) + .collect(Collectors.toList()); + } + + private RecentLearningDTO getRecentLearning(User user) { + UserCollection recentCollection = userCollectionRepository + .findRecentByUser(user, PageRequest.of(0, 1)) + .stream() + .findFirst() + .orElse(null); + + if (recentCollection == null) { + return null; + } + + List recentEpisodes = homeRepository.findRecentEpisodes( + recentCollection.getCollection().getId(), + recentCollection.getUserCollectionStatus(), + RECENT_EPISODES_SIZE + ); + + return RecentLearningDTO.builder() + .collectionId(recentCollection.getCollection().getId()) + .title(recentCollection.getCollection().getTitle()) + .currentEpisode(recentCollection.getUserCollectionStatus()) + .isCompleted(isCollectionCompleted(recentCollection)) + .episodes(convertToEpisodeDTO(recentEpisodes)) + .build(); + } + + private boolean isCollectionCompleted(UserCollection userCollection) { + return userCollection.getUserCollectionStatus() >= + userCollection.getCollection().getEpisodes().size(); + } + + private List convertToEpisodeDTO(List episodes) { + return episodes.stream() + .map(episode -> EpisodeDTO.builder() + .episodeNumber(episode.getEpisodeNumber()) + .episodeName(episode.getEpisodeName()) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index 58c23fd8..297fa301 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -6,7 +6,10 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; +import learningFlow.learningFlow_BE.converter.UserConverter; +import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.service.home.HomeService; import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import lombok.RequiredArgsConstructor; @@ -17,8 +20,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import static learningFlow.learningFlow_BE.converter.UserConverter.toUserLoginResponseDTO; - @RestController @RequiredArgsConstructor @RequestMapping("/home") @@ -26,7 +27,7 @@ @Slf4j @Tag(name = "Home", description = "홈 화면 보여주는 API") public class HomeRestController { - + private final HomeService homeService; @GetMapping @Operation(summary = "홈 화면 API", description = "홈 화면에 필요한 정보를 제공하는 API입니다.") @@ -35,27 +36,13 @@ public class HomeRestController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001", description = "사용자를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), }) public ApiResponse getHome( -// @AuthenticationPrincipal PrincipalDetails principalDetails + @AuthenticationPrincipal PrincipalDetails principalDetails ) { - // TODO : 추후 구현될 로직을 위한 주석 - - /** - * 1. 현재 로그인한 사용자 정보 조회 - * 2. 사용자 기반 추천 컬렉션 목록 조회 - * 3. 사용자의 최근 수강 컬렉션 목록 조회 - * 4. HomeInfoDto로 변환하여 반환 - */ - - /** - * Spring Security 사용하기 때문에 @AuthenticationPrincipal를 통해 바로 현재 인증된 사용자의 정보를 가져올 수 있음 - */ - -// User user = principalDetails.getUser(); - - return ApiResponse.onSuccess(null); + User user = principalDetails != null ? principalDetails.getUser() : null; + HomeInfoDTO homeInfo = homeService.getHomeInfo(user); + return ApiResponse.onSuccess(homeInfo); } - @GetMapping("/test") @Operation(summary = "홈 화면 테스트용 API", description = "로그인, 로그아웃 상태 유지되는지 확인할 수 있는 API") public ApiResponse getHomeTest( @@ -65,7 +52,7 @@ public ApiResponse getHomeTest( if (principalDetails != null) { log.info("인증된 사용자: {}", principalDetails.getUsername()); - return ApiResponse.onSuccess(toUserLoginResponseDTO(principalDetails.getUser())); + return ApiResponse.onSuccess(UserConverter.toUserLoginResponseDTO(principalDetails.getUser())); } log.info("인증되지 않은 사용자"); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java index 6acc3fdb..2b8a0f22 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java @@ -17,7 +17,8 @@ public class HomeResponseDTO { @AllArgsConstructor public static class HomeInfoDTO { List recommendedCollections; - List recentCollections; +// List recentCollections; + RecentLearningDTO recentLearning; } @Getter @@ -49,4 +50,25 @@ public static class RecentCollectionDTO { String collectionUrl; // 컬렉션 상세 페이지 URL Integer currentEpisode; // 현재 학습 중인 에피소드 번호 } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class RecentLearningDTO { + private Long collectionId; + private String title; + private Integer currentEpisode; + private boolean isCompleted; + private List episodes; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class EpisodeDTO { + private Integer episodeNumber; + private String episodeName; + } } \ No newline at end of file From 27fdfa5b3cf6efece081029a8ef294922f948171 Mon Sep 17 00:00:00 2001 From: Karen Date: Thu, 23 Jan 2025 18:33:40 +0900 Subject: [PATCH 065/256] =?UTF-8?q?[fix]=20QueryDSL=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- learningFlow/build.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/learningFlow/build.gradle b/learningFlow/build.gradle index e061575a..270e8582 100644 --- a/learningFlow/build.gradle +++ b/learningFlow/build.gradle @@ -65,7 +65,8 @@ dependencies { //QueryDsl - implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + implementation 'com.querydsl:querydsl-core' annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" @@ -91,6 +92,11 @@ tasks.withType(JavaCompile).configureEach { options.generatedSourceOutputDirectory = file(generated) } +// gradle clean 시에 QClass 디렉토리 삭제 +clean { + delete file(generated) +} + configurations { compileOnly { extendsFrom annotationProcessor From e75b772ac954bc791df8722399cb41c2853468c5 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Thu, 23 Jan 2025 18:36:53 +0900 Subject: [PATCH 066/256] =?UTF-8?q?=EB=B8=94=EB=A1=9C=EA=B7=B8=20=EC=9E=84?= =?UTF-8?q?=EB=B2=A0=EB=93=9C=20=EC=9E=84=EC=8B=9C=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiPayload/code/status/ErrorStatus.java | 6 ++- .../service/embed/BlogEmbedService.java | 49 +++++++++++++++++++ .../controller/ResourceRestController.java | 8 +-- 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index 3d9d0a78..5444e8a5 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -51,8 +51,10 @@ public enum ErrorStatus implements BaseErrorCode { //URI 에러 URI_SYNTAX_ERROR(HttpStatus.BAD_REQUEST, "URI4001", "잘못된 형태의 URI 입니다"), // 임베드 에러 - YOUTUBE_URI_SYNTAX_ERROR(HttpStatus.BAD_REQUEST, "EMBED4001", "유튜브 URI 형식이 아닙니다."); - + YOUTUBE_URI_SYNTAX_ERROR(HttpStatus.BAD_REQUEST, "EMBED4001", "유튜브 URI 형식이 아닙니다."), + UNSUPPORTED_BLOG_PLATFORM(HttpStatus.BAD_REQUEST, "EMBED4002", "지원하지 않는 블로그 플랫폼입니다."), + // Resource 에러 + RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "RESOURCE4001", "존재하지 않는 리소스 입니다."); private final HttpStatus httpStatus; private final String code; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java new file mode 100644 index 00000000..ef6edc0f --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java @@ -0,0 +1,49 @@ +package learningFlow.learningFlow_BE.service.embed; + +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; +import learningFlow.learningFlow_BE.domain.Resource; +import learningFlow.learningFlow_BE.repository.ResourceRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class BlogEmbedService { + private final ResourceRepository resourceRepository; + + public Resource getResource(Long episodeId) { + Resource resource = resourceRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.RESOURCE_NOT_FOUND)); + + // 이미 변환된 URL이 존재하면 바로 반환 + if (resource.getClientUrl() != null) { + return resource; + } + + // 변환된 URL 생성 및 저장 + String embedUrl = getEmbedUrl(resource.getUrl()); + resource.setClientUrl(embedUrl); + return resourceRepository.save(resource); + } + + private String getEmbedUrl(String blogUrl) { + if (blogUrl.contains("brunch.co.kr")) { + return generateProxyUrl(blogUrl); + } else if (blogUrl.contains("tistory.com")) { + return generateProxyUrl(blogUrl); + } else if (blogUrl.contains("naver.com")) { + return generateProxyUrl(blogUrl); + } else if (blogUrl.contains("velog.io")) { + return generateProxyUrl(blogUrl); + } else { + throw new ResourceHandler(ErrorStatus.UNSUPPORTED_BLOG_PLATFORM); + } + } + + private String generateProxyUrl(String blogUrl) { + return "/proxy/blog?url=" + blogUrl; // 저장될 변환된 URL + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index 8eb0dc95..5d2433bf 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -53,9 +53,7 @@ public class ResourceRestController { public ApiResponse watchEpisode( @AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable("episode-id") Long episodeId) { - /** - * 강의 시청 하는 API로 강좌로 이동하는 API 이기 때문에 일단 Resource의 Url을 반환하게 해놓았어요. - */ + String loginId = principalDetails.getUser().getLoginId(); UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); Collection collection = resourceService.getCollection(episodeId); @@ -66,7 +64,9 @@ public ApiResponse watchEpisode( if (resourceType == ResourceType.VIDEO) { resource = youtubeUrlEmbedService.getResource(episodeId); - } // TEXT 일 경우도 처리 + } else if (resourceType == ResourceType.TEXT) { + + } return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memo)); } From 6450185cf3c5522e9cb4825d2c03b978bc1ac3f1 Mon Sep 17 00:00:00 2001 From: Karen Date: Thu, 23 Jan 2025 18:37:45 +0900 Subject: [PATCH 067/256] Remove Gradle cache from Git tracking --- .../.gradle/8.11.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/checksums/md5-checksums.bin | Bin 41347 -> 0 bytes .../8.11.1/checksums/sha1-checksums.bin | Bin 95333 -> 0 bytes .../executionHistory/executionHistory.bin | Bin 202229 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 37897 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 25195 -> 0 bytes learningFlow/.gradle/8.11.1/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 -- .../.gradle/buildOutputCleanup/outputFiles.bin | Bin 19361 -> 0 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 0 bytes learningFlow/.gradle/vcs-1/gc.properties | 0 15 files changed, 2 deletions(-) delete mode 100644 learningFlow/.gradle/8.11.1/checksums/checksums.lock delete mode 100644 learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/checksums/sha1-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileChanges/last-build.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin delete mode 100644 learningFlow/.gradle/8.11.1/gc.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 learningFlow/.gradle/buildOutputCleanup/cache.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 learningFlow/.gradle/file-system.probe delete mode 100644 learningFlow/.gradle/vcs-1/gc.properties diff --git a/learningFlow/.gradle/8.11.1/checksums/checksums.lock b/learningFlow/.gradle/8.11.1/checksums/checksums.lock deleted file mode 100644 index 63e0cd500da796398d36dd917b3317edc08e45de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS1EmnK{d1>KI1~6b<1^_yu1$qDg diff --git a/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin b/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin deleted file mode 100644 index e1270cf78a2cc9a74024893bc66f72bf92c63131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41347 zcmeI5iC<37`~UA0?Yly0Pb49gC6YF2-=jS$?P-zrebcUuQfZ-5mdFxCBq5cuBwD1D zBxH$D^qX_fob&m<&)r|}dzi=LJ-7GE^_**#Yp$7d+@V3CEajR*h4R0`_rG8M`_;c0 z_%{RpX5ilp{F{M)Gw^Q){>{L@8TdB?|7PId4E&pce>3oJ2L8>!zZv*91OH~=-wgbl zfqygb|H}-RgMqNX!7N>~0Q&`JAceA?jY6Sojbe7H84|BAfxlhUf&ckIwDi?Uh3@!B zsPECl^%$KRkwq@=enLG^jL^FnxdH}{aYDVgiO>hzzhvy*n+$c|Ktlg;l5IS%D+aY+ zh3m1)hV)N8-(&-I_XC7}_J>fW-5oBdJJRENoMD!{hUE==s5@v8`jln!pWLz@sN3Ge z_4wBj@dbB&^+G-B60RqFS@NOZUrY$R{;F{Z;SY#iK+b8Wa>9JXS8qM30I$TfTY;V3|Ad>~{_w*6EMp(;F{RPLMuA5Eh zUPcXkLfvvuj|m|3*{&O&Kc7`WJ(d;MQx}FRUuaZmg}Nm>q4Pg$u2L^U{dC$(==*9e zrrhxEfcE>Z6S|x6H@&>&Gf+R;g6nDF+j{cs{WPF%REg^uhxo$Ib$g6LeOEc5KW}JP z3V6K->Ln|1{mAPhS40$@&pC}KXd=(*nSYhRNI^?i?V`z)@( zFI`V~te_sEO6a>bFTL84_XFydCkfq&NinzReLd9e^>IC0_N4c*gCmQf9;-~~w>RHw zNXlx5x>YBkf2Q1*dYxqn^+PLhJ%_)ziqmQWkqJj#dB zIz|%fdu;W-lwPK~X4p>F0AYXBSgpHMzYpqeFL6C@`QrNWh1DOR9%V@A3U;e+oSmbG zx@j(<>(wf~*)fF1Wu%Vl`C6ux4E`CPp?x+HC;9EaO0Mk`UG{|b@*=-4l9Q(ek*tY>S;5$USxZQ@z;)sP^gCy`Kl<#hV$*E8Wgw1 z8H9b+&U3;A49lVY@laepVR55kv+{E^Z^zFOdbWPzC9UJvpna|)p}+H5D`iq73-#U0 zaJ`t{txe{$lXx z`1&`8PlZ2Kp}ltl{u?E-=9=l27mlEItZ}_mIIT=-!O%UZd&&`dSNi_3y(#5TKS<1H z8GXR2i-L8i|9-^&E#sBT7Rg`W4ei5;yi_Kc{8v7*!4T>hDR}#3ic(^4uPg3@`mr=Z zFRME)KPZRtq5VZdKPkFbO_gmov=8aQ^^?Eelv4iYqy3nkiRY+rws%V@$pZ@DJ6V&60xUCprHgP_8{36udiF|%K>AL}A0%sf4Eyi%a zr@y?B&XV{!3-w%L9jgxA`}wD*$q(vgwzz#&`r%rSf#_FIkK07(N1t`If7WP zsxKFXEp!JspnZ@&Zhy9=()4k6DLMy_5P9b878hzMdOehje0HE@ew@++(eT;%c`pZhxtM@r=<0#;edi zf0WSQXvpu2KZ@eb#va!%%V$KMvEtqi?QMvCeR$J-)Xg3*xdXOM)UvK)s$uaAPBGmQ1 z5c)*U+59V_N1=Y47*~V3Mrp0Z!cnLPYvJ|{_Hov;0hdys?$=G|FG@59-1j6x-K`SW zZ^%AhcEu@50O|?Exo|^+ez$-5%hOQb!;9NDGTfHF&THrabsu6L8a1>cJ*`*xKs_;u zus2oL^`EXq`zUD{p$8sZ{kEk<7uui5CG?&{cI(eqPD4G0*pIhFf7ngEj_8DX{C(X1 zR(ETL{5y^bsAm!LaC`XL_7h(>q5E5&Ic|UZ-8SbVd-Y79eE^Xs?+CmQ{Crvq&yz%a z-jVvc_3GcTZfIZd5^v|OK;!xglI>`JWlR#f$tv%S>IH|PJrSOBcU>BF`J7Mhgu2oH z+VOs$`)T`J6Vy{wh<3UH8Wu=7+8>?CvXwev-k-8 zXS2qk?#9g_T~uKjw=z*_vcJm5`S&3fVxdHZvVjF z*Q-lc!v^XFmAL*;M@z}2?_&$p?ZgQE*aea3^m{H)Pq!!Zi3@{^WZvaLJwh7S+uYBw z-FJLg4fO-WxY{xn?bzzK>GMskXwA%>kUQM|ENP9x{9e3Fr)U9U- z{Z-FMo$fXi=X?DLeY~XW`?-3wF3Ewo-sK_tG&7_hok#k_zId`I&tY^@3Y`n79=QFJ zTZwOS6hEW9>X=XH4<)xUrca{#ZR7-@e|%jI6h;`{J%Y7|iz=NKf%s&$L-|Aj+P&Cp0J(`W{{k*`5zd)8a6C=^fJ^758(E%OwT?ta$`k#?>N!_K_>&9!Rvm=-oF#Ke|@6X zeXLar-E%T5aeYW?b?t#8WM1|eQ&4C zwn0ZGsC)0m^*5b8tL`44Lven5kkF?-c3pdU>m;<_tBUI*(fmcn*i#}yFzM2C9! z?N{jD<(W(9Kfg!Ft+Dll?d1N!^|yljbhk^4@cRrsu8(z{+dnOg4UCbP~Xdm>r)|%OL8mupiFTh_Qlju$JV;j zCzitB(7Q$0Up_KbdS%}hsJmPu^x?Nl-tqPxfO_awT>q{w;Jlsr`WdJP*b{oob+x>L zR3HJQ zeb|omF+#tjvg!AqeAK?(IId5tZ7})6*9^@mW-^5SLf}Zu^fGk+v7N;ApHjgyGBTwo ze;y>-|Fy30vGXx?bk6z{7lq&3Pv~Vm+K~?(I8Ed2{I)IjVc74q7wWru2>n#3w7^U& ziidb&-G8?i7q6UokJ`~D?lZrCo-0|^cOB)u9Af@wL@7#cJ9tjO_7BqG?a##ZH7|Jk zSrO_+L_V3R?lyV(rWLKD;W^xXwqW#bvRR6C@=!d)b>KSX`9Q>l$cW|8K8BbFI>r;;+j{SR zhI$w=F1i8NV$r1iVo*0F)@4Bk+qb{{YtcPNrwwnP!J|t4vP<(Mv=6$7>x_ESx^vgF zP##Dl;)gMI$tUgng7wh;7;&FrO7u-)TyU2g>eljjJ522#nv!4pq5e4V;X1S9kMHk7 z$2_2Y$wxvjTzAHR-Tf5Qy@)txe%Jre>Q&TMsN0$1_AIAgZ_E7f`yteIhRs&C`e3u$^#X|8hp3@shM&RReW*W!#=ilKw!1 z&Np|c>+Z#M?&aJ~I(O}ny_YSaOFC}|-g5!n2Q0e@U0*AH>B$f1{MGg%^u*VrKgLth zd*CBtgx(XTJ7=LB2>lij=QWSY)`I$5m(Y048*qD`tVikxES*B2{r*H;=Pg<#G8uOY z#fb|s|Gbsk@14K57`>+rBjSN~cwwcLjooVGm&oV5e=RAR^ou2+zIzC7f3dG(?h9G% z(@-xa;&Abqn7p@sK}Aq^I78UCo)dJCZbg5NaL^go`C@y%XLLT8f%Xw;gq}6HwRcn$ zJqKkG?JOzV{$yL2BRU6tHF5hT&(&oAjGioq?IaNWS*o&;;lk9zTBz$!;P%Vt_1-_w zE#!cDNfMz)EpKDE)sFIBauu#G=i(GI6ZAv-H$0org`RF4eJXPmwqru9mk>ibZ`+RB zUQl;z!|jFnrp`Hi)HZ_pQ6dh7SGmb;(BTh&dQuHxuf2CMkJjxaP>*>@=mleL8q3>I z|Bn*+S-9-r^-aWx zD9(?>jUZ2usU_ry0b23)@z zq73!mGq}A3v-(PQr$f0=cMT=w(6 z&Nb8fxV}PZV9-9>{xEDOPlC|xP7k%;U5@TKroV7qibJaHL*iAmE`dZ|UD++c;`5~K zJZ#6GIHy*b(aFuInRG!t+aGUdRc-$37MpP&s2`fdb!p?d=AxKcG@rUHxW0PJYvFXy zkz{C}^O(>L^MihVEqw!ZlZAvH_+&5LSIP#c$Cl!{jA5-wq{&KgsFxD+BhwZ3Cx&uU z2kHiwaQijJyqiPU9!2@zmzU73&RL7Ry6OP!eZmR-{kD3#M<>mpZcT^lvPFt2%2ls> zp`J$QYc&STtOVrlKz)}gZoe+SuY=)+7CKLzr3w9{JzItU6ZHIB5P<9JU(8CoToXq3 zH&0@Hk3EM9w^0VBR9gnp}zF&j71u+jBRNjp%yK78A-T4dNzT%AoQh!IE zF+n|)$lDw141Bz{$|yiRVD z0D2DH6G-Tv40gZ$WyS*S6PgHp_5stCWuc3qZj*`YI~@6pr!}=MLp>-G*HwA{#7-zv z>Y$!a^iwtb;&AWnaC9Gwb0h4J3psWPc%t<>x);~gR_wf$vf)PoY-eu|p&uUDQ`4@# z4eF^xeo#*cyIk;QHOhwt>bSiILnd7UyZ=FGA3?;S#=b(o@XoU@p`IB@*t;s87|m@z z0QEp3KWlbsBtHl{+XD6A0o-0oXIegGRir;^M-bO{X$YFM>K3B)3M9^jU9LIe&GsGW zK75#n2kmt-$#nalqd4^bh_|EdHX`FNV1o8t`gdH{2`c3)U~NTlVo&S~U5=$SH=HcY zV1LYa9vio1u%Dp!0W5 zbl)(Q!`m@p>XAP8Cc+Ndr^yrgQlXp_H6?whhj0@5MsZ)ej1}nKXjMe$VWUgkoMuse zJ7$gR#y0hvdtH?;!gk_w2|YLBTz^s|YNv>ZTT|JNOI&7KrJ((RSlr(9y+Z4P;XXE~ zA4(zgPaOkZv8KXMPbTue8Her9GP|ef{+z6d+nb3$UVmX*XEd~rxJBq{XWgZj=7&Mu zndrZnyU5!l!?7}`8-^10zj7C!p?fL`bvJHYHfkT(_2A*Y{fG!#Aj# zbl|#;?DCBd-f;y%-HzCIHpBXvNs|X6kv%d0wjBEwPU`h!Ks}tu8@7I9rc2%QU7()W zfVXd(@kq1s@5vCTM+p)772ZLsw*q&e?(ae94_;nqK5pL!b>joLZa1gNB}idH`#Q%9 z*Xi0`lJ+9z}{mCZs zsuSHOA9_0c-jdph+dHw93PiY0or3m9ObK0*!~MLKrytY{iSxxNVP%hd?&b$jKSA6d zoQ@A4dUf#rNvKX-6hr&sZ-g%6(KGS&I?9JGhJ^08 z-9+rXuLiVtBlgSwyR+^-8BFM0IBbmDyD)9i^=j)w`^Arlf0tCH(e+RHjA1)Tx`chB zME7x*k+o3YN5qM%e`sc5vC=ryt%GtvZ=>?f$C~xHEol>>ENPA*)wuEQRev6Zy)|HgbPX_l@sR_a^p* z-=AHNli$0c`$=dq-j2WCs-SkonkZ;rLY#O0dDG_d@0OwW16IVo_HTH#o0Fpo-9J;e z;O!h-u>G7yb~w7XJKrMosuElMyxauXe*Ps~4`7(srEOvK3+k?eg#K!^X2J*l-%#H# zf$KpFJNvvd6#hcpkjSecaeQ4~YnM7h-S{bPAM$<0oo9JF9H1Uc=%HLeU*q>(lYqM8 zAKX6l+4RS!4;s;PnWGD?hpEfIxLP@do3oJ2L8>!zZsyN0eK){FQ~<^|G2sx zKbEF{+q`Bji%$M=i^>b|(*il#CXXv2x8OART>D?*xKqTlY1bnK4ECaLJ_>%Nhs2Y| zh`2~g#B65R9I$niU2SCc@sYs2MUZ%oP7zkDBP1V#Vzqm^>Ek3?8FC`NoL>Oi#Cp|( z&PVP`w1iKa>G^b4GwbZvqX&4FT7owN81W(y_G%IKW|`!pPkcr0BIXZMwyfIMAAYY; zhs4V~NN`|xArcX2*RYkxEkr*xlZ71=E;>?9iq<_H@{?;hxb8GBkFja*-Pdw7#w-TUs+8$YrH zt7Q>k4GFHVv_#r;2vc)k(Y{Z~*r z5!19@cPSY4%9cvdt&gWAt{;hB{58YF=Y-AequunW4bVp~7xZC2 zrd?R`!?k4&;BJM@Za)tsnA&KG4VHmp>{}$BboNGPRfTybBf<+3tcz%gR{8yBYJM*> zreC0z^yOvSIY3}@#SRI>6k6h&wp^X;WcR)1Chd~z4XF%(0PAsE3lfJG&=N=N!mIVu zw0!K3?8y3ct4Zu28Wj|IPPvN{z>*onrrTML;w;i^Q~aqnZGuv z-?p1Szn*4%{{EhQh+u<+z;f_O^0Al6!iI9nGdJ_F)S9}`3>1m|!;sL%Zq_6s^Ve#- z#Tsu{GA0PkF|2+J-f3g&G2jacL1S7X+GzX(t3uI)t>wzdjoY4&K%zej5-R1iL_R~f zRKh+@Zc!2c56i5tjUz%25=%hTkb8A(ViWJN#_aN1#`YH+@_pcjOqV6koEQs<`Q}PP zq0wq=`_cn%Q{Ox&na%(inmUfxkeDyp9n!aykK7f%>C~a>Fq64o1@)>B66>)nM4GD$ zMOTy-jl_+MpTM?M z!p`s!3()44a@LIlV{SYdk(DpId5dDw*Uj20Md6ltijTfP~bFxc$A!g>P=<3>=C zh$!LkniB@f4>iVo8#Y}@1J9ULqKOJn7+q@@7F6R?4LX!@ulH8?gKr=t(+&? z%Wc8}o<-z?v@ zEUwCG!}bT*=b=%M;CVqy98l<`=q5>VOlGXVfA+A?e(2+MH6*y^S;0FwI#$VQ2H8*f z&Ma-sxeVqX^O273CCjR4edJ%+;vM~NV^wV#pZG(LLGZo<8~I&P=!08u#_5H2@ZWUA?*zE$874ziw?GG}l`+g0zq-b-*zq?VGfrws6aJYd_Qj|&T(q5#-R`0H?+j^0@ba@Y^CaQ>lY@}e2adFh})3R zVxc7(Yctia&~MwhxVWcKU8Dt`2BwVIh(R%y0~Kk_b7Sv))G!@_kaH+ zNgnyY&OcD*yJbB5tLy3 zu^X}y`j99ApQK*JRY@^^w+XgYQnQ;W(>nhX5!#U8nrF?AmWO0`(J^2CedT_N??vqA zG^jqX{S69-F{nsBQhz6Ete2FV3fgrbAU%15B^(D6$cRTYSqJY0S zQD_+@9ucWjfU*umCYcaX_W6~u^4adF8J*;>=}KUiVsXXH2MMtlT4Lz1%l9Ie*L<^k zj&J)NaTq7C=m3Sg7*wQQH5v(--el9*lTdfM=GnJbAbV1McvAriD~M$>p)w|SC+eda z-QurTRYlVey+cGCBoxol5@#-2tr~g6J=k!qjx%@sgBl`03}b~K%h;q|DMxO4TVwOY zGwLW$9fztcSO;pa(CkX&(-NoFRb7y>y1g_#HJw9R-_dkv}lxTm#Z1t35qhG9Dil=Y*a zA`zy=Eo*?st%d3=P%8p-7(d)3ZKAME5+3V4KkfF~EM@XQlehyMC&|CnRTzei_&e4oC=Vnl%6 zVTJz>s7SpEFB7=wICvv#_U&EvUz*;`kYIJd>?sspaK4iX%H3Y^$PGUi&HUlh3H;U( z2FDQ&;tMM*x}YNYcynPSF510z-|Z*sx1ZPc18rh+#aclHC`+)tNFv^yiOl!sSYejA zf~Bcw-(mqo+<^qA5G}zxT)43Jt@9B!%LIvEsS02ns6Jjo0((b8_VJf>{}vbKa?$L5 z&L3sVcH#s|oH?O}XyzcA zbDe%P<&J$sge?`ItdgW9n4(e?q|;LQ{Ct}n{5JD|JVo^p00|Y4hsi$J`PzdwPgcZq zEF4g6zblWj4;wfYu)^vJD$)wx6+UXY=zj4@)lH2@6xKHuA|E%Y0EPJ*Euo)%Q@(iF zW!q&@&o}<{Teu1l*j*YF7H&|Hd~`L^{kooUs6y=1B6X=VBY3YSr~qa0Q(EG0(~RAq zI`>%#`j8x@lC)sxgPjo)LSVm;eTb@ZDO*;K^4JX>d3<@h`&UGOh{Ou@XOKv}dT6vW zN4n>YM0NOb29C~Tdqk{(1T#1n$v%`ho=G(1B#QO%ua58kdmBVImKh@cK!UxRmUt!p zyOEB2>44UbB|M(d8coQD10-aWXo*X1tG6E!>8u;`=samCrUWdpHD`ePgD#ANmT);> z{g>JNP0K_8*KoVd-@}mLd;onc1d&M|2anputE^>AGC^uD>+f0Bfhfm(aH5+f>jqlF zDYsuSkg;g-3`bFpPjzY@BEZcIE6gBAl6_QeXjm{1tH`xd=H}7zX}O~R5-c9H#98NB z-?(>usXg@p4|xZYqX3b;h}96gOM}8B3@XwJc2?x640Pss76-lB=M(5Ug?wNm28DT^ zJ?Q3Ay+!3?YOmNK`*mXRKYl@iOOy&w_^{ne@^LrS z%0m{*Pgo>U-)IA3zFS{}<>CupzN`JJ5(>w1&R4ioc6CeGaDD*+_czi z^1;2T-|G?a0uu9`I5GW`Tnnz12EWwodwH$C=@TM8Kw`eU8#r;ELsp+*#Dl|3)$q_Dz#91@%;Gw|vFk~CK-nVYMI7-NP%?v^l{(iMM= zeC&cg_`yAeO#B?C`zhb^vZd}fbH$?z3Fd5CLSXyd58u+<2em3s+m^TQ zT=`#u@f$5sJmz*m!l~fgU#DBylAl$t?%A#f45&WJApx#*G$RlA^0_Ur@&{wgS)dO=EXR}9W8lm4PoppPFLp3mGxI%btso+> zl>=qI=fPh&<9EdTZI(JVhPsEC90faxI*!*=fKoY6w1@20ot3!w(D)5(UKfzQWL_*GyrB5 z^TCU5;Y=rJiQVryourP>S@=nb-Cbgh-kuW#D=#haRO5KBd&q=!*P{(jr9KU#D8YTO z#nBSH0WEKWI%kG#d4dg$b}cbe2gOfmHzi<1 z_O8ce;I@Gk&P-5|hzrF@w=8DU^rZa)V@t!ZzfS=pPSR5WirQ0JqK#QcLOA&T15@$nc329b;bqcf9Y{t98b{`UVDIfyt4Ja-kmdU+J9Vq`$;n>;v^XFx~ zH|vs{5n(|ED1ulPB8|f>X5fcrq9lt1OV5sO(FQ^z3D?_3bj0Y>Luv3BLgNsr4s!i0|M@tIU2gxfnV+6M5Sag72?wBY0sGqs%e(GsL zuv-xRMo^J@RXf${`R#JD z*@3`sdF!syzyB}6Y)wmCy1PA7ghTs6lDbcf)@TJbyI>rI4@FucW9yR2o#%tUC>p(6 z8hE#)>%RnRDlJj|n>~12abiS+vvpCw_%3jx#C%ZSzX4-5Z(3qHh;c)&b%54~Z@b>_ z`<>c|2p(Vw3O_g($s=!x;rO9CsCCn-*TB7`md}GkfXq!MSpAo1M{B*f8`7Yiu_C^7 z86x;F4PF~!Zze(mW9U#E-N6daIKv_Odl+0PX-1N}WHa{Dz zbj3(@4TuUV0ip#f3L8O1^6}QXQP7EBceR4JuEu?fpT>}gT}uThtSq!de)cZ?mND*a zq8{w$M%8pcW~R5FDYhVeA8Hh7-uLf6cyPH{6b|6AuJwX3*E6VNsAE^L^2Ro}szz_Bk9P;6eKvW(h^sl7`I3cb?(?O9nkq>U+8N@Ohba(jFwP!6q;}twBuKbk?9w( zlCK8@h>`?EY;vY0T(0(q74SuoF|x%JkCP!i52I!pdt|m|GxG< z7T8)ay`rGH@c{^|s#VwB(RH-89(#@gKC-ae9w-twKt<|RQnvS3{oZ3GX~+85T!l`)hCYh0 zbpS;$9#kY^`z!S--d0(|Ps)y)yAwSG5wVI2P!#7mIb#pLU~RgkGFkXiaV_7dCs;YG zSDDd}kh?(ZgLgaMqS>A7;=piZF)b0NB|0vNSkSGMK0!Y$Kv{Ui%@6sofj-pddDmAc{9UH_{t{L4W_BHDJGvZ{F`aaifH zVsdc#+*;(rnhH<^=Q#}+M;IprI$WZ)_WGYVSb7+Y6x+4c+>qeGb}z}t7uO|CQ_XVP zXN>pdZb(OKGAoE9st@dJ0)=6ov$lEn^-=4UXVrqf6<_<>bLl1|PGD;d%4!o(k$k*+ zljWm!X=ra|W^`^}7$=B8YLtvn0SXJ2=}1I4Z`y3Zb;+mCrF@Ru`_&3|E0sX|gK3_8 z6}nvIYOHxzmcp8g;-0Z775^m|KhXL}k-0qWWTBt4utwM}uBtoazXVG!EwO0zp6q?! z{g(PIGP60zuo~PhuwE_0?h2r=V$nhxhuBw#+ZwM%R|d(*GAz<)0OtmkV5I^Swt3E4 zRehW8p&gXRWtK~B9O=IP{J#XJD6Nm-?%&+4Cf(O7S;XJQ?ZSQ<>i^D_)I(ar&f9#y zB>Q?1?lTwlc71y*hkUTZUNJwTB{sM#ZW5K@drCQYdqYSJOUy)YzMRM#Kv$K;g`zB`ztXOIY~+m9;uN`ze6(at|QD`&|bE zNUWZqC0v>FE`3p0aKpay3zNjO>R0GPU<)KzmeCT@k3J85ULaC;=v6aY@A^*c90ZYw z6TGWwi3x7m$;7`|!p?qoIfD}?Um^mHoC76FTvkTQ_VspG(jPFiAx zzw-|99~;CfrPu9FY3c#HluCRDmY{HgJ000autDL|a1Niw+~Oy?29hs$AR(Aa1t=Ux zXo+2MUgtb6Xa066i(0!hvkB!Z!JUwhbfF~{9^2q7CF8py!O+Xovmsap`M_2VltsWN zxmV@)*dnbogxt=&iQ4nZ^eMIn!JQ#yDHWhFfExjs5EG?8T$8)r@N2suYx|7 z$3Q|0n={hv{yeH|^}BTXv839~I`5SQ67;lNx4WBC@8Wgv5tN8Yo@AjC!TAiZX=KzgLP zE?7B?2tv;W+KXt37nCq02zzRi32-ZS^7eqhV z#}D)IEvbn+qw_hwrb+T>fmt2m{efDw6|C-k5X z4vZv?ygf^2VNQIv;&NF<6NBR&=sXw3atJ7l7)c_kuPt3rzW&Pc%)WE%hc(v5!Ep$m zp#l_+c_MMsoI;f3Kx1Up(|Xm>zPoF&UX|K9@k2ri%pKW>c&;DQtbUT4WbF_0$uQ?( zNH}6K3yMrVs7Srq^T8p_hAVG^zQbXkc}Il+?3D-y6`-)2(h}ug8auz%RxNMX+OTic zpG8`T05gCU;Tceod|WtuZ6}XOjKb%^ih{X&a$vV&u`2>r5-Z%BKt&>UPTj27COdui z(#e>pW#$V&X2aH_3dJr%4J}cl(Br?GJ|a3L@jaWNhMzwou45i3l>JShBKc4mGP|-r zZD^g}z|w>}?^^Fd;IW^scQd_* zJ7jkc^NtAmC#pyPLZX-f^8ii*bx@Ifd`iiGR}7dBp_mYEs17Ws#49R5kpwGBCfubqToZj!ut4K7!?@_9q{sgy z=KJzXsTVelQo7W(tQOAJ@NhMmsSKwC7iOTKv;qK{*Z#S*NPBm<uMXAU`66y}m7qDuF-Tys@2(aI=!ZXjUZ#b~-u)OVZ4W&0VX-AVw(QPR-01_Pi z;FAIaUum0+|jgz z)Kr}6H}6)Vh{5&U>%X~xQ;a(DWJoa0^E`NnaqB#$ z+pOS(vWu@^t^D)l?8x9t(fG^sENxH#K(AT&+%}C3F+JG!kwbq^`Z0*r$`GWCVSLDMKG@ zv9!cHMWH-1y?E`HtEXHyE6@J=FTr|;mI$Amkh5lYIZ=MP)9&G-La@fzI0zp;w8SaK zwzJGb%=USPdn`>1WhD?{4|~NAvJrXYXIeYUm7VD4k{1T-J-6a-(0_@=SPYZ)hkJwv zPsO&*M8hn5mIS3AU>&HvLOvFQ9Y!W*>b5O~Vjmeknf3GR{jn*Su2aZFho7TtYwm;ds*qe{pdR0fUs+WVPz*aB|1O6!u|$Ln6`-&T(-NUts=7Vj4|}y#m^@x`awrB7d5~BG?kQv+ zy#_Y==Ug>+)*G>KEv^utp3dOb=LrdBEH{#RRcz6dE%f2U`7QFdj@}kj2B!cu649wP z-*+b1zbZQZzNp(cA`zgMtXmIygUxO@=p9zr=Q$0onVZ`9zl%MP6Q=9<1f4 zwsN4%cSiNtU*4Z}kaRv~ld)19Av9 zyXgz50EKm)NL2H@K;e8f@b2lQcmC#9TfuojB{U$x6He>nn!N78HxI9FeKeP0!?kJ> z+qK!Aet)h(fZf5JoIw)xz2aMPLY2q;V{^+%w%(uD#}R zOa4-3uCrCh$4e?eSrkTNP+@K;6%Qj}j z^ef-=>~Gq-?u@P**mJ-~jy~G8o99{c@8)7ZL@h>-Hr_eDI^Wa^@M@iqI z_3UOhl_o)$=tuL)T*`4mOT< z*ejclv;@<~r<-#*b+Uu%Gkn~>syHK}6cV=BCuw$n?JB<6mc!Ozbi*U->)}`QSg%TL z_kTw|u-=h~tMQjh=2UF+#_kp8pNJ|0XA+gT4T<^Qew3Sat23S2qdUcCynmob(;W6{ z4(0Zpy0kvDT9{63J+qBJ&Q@lBiQ4QvM2tfpy4XsRdS$%lOvb|pEY(bQR|P+@VD}I( zSN;?>NKpT+5fUL4H}HZpV=U#~@sqRHb@K}lAq|O*^V}KU=Pv*4`$^n=j4L3-VExHM z7y*8o9A%&Rey-^8icJj3d3iw%cbwvbV*Y@AjYY`_*u7Yp?|sQc>f9xsgri&HCPzgj zuWdSldWFtfi4uU3#*udMhv2tcKceE}w={3LB#E7a*vLWt#mao&BYX1p*p&LYKJ|jl zuD@@W^%*1LCL}n(TWGQmmWh+688$?{=2+bEFjHyl5hUn9{>4f@_MA@Yl`gl}v-@Q+ zbW{8--d_6cQ^?046`-s?MN53K`)E>cP`&q{)U;gl$sjCKgK^MpgoFr)GqMkzu!+Db z=l=3r8y0%^eV>g$gaIUYw$c)(g)jRxo_^W={^*f`SkoRfyL1O3!J0x#wD?<1$ua0y zur^Kz*X{^gi}_fgf5Q~eDcD6I4BS|zhd zyJatPR%)!$UZ-WV|0Ezll#GI?#|lR#s7SM`CfU^}`|;=9ZSUV!kDO>&fJR;-c}^)Um9H9KgD4>#>@svY>m<$O%kAS#FzpWQl0EC-pJ z+^doeq1+wr{I*t`!=JKB&o04wwTM+$4-$gEX$g(;UDvwKt>}Lh_g&@gx>xVfIEEoX z{Z1!o?D%NksOVcK?o+(wyhbGG#fgL)pm3 zEF`#2(-NX}ujT4L8a^7?!JWgcP&wTF<61lzb!{Z5hUjOd7NaMdfi)Y?TdB}b3J8LH!ML! z8zlJ8gHO^pcw$F&qf(MTiaZQ@wM9tm0UXB|IHj>7ijgG3q0;jBB9mS-)-RDIZW$Ni zk&g)~Kv{)lQxcKRV0Y(i7OPXyx|X1&CDCrk2RhGH=h^2G-@j;Iel2xBEn|6Ja`0YT zK!80Mfu5b``&pS|ZK~6fO(*(%#Y)#LS&;BOmj9XFK9_|E#xXm+Mo}k~WF2 zAGe`iMZs|hanp|DesXl6dgh7GO`qlXm5ukuA|K#3j+Oa-Rwm+ol=|6f2cOW*jyd8L z^r6THmOVjX{sk)1T%SSckteLKyh~vy2t?dGfC13r_x-Z8rs8`Nj5f zB?Z(Y;vys@z@3ilBkOA3f_J)G`45j!=&HERHc$z_KQI#MYA0!lrRxU1R%GnSl{~*; zwa;EPJ47snJ~qsgOBRegdw5~N?|W{qIM2V_TC@`qvp*rR>JqJwclB+4kyY#X&fbul zOnvDI_8eG2zgb2|FiO%A)qI}&)s{TEwlK$GZ@qWRaVp`@i0)TQnP>^I2VDCkdJgeq zUu7F%WUnBi2XZ) zRAMicpoC!2LLwg7TgX;RKA`UqVL$b*!Ux;6z{lhwNO0KG5`nibDhS2MJ~{s>Oo~-< z6?Ph6y+Suj7A;yrKD#^gVEACdeWtb-%nT2jkPm0*gME~ic-x{|yDaF5N_d<2rKmhP zaQ@Nd*tV<9LIO(+7J!px6y(4j^QB}ri2iwg2_6LJC{=Wog0WHzK^_A|?b4s5o{vvS)`RVIc$OmH>$5xTZZ#CGXct7p7!{x}ZKEX^*H=7kvdr7n5?0@&`Fiv9R@K|=$c@+Tp+0Q`0>m&@n5IBQ>XnoDWwDy83{iB` z^p`H&efSson48ZAVHum`~4k?cv*vTUisj`M*z|_RU1S(m?M3IKlf~GU1>jDa`Uc z?rt6Uo4iD$I0B&$jbzLN_|qkjzsN+|pMp(w9nWG`^X&>r+qN0Iy@J`*FrxyLrLMHZ z0}BR&B9{Q43ZEO|ta{DI{_BGq+)c?olo+4K-|Dvbp~Qd3WOKf6FC;Y49%P#*m;B!G zNX2^O;lanoGg)dug&=0JUTLm^y<)pZ>my~r&*Z{zW~}6;ko2I)AtOZSLV|k%Em32B zQ+Fq`gQjBA5@|zyQ++fJ6uZ(vw1nu4{R?5YUl~stxTVCWE3h*Po2wS+Bl0vYkbbJ42}e#iERs;M{O;T%dcwxV!M3?cI+&?;=7C63cGU5+^rs zt4%mH)@u#@?%b^La|0r}AmJ5GONcFzUnuzVN#ch*`KFd0Pml@da-wg!Vy77>tXM>n z#u4$c?bMGa<2DwTOZHxVu_^bz1oI18;-y&aoRR?D)AC~>*Vzmwsgd|UAI#Tj3B#_` z)#fRAecS8JS-w5o21bhY$}I#~fv$26S>{l=PQKJO(3hncZdG6Hg zSF@9j2&F5yDm;4j^XKhgbi{H7lnwsGN;Y$T5 zyz@NQcA7{OiO=jmxNDuS(e5#oov;tC{K+i3}lIj$!ouTn-Hh%*nD3OH>?#6?I%VDUwo z-QN0%Jzw)ajd#6j3kj}EI*JH)NUR^AB`j<7a>~41w+mFXYGg>PSpf-8e@HOb&=NDg zwNjd@O*g?;$OI2{6{r9ryI1m6x5maJ6qovGROt=zJU%khEUUr2a9gFe=B(-I7cMZ1>k+`QvN#SAFCoDL z=8o*6;GKZ-h;rnJmB^U;dV|xTZLC+GSUiEkG|%k*PzPVr^I3NN(_x7PgRNuKlM{>_ z%ORjJ$AgMA4xd}AhkA@o#^z^L-~1HEl!ZqAoC;7_!1|Dh(kA+wPu;3--MYb1a^T&| zG(=oLL?kW2{mbc~QIp}XORD!0Vu*~$p8|s@oK-__Z_+45;&)}Hy@wWF4+Nz(wW{X!Y zgX8cngT$hFqP^~|bmODo`|10F-fzl#WYmWUkm<0(w-;2T*>$UO%QlpdT&F3rbYV>Z zUHN~BMe~e&%VSrz*oF7bF!gt=Nz$L7-YlbUd1HABlxXZmL-H}z(m14gOzhX7S@6A` zW;-j959|~Gg&_=7Bw~h1xoV;7*0IyK-9GF~nOP2rpbjcPVb!1|8j_vk9X+op)Lqyu R(bBUa2@&0pU>?DU{|BKVb-$SP7v>GDN0?h)~9)NTNt6C6Wx0 z5YZ&0Qu&{A_qqFdK6m)9&)0g^Z~fM9+3Q*7_Plz(-mmw5pS|CE?{mB7qlv=_aL!{5 z_n*f5pFb}CX)yzf8CcA~Vg?p7u$Y0x3@m0~F$0SkSj@m;1{O20n1RI%EM{Oa1B)40 z%)nv>7BjGzf&Z^$U?0*EX3&{i{xs+xIQ(%qIaVAF|0YD{_7}y@Gr{1mUCM~xAB4!$ z7dq|yat`2uoe;keyHiNPIsxGJ%@BWN_#-Z@TLs`&k`R9v@$MY)kfy|HV4tub;tnSV@9x$p0=Nek#M>A+eFu^`fFEZVf9Sx|$yl?) zSp11h(Ej69)(!;2@wwy9MsEsr3~W1olS;#^8Sk%$;(TCy-NTQKh2_ZKlVYg zAEvt#;+yokpN2a-0sDvHncx;)aSF|EDnf&4R{=MFasG&NW;rNA>wC6RsXOrVo91#Wl#6sP3U-OsN>lZoz+`^t{AI0&szCvF%9^kIf zPt^IiV1z>);HI|FKI`^|p6H>bY@e=Lh-o{mkE7^lQ;09lGXE>Ax{8+(pn^3o@u{tvTDZo9WpndD= zxL+;XCjcHM4Dq(>KcgMT(}1oF9ETVAG7C8DZLoe>!G2xbyYiWKU*cEbrx>nB7tQWe zNQY{B0K8x+(f>sY_w66w9F+wAbzwcccq2{e@OFj2z`o=^{!7?;V-Kwd^%fU4Mf8&> zEx)$l=-^x6N4OQ@tEyc%zl}))e76R~ol*-Pe{kOk@V&53CVn`}*6Ciej)3DbjEMG0 zw0HF*e=vmryeI_XlG4J1S;Aoa;9X$7N;1*ic!0^S2G}P{L;J&bL%-PV26YC%4CW!} zN=~!*uSzdqZ_o|xZ@R3g+rt9p1unt_;&;pr#f2$t0QT9U5bth}7nt3I&0hm$h>zT# zxi^ur1=vT46Y*rc@vaoX(hdTSU&RFRW!J8EtkpUXaKSQ&ueOQmVZ2ihaN{KqcV}J4 zyK)QA#fynUJaCubiI{F|Jm+dbJcRz}nTTE%;K!7Xh^HtXTz#)_ehC4`S;P68vghXJ zp>2a_0DgTLv^Tz;AjGF)5Bw;>{G^=y%XnnYa17X6?uPd9r8CT%drkq|Eg9meYvvQ% z9b5qJ9ZbYi*I5=<>SF5`-W86kR4tP{TJKme&haMY&_1Z9_*(`@4-RJr`;{77w(K;E zA7K}W!|!r}_Ai2Vh55IGe=CCb(jnrPN?Hrfw(P{l$$B_1F1760&Yo2qPKXn)4C~dU zxscm4nH#Wm(~txD`Q5^rX3&mqMUi$E#-Ao)QJj?K^^O4Jx26&8)4U!A;|e&0e%G5f%J=(9Pi6ZE&xBy0noni zVenDD0Bm2xCrrdMln3u}s?S*idj+^IWSHK&wn^<3=r7*R3fez^JiPhQxGk_hcmv{N zZtGSUr>`a8xFaymjBkoEbv4100Qdg{?f(dT3}PwA>TLP%7`-tes*UO@oc3P%idQh*#LXXM-bmVcj{_^9#)@?Vg1Q= zusPCbD`g7om1dy*Rf)qpwzGo$AucbKh+q9Vl!g17x)a#%hVfjTt2ViGRS)bB@%z>i z?QA1uT-X(>m*ao(_A z<*MX%yZLMZ`yZU;9ipFH)#{cgy&{ljy#7^)S4lq4+$3cP{OA(l`D^?aBIQxj7sP)C`X7EHgY9R0*AwwPsiz~)RkFZ(hgXFC%9EL$Yqp_b z0=g!!4&=$=6}USOM1%e+dq6)b+l4ApmV^QPD6Hps6Z1^31niA~pX)z~_W6-B`V8S5 zPXK-d)`9$Qc|wO}o?vy-yPjxYAn;OOE9|vB@GlC-VS!)ck3U@xu>HW{KhQqr>`j+9 zA^pI9tpUXE3hNh+?92c-AFNje?Luq9WItf*g}e;3pDYtI-TelPXWUg;B7QwXvg)f| z@&^#Ve+a~H=xC1pwH5~c`JX`i&PSZKqcs<>PaPuSg*JBTGmq(~E3uz>=LQW7vKyMS*BvWXs2TZ2co_zORrZ;>EizMgFnP#_pGBImF#=vYCC! z#_HbQK!^t|Ra(>Z8ia{+)F9%eJogy7UBiEYJn$z%T>iRZm

DfV;vvP^#+kcwY3{ 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 diff --git a/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin b/learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 71e1bdf6416f7b8bb8cf83dece7fa62cdeb4ccb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25195 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 H&r$vd$0B^m diff --git a/learningFlow/.gradle/8.11.1/gc.properties b/learningFlow/.gradle/8.11.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 42a1bbd84254ce5c106739710b2a431e1f033ddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9*uy@Xee#Fp3=mKR04!ewEdT%j diff --git a/learningFlow/.gradle/buildOutputCleanup/cache.properties b/learningFlow/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index a5e72f1b..00000000 --- a/learningFlow/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 09 13:28:54 KST 2025 -gradle.version=8.11.1 diff --git a/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin b/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index a55505f87fe51cb70a604d0a0dc170a39f61a79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19361 zcmeI&Sx8iI6vy#vTAG>Wh%{KG@Lq>yI+xEqbDaCd`!o|FN$N3u z^pFN0u7ig-LID&&0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(16!>2X#P(l^y|@^) z->`uLr>&AS%c1{Z)-Gdj>EqDDJH%;a2Y-IB$JBXA6+LaF@JLtooXn!xcWt9+Uf02X z$fGvPc5~%hF)#0D&)pRk;;Bs~7qGjfmA!cV#bXA|E9~yg2Peh8ub(4aNn)RPe|fN1uM$r4?d(%pbM#Iw z`iHdtCcC%xr*ll0HihP!*?n||dx`6NG{WUO>{Hu5UU?CBYnyN-kbUN<9v9MnVnq7zNkFRw>2g^i{9sAcCFg0t}xwpr*Juj-H>;~pfZd-K>m$=MbeWjn|Kr7 z7fog_jgWhMTo#J?$m?c*r`BI9c%u@o+rqwPU%E?WvimsNzm7ev#_rsM@<$r?Z9?O|Ok-xRa@^1}o^Iv_{FC;g3pa1{> diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe deleted file mode 100644 index ae369ee1fcf75999a04de9c5ef457efedbf5a5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4Tvt=*(9D32_5_ diff --git a/learningFlow/.gradle/vcs-1/gc.properties b/learningFlow/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29b..00000000 From d4f2b871fa1fffd48596b183a93f20d5f081f070 Mon Sep 17 00:00:00 2001 From: Karen Date: Thu, 23 Jan 2025 18:38:34 +0900 Subject: [PATCH 068/256] [fix] Add gradle directory to .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a5d5eb5b..e412bc97 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,7 @@ out/ ### VS Code ### .vscode/ .idea/ -.DS_Store \ No newline at end of file +.DS_Store + +### gradle ### +.gradle/ From bdcd258d5d574b87f184307eff798cc5938567bb Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Thu, 23 Jan 2025 18:39:31 +0900 Subject: [PATCH 069/256] =?UTF-8?q?.idae=20=EC=82=AD=EC=A0=9C=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- learningFlow/.idea/compiler.xml | 15 --------------- learningFlow/.idea/misc.xml | 10 ---------- learningFlow/.idea/modules.xml | 8 -------- 3 files changed, 33 deletions(-) delete mode 100644 learningFlow/.idea/compiler.xml delete mode 100644 learningFlow/.idea/misc.xml delete mode 100644 learningFlow/.idea/modules.xml diff --git a/learningFlow/.idea/compiler.xml b/learningFlow/.idea/compiler.xml deleted file mode 100644 index 6fb22e6b..00000000 --- a/learningFlow/.idea/compiler.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/learningFlow/.idea/misc.xml b/learningFlow/.idea/misc.xml deleted file mode 100644 index 5147a0b0..00000000 --- a/learningFlow/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/learningFlow/.idea/modules.xml b/learningFlow/.idea/modules.xml deleted file mode 100644 index 4b679589..00000000 --- a/learningFlow/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 56225116ba983594fa7b40484068fa610ef01098 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Thu, 23 Jan 2025 18:40:18 +0900 Subject: [PATCH 070/256] =?UTF-8?q?.gradle=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gradle/8.11.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/checksums/md5-checksums.bin | Bin 41347 -> 0 bytes .../8.11.1/checksums/sha1-checksums.bin | Bin 95333 -> 0 bytes .../executionHistory/executionHistory.bin | Bin 202229 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .../.gradle/8.11.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.bin | Bin 37897 -> 0 bytes .../.gradle/8.11.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../8.11.1/fileHashes/resourceHashesCache.bin | Bin 25195 -> 0 bytes learningFlow/.gradle/8.11.1/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 -- .../.gradle/buildOutputCleanup/outputFiles.bin | Bin 19361 -> 0 bytes learningFlow/.gradle/file-system.probe | Bin 8 -> 0 bytes learningFlow/.gradle/vcs-1/gc.properties | 0 15 files changed, 2 deletions(-) delete mode 100644 learningFlow/.gradle/8.11.1/checksums/checksums.lock delete mode 100644 learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/checksums/sha1-checksums.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.bin delete mode 100644 learningFlow/.gradle/8.11.1/executionHistory/executionHistory.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileChanges/last-build.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.bin delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/fileHashes.lock delete mode 100644 learningFlow/.gradle/8.11.1/fileHashes/resourceHashesCache.bin delete mode 100644 learningFlow/.gradle/8.11.1/gc.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 learningFlow/.gradle/buildOutputCleanup/cache.properties delete mode 100644 learningFlow/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 learningFlow/.gradle/file-system.probe delete mode 100644 learningFlow/.gradle/vcs-1/gc.properties diff --git a/learningFlow/.gradle/8.11.1/checksums/checksums.lock b/learningFlow/.gradle/8.11.1/checksums/checksums.lock deleted file mode 100644 index 63e0cd500da796398d36dd917b3317edc08e45de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZS1EmnK{d1>KI1~6b<1^_yu1$qDg diff --git a/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin b/learningFlow/.gradle/8.11.1/checksums/md5-checksums.bin deleted file mode 100644 index e1270cf78a2cc9a74024893bc66f72bf92c63131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41347 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

DfV;vvP^#+kcwY3{ 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 H&r$vd$0B^m diff --git a/learningFlow/.gradle/8.11.1/gc.properties b/learningFlow/.gradle/8.11.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/learningFlow/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 42a1bbd84254ce5c106739710b2a431e1f033ddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9*uy@Xee#Fp3=mKR04!ewEdT%j diff --git a/learningFlow/.gradle/buildOutputCleanup/cache.properties b/learningFlow/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index a5e72f1b..00000000 --- a/learningFlow/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 09 13:28:54 KST 2025 -gradle.version=8.11.1 diff --git a/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin b/learningFlow/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index a55505f87fe51cb70a604d0a0dc170a39f61a79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19361 zcmeI&Sx8iI6vy#vTAG>Wh%{KG@Lq>yI+xEqbDaCd`!o|FN$N3u z^pFN0u7ig-LID&&0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(16!>2X#P(l^y|@^) z->`uLr>&AS%c1{Z)-Gdj>EqDDJH%;a2Y-IB$JBXA6+LaF@JLtooXn!xcWt9+Uf02X z$fGvPc5~%hF)#0D&)pRk;;Bs~7qGjfmA!cV#bXA|E9~yg2Peh8ub(4aNn)RPe|fN1uM$r4?d(%pbM#Iw z`iHdtCcC%xr*ll0HihP!*?n||dx`6NG{WUO>{Hu5UU?CBYnyN-kbUN<9v9MnVnq7zNkFRw>2g^i{9sAcCFg0t}xwpr*Juj-H>;~pfZd-K>m$=MbeWjn|Kr7 z7fog_jgWhMTo#J?$m?c*r`BI9c%u@o+rqwPU%E?WvimsNzm7ev#_rsM@<$r?Z9?O|Ok-xRa@^1}o^Iv_{FC;g3pa1{> diff --git a/learningFlow/.gradle/file-system.probe b/learningFlow/.gradle/file-system.probe deleted file mode 100644 index 1ccf7365dd48312418fa77a45864dd3cc47a076a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4Tvt<|7LL2 Date: Thu, 23 Jan 2025 19:44:06 +0900 Subject: [PATCH 071/256] =?UTF-8?q?feat=20:=20brunch=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EC=95=88=ED=95=98=EA=B3=A0=20velog=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=B4=20brunch=20->=20velog?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/CollectionConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index 3884e86b..ac95a78b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -101,8 +101,8 @@ private static String extractResourceSource(String url) { if (lowerCaseUrl.contains("youtube")) { return "youtube"; - } else if (lowerCaseUrl.contains("brunch")) { - return "brunch"; + } else if (lowerCaseUrl.contains("velog")) { + return "velog"; } else if (lowerCaseUrl.contains("naver")) { return "naverBlog"; } else if (lowerCaseUrl.contains("tistory")) { From 5b2c0b997ae50bfa03ad5d8f36c4716970d78a7a Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Thu, 23 Jan 2025 20:48:33 +0900 Subject: [PATCH 072/256] =?UTF-8?q?=EC=9C=A0=ED=8A=9C=EB=B8=8C,=20?= =?UTF-8?q?=ED=94=84=EB=A1=9D=EC=8B=9C=20=EC=84=9C=EB=B2=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/cors/CorsConfig.java | 22 +++++++++++++ .../restTemplate/RestTemplateConfig.java | 14 ++++++++ .../learningFlow_BE/domain/Resource.java | 3 ++ .../service/embed/BlogEmbedService.java | 32 +++++------------- .../web/controller/ProxyController.java | 33 +++++++++++++++++++ .../controller/ResourceRestController.java | 6 ++-- 6 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/config/restTemplate/RestTemplateConfig.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java new file mode 100644 index 00000000..0307d5c8 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java @@ -0,0 +1,22 @@ +package learningFlow.learningFlow_BE.config.cors; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig { + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/proxy/blog") // 프록시 서버 API에 대해 CORS 허용 + .allowedOrigins("*") // 모든 도메인에서 접근 가능 (필요하면 특정 도메인만 허용 가능) + .allowedMethods("GET") + .allowedHeaders("*"); + } + }; + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/restTemplate/RestTemplateConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/restTemplate/RestTemplateConfig.java new file mode 100644 index 00000000..280aa43e --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/restTemplate/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package learningFlow.learningFlow_BE.config.restTemplate; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java index 5b06e8a7..6e802307 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java @@ -34,6 +34,9 @@ public class Resource extends BaseEntity { @Column(name = "client_url") private String clientUrl; // 클라이언트에게 보내줄 url + @Column(nullable = false, columnDefinition = "INTEGER DEFAULT 0") + private Integer studyDuration; // 학습 시간 (초 단위 저장) + @OneToMany(mappedBy = "resource", cascade = CascadeType.ALL) private List episodes; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java index ef6edc0f..035e45f1 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java @@ -8,6 +8,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + @Service @RequiredArgsConstructor @Transactional @@ -19,31 +22,12 @@ public Resource getResource(Long episodeId) { .orElseThrow(() -> new ResourceHandler(ErrorStatus.RESOURCE_NOT_FOUND)); // 이미 변환된 URL이 존재하면 바로 반환 - if (resource.getClientUrl() != null) { - return resource; - } - - // 변환된 URL 생성 및 저장 - String embedUrl = getEmbedUrl(resource.getUrl()); - resource.setClientUrl(embedUrl); - return resourceRepository.save(resource); - } - - private String getEmbedUrl(String blogUrl) { - if (blogUrl.contains("brunch.co.kr")) { - return generateProxyUrl(blogUrl); - } else if (blogUrl.contains("tistory.com")) { - return generateProxyUrl(blogUrl); - } else if (blogUrl.contains("naver.com")) { - return generateProxyUrl(blogUrl); - } else if (blogUrl.contains("velog.io")) { - return generateProxyUrl(blogUrl); - } else { - throw new ResourceHandler(ErrorStatus.UNSUPPORTED_BLOG_PLATFORM); + if (resource.getClientUrl() == null) { + String proxyUrl = "/proxy/blog?url=" + URLEncoder.encode(resource.getUrl(), StandardCharsets.UTF_8); + resource.setClientUrl(proxyUrl); + return resourceRepository.save(resource); } - } - private String generateProxyUrl(String blogUrl) { - return "/proxy/blog?url=" + blogUrl; // 저장될 변환된 URL + return resource; } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java new file mode 100644 index 00000000..8d63fba8 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java @@ -0,0 +1,33 @@ +package learningFlow.learningFlow_BE.web.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +@RequestMapping("/proxy") +@RequiredArgsConstructor +@Slf4j +public class ProxyController { + private final RestTemplate restTemplate; // HTTP 요청을 보내는 Spring 제공 유틸리티, 외부 블로그 페이지의 HTML을 가져오기 위해 사용 + + @GetMapping("/blog") + public ResponseEntity fetchBlogContent(@RequestParam String url) { + try { + HttpHeaders headers = new HttpHeaders(); // HTTP 요청 헤더를 생성 + headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + + HttpEntity entity = new HttpEntity<>(headers); // HTTP 요청 엔티티를 생성 (헤더 포함). + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + + return ResponseEntity.ok(response.getBody()); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("블로그 데이터 가져오기 실패"); + } + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index 5d2433bf..18e69c4e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -17,6 +17,7 @@ import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.service.embed.BlogEmbedService; import learningFlow.learningFlow_BE.service.embed.YoutubeUrlEmbedService; import learningFlow.learningFlow_BE.service.memo.MemoCommandService; import learningFlow.learningFlow_BE.service.resource.ResourceService; @@ -41,6 +42,7 @@ public class ResourceRestController { private final MemoCommandService memoCommandService; private final ResourceService resourceService; private final YoutubeUrlEmbedService youtubeUrlEmbedService; + private final BlogEmbedService blogEmbedService; @GetMapping("/{episode-id}") @Operation(summary = "강의 시청, 강좌로 이동 API", description = "강의 에피소드를 시청하기 위해 강좌로 이동하는 API, 그리고 강의를 시청 처리하는 로직도 포함") @ApiResponses({ @@ -59,13 +61,13 @@ public ApiResponse watchEpisode( Collection collection = resourceService.getCollection(episodeId); ResourceType resourceType = resourceService.getResourceType(episodeId); Optional memo = resourceService.getMemoContents(episodeId); - // log.info("Memo= ", memo.get().getContents()); + Resource resource = null; if (resourceType == ResourceType.VIDEO) { resource = youtubeUrlEmbedService.getResource(episodeId); } else if (resourceType == ResourceType.TEXT) { - + resource = blogEmbedService.getResource(episodeId); } return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memo)); From eadc852cd6f12812f654a4086923f2406b5ef6cd Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Fri, 24 Jan 2025 16:48:07 +0900 Subject: [PATCH 073/256] =?UTF-8?q?api=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QResource.java | 2 ++ .../apiPayload/code/status/ErrorStatus.java | 6 +++++- .../converter/ResourceConverter.java | 18 +++++++++++++++++ .../domain/UserEpisodeProgress.java | 6 ++---- .../service/resource/ResourceService.java | 20 +++++++++++++++++-- .../web/controller/ProxyController.java | 11 +++++++--- .../controller/ResourceRestController.java | 12 +++++++++++ .../web/dto/resource/ResourceRequestDTO.java | 13 ++++++++++++ .../web/dto/resource/ResourceResponseDTO.java | 19 ++++++++++++++++++ .../src/main/resources/application.yml | 2 +- 10 files changed, 98 insertions(+), 11 deletions(-) diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java index aaa543ce..ddc976cd 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java @@ -35,6 +35,8 @@ public class QResource extends EntityPathBase { public final NumberPath resourceQuantity = createNumber("resourceQuantity", Integer.class); + public final NumberPath studyDuration = createNumber("studyDuration", Integer.class); + public final StringPath title = createString("title"); public final EnumPath type = createEnum("type", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index 5444e8a5..ef1685b5 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -53,9 +53,13 @@ public enum ErrorStatus implements BaseErrorCode { // 임베드 에러 YOUTUBE_URI_SYNTAX_ERROR(HttpStatus.BAD_REQUEST, "EMBED4001", "유튜브 URI 형식이 아닙니다."), UNSUPPORTED_BLOG_PLATFORM(HttpStatus.BAD_REQUEST, "EMBED4002", "지원하지 않는 블로그 플랫폼입니다."), + BLOG_FETCH_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "PORXY5001", "블로그 데이터를 가져오는 과정에서 오류가 발생했습니다."), + // Resource 에러 - RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "RESOURCE4001", "존재하지 않는 리소스 입니다."); + RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "RESOURCE4001", "존재하지 않는 리소스 입니다."), + // User Progress + USER_PROGRESS_NOT_FOUND(HttpStatus.NOT_FOUND, "USER-PROGRESS4001", "진도 값이 null 인 상태입니다."); private final HttpStatus httpStatus; private final String code; private final String message; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index baae624b..5c7a8b1a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -2,7 +2,10 @@ import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceRequestDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; +import org.springframework.http.ResponseEntity; import java.util.*; @@ -35,4 +38,19 @@ public static List episodeInformationLis Collections.sort(episodeInformationList, Comparator.comparingInt(ResourceResponseDTO.episodeInformation::getEpisodeNumber)); return episodeInformationList; } + + public static ResourceResponseDTO.BlogResponseDTO proxyBlogResponse(String url, ResponseEntity response){ + return ResourceResponseDTO.BlogResponseDTO.builder() + .url(url) + .htmlContent(response.getBody()) + .build(); + } + + public static ResourceResponseDTO.ProgressResponseDTO toSaveProgressResponse(ResourceRequestDTO.ProgressRequestDTO request){ + return ResourceResponseDTO.ProgressResponseDTO.builder() + .progress(request.getProgress()) + .resourceType(request.getResourceType()) + .build(); + + } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java index c15862ee..1a737b1d 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserEpisodeProgress.java @@ -5,10 +5,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Table; import learningFlow.learningFlow_BE.domain.enums.ResourceType; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Getter @NoArgsConstructor @@ -22,6 +19,7 @@ public class UserEpisodeProgress extends BaseEntity{ @Column(nullable = false) private int episodeNumber; + @Setter private Integer currentProgress; @Column(nullable = false) private Integer totalProgress; diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index eb6ebac7..5baf0c3b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -2,9 +2,12 @@ import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; +import learningFlow.learningFlow_BE.converter.ResourceConverter; import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.repository.*; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceRequestDTO; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -65,7 +68,7 @@ public Optional getMemoContents(Long episodeId){ } @Transactional - public UserCollection updateUserCollection(CollectionEpisode episode, String loginId) { + public void updateUserCollection(CollectionEpisode episode, String loginId) { log.info("Received loginId: {}", loginId); log.info("Received episode: {}", episode); // UserCollection 조회 @@ -100,6 +103,19 @@ public UserCollection updateUserCollection(CollectionEpisode episode, String log // 저장 UserCollection savedCollection = userCollectionRepository.save(userCollection); log.info("Saved UserCollection: {}", savedCollection); - return savedCollection; + } + @Transactional + public void saveProgress(ResourceRequestDTO.ProgressRequestDTO request, String userId) { + UserEpisodeProgressId progressId = new UserEpisodeProgressId(request.getEpisodeId(), userId); + UserEpisodeProgress progress = userEpisodeProgressRepository.findById(progressId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.USER_PROGRESS_NOT_FOUND)); + if (request.getResourceType() == ResourceType.VIDEO && request.getProgress() != null) { + progress.setCurrentProgress(request.getProgress()); + } else if (request.getResourceType() == ResourceType.TEXT && request.getProgress() != null) { + progress.setCurrentProgress(request.getProgress()); + } else { + throw new ResourceHandler(ErrorStatus._BAD_REQUEST); + } + userEpisodeProgressRepository.save(progress); } } \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java index 8d63fba8..92eda348 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java @@ -1,5 +1,10 @@ package learningFlow.learningFlow_BE.web.controller; +import learningFlow.learningFlow_BE.apiPayload.ApiResponse; +import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; +import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; +import learningFlow.learningFlow_BE.converter.ResourceConverter; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.*; @@ -17,7 +22,7 @@ public class ProxyController { private final RestTemplate restTemplate; // HTTP 요청을 보내는 Spring 제공 유틸리티, 외부 블로그 페이지의 HTML을 가져오기 위해 사용 @GetMapping("/blog") - public ResponseEntity fetchBlogContent(@RequestParam String url) { + public ApiResponse fetchBlogContent(@RequestParam String url) { try { HttpHeaders headers = new HttpHeaders(); // HTTP 요청 헤더를 생성 headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); @@ -25,9 +30,9 @@ public ResponseEntity fetchBlogContent(@RequestParam String url) { HttpEntity entity = new HttpEntity<>(headers); // HTTP 요청 엔티티를 생성 (헤더 포함). ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); - return ResponseEntity.ok(response.getBody()); + return ApiResponse.onSuccess(ResourceConverter.proxyBlogResponse(url, response)); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("블로그 데이터 가져오기 실패"); + throw new ResourceHandler(ErrorStatus.BLOG_FETCH_FAILED); } } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index 18e69c4e..201ceeaf 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -23,6 +23,7 @@ import learningFlow.learningFlow_BE.service.resource.ResourceService; import learningFlow.learningFlow_BE.web.dto.memo.MemoRequestDTO; import learningFlow.learningFlow_BE.web.dto.memo.MemoResponseDTO; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceRequestDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -73,6 +74,17 @@ public ApiResponse watchEpisode( return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memo)); } + @PostMapping("/{episode-id}/save-progress") + public ApiResponse saveProgress( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @Valid @RequestBody ResourceRequestDTO.ProgressRequestDTO request) { + String loginId = principalDetails.getUser().getLoginId(); + resourceService.saveProgress(request, loginId); + + return ApiResponse.onSuccess(ResourceConverter.toSaveProgressResponse(request)); + } + + @PostMapping("/{episode-id}/memo") @Operation(summary = "강의 메모 생성 API", description = "강의 에피소드에 메모를 추가하는 API") @ApiResponses({ diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java index e20d6bbd..3fd54a4e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java @@ -1,4 +1,17 @@ package learningFlow.learningFlow_BE.web.dto.resource; +import jakarta.validation.constraints.NotNull; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; +import lombok.Getter; + public class ResourceRequestDTO { + + @Getter + public static class ProgressRequestDTO { + @NotNull + private Long episodeId; // 강의 ID + @NotNull + private ResourceType resourceType; // 강의 타입 (VIDEO or TEXT) + private Integer progress; // 유튜브 강의 && 블로그 픽셀 + } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index bc09ecd6..767cadae 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -44,4 +44,23 @@ public static class SearchResultResourceDTO { String resourceSource; Integer episodeNumber; } + + @Getter + @AllArgsConstructor + @NoArgsConstructor + @Builder + public static class BlogResponseDTO { + private String url; // 요청된 블로그 URL + private String htmlContent; // 블로그 HTML 데이터 + } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class ProgressResponseDTO { + private ResourceType resourceType; + private Integer progress; + } + } diff --git a/learningFlow/src/main/resources/application.yml b/learningFlow/src/main/resources/application.yml index aa925a08..644ddc3c 100644 --- a/learningFlow/src/main/resources/application.yml +++ b/learningFlow/src/main/resources/application.yml @@ -6,7 +6,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? jpa: hibernate: - ddl-auto: update # ??? ?? ???? (?? ????? ??) + ddl-auto: create # ??? ?? ???? (?? ????? ??) show-sql: true # SQL ?? ?? sql: init: From dc16f64202b085b8af210eb9d26fbccea3117eac Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Fri, 24 Jan 2025 18:01:26 +0900 Subject: [PATCH 074/256] =?UTF-8?q?=EC=9C=A0=ED=8A=9C=EB=B8=8C,=20?= =?UTF-8?q?=EB=B8=94=EB=A1=9C=EA=B7=B8=20=EC=9E=84=EB=B2=A0=EB=93=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20API=20=EC=99=84=EB=A3=8C=20&?= =?UTF-8?q?=20TEST=20=EC=A7=84=ED=96=89X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/BaseEntity.java | 4 ++-- .../service/resource/ResourceService.java | 5 +++-- .../web/controller/ResourceRestController.java | 11 ++++++++++- .../web/dto/resource/ResourceRequestDTO.java | 2 -- learningFlow/src/main/resources/application.yml | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java index 0417b701..1ebae67a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java @@ -14,11 +14,11 @@ @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { @CreatedDate - @Column(nullable = true, updatable = false) + @Column(nullable = false, updatable = false) private LocalDateTime createdAt; @LastModifiedDate - @Column(nullable = true) + @Column(nullable = false) private LocalDateTime updatedAt; // 다시 바꿀것 } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index 5baf0c3b..e58eaeb3 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -105,10 +105,11 @@ public void updateUserCollection(CollectionEpisode episode, String loginId) { log.info("Saved UserCollection: {}", savedCollection); } @Transactional - public void saveProgress(ResourceRequestDTO.ProgressRequestDTO request, String userId) { - UserEpisodeProgressId progressId = new UserEpisodeProgressId(request.getEpisodeId(), userId); + public void saveProgress(ResourceRequestDTO.ProgressRequestDTO request, String userId, Long episodeId) { + UserEpisodeProgressId progressId = new UserEpisodeProgressId(episodeId, userId); UserEpisodeProgress progress = userEpisodeProgressRepository.findById(progressId) .orElseThrow(() -> new ResourceHandler(ErrorStatus.USER_PROGRESS_NOT_FOUND)); + if (request.getResourceType() == ResourceType.VIDEO && request.getProgress() != null) { progress.setCurrentProgress(request.getProgress()); } else if (request.getResourceType() == ResourceType.TEXT && request.getProgress() != null) { diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index 201ceeaf..b6e0ab7e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -75,11 +75,20 @@ public ApiResponse watchEpisode( } @PostMapping("/{episode-id}/save-progress") + @Operation(summary = "강의 진도 저장 API", description = "강의 진도 저장 API") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "RESOURCE4001", description = "강의 에피소드를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), + }) + @Parameters({ + @Parameter(name = "episode-id", description = "시청할 강의 에피소드 ID") + }) public ApiResponse saveProgress( @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable("episode-id") Long episodeId, @Valid @RequestBody ResourceRequestDTO.ProgressRequestDTO request) { String loginId = principalDetails.getUser().getLoginId(); - resourceService.saveProgress(request, loginId); + resourceService.saveProgress(request, loginId, episodeId); return ApiResponse.onSuccess(ResourceConverter.toSaveProgressResponse(request)); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java index 3fd54a4e..f3ceb781 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java @@ -8,8 +8,6 @@ public class ResourceRequestDTO { @Getter public static class ProgressRequestDTO { - @NotNull - private Long episodeId; // 강의 ID @NotNull private ResourceType resourceType; // 강의 타입 (VIDEO or TEXT) private Integer progress; // 유튜브 강의 && 블로그 픽셀 diff --git a/learningFlow/src/main/resources/application.yml b/learningFlow/src/main/resources/application.yml index 644ddc3c..0b4e0e78 100644 --- a/learningFlow/src/main/resources/application.yml +++ b/learningFlow/src/main/resources/application.yml @@ -6,7 +6,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? jpa: hibernate: - ddl-auto: create # ??? ?? ???? (?? ????? ??) + ddl-auto: update # ??? ?? ???? (?? ????? ??) show-sql: true # SQL ?? ?? sql: init: From 758feec396ceecbdd0aedbae91e0c46dc1f75685 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:22:13 +0900 Subject: [PATCH 075/256] =?UTF-8?q?feat=20:=20Collection=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=EC=9D=B4=20=EC=95=84=EB=8B=8C=20Resource=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=BB=A8=EB=B2=84=ED=8C=85=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=83=EB=93=A4=EC=9D=80=20=EC=A0=84=EB=B6=80=20ResourceConv?= =?UTF-8?q?erter=EB=A1=9C=20=EC=9D=B4=EB=8F=99.=20=EC=88=98=EA=B0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=EB=90=9C=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=B4=EC=A3=BC=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/CollectionConverter.java | 62 +++++++------------ 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index ac95a78b..8471c499 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -1,9 +1,6 @@ package learningFlow.learningFlow_BE.converter; -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.domain.Resource; -import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; @@ -53,27 +50,21 @@ public static CollectionResponseDTO.SearchResultDTO toSearchResultDTO( public static CollectionResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO(Collection collection, User currentUser) { - int totalSeconds = collection.getEpisodes().stream() - .map(CollectionEpisode::getResource) - .mapToInt(Resource::getRuntime).sum(); - - int totalHours = (int) Math.ceil(totalSeconds / 3600); - Integer textCount = countResourcesByType(collection,ResourceType.TEXT); Integer videoCount = countResourcesByType(collection, ResourceType.VIDEO); - List resourceDTOList = getResourceDTOList(collection); + List resourceDTOList = ResourceConverter.getResourceDTOList(collection); return CollectionResponseDTO.CollectionPreviewDTO.builder() - .id(collection.getId()) + .collectionId(collection.getId()) .interestField(collection.getInterestField()) .title(collection.getTitle()) .creator(collection.getCreator()) .keywords(collection.getKeywords()) .difficulties(collection.getDifficulty()) .amount(collection.getAmount()) - .runtime(totalHours) + .runtime(getTotalHours(collection)) .textCount(textCount) .videoCount(videoCount) .resource(resourceDTOList) @@ -82,34 +73,27 @@ public static CollectionResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO( .build(); } - private static List getResourceDTOList(Collection collection) { - - return collection.getEpisodes().stream() - .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() - .episodeName(episode.getEpisodeName()) - .url(episode.getResource().getUrl()) - .resourceSource(extractResourceSource(episode.getResource().getUrl())) - .episodeNumber(episode.getEpisodeNumber()) - .build()) - .toList(); - + public static CollectionResponseDTO.CompletedCollectionDTO convertToCompletedCollectionDTO( + UserCollection userCollection + ) { + return CollectionResponseDTO.CompletedCollectionDTO.builder() + .collectionId(userCollection.getCollection().getId()) + .interestField(userCollection.getCollection().getInterestField()) + .collectionTitle(userCollection.getCollection().getTitle()) + .creator(userCollection.getCollection().getCreator()) + .keywords(userCollection.getCollection().getKeywords()) + .difficulties(userCollection.getCollection().getDifficulty()) + .runtime(getTotalHours(userCollection.getCollection())) + .lastAccessedTime(userCollection.getLastAccessedAt()) + .build(); } - private static String extractResourceSource(String url) { - - String lowerCaseUrl = url.toLowerCase(); + private static int getTotalHours(Collection collection) { + int totalSeconds = collection.getEpisodes().stream() + .map(CollectionEpisode::getResource) + .mapToInt(Resource::getRuntime).sum(); - if (lowerCaseUrl.contains("youtube")) { - return "youtube"; - } else if (lowerCaseUrl.contains("velog")) { - return "velog"; - } else if (lowerCaseUrl.contains("naver")) { - return "naverBlog"; - } else if (lowerCaseUrl.contains("tistory")) { - return "tistory"; - } else { - return "unknown"; - } + return (int) Math.ceil((double) totalSeconds / 3600); } private static int countResourcesByType(Collection collection, ResourceType type) { @@ -118,6 +102,4 @@ private static int countResourcesByType(Collection collection, ResourceType type .filter(resource -> resource.getType() == type) .count(); } - - } From 78d3381b04d834a0b0f730f4364376b18965879b Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:22:39 +0900 Subject: [PATCH 076/256] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EC=9D=B4?= =?UTF-8?q?=20Collection=20=EC=88=98=EA=B0=95=EC=83=81=ED=83=9C=EB=A5=BC?= =?UTF-8?q?=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20=EC=97=B4=EA=B1=B0?= =?UTF-8?q?=ED=98=95=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QUserCollection.java | 2 ++ .../learningFlow_BE/domain/UserCollection.java | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java index ffa8f829..78ef0e58 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java @@ -28,6 +28,8 @@ public class QUserCollection extends EntityPathBase { public final DatePath lastAccessedAt = createDate("lastAccessedAt", java.time.LocalDate.class); + public final EnumPath status = createEnum("status", learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus.class); + public final QUser user; public final NumberPath userCollectionStatus = createNumber("userCollectionStatus", Integer.class); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java index 3ea0b30c..3bab663b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java @@ -1,13 +1,18 @@ package learningFlow.learningFlow_BE.domain; import jakarta.persistence.*; +import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; import java.time.LocalDate; @Getter @NoArgsConstructor @AllArgsConstructor +@DynamicInsert +@DynamicUpdate @Builder @Entity @Table(name = "user_collection") @@ -31,6 +36,10 @@ public class UserCollection { @Column(name = "last_accessed_at", nullable = false) private LocalDate lastAccessedAt; + @Enumerated(EnumType.STRING) + @Column(columnDefinition = "VARCHAR(20) DEFAULT 'IN_PROGRESS'", nullable = false) + private UserCollectionStatus status; + public void setUser(User user) { // 기존 유저와의 관계 제거 if (this.user != null) { From c3496f49fb79cddce3133019fbf1d3adbe3f4d72 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:22:46 +0900 Subject: [PATCH 077/256] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EC=9D=B4?= =?UTF-8?q?=20Collection=20=EC=88=98=EA=B0=95=EC=83=81=ED=83=9C=EB=A5=BC?= =?UTF-8?q?=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20=EC=97=B4=EA=B1=B0?= =?UTF-8?q?=ED=98=95=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/enums/UserCollectionStatus.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/UserCollectionStatus.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/UserCollectionStatus.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/UserCollectionStatus.java new file mode 100644 index 00000000..0142094e --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/UserCollectionStatus.java @@ -0,0 +1,6 @@ +package learningFlow.learningFlow_BE.domain.enums; + +public enum UserCollectionStatus { + IN_PROGRESS, // 수강 중 + COMPLETED // 수강 완료 +} From 748a39e274040a62a057b93bf42a254169628976 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:23:27 +0900 Subject: [PATCH 078/256] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=98=84=EC=9E=AC=20=ED=95=B4=EB=8B=B9=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EC=9D=B4=20=EC=88=98=EA=B0=95=EC=A4=91=EC=9D=B8=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EC=9D=84=20=EC=88=98=EA=B0=95?= =?UTF-8?q?=EC=83=81=ED=83=9C=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=B0=BE?= =?UTF-8?q?=EA=B3=A0=20=EC=B5=9C=EA=B7=BC=20=EC=88=98=EA=B0=95=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=82=B4=EB=A6=BC?= =?UTF-8?q?=EC=B0=A8=EC=88=9C=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/UserCollectionRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java new file mode 100644 index 00000000..81a8579d --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -0,0 +1,12 @@ +package learningFlow.learningFlow_BE.repository; + +import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface UserCollectionRepository extends JpaRepository { + List findByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); +} From 2cfcb4c416c1e3667e2dd4cb322d7f2f2311a34b Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:24:25 +0900 Subject: [PATCH 079/256] =?UTF-8?q?feat=20:=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EC=9D=B4=20=EC=9E=90=EC=8B=A0=EC=9D=98=20?= =?UTF-8?q?=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=A0=EB=95=8C=20=EC=82=AC=EC=9A=A9=ED=95=A0=20DTO?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/UserConverter.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java index 40f248b3..3e58d43c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java @@ -1,10 +1,15 @@ package learningFlow.learningFlow_BE.converter; import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class UserConverter { @@ -19,7 +24,7 @@ public static UserResponseDTO.UserLoginResponseDTO toUserLoginResponseDTO(User u .build(); } - public UserInfoDTO convertToUserInfoDTO(User user) { + public static UserInfoDTO convertToUserInfoDTO(User user) { return UserInfoDTO.builder() .name(user.getName()) .email(user.getEmail()) @@ -30,4 +35,20 @@ public UserInfoDTO convertToUserInfoDTO(User user) { .profileImageUrl(user.getImage() != null ? user.getImage().getImageURL() : null) .build(); } + + public static UserResponseDTO.UserMyPageResponseDTO convertToUserMyPageResponseDTO( + List inProgressUserCollectionList, + List completedUserCollectionList + ) { + List recentlyWatchedEpisodeList = inProgressUserCollectionList.stream() + .map(ResourceConverter::convertToRecentlyWatchedEpisodeDTO).toList(); + + List completedCollectionList = completedUserCollectionList.stream() + .map(CollectionConverter::convertToCompletedCollectionDTO).toList(); + + return UserResponseDTO.UserMyPageResponseDTO.builder() + .recentlyWatchedEpisodeList(recentlyWatchedEpisodeList) + .completedCollectionList(completedCollectionList) + .build(); + } } From 80a190421a3043300ca2d9f82afd09aa579a6894 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:25:36 +0900 Subject: [PATCH 080/256] =?UTF-8?q?feat=20:=20=EC=88=98=EA=B0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=EB=90=9C=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EB=8B=B4=EC=95=84=EB=82=B4=EB=8A=94=20DTO?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/collection/CollectionResponseDTO.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java index 373f0f01..10e19977 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDate; import java.util.List; public class CollectionResponseDTO { @@ -28,18 +29,33 @@ public static class SearchResultDTO { @NoArgsConstructor @AllArgsConstructor public static class CollectionPreviewDTO { - Long id; + Long collectionId; InterestField interestField; String title; String creator; List keywords; List difficulties; Integer amount; - Integer runtime; + Integer runtime; //TODO : 필드 이름 수정 필요, 해당 컬렉션 수강 전체에 드느 시간이기 때문에 좀 더 좋은 필드 이름으로.. Integer textCount; Integer videoCount; List resource; Integer bookmarkCount; boolean isBookmarked; } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class CompletedCollectionDTO { + Long collectionId; + InterestField interestField; + String collectionTitle; + String creator; + List keywords; + List difficulties; + Integer runtime; //TODO : 필드 이름 수정 필요, 해당 컬렉션 수강 전체에 드느 시간이기 때문에 좀 더 좋은 필드 이름으로.. + LocalDate lastAccessedTime; + } } From 9f096e6c26c16b4fdd487b85fd30a7b194e7840d Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:26:05 +0900 Subject: [PATCH 081/256] =?UTF-8?q?feat=20:=20ResourceConverter=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=B4=EC=84=9C=20Resource=EC=99=80=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=ED=95=B4=EC=84=9C=20DTO=20=EB=B3=80=ED=99=98=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EA=B2=83=EB=93=A4=20=EC=A0=84?= =?UTF-8?q?=EB=B6=80=20=EC=9D=B4=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java new file mode 100644 index 00000000..b1e689f5 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -0,0 +1,85 @@ +package learningFlow.learningFlow_BE.converter; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; + +import java.util.List; + +public class ResourceConverter { + + public static List getResourceDTOList(Collection collection) { + + return collection.getEpisodes().stream() + .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() + .resourceId(episode.getResource().getId()) + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .build()) + .toList(); + } + + private static String extractResourceSource(String url) { + + String lowerCaseUrl = url.toLowerCase(); + + if (lowerCaseUrl.contains("youtube")) { + return "youtube"; + } else if (lowerCaseUrl.contains("velog")) { + return "velog"; + } else if (lowerCaseUrl.contains("naver")) { + return "naverBlog"; + } else if (lowerCaseUrl.contains("tistory")) { + return "tistory"; + } else { + return "unknown"; + } + } + + public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( + UserCollection userCollection + ) { + return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() + .resourceId(getResourceId(userCollection)) + .CollectionTitle(userCollection.getCollection().getTitle()) + .resourceSource(extractResourceSource(getResourceUrl(userCollection))) + .episodeNumber(userCollection.getUserCollectionStatus()) + .episodeName(getEpisodeName(userCollection)) + .progressRatio(calculateProgressRatio(userCollection)) + .build(); + } + + private static String getResourceUrl(UserCollection userCollection) { + return userCollection.getCollection().getEpisodes().stream() + .filter(episode -> episode.getEpisodeNumber().equals(userCollection.getUserCollectionStatus())) + .findFirst() + .map(episode -> episode.getResource().getUrl()) + .orElse(null); + } + + private static Long getResourceId(UserCollection userCollection) { + return userCollection.getCollection().getEpisodes().stream() + .filter(episode -> episode.getEpisodeNumber().equals(userCollection.getUserCollectionStatus())) + .findFirst() + .map(episode -> episode.getResource().getId()) + .orElse(null); + } + + private static String getEpisodeName(UserCollection userCollection) { + return userCollection.getCollection().getEpisodes().stream() + .filter(episode -> episode.getEpisodeNumber().equals(userCollection.getUserCollectionStatus())) + .findFirst() + .map(CollectionEpisode::getEpisodeName) + .orElse(null); + } + + private static String calculateProgressRatio(UserCollection userCollection) { + int currentEpisode = userCollection.getUserCollectionStatus(); + int totalEpisodes = userCollection.getCollection().getEpisodes().size(); + double progressPercentage = ((double) currentEpisode / totalEpisodes) * 100; + return String.format("%d / %d회차 (%.0f%%)", currentEpisode, totalEpisodes, progressPercentage); + } +} From fba60830ff8d935248fd7015963dfd014652fde2 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:26:37 +0900 Subject: [PATCH 082/256] =?UTF-8?q?feat=20:=20SearchResponseDTO=EC=97=90?= =?UTF-8?q?=20=EA=B0=80=EC=9E=A5=20=EC=B5=9C=EA=B7=BC=EC=97=90=20=EC=88=98?= =?UTF-8?q?=EA=B0=95=ED=95=9C=20resource=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/resource/ResourceResponseDTO.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 4a29e750..cffe61a9 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -20,9 +20,23 @@ public static class ResourceUrlDTO { @NoArgsConstructor @Builder public static class SearchResultResourceDTO { + Long resourceId; String episodeName; String url; String resourceSource; Integer episodeNumber; } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class RecentlyWatchedEpisodeDTO { + Long resourceId; + String CollectionTitle; + String resourceSource; + Integer episodeNumber; + String episodeName; + String progressRatio; + } } From cc365002b3e757f9e49723103387301b9b6e19b6 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:27:27 +0900 Subject: [PATCH 083/256] =?UTF-8?q?feat=20:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20private=20=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EB=B0=8F=20=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20DTO?= =?UTF-8?q?=EB=93=A4=20=EB=8B=B4=EA=B3=A0=EC=9E=88=EB=8A=94=20UserMyPageRe?= =?UTF-8?q?sponseDTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/user/UserResponseDTO.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java index fa93ce48..949f6d39 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java @@ -1,6 +1,8 @@ package learningFlow.learningFlow_BE.web.dto.user; import learningFlow.learningFlow_BE.domain.enums.*; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -17,14 +19,14 @@ public class UserResponseDTO { @NoArgsConstructor @Builder public static class UserInfoDTO { - private String name; - private String email; - private Job job; - private List interestFields; - private LocalDate birthDay; - private Gender gender; - private MediaType preferType; - private String profileImageUrl; + String name; + String email; + Job job; + List interestFields; + LocalDate birthDay; + Gender gender; + MediaType preferType; + String profileImageUrl; /** * 어떤 필드들을 사용자 정보 조회 시에 보여줘야 할지 아직 안정해서 비워두었습니다. */ @@ -36,10 +38,19 @@ public static class UserInfoDTO { @NoArgsConstructor @AllArgsConstructor public static class UserLoginResponseDTO { - private String loginId; - private String email; - private String name; - private Role role; - private SocialType socialType; + String loginId; + String email; + String name; + Role role; + SocialType socialType; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class UserMyPageResponseDTO { + List recentlyWatchedEpisodeList; + List completedCollectionList; } } From 31e3c7ef94c5a70396cfe77cb1fca7992d84b374 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:28:02 +0900 Subject: [PATCH 084/256] =?UTF-8?q?feat=20:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20=EA=B3=BC=EC=A0=95=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=EC=97=86=EC=96=B4=EC=84=9C=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20?= =?UTF-8?q?/user/mypage=20=EA=B2=BD=EB=A1=9C=EB=A1=9C=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/UserRestController.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java index 7a1ba068..68a1db8b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java @@ -9,12 +9,11 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; -import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; -import learningFlow.learningFlow_BE.apiPayload.exception.handler.LoginHandler; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.service.user.UserService; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; +import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -63,6 +62,18 @@ public ApiResponse getUserInfo( ); } + @GetMapping("/mypage") + @Operation(summary = "마이 페이지 조회 API", description = "마이 페이지에서 최근 학습 목록, 완료 컬렉션 조회 API") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "로그인이 필요한 서비스입니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) + }) + public ApiResponse getMyPage( + @AuthenticationPrincipal PrincipalDetails principalDetails + ) { + return ApiResponse.onSuccess(userService.getUserMyPageResponseDTO(principalDetails.getUser().getLoginId())); + } + @GetMapping("/bookmarks") @Operation(summary = "북마크한 컬렉션 조회 API", description = "사용자가 북마크한 컬렉션 목록을 조회하는 API") @ApiResponses({ @@ -76,9 +87,6 @@ public ApiResponse getBookmarkedCollectio @RequestParam(required = false, defaultValue = "0") Long lastId, @AuthenticationPrincipal PrincipalDetails principalDetails ) { - if (principalDetails == null) { - throw new LoginHandler(ErrorStatus.LOGIN_REQUIRED); - } return ApiResponse.onSuccess( userService.getBookmarkedCollections(principalDetails.getUser().getLoginId(), lastId) ); From 923cce8cb09c5583bbc7cd242e39f3a9b9afc6dc Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 24 Jan 2025 21:28:29 +0900 Subject: [PATCH 085/256] =?UTF-8?q?feat=20:=20getUserMyPageResponseDTO?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/UserService.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index af385d1c..6595e067 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -7,11 +7,15 @@ import learningFlow.learningFlow_BE.converter.UserConverter; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.repository.UserRepository; import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; +import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -31,6 +35,7 @@ public class UserService { private final UserRepository userRepository; private final UserConverter userConverter; private final CollectionRepository collectionRepository; + private final UserCollectionRepository userCollectionRepository; private static final int BOOKMARK_PAGE_SIZE = 8; @@ -86,7 +91,6 @@ public BookmarkDTO.BookmarkResponseDTO toggleBookmark(String loginId, Long colle return new BookmarkDTO.BookmarkResponseDTO(!isCurrentlyBookmarked); } - @Transactional(readOnly = true) public CollectionResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId, Long lastId) { User user = userRepository.findById(loginId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); @@ -138,4 +142,17 @@ public CollectionResponseDTO.SearchResultDTO getBookmarkedCollections(String log user ); } + + public UserResponseDTO.UserMyPageResponseDTO getUserMyPageResponseDTO(String loginId) { + User user = userRepository.findById(loginId) + .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); + + List inProgressUserCollectionList + = userCollectionRepository.findByUserAndStatusOrderByLastAccessedAtDesc(user, UserCollectionStatus.IN_PROGRESS); + + List completedUserCollectionList + = userCollectionRepository.findByUserAndStatusOrderByLastAccessedAtDesc(user, UserCollectionStatus.COMPLETED); + + return UserConverter.convertToUserMyPageResponseDTO(inProgressUserCollectionList, completedUserCollectionList); + } } \ No newline at end of file From 55e2a7c57451a464268d0666fb19adf571b6fd96 Mon Sep 17 00:00:00 2001 From: JungJaehoon0430 <80247965+JungJaehoon0430@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:00:05 +0900 Subject: [PATCH 086/256] =?UTF-8?q?home=20=EB=B3=B4=EC=99=84=20=EB=B0=8F?= =?UTF-8?q?=20=EC=B6=94=EC=B2=9C=20=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SecurityConfig에 "/home/**",추가 // Swagger UI 관련 경로 허용 HomeConverter 생성, Builder 분리 HomeRepository 수정 HomeRepositoryImpl수정 및 추가 - findTopBookmarkedCollections에서 사용자 선호 매체/관심사 기반 추천 * - 사용자가 로그인하지 않은 경우 또는 선호 매체가 없는 경우 북마크 수 기준으로 추천 * - 선호하는 매체가 있는 경우 해당 매체의 컬렉션들을 먼저 조회(북마크 수 기준) * - 선호하는 매체의 컬렉션이 부족한 경우 나머지 컬렉션들로 채움(북마크 수 기준) JwtAuthenticationFilter에 requestURI.startsWith("/home") || 추가하여 로그인 안해도 home 접근 가능하게 수정 HomeService 수정 HomeRestController 수정 HomeResponseDTO 수정 --- .../config/security/SecurityConfig.java | 4 +- .../converter/HomeConverter.java | 43 ++++++++++ .../repository/home/HomeRepository.java | 3 +- .../repository/home/HomeRepositoryImpl.java | 79 +++++++++++++++---- .../security/jwt/JwtAuthenticationFilter.java | 1 + .../service/home/HomeService.java | 69 ++++++---------- .../web/controller/HomeRestController.java | 22 +----- .../web/dto/home/HomeResponseDTO.java | 39 +-------- 8 files changed, 144 insertions(+), 116 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index ea7d02f6..dce1da23 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -45,11 +45,11 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte "/find/**", "/reset-password", "/search/**", + "/home/**", "/collections/{collectionId:[\\d]+}" ).permitAll() .requestMatchers( - "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", - "/home/**").permitAll() + "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**", "/resources/**", "/collections/{collectionId}/bookmark").authenticated() .anyRequest().permitAll() diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java new file mode 100644 index 00000000..cc39331c --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java @@ -0,0 +1,43 @@ +package learningFlow.learningFlow_BE.converter; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecentLearningDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.EpisodeDTO; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO.CollectionPreviewDTO; + +import java.util.List; +import java.util.stream.Collectors; + +public class HomeConverter { + public static HomeInfoDTO toHomeInfoDTO(List recommendedCollections, RecentLearningDTO recentLearning) { + return HomeInfoDTO.builder() + .recommendedCollections(recommendedCollections) + .recentLearning(recentLearning) + .build(); + } + + public static RecentLearningDTO toRecentLearningDTO(Collection collection, int currentEpisode, boolean isCompleted, List episodes) { + return RecentLearningDTO.builder() + .collectionId(collection.getId()) + .title(collection.getTitle()) + .currentEpisode(currentEpisode) + .isCompleted(isCompleted) + .episodes(toEpisodeDTOList(episodes)) + .build(); + } + + public static List toEpisodeDTOList(List episodes) { + return episodes.stream() + .map(HomeConverter::toEpisodeDTO) + .collect(Collectors.toList()); + } + + public static EpisodeDTO toEpisodeDTO(CollectionEpisode episode) { + return EpisodeDTO.builder() + .episodeNumber(episode.getEpisodeNumber()) + .episodeName(episode.getEpisodeName()) + .build(); + } +} \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java index 7e32cef0..5f20de86 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java @@ -2,10 +2,11 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.domain.User; import java.util.List; public interface HomeRepository { - List findTopBookmarkedCollections(int limit); + List findTopBookmarkedCollections(int limit, User user); List findRecentEpisodes(Long collectionId, int currentEpisode, int limit); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java index 34b880d8..e1e70320 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java @@ -1,30 +1,24 @@ package learningFlow.learningFlow_BE.repository.home; import com.querydsl.jpa.impl.JPAQueryFactory; -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.domain.QCollection; -import learningFlow.learningFlow_BE.domain.QCollectionEpisode; +import learningFlow.learningFlow_BE.domain.*; +import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.ResourceType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; +// TODO: 성능 최적화 검토 필요 +// - Collection 조회 시 N+1 문제 확인 +// - 인덱스 추가 검토: bookmarkCount @Repository @RequiredArgsConstructor public class HomeRepositoryImpl implements HomeRepository { private final JPAQueryFactory queryFactory; private final QCollection collection = QCollection.collection; private final QCollectionEpisode episode = QCollectionEpisode.collectionEpisode; - - @Override - public List findTopBookmarkedCollections(int limit) { - return queryFactory - .selectFrom(collection) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit) - .fetch(); - } + private final QResource resource = QResource.resource; @Override public List findRecentEpisodes(Long collectionId, int currentEpisode, int limit) { @@ -37,4 +31,61 @@ public List findRecentEpisodes(Long collectionId, int current .orderBy(episode.episodeNumber.asc()) .fetch(); } -} + + /** + * 사용자 선호 매체/관심사 기반 추천 + * - 사용자가 로그인하지 않은 경우 또는 선호 매체가 없는 경우 북마크 수 기준으로 추천 + * - 선호하는 매체가 있는 경우 해당 매체의 컬렉션들을 먼저 조회(북마크 수 기준) + * - 선호하는 매체의 컬렉션이 부족한 경우 나머지 컬렉션들로 채움(북마크 수 기준) + * @param limit + * @param user + * @return + */ + @Override + public List findTopBookmarkedCollections(int limit, User user) { + if (user == null || user.getPreferType() == MediaType.NO_PREFERENCE) { + return findCollectionsByBookmarkCount(limit); + } + + boolean preferVideo = user.getPreferType() == MediaType.VIDEO; + + // 선호하는 타입의 컬렉션들 먼저 조회 + List preferredCollections = queryFactory + .select(collection) + .from(collection) + .leftJoin(collection.episodes, episode) + .leftJoin(episode.resource, resource) + .groupBy(collection) + .having( + preferVideo ? + resource.type.eq(ResourceType.VIDEO).count().multiply(100) + .divide(resource.count()).goe(50L) : + resource.type.eq(ResourceType.TEXT).count().multiply(100) + .divide(resource.count()).goe(50L) + ) + .orderBy(collection.bookmarkCount.desc()) + .fetch(); + + // 부족하면 나머지 컬렉션들로 채움 + if (preferredCollections.size() < limit) { + List remainingCollections = queryFactory + .selectFrom(collection) + .where(collection.notIn(preferredCollections)) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit - preferredCollections.size()) + .fetch(); + + preferredCollections.addAll(remainingCollections); + } + + return preferredCollections.subList(0, Math.min(preferredCollections.size(), limit)); + } + + private List findCollectionsByBookmarkCount(int limit) { + return queryFactory + .selectFrom(collection) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit) + .fetch(); + } +} \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index 8ec0c8f3..feb76f84 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -161,6 +161,7 @@ private boolean isPermitAllUrl(String requestURI) { requestURI.startsWith("/webjars") || requestURI.startsWith("/find") || requestURI.startsWith("/search") || + requestURI.startsWith("/home") || requestURI.equals("/reset-password"); } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java index 5c70cf3e..8f91b5fc 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java @@ -1,59 +1,52 @@ package learningFlow.learningFlow_BE.service.home; +import learningFlow.learningFlow_BE.converter.HomeConverter; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.domain.UserCollection; -import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.home.HomeRepository; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.EpisodeDTO; +import learningFlow.learningFlow_BE.repository.UserCollectionRepository; +import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.service.collection.CollectionService; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO.CollectionPreviewDTO; import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecentLearningDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecommendedCollectionDTO; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; +// TODO: 추천 알고리즘 개선 예정 +// - 현재: 북마크 수 기준 정렬, 사용자 선호 매체/관심사 기반 추천 +// - 개선: ??? @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class HomeService { private final HomeRepository homeRepository; private final UserCollectionRepository userCollectionRepository; + private final CollectionService collectionService; private static final int RECOMMENDED_SIZE = 6; private static final int RECENT_EPISODES_SIZE = 4; public HomeInfoDTO getHomeInfo(User user) { - List recommendedCollections = getRecommendedCollections(); - RecentLearningDTO recentLearning = user != null ? getRecentLearning(user) : null; - - return HomeInfoDTO.builder() - .recommendedCollections(recommendedCollections) - .recentLearning(recentLearning) - .build(); - } + List topCollections = homeRepository.findTopBookmarkedCollections(RECOMMENDED_SIZE, user); + List recommendedCollections = topCollections.stream() + .map(collection -> collectionService.CollectionDetails( + collection.getId(), + user != null ? SecurityContextHolder.getContext().getAuthentication() != null ? (PrincipalDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal() : null : null + )) + .toList(); - private List getRecommendedCollections() { - // TODO: 추후 추천 알고리즘 개선 예정 - List collections = homeRepository.findTopBookmarkedCollections(RECOMMENDED_SIZE); + RecentLearningDTO recentLearning = user != null ? getRecentLearning(user) : null; - return collections.stream() - .map(collection -> RecommendedCollectionDTO.builder() - .collectionId(collection.getId()) - .title(collection.getTitle()) - .creator(collection.getCreator()) - .image(collection.getImage()) - .difficulty(collection.getDifficulty().getFirst()) // 우선 0번째 사용하게 - .category(collection.getInterestField().toString()) - .detailInformation(collection.getDetailInformation()) - .collectionUrl("/collections/" + collection.getId()) - .build()) - .collect(Collectors.toList()); + return HomeConverter.toHomeInfoDTO(recommendedCollections, recentLearning); } private RecentLearningDTO getRecentLearning(User user) { @@ -73,26 +66,16 @@ private RecentLearningDTO getRecentLearning(User user) { RECENT_EPISODES_SIZE ); - return RecentLearningDTO.builder() - .collectionId(recentCollection.getCollection().getId()) - .title(recentCollection.getCollection().getTitle()) - .currentEpisode(recentCollection.getUserCollectionStatus()) - .isCompleted(isCollectionCompleted(recentCollection)) - .episodes(convertToEpisodeDTO(recentEpisodes)) - .build(); + return HomeConverter.toRecentLearningDTO( + recentCollection.getCollection(), + recentCollection.getUserCollectionStatus(), + isCollectionCompleted(recentCollection), + recentEpisodes + ); } private boolean isCollectionCompleted(UserCollection userCollection) { return userCollection.getUserCollectionStatus() >= userCollection.getCollection().getEpisodes().size(); } - - private List convertToEpisodeDTO(List episodes) { - return episodes.stream() - .map(episode -> EpisodeDTO.builder() - .episodeNumber(episode.getEpisodeNumber()) - .episodeName(episode.getEpisodeName()) - .build()) - .collect(Collectors.toList()); - } -} +} \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index 297fa301..820fc5eb 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -6,16 +6,13 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; -import learningFlow.learningFlow_BE.converter.UserConverter; import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.service.home.HomeService; import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; -import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,7 +20,6 @@ @RestController @RequiredArgsConstructor @RequestMapping("/home") -@Validated @Slf4j @Tag(name = "Home", description = "홈 화면 보여주는 API") public class HomeRestController { @@ -38,24 +34,10 @@ public class HomeRestController { public ApiResponse getHome( @AuthenticationPrincipal PrincipalDetails principalDetails ) { + log.info("홈 화면 API 호출"); User user = principalDetails != null ? principalDetails.getUser() : null; + log.info("사용자 상태: {}", user != null ? "로그인" : "비로그인"); HomeInfoDTO homeInfo = homeService.getHomeInfo(user); return ApiResponse.onSuccess(homeInfo); } - - @GetMapping("/test") - @Operation(summary = "홈 화면 테스트용 API", description = "로그인, 로그아웃 상태 유지되는지 확인할 수 있는 API") - public ApiResponse getHomeTest( - @AuthenticationPrincipal PrincipalDetails principalDetails - ) { - log.info("/home/test 시작"); - - if (principalDetails != null) { - log.info("인증된 사용자: {}", principalDetails.getUsername()); - return ApiResponse.onSuccess(UserConverter.toUserLoginResponseDTO(principalDetails.getUser())); - } - - log.info("인증되지 않은 사용자"); - return ApiResponse.onSuccess(null); - } } \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java index 2b8a0f22..29ae575e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java @@ -1,56 +1,23 @@ package learningFlow.learningFlow_BE.web.dto.home; -import learningFlow.learningFlow_BE.domain.Image; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; import java.util.List; public class HomeResponseDTO { - @Getter @Builder @NoArgsConstructor @AllArgsConstructor public static class HomeInfoDTO { - List recommendedCollections; -// List recentCollections; + List recommendedCollections; RecentLearningDTO recentLearning; } - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class RecommendedCollectionDTO { - Long collectionId; // 컬렉션 ID - String title; // 컬렉션 제목 - String creator; // 생성자 - Image image; // 컬렉션 이미지 URL - Integer difficulty; // 난이도 - String category; // 카테고리 - String detailInformation; // 상세 정보 - String collectionUrl; // 컬렉션 상세 페이지 URL - } - - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class RecentCollectionDTO { - Long collectionId; // 컬렉션 ID - String title; // 컬렉션 제목 - String creator; // 생성자 - Image image; // 컬렉션 이미지 URL - LocalDateTime lastAccessedAt; // 마지막 접속 시간, UserCollection 엔티티의 lastAccessedAt 필드, 최신 순으로 정렬 시 사용 - Integer progress; // 진행률 - String collectionUrl; // 컬렉션 상세 페이지 URL - Integer currentEpisode; // 현재 학습 중인 에피소드 번호 - } - @Getter @Builder @NoArgsConstructor @@ -71,4 +38,4 @@ public static class EpisodeDTO { private Integer episodeNumber; private String episodeName; } -} \ No newline at end of file +} From 1f84361106728edfc0985147a684f3f79c169023 Mon Sep 17 00:00:00 2001 From: JungJaehoon0430 <80247965+JungJaehoon0430@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:31:10 +0900 Subject: [PATCH 087/256] =?UTF-8?q?=EC=B6=94=EC=B2=9C=20=EC=95=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=EC=A6=98=20=EA=B0=9C=EC=84=A0(=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=84=A0=ED=98=B8=20=EB=A7=A4=EC=B2=B4/=EA=B4=80?= =?UTF-8?q?=EC=8B=AC=EC=82=AC=20=EA=B8=B0=EB=B0=98=20=EC=B6=94=EC=B2=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 사용자 선호 매체/관심사 기반 추천 * - 사용자가 로그인하지 않은 경우 또는 선호 매체가 없는 경우 북마크 수 기준으로 추천 * - 선호 매체/관심사 기반 추천 * 1. 관심분야 + 선호타입 50% 이상 * 2. 관심분야 + 선호타입 50% 미만 * 3. 비관심분야 + 선호타입 50% 이상 * 4. 비관심분야 + 선호타입 50% 미만 * TODO: 추천 알고리즘 개선 예정(최적화 필요) --- .../repository/home/HomeRepositoryImpl.java | 84 +++++++++++++------ 1 file changed, 60 insertions(+), 24 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java index e1e70320..a4618790 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java @@ -2,11 +2,13 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import learningFlow.learningFlow_BE.domain.*; +import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.domain.enums.MediaType; import learningFlow.learningFlow_BE.domain.enums.ResourceType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.ArrayList; import java.util.List; // TODO: 성능 최적화 검토 필요 @@ -35,8 +37,12 @@ public List findRecentEpisodes(Long collectionId, int current /** * 사용자 선호 매체/관심사 기반 추천 * - 사용자가 로그인하지 않은 경우 또는 선호 매체가 없는 경우 북마크 수 기준으로 추천 - * - 선호하는 매체가 있는 경우 해당 매체의 컬렉션들을 먼저 조회(북마크 수 기준) - * - 선호하는 매체의 컬렉션이 부족한 경우 나머지 컬렉션들로 채움(북마크 수 기준) + * - 선호 매체/관심사 기반 추천 + * 1. 관심분야 + 선호타입 50% 이상 + * 2. 관심분야 + 선호타입 50% 미만 + * 3. 비관심분야 + 선호타입 50% 이상 + * 4. 비관심분야 + 선호타입 50% 미만 + * TODO: 추천 알고리즘 개선 예정(최적화 필요) * @param limit * @param user * @return @@ -48,39 +54,69 @@ public List findTopBookmarkedCollections(int limit, User user) { } boolean preferVideo = user.getPreferType() == MediaType.VIDEO; + List result = new ArrayList<>(); + List userInterests = user.getInterestFields(); - // 선호하는 타입의 컬렉션들 먼저 조회 - List preferredCollections = queryFactory + // 1. 관심분야 + 선호타입 50% 이상 + result.addAll(queryFactory .select(collection) .from(collection) - .leftJoin(collection.episodes, episode) - .leftJoin(episode.resource, resource) - .groupBy(collection) - .having( - preferVideo ? - resource.type.eq(ResourceType.VIDEO).count().multiply(100) - .divide(resource.count()).goe(50L) : - resource.type.eq(ResourceType.TEXT).count().multiply(100) - .divide(resource.count()).goe(50L) - ) + .where(collection.interestField.in(userInterests) + .and(preferVideo ? + collection.resourceTypeRatio.goe(50) : + collection.resourceTypeRatio.lt(50))) .orderBy(collection.bookmarkCount.desc()) - .fetch(); + .fetch()); - // 부족하면 나머지 컬렉션들로 채움 - if (preferredCollections.size() < limit) { - List remainingCollections = queryFactory - .selectFrom(collection) - .where(collection.notIn(preferredCollections)) + // 2. 관심분야 + 선호타입 50% 미만 + if (result.size() < limit) { + result.addAll(queryFactory + .select(collection) + .from(collection) + .where(collection.interestField.in(userInterests) + .and(collection.notIn(result)) + .and(preferVideo ? + collection.resourceTypeRatio.lt(50) : + collection.resourceTypeRatio.goe(50))) .orderBy(collection.bookmarkCount.desc()) - .limit(limit - preferredCollections.size()) - .fetch(); + .limit(limit - result.size()) + .fetch()); + } - preferredCollections.addAll(remainingCollections); + // 3. 비관심분야 + 선호타입 50% 이상 + if (result.size() < limit) { + result.addAll(queryFactory + .select(collection) + .from(collection) + .where(collection.interestField.notIn(userInterests) + .and(collection.notIn(result)) + .and(preferVideo ? + collection.resourceTypeRatio.goe(50) : + collection.resourceTypeRatio.lt(50))) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit - result.size()) + .fetch()); } - return preferredCollections.subList(0, Math.min(preferredCollections.size(), limit)); + // 4. 비관심분야 + 선호타입 50% 미만 + if (result.size() < limit) { + result.addAll(queryFactory + .select(collection) + .from(collection) + .where(collection.interestField.notIn(userInterests) + .and(collection.notIn(result)) + .and(preferVideo ? + collection.resourceTypeRatio.lt(50) : + collection.resourceTypeRatio.goe(50))) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit - result.size()) + .fetch()); + } + + return result.subList(0, Math.min(result.size(), limit)); } + private List findCollectionsByBookmarkCount(int limit) { return queryFactory .selectFrom(collection) From a72fb568c5e16b446d07bb3cc9be418a7f3b079d Mon Sep 17 00:00:00 2001 From: JungJaehoon0430 <80247965+JungJaehoon0430@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:57:31 +0900 Subject: [PATCH 088/256] =?UTF-8?q?=ED=99=88=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20merge=EB=90=9C=EA=B1=B0=20pull=20=ED=9B=84?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit . --- .../repository/UserCollectionRepository.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java index 4972d109..767262f9 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -2,9 +2,17 @@ import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface UserCollectionRepository extends JpaRepository { -} + List findByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); + + @Query("SELECT uc FROM UserCollection uc WHERE uc.user = :user ORDER BY uc.lastAccessedAt DESC") + List findRecentByUser(@Param("user") User user, Pageable pageable); +} \ No newline at end of file From e77f6b830db746f9e6c6835f0b26338110d543f8 Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 03:20:04 +0900 Subject: [PATCH 089/256] =?UTF-8?q?[feat]=20CI/CD=20=EB=B0=8F=20docker=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- learningFlow/Dockerfile | 11 +++++++ learningFlow/build.gradle | 7 ++++- learningFlow/docker-compose.yml | 30 ++++++++++++------- .../src/main/resources/application.yml | 25 ++++++++++++---- 4 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 learningFlow/Dockerfile diff --git a/learningFlow/Dockerfile b/learningFlow/Dockerfile new file mode 100644 index 00000000..baafd29b --- /dev/null +++ b/learningFlow/Dockerfile @@ -0,0 +1,11 @@ +FROM gradle:8.11.1-jdk21 AS builder +#Gradle 8.11.1 +COPY . /usr/src +WORKDIR /usr/src +RUN gradle wrapper --gradle-version 8.11.1 +RUN ./gradlew clean build -x test + +FROM openjdk:21-jdk +#debian기반 +COPY --from=builder /usr/src/build/libs/learningFlow-BE-0.0.1-SNAPSHOT.jar /usr/app/app.jar +ENTRYPOINT ["java", "-jar", "/usr/app/app.jar"] \ No newline at end of file diff --git a/learningFlow/build.gradle b/learningFlow/build.gradle index 270e8582..9e5316ac 100644 --- a/learningFlow/build.gradle +++ b/learningFlow/build.gradle @@ -21,6 +21,7 @@ configurations { repositories { mavenCentral() + maven { url 'https://aws.oss.sonatype.org/content/repositories/releases/' } // AWS Repository 추가 } dependencies { @@ -31,7 +32,11 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' // 데이터베이스 - implementation 'mysql:mysql-connector-java:8.0.33' +// implementation 'mysql:mysql-connector-java:8.0.33' + implementation 'com.mysql:mysql-connector-j' + // AWS RDS 및 JDBC 드라이버 의존성 추가 + runtimeOnly 'software.aws.rds:aws-mysql-jdbc:1.1.6' + runtimeOnly 'software.amazon.awssdk:rds:2.20.57' // 보안 implementation 'org.springframework.boot:spring-boot-starter-security' diff --git a/learningFlow/docker-compose.yml b/learningFlow/docker-compose.yml index 60850565..298b1e7d 100644 --- a/learningFlow/docker-compose.yml +++ b/learningFlow/docker-compose.yml @@ -1,19 +1,29 @@ version: '3.8' # docker-compose 파일 버전 services: - learningFlow: # 서비스 이름 - image: mysql:8.0 # 사용할 Docker 이미지 (MySQL 8.0) + learningFlow: # Spring Boot 서비스 이름 + build: + context: . # Dockerfile이 있는 디렉토리 (현재 디렉토리) + image: app-image # 생성될 Docker 이미지 이름 + ports: + - "8080:8080" # 애플리케이션 포트 매핑 +# image: mysql:8.0 # 사용할 Docker 이미지 (MySQL 8.0) container_name: learningFlow_db # 컨테이너 이름 restart: always # 컨테이너 재시작 정책 environment: - MYSQL_ROOT_PASSWORD: root1234 # 루트 사용자 비밀번호 - MYSQL_DATABASE: learningFlow_db # 기본 생성 DB 이름 - MYSQL_USER: learningFlow # 사용자 이름 - MYSQL_PASSWORD: learningFlow123 # 사용자 비밀번호 - ports: - - "3307:3306" # 호스트와 컨테이너 간 포트 매핑 - volumes: - - db_data:/var/lib/mysql # 데이터 지속성을 위한 볼륨 매핑 + MAIL_PASSWORD: ${MAIL_PASSWORD} + MAIL_USERNAME: ${MAIL_USERNAME} + SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID} + SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET} + JWT_SECRET_KEY: ${JWT_SECRET_KEY} + DB_URL: ${DB_URL} + DB_USER: ${DB_USER} + DB_PASSWORD: ${DB_PASSWORD} volumes: db_data: + +networks: + default: + driver: bridge + diff --git a/learningFlow/src/main/resources/application.yml b/learningFlow/src/main/resources/application.yml index ae85686d..1dcbaa63 100644 --- a/learningFlow/src/main/resources/application.yml +++ b/learningFlow/src/main/resources/application.yml @@ -1,12 +1,19 @@ spring: datasource: - url: jdbc:mysql://localhost:3307/learningFlow_db # Docker?? ?? ?? MySQL ?? - username: learningFlow # Docker Compose?? ??? ??? ?? - password: learningFlow123 # Docker Compose?? ??? ???? - driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? +# url: jdbc:mysql://localhost:3307/learningFlow_db # Docker?? ?? ?? MySQL ?? +# username: learningFlow # Docker Compose?? ??? ??? ?? +# password: learningFlow123 # Docker Compose?? ??? ???? + url: ${DB_URL} + username: ${DB_USER} + password: ${DB_PASSWORD} +# driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? + driver-class-name: software.aws.rds.jdbc.mysql.Driver jpa: hibernate: ddl-auto: update # ??? ?? ???? (?? ????? ??) + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL8Dialect show-sql: true # SQL ?? ?? sql: init: @@ -16,8 +23,8 @@ spring: client: registration: google: - client-id: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT-ID} - client-secret: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT-SECRET} + client-id: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID} + client-secret: ${SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET} scope: - email - profile @@ -52,4 +59,10 @@ app: server: port: 8080 # Spring Boot ?????? ?? ?? +logging: + level: + org.hibernate.SQL: DEBUG + org.hibernate.type.descriptor.sql.BasicBinder: DEBUG + + From e4610710e032c75e89b74f7992261867b6f90305 Mon Sep 17 00:00:00 2001 From: JIMIN KIM <102471138+jimin-fundamental@users.noreply.github.com> Date: Sat, 25 Jan 2025 03:21:56 +0900 Subject: [PATCH 090/256] Create main.yml --- .github/workflows/main.yml | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..bcd56044 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,56 @@ +name: CI/CD for Spring Boot App + +on: + push: + branches: + - deploy + +jobs: + docker: + runs-on: ubuntu-latest + + steps: + # Checkout the repository + - name: Checkout code + uses: actions/checkout@v3 + + # Log in to Docker Hub + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # Set up Docker Buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + # Build and push Docker image + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} + + deploy: + runs-on: ubuntu-latest + needs: [docker] + + steps: + # SSH Connect and Docker Image Pull and Container Run + - name: SSH Connect and Docker Image Pull and Container Run + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USER }} + key: ${{ secrets.EC2_SSH_KEY }} + port: 22 + script: | + docker stop my-was || true + docker rm my-was || true + docker image rm ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} || true + docker run -d -p 8080:8080 \ + -v /root/my-proj/resources:/app/resources \ + --name my-was ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} From 896c38f007b27b3e65ea8fc43850ab3ff53b8c32 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 11:46:12 +0900 Subject: [PATCH 091/256] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B0=80=EB=8F=85=EC=84=B1=20=EC=A2=8B=EA=B2=8C=20=EA=B3=B5?= =?UTF-8?q?=EB=B0=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/controller/HomeRestController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index 820fc5eb..58728414 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -23,6 +23,7 @@ @Slf4j @Tag(name = "Home", description = "홈 화면 보여주는 API") public class HomeRestController { + private final HomeService homeService; @GetMapping From 4ab495f4c4ba4d36bacc5bc4313472a2402711e6 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 11:46:47 +0900 Subject: [PATCH 092/256] =?UTF-8?q?refactor=20:=20UserConverter=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=ED=95=98=EA=B3=A0=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EB=8D=98=20=EA=B2=83=20=EC=97=86=EC=95=A0=EA=B3=A0=20=EC=A0=95?= =?UTF-8?q?=EC=A0=81=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow/learningFlow_BE/converter/UserConverter.java | 2 -- .../learningFlow/learningFlow_BE/service/user/UserService.java | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java index 3e58d43c..52439dc2 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java @@ -6,11 +6,9 @@ import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; -import org.springframework.stereotype.Component; import java.util.List; -@Component public class UserConverter { public static UserResponseDTO.UserLoginResponseDTO toUserLoginResponseDTO(User user) { diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 6595e067..1daa94ce 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -33,7 +33,6 @@ public class UserService { private final UserRepository userRepository; - private final UserConverter userConverter; private final CollectionRepository collectionRepository; private final UserCollectionRepository userCollectionRepository; @@ -43,7 +42,7 @@ public UserInfoDTO getUserInfo(String loginId) { User user = userRepository.findById(loginId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); - return userConverter.convertToUserInfoDTO(user); + return UserConverter.convertToUserInfoDTO(user); } @Transactional From 2e73f56552cc220478d45355fcdd68150088129e Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:37:04 +0900 Subject: [PATCH 093/256] =?UTF-8?q?feat=20:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EC=96=B4=EC=A7=84=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/home/HomeRepository.java | 12 -- .../repository/home/HomeRepositoryImpl.java | 127 ------------------ .../service/home/HomeService.java | 81 ----------- 3 files changed, 220 deletions(-) delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java deleted file mode 100644 index 5f20de86..00000000 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package learningFlow.learningFlow_BE.repository.home; - -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.domain.User; - -import java.util.List; - -public interface HomeRepository { - List findTopBookmarkedCollections(int limit, User user); - List findRecentEpisodes(Long collectionId, int currentEpisode, int limit); -} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java deleted file mode 100644 index a4618790..00000000 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/home/HomeRepositoryImpl.java +++ /dev/null @@ -1,127 +0,0 @@ -package learningFlow.learningFlow_BE.repository.home; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import learningFlow.learningFlow_BE.domain.*; -import learningFlow.learningFlow_BE.domain.enums.InterestField; -import learningFlow.learningFlow_BE.domain.enums.MediaType; -import learningFlow.learningFlow_BE.domain.enums.ResourceType; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.ArrayList; -import java.util.List; - -// TODO: 성능 최적화 검토 필요 -// - Collection 조회 시 N+1 문제 확인 -// - 인덱스 추가 검토: bookmarkCount -@Repository -@RequiredArgsConstructor -public class HomeRepositoryImpl implements HomeRepository { - private final JPAQueryFactory queryFactory; - private final QCollection collection = QCollection.collection; - private final QCollectionEpisode episode = QCollectionEpisode.collectionEpisode; - private final QResource resource = QResource.resource; - - @Override - public List findRecentEpisodes(Long collectionId, int currentEpisode, int limit) { - int startEpisode = Math.max(1, currentEpisode - (limit - 1)); - - return queryFactory - .selectFrom(episode) - .where(episode.collection.id.eq(collectionId) - .and(episode.episodeNumber.between(startEpisode, startEpisode + limit - 1))) - .orderBy(episode.episodeNumber.asc()) - .fetch(); - } - - /** - * 사용자 선호 매체/관심사 기반 추천 - * - 사용자가 로그인하지 않은 경우 또는 선호 매체가 없는 경우 북마크 수 기준으로 추천 - * - 선호 매체/관심사 기반 추천 - * 1. 관심분야 + 선호타입 50% 이상 - * 2. 관심분야 + 선호타입 50% 미만 - * 3. 비관심분야 + 선호타입 50% 이상 - * 4. 비관심분야 + 선호타입 50% 미만 - * TODO: 추천 알고리즘 개선 예정(최적화 필요) - * @param limit - * @param user - * @return - */ - @Override - public List findTopBookmarkedCollections(int limit, User user) { - if (user == null || user.getPreferType() == MediaType.NO_PREFERENCE) { - return findCollectionsByBookmarkCount(limit); - } - - boolean preferVideo = user.getPreferType() == MediaType.VIDEO; - List result = new ArrayList<>(); - List userInterests = user.getInterestFields(); - - // 1. 관심분야 + 선호타입 50% 이상 - result.addAll(queryFactory - .select(collection) - .from(collection) - .where(collection.interestField.in(userInterests) - .and(preferVideo ? - collection.resourceTypeRatio.goe(50) : - collection.resourceTypeRatio.lt(50))) - .orderBy(collection.bookmarkCount.desc()) - .fetch()); - - // 2. 관심분야 + 선호타입 50% 미만 - if (result.size() < limit) { - result.addAll(queryFactory - .select(collection) - .from(collection) - .where(collection.interestField.in(userInterests) - .and(collection.notIn(result)) - .and(preferVideo ? - collection.resourceTypeRatio.lt(50) : - collection.resourceTypeRatio.goe(50))) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit - result.size()) - .fetch()); - } - - // 3. 비관심분야 + 선호타입 50% 이상 - if (result.size() < limit) { - result.addAll(queryFactory - .select(collection) - .from(collection) - .where(collection.interestField.notIn(userInterests) - .and(collection.notIn(result)) - .and(preferVideo ? - collection.resourceTypeRatio.goe(50) : - collection.resourceTypeRatio.lt(50))) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit - result.size()) - .fetch()); - } - - // 4. 비관심분야 + 선호타입 50% 미만 - if (result.size() < limit) { - result.addAll(queryFactory - .select(collection) - .from(collection) - .where(collection.interestField.notIn(userInterests) - .and(collection.notIn(result)) - .and(preferVideo ? - collection.resourceTypeRatio.lt(50) : - collection.resourceTypeRatio.goe(50))) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit - result.size()) - .fetch()); - } - - return result.subList(0, Math.min(result.size(), limit)); - } - - - private List findCollectionsByBookmarkCount(int limit) { - return queryFactory - .selectFrom(collection) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit) - .fetch(); - } -} \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java deleted file mode 100644 index 8f91b5fc..00000000 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/home/HomeService.java +++ /dev/null @@ -1,81 +0,0 @@ -package learningFlow.learningFlow_BE.service.home; - -import learningFlow.learningFlow_BE.converter.HomeConverter; -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.domain.User; -import learningFlow.learningFlow_BE.domain.UserCollection; -import learningFlow.learningFlow_BE.repository.home.HomeRepository; -import learningFlow.learningFlow_BE.repository.UserCollectionRepository; -import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.service.collection.CollectionService; -import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO.CollectionPreviewDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecentLearningDTO; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -// TODO: 추천 알고리즘 개선 예정 -// - 현재: 북마크 수 기준 정렬, 사용자 선호 매체/관심사 기반 추천 -// - 개선: ??? -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class HomeService { - private final HomeRepository homeRepository; - private final UserCollectionRepository userCollectionRepository; - private final CollectionService collectionService; - - private static final int RECOMMENDED_SIZE = 6; - private static final int RECENT_EPISODES_SIZE = 4; - - public HomeInfoDTO getHomeInfo(User user) { - List topCollections = homeRepository.findTopBookmarkedCollections(RECOMMENDED_SIZE, user); - List recommendedCollections = topCollections.stream() - .map(collection -> collectionService.CollectionDetails( - collection.getId(), - user != null ? SecurityContextHolder.getContext().getAuthentication() != null ? (PrincipalDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal() : null : null - )) - .toList(); - - RecentLearningDTO recentLearning = user != null ? getRecentLearning(user) : null; - - return HomeConverter.toHomeInfoDTO(recommendedCollections, recentLearning); - } - - private RecentLearningDTO getRecentLearning(User user) { - UserCollection recentCollection = userCollectionRepository - .findRecentByUser(user, PageRequest.of(0, 1)) - .stream() - .findFirst() - .orElse(null); - - if (recentCollection == null) { - return null; - } - - List recentEpisodes = homeRepository.findRecentEpisodes( - recentCollection.getCollection().getId(), - recentCollection.getUserCollectionStatus(), - RECENT_EPISODES_SIZE - ); - - return HomeConverter.toRecentLearningDTO( - recentCollection.getCollection(), - recentCollection.getUserCollectionStatus(), - isCollectionCompleted(recentCollection), - recentEpisodes - ); - } - - private boolean isCollectionCompleted(UserCollection userCollection) { - return userCollection.getUserCollectionStatus() >= - userCollection.getCollection().getEpisodes().size(); - } -} \ No newline at end of file From 0b9ee04582ed66b628703f48674ddb27e1ad4b6d Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:37:56 +0900 Subject: [PATCH 094/256] =?UTF-8?q?feat=20:=20UserCollectionRepository?= =?UTF-8?q?=EC=97=90=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EC=99=80=20=ED=95=B4=EB=8B=B9=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=88=98=EA=B0=95=ED=95=9C=20=EC=88=98=EA=B0=95?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=ED=86=B5=ED=95=B4=20UserCollecti?= =?UTF-8?q?on=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/UserCollectionRepository.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java index 767262f9..28e4f1e3 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -3,16 +3,13 @@ import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.domain.UserCollection; import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import java.util.List; +import java.util.Optional; public interface UserCollectionRepository extends JpaRepository { List findByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); - @Query("SELECT uc FROM UserCollection uc WHERE uc.user = :user ORDER BY uc.lastAccessedAt DESC") - List findRecentByUser(@Param("user") User user, Pageable pageable); + Optional findFirstByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); } \ No newline at end of file From 6fdcf12a35b3377a6848a139e1fb344ff9c9db45 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:38:13 +0900 Subject: [PATCH 095/256] =?UTF-8?q?feat=20:=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=A0=84=EB=B6=80=20=EC=A6=89=EC=8B=9C?= =?UTF-8?q?=EB=A1=9C=EB=94=A9=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/learningFlow/learningFlow_BE/domain/User.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java index c5299b90..8bf7788e 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -43,7 +43,7 @@ public class User extends BaseEntity { @Column(nullable = false) private Job job; - @ElementCollection(fetch = FetchType.LAZY) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "user_interests") @Enumerated(EnumType.STRING) @Column(name = "interest_field", nullable = false) @@ -68,7 +68,7 @@ public class User extends BaseEntity { @JoinColumn(name = "image_id") private Image image; - @ElementCollection(fetch = FetchType.LAZY) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "user_bookmarks", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "collection_id") private List bookmarkedCollectionIds = new ArrayList<>(); From 85bd793785df26f68a66b3db3640394154be8ad6 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:40:07 +0900 Subject: [PATCH 096/256] =?UTF-8?q?feat=20:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EC=97=90=20=EB=8C=80=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EB=A9=B4=20=EA=B2=80=EC=A6=9D=20=EC=88=98=ED=96=89=ED=95=98?= =?UTF-8?q?=EA=B3=A0,=20=ED=86=A0=ED=81=B0=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=EC=9D=B4=20=EC=97=86=EC=96=B4=EB=8F=84=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=9D=B4=20=EA=B0=80=EB=8A=A5=ED=95=9C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=EC=97=90=EB=A7=8C=20=EC=A0=95=EC=83=81=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=ED=96=89.=20=ED=86=A0=ED=81=B0?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=ED=95=98=EB=A9=B4=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=95=84=EC=9A=94=ED=95=98=EB=8B=A4=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/jwt/JwtAuthenticationFilter.java | 149 +++++++----------- 1 file changed, 58 insertions(+), 91 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index feb76f84..785aab60 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -30,117 +30,84 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - log.info("JWT 필터 진입, URL: {}", request.getRequestURI()); - - /** - * 로그인, 회원가입 등 인증이 필요없는 경로는 토큰 검증을 건너뛰도록 설정 - * 인증 미필요 URL 체크 - */ - if (isPermitAllUrl(request.getRequestURI())) { - log.info("인증이 필요없는 URL: {}", request.getRequestURI()); - filterChain.doFilter(request, response); - return; - } + String jwt = getJwtFromRequest(request); try { - String jwt = getJwtFromRequest(request); - log.info("요청에서 추출한 토큰: {}", jwt); - - if (!StringUtils.hasText(jwt)) { - log.info("토큰이 없는 요청"); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write( - new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) - ) - ); - return; - } - //AccessToken 검증 - if (jwtTokenProvider.validateToken(jwt)) { + if (StringUtils.hasText(jwt)) { + if (jwtTokenProvider.validateToken(jwt)) { + log.info("유효한 Access Token"); - log.info("유효한 Access Token"); + if (!request.getRequestURI().equals("/logout/test")) { + Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); + log.info("블랙리스트 체크 결과: {}", isBlacklisted); - //로그아웃 요청이 아닌 경우에만 블랙리스트 체크 - if (!request.getRequestURI().equals("/logout/test")) { - //TODO : 테스트 위해서 URI 설정을 /logout/test로 해놓음. 추후 수정 필요 - //Redis에서 블랙리스트 체크하기 - 로그아웃된 사용자인지 여부 파악 - Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); - log.info("블랙리스트 체크 결과: {}", isBlacklisted); - - if (Boolean.TRUE.equals(isBlacklisted)) { - throw new RuntimeException("이미 로그아웃된 토큰입니다."); + if (Boolean.TRUE.equals(isBlacklisted)) { + throw new RuntimeException("이미 로그아웃된 토큰입니다."); + } } - } - - //유효한 토큰이면 인증 처리 - String email = jwtTokenProvider.getEmailFromToken(jwt); - log.info("토큰에서 추출한 이메일: {}", email); - - UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); - UsernamePasswordAuthenticationToken authentication - = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("인증 정보 SecurityContext에 저장"); - } else { - log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); - // Access Token이 만료된 경우, Refresh Token 확인 - String refreshToken = request.getHeader("Refresh-Token"); - log.info("전달받은 Refresh Token: {}", refreshToken); - - if (!StringUtils.hasText(refreshToken)) { - log.info("Refresh Token이 없음 - 재로그인 필요"); - response.setContentType("application/json"); - response.setCharacterEncoding("UTF-8"); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - String error = new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("401", "토큰이 만료되었습니다. 다시 로그인해주세요.", null) - ); - response.getWriter().write(error); - return; - } - if (jwtTokenProvider.validateToken(refreshToken)) { - log.info("유효한 Refresh Token. 새로운 Access Token을 발급 시작"); + String email = jwtTokenProvider.getEmailFromToken(jwt); + log.info("토큰에서 추출한 이메일: {}", email); - // Refresh Token이 유효하면 새로운 Access Token 발급 - String email = jwtTokenProvider.getEmailFromToken(refreshToken); UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); - UsernamePasswordAuthenticationToken authentication - = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - - //새로운 AccessToken 발급 및 헤더에 추가 - String newAccessToken = jwtTokenProvider.createAccessToken(authentication); - log.info("새로 발급된 Access Token: {}", newAccessToken); - response.addHeader("Authorization", "Bearer " + newAccessToken); - - //새로운 토큰으로 인증 처리 authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); + log.info("인증 정보 SecurityContext에 저장"); + + } else { + log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); + String refreshToken = request.getHeader("Refresh-Token"); + log.info("전달받은 Refresh Token: {}", refreshToken); + + if (!StringUtils.hasText(refreshToken)) { + if (!isPermitAllUrl(request.getRequestURI())) { + handleAuthenticationError(response, "토큰이 만료되었습니다. 다시 로그인해주세요."); + return; + } + } else if (jwtTokenProvider.validateToken(refreshToken)) { + String email = jwtTokenProvider.getEmailFromToken(refreshToken); + UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); + + String newAccessToken = jwtTokenProvider.createAccessToken(authentication); + log.info("새로 발급된 Access Token: {}", newAccessToken); + response.addHeader("Authorization", "Bearer " + newAccessToken); + + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); + } } + } else if (!isPermitAllUrl(request.getRequestURI())) { + handleAuthenticationError(response, "로그인이 필요한 서비스입니다."); + return; } } catch (Exception e) { - log.error("Security Context에서 사용자 인증을 설정할 수 없습니다: {}", e.getMessage()); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write( - new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) - ) - ); - return; + if (!isPermitAllUrl(request.getRequestURI())) { + handleAuthenticationError(response, "로그인이 필요한 서비스입니다."); + return; + } } filterChain.doFilter(request, response); } + private void handleAuthenticationError(HttpServletResponse response, String message) throws IOException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("AUTH4001", message, null) + ) + ); + } + private String getJwtFromRequest(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { From 8a38a2ee215c5ee65b01128cff833424b2d3f0aa Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:40:53 +0900 Subject: [PATCH 097/256] =?UTF-8?q?feat=20:=20home=EC=97=90=20=EC=93=B0?= =?UTF-8?q?=EC=9D=BC=20convertToHomeCollection=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=ED=86=B5=ED=95=B4=EC=84=9C=20home=EC=97=90=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20DTO=EB=A1=9C=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/CollectionConverter.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index 8471c499..59761a8d 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -11,6 +11,12 @@ public class CollectionConverter { + public static List convertToHomeCollection(List collections) { + return collections.stream() + .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, null)) + .toList(); + } + public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( String keyword, InterestField interestFields, From 5773acbb92fc3b4a08d88b074675a5ad7b80ee0c Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:41:09 +0900 Subject: [PATCH 098/256] =?UTF-8?q?feat=20:=20home=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EA=B0=81=EC=A2=85=20=EB=8F=99=EC=A0=81=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/collection/CollectionRepositoryCustom.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java index 5db2bf75..432c81a5 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java @@ -1,6 +1,8 @@ package learningFlow.learningFlow_BE.repository.collection; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import org.springframework.data.domain.Pageable; @@ -11,4 +13,10 @@ public interface CollectionRepositoryCustom { Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition); List searchNextPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection, Pageable pageable); Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, SearchRequestDTO.SearchConditionDTO condition); + List findTopBookmarkedCollections(int limit); + List findByInterestFieldAndPreferType(List interestFields, + MediaType preferType, + boolean matchInterest, + boolean matchPreferType, + int limit); } From 8b96c71a3047cf73ad796000b34192d8851ef904 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:41:23 +0900 Subject: [PATCH 099/256] =?UTF-8?q?feat=20:=20home=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EA=B0=81=EC=A2=85=20=EB=8F=99=EC=A0=81=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collection/CollectionRepositoryImpl.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java index 0bdc1e23..7f6a3342 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java @@ -9,6 +9,7 @@ import learningFlow.learningFlow_BE.domain.QCollection; import learningFlow.learningFlow_BE.domain.QCollectionEpisode; import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.domain.enums.MediaType; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -112,6 +113,42 @@ public Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, S return count != null ? count.intValue() : 0; } + @Override + public List findTopBookmarkedCollections(int limit) { + return jpaQueryFactory + .selectFrom(collection) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit) + .fetch(); + } + + @Override + public List findByInterestFieldAndPreferType( + List interestFields, + MediaType preferType, + boolean matchInterest, + boolean matchPreferType, + int limit + ) { + + BooleanExpression interestCondition = matchInterest ? + collection.interestField.in(interestFields) : collection.interestField.notIn(interestFields); + + BooleanExpression preferTypeCondition = null; + if (preferType != MediaType.NO_PREFERENCE) { + preferTypeCondition = preferType == MediaType.VIDEO ? + (matchPreferType ? collection.resourceTypeRatio.goe(50) : collection.resourceTypeRatio.lt(50)) : + (matchPreferType ? collection.resourceTypeRatio.lt(50) : collection.resourceTypeRatio.goe(50)); + } + + return jpaQueryFactory + .selectFrom(collection) + .where(interestCondition, preferTypeCondition) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit) + .fetch(); + } + private BooleanExpression createDynamicInterestFields(InterestField interestFields) { if (interestFields == null) { return null; From b16a4cb782655cdcd028fc6d388a95b5b6f17f9e Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:41:49 +0900 Subject: [PATCH 100/256] =?UTF-8?q?feat=20:=20home=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=AC=20=EC=88=98=20=EC=9E=88=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/collection/CollectionService.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 31aed43c..96c61d3d 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -3,10 +3,15 @@ import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; import learningFlow.learningFlow_BE.converter.CollectionConverter; +import learningFlow.learningFlow_BE.converter.HomeConverter; +import learningFlow.learningFlow_BE.converter.ResourceConverter; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.RequiredArgsConstructor; @@ -14,15 +19,20 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class CollectionService { private final CollectionRepository collectionRepository; + private final UserCollectionRepository userCollectionRepository; private static final int PAGE_SIZE = 8; + private static final int HOME_COLLECTION_SIZE = 6; public CollectionResponseDTO.CollectionPreviewDTO CollectionDetails(Long collectionId, PrincipalDetails principalDetails) { @@ -66,6 +76,72 @@ public CollectionResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchCondi return CollectionConverter.toSearchResultDTO(collections, lastCollection.getId(), hasNext, totalPages, currentPage, currentUser); } + public HomeResponseDTO.GuestHomeInfoDTO getGuestHomeCollections() { + List collections = collectionRepository.findTopBookmarkedCollections(HOME_COLLECTION_SIZE); + + return HomeConverter.convertToGuestHomeInfoDTO(CollectionConverter.convertToHomeCollection(collections)); + } + + public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { + // 최근 학습 컬렉션 조회 + HomeResponseDTO.RecentLearningDTO recentLearning = getRecentLearning(user); + + // 추천 컬렉션 목록 조회 + + // 1. interestField와 preferType 모두 충족 + List recommendedCollections = new ArrayList<>(collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), true, true, HOME_COLLECTION_SIZE + )); + + // 2. interestField만 충족 + if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { + recommendedCollections.addAll( + collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), true, false, + HOME_COLLECTION_SIZE - recommendedCollections.size() + ) + ); + } + + // 3. preferType만 충족 + if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { + recommendedCollections.addAll( + collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), false, true, + HOME_COLLECTION_SIZE - recommendedCollections.size() + ) + ); + } + + // 4. 모두 불충족 + if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { + recommendedCollections.addAll( + collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), false, false, + HOME_COLLECTION_SIZE - recommendedCollections.size() + ) + ); + } + + List recommendedPreviewDTOs = recommendedCollections.stream() + .distinct() + .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, user)) + .limit(HOME_COLLECTION_SIZE) + .toList(); + + return HomeResponseDTO.UserHomeInfoDTO.builder() + .recentLearning(recentLearning) + .recommendedCollections(recommendedPreviewDTOs) + .build(); + } + + private HomeResponseDTO.RecentLearningDTO getRecentLearning(User user) { + return userCollectionRepository + .findFirstByUserAndStatusOrderByLastAccessedAtDesc(user, UserCollectionStatus.IN_PROGRESS) + .map(ResourceConverter::toRecentLearningDTO) + .orElse(null); + } + private int calculateCurrentPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection) { return collectionRepository.getCountGreaterThanBookmark(lastCollection.getBookmarkCount(),lastCollection.getId(), condition) / PAGE_SIZE + 1; } From 508f05fb136f0876d07ad277bdb0b87b13923c37 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:42:15 +0900 Subject: [PATCH 101/256] =?UTF-8?q?feat=20:=20home=EC=97=90=20=EC=93=B0?= =?UTF-8?q?=EC=9D=BC=20DTO=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=EC=BB=A8=EB=B2=84=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/HomeConverter.java | 40 ++++--------------- 1 file changed, 7 insertions(+), 33 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java index cc39331c..f47a3509 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java @@ -1,43 +1,17 @@ package learningFlow.learningFlow_BE.converter; -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.RecentLearningDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.EpisodeDTO; -import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO.CollectionPreviewDTO; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import java.util.List; -import java.util.stream.Collectors; public class HomeConverter { - public static HomeInfoDTO toHomeInfoDTO(List recommendedCollections, RecentLearningDTO recentLearning) { - return HomeInfoDTO.builder() - .recommendedCollections(recommendedCollections) - .recentLearning(recentLearning) - .build(); - } - - public static RecentLearningDTO toRecentLearningDTO(Collection collection, int currentEpisode, boolean isCompleted, List episodes) { - return RecentLearningDTO.builder() - .collectionId(collection.getId()) - .title(collection.getTitle()) - .currentEpisode(currentEpisode) - .isCompleted(isCompleted) - .episodes(toEpisodeDTOList(episodes)) - .build(); - } - - public static List toEpisodeDTOList(List episodes) { - return episodes.stream() - .map(HomeConverter::toEpisodeDTO) - .collect(Collectors.toList()); - } - public static EpisodeDTO toEpisodeDTO(CollectionEpisode episode) { - return EpisodeDTO.builder() - .episodeNumber(episode.getEpisodeNumber()) - .episodeName(episode.getEpisodeName()) + public static HomeResponseDTO.GuestHomeInfoDTO convertToGuestHomeInfoDTO( + List collectionPreviewList + ) { + return HomeResponseDTO.GuestHomeInfoDTO.builder() + .recommendedCollections(collectionPreviewList) .build(); } } \ No newline at end of file From c775f698ab0fc68521d2d9ae6bb4cf23b563b5a6 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:42:24 +0900 Subject: [PATCH 102/256] =?UTF-8?q?feat=20:=20home=EC=97=90=20=EC=93=B0?= =?UTF-8?q?=EC=9D=BC=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/home/HomeResponseDTO.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java index 29ae575e..d379292c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java @@ -1,6 +1,7 @@ package learningFlow.learningFlow_BE.web.dto.home; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -9,33 +10,31 @@ import java.util.List; public class HomeResponseDTO { + @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class HomeInfoDTO { - List recommendedCollections; + public static class UserHomeInfoDTO { RecentLearningDTO recentLearning; + List recommendedCollections; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class RecentLearningDTO { - private Long collectionId; - private String title; - private Integer currentEpisode; - private boolean isCompleted; - private List episodes; + public static class GuestHomeInfoDTO { + List recommendedCollections; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class EpisodeDTO { - private Integer episodeNumber; - private String episodeName; + public static class RecentLearningDTO { + private CollectionResponseDTO.CompletedCollectionDTO collection; + private List resources; + private String progressRatio; } } From b7a70170635ca8086a0c9f7d203df52dc8369b0e Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:42:53 +0900 Subject: [PATCH 103/256] =?UTF-8?q?feat=20:=20homeService=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EB=A1=9C=20CollectionService=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20Collection=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/HomeRestController.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index 58728414..ebf45e04 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -6,10 +6,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; -import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.service.home.HomeService; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; +import learningFlow.learningFlow_BE.service.collection.CollectionService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -24,7 +22,7 @@ @Tag(name = "Home", description = "홈 화면 보여주는 API") public class HomeRestController { - private final HomeService homeService; + private final CollectionService collectionService; @GetMapping @Operation(summary = "홈 화면 API", description = "홈 화면에 필요한 정보를 제공하는 API입니다.") @@ -32,13 +30,15 @@ public class HomeRestController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001", description = "사용자를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), }) - public ApiResponse getHome( + public ApiResponse getHome( @AuthenticationPrincipal PrincipalDetails principalDetails ) { - log.info("홈 화면 API 호출"); - User user = principalDetails != null ? principalDetails.getUser() : null; - log.info("사용자 상태: {}", user != null ? "로그인" : "비로그인"); - HomeInfoDTO homeInfo = homeService.getHomeInfo(user); - return ApiResponse.onSuccess(homeInfo); + if (principalDetails == null || principalDetails.getUser() == null) { + log.info("비회원"); + return ApiResponse.onSuccess(collectionService.getGuestHomeCollections()); + } else { + log.info("회원"); + return ApiResponse.onSuccess(collectionService.getUserHomeCollections(principalDetails.getUser())); + } } } \ No newline at end of file From beddc18fd8bcdbcf116bbbd131b99f29013e1fc0 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:49:27 +0900 Subject: [PATCH 104/256] =?UTF-8?q?feat=20:=20Service=20=EA=B3=84=EC=B8=B5?= =?UTF-8?q?=EC=97=90=EC=84=9C=20DTO=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=EA=B2=8C=20=EC=95=88=EC=96=B4=EC=9A=B8=EB=A0=A4?= =?UTF-8?q?=EC=84=9C=20=ED=95=B4=EB=8B=B9=20=EB=A1=9C=EC=A7=81=20Converter?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/HomeConverter.java | 20 +++++++++++++++++++ .../service/collection/CollectionService.java | 11 +--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java index f47a3509..8e58a92b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java @@ -1,5 +1,7 @@ package learningFlow.learningFlow_BE.converter; +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; @@ -14,4 +16,22 @@ public static HomeResponseDTO.GuestHomeInfoDTO convertToGuestHomeInfoDTO( .recommendedCollections(collectionPreviewList) .build(); } + + public static HomeResponseDTO.UserHomeInfoDTO convertToUserHomeInfoDTO( + HomeResponseDTO.RecentLearningDTO recentLearning, + List recommendedCollections, + User user, + int size + ) { + List recommendedPreviewDTOs = recommendedCollections.stream() + .distinct() + .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, user)) + .limit(size) + .toList(); + + return HomeResponseDTO.UserHomeInfoDTO.builder() + .recentLearning(recentLearning) + .recommendedCollections(recommendedPreviewDTOs) + .build(); + } } \ No newline at end of file diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 96c61d3d..5ee3732b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -123,16 +123,7 @@ public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { ); } - List recommendedPreviewDTOs = recommendedCollections.stream() - .distinct() - .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, user)) - .limit(HOME_COLLECTION_SIZE) - .toList(); - - return HomeResponseDTO.UserHomeInfoDTO.builder() - .recentLearning(recentLearning) - .recommendedCollections(recommendedPreviewDTOs) - .build(); + return HomeConverter.convertToUserHomeInfoDTO(recentLearning, recommendedCollections, user, HOME_COLLECTION_SIZE); } private HomeResponseDTO.RecentLearningDTO getRecentLearning(User user) { From 55f0e49d95aa04487ed94d548ffdd44d0ded8a06 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sat, 25 Jan 2025 14:50:19 +0900 Subject: [PATCH 105/256] =?UTF-8?q?feat=20:=20=EC=B5=9C=EA=B7=BC=EC=97=90?= =?UTF-8?q?=20=EC=88=98=EA=B0=95=ED=95=9C=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20DTO=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 53 ++++++++++++++----- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index b1e689f5..8c072e7c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -3,12 +3,39 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import java.util.List; public class ResourceConverter { + public static HomeResponseDTO.RecentLearningDTO toRecentLearningDTO(UserCollection userCollection) { + Collection collection = userCollection.getCollection(); + int currentEpisode = userCollection.getUserCollectionStatus(); + + List resources = collection.getEpisodes().stream() + .filter(episode -> episode.getEpisodeNumber() <= currentEpisode) + .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() + .resourceId(episode.getResource().getId()) + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .build()) + .toList(); + + CollectionResponseDTO.CompletedCollectionDTO completedCollectionDTO + = CollectionConverter.convertToCompletedCollectionDTO(userCollection); + + return HomeResponseDTO.RecentLearningDTO.builder() + .collection(completedCollectionDTO) + .resources(resources) + .progressRatio(calculateProgressRatio(userCollection)) + .build(); + } + public static List getResourceDTOList(Collection collection) { return collection.getEpisodes().stream() @@ -22,6 +49,19 @@ public static List getResourceDTOLi .toList(); } + public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( + UserCollection userCollection + ) { + return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() + .resourceId(getResourceId(userCollection)) + .CollectionTitle(userCollection.getCollection().getTitle()) + .resourceSource(extractResourceSource(getResourceUrl(userCollection))) + .episodeNumber(userCollection.getUserCollectionStatus()) + .episodeName(getEpisodeName(userCollection)) + .progressRatio(calculateProgressRatio(userCollection)) + .build(); + } + private static String extractResourceSource(String url) { String lowerCaseUrl = url.toLowerCase(); @@ -39,19 +79,6 @@ private static String extractResourceSource(String url) { } } - public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( - UserCollection userCollection - ) { - return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() - .resourceId(getResourceId(userCollection)) - .CollectionTitle(userCollection.getCollection().getTitle()) - .resourceSource(extractResourceSource(getResourceUrl(userCollection))) - .episodeNumber(userCollection.getUserCollectionStatus()) - .episodeName(getEpisodeName(userCollection)) - .progressRatio(calculateProgressRatio(userCollection)) - .build(); - } - private static String getResourceUrl(UserCollection userCollection) { return userCollection.getCollection().getEpisodes().stream() .filter(episode -> episode.getEpisodeNumber().equals(userCollection.getUserCollectionStatus())) From 510a9bb588e653db42088800cdd31bc2e959a69d Mon Sep 17 00:00:00 2001 From: JIMIN KIM <102471138+jimin-fundamental@users.noreply.github.com> Date: Sat, 25 Jan 2025 17:01:38 +0900 Subject: [PATCH 106/256] Update main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bcd56044..317a60ba 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -29,8 +29,8 @@ jobs: - name: Build and push uses: docker/build-push-action@v4 with: - context: . - file: ./Dockerfile + context: ./learningFlow # Dockerfile이 있는 디렉토리 + file: ./learningFlow/Dockerfile # Dockerfile 경로 지정 push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} From 2bd63fb5fe223f722a628c3a7b890611b77a4466 Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 17:13:44 +0900 Subject: [PATCH 107/256] =?UTF-8?q?[fix]=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0,=20main.yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- learningFlow/.gitattributes => .gitattributes | 0 .gitignore | 5 ++++- learningFlow/Dockerfile => Dockerfile | 0 learningFlow/build.gradle => build.gradle | 0 .../docker-compose.yml => docker-compose.yml | 0 learningFlow/erd.md => erd.md | 0 .../gradle => gradle}/wrapper/gradle-wrapper.jar | Bin .../wrapper/gradle-wrapper.properties | 0 learningFlow/gradlew => gradlew | 0 learningFlow/gradlew.bat => gradlew.bat | 0 learningFlow/.idea/compiler.xml | 14 -------------- learningFlow/settings.gradle => settings.gradle | 0 .../learningFlow_BE/domain/QBaseEntity.java | 0 .../learningFlow_BE/domain/QCollection.java | 0 .../domain/QCollectionEpisode.java | 0 .../domain/QEmailVerificationToken.java | 0 .../learningFlow_BE/domain/QImage.java | 0 .../learningFlow_BE/domain/QMemo.java | 0 .../learningFlow_BE/domain/QMemoId.java | 0 .../domain/QPasswordResetToken.java | 0 .../learningFlow_BE/domain/QResource.java | 0 .../learningFlow_BE/domain/QUser.java | 0 .../learningFlow_BE/domain/QUserCollection.java | 0 .../LearningFlowBeApplication.java | 0 .../learningFlow_BE/apiPayload/ApiResponse.java | 0 .../learningFlow_BE/apiPayload/code/BaseCode.java | 0 .../apiPayload/code/BaseErrorCode.java | 0 .../apiPayload/code/ErrorReasonDTO.java | 0 .../apiPayload/code/ReasonDTO.java | 0 .../apiPayload/code/status/ErrorStatus.java | 0 .../apiPayload/code/status/SuccessStatus.java | 0 .../apiPayload/exception/ExceptionAdvice.java | 0 .../apiPayload/exception/GeneralException.java | 0 .../exception/handler/CollectionHandler.java | 0 .../exception/handler/LoginHandler.java | 0 .../apiPayload/exception/handler/PageHandler.java | 0 .../exception/handler/ResourceHandler.java | 0 .../apiPayload/exception/handler/UserHandler.java | 0 .../learningFlow_BE/config/QueryDslConfig.java | 0 .../learningFlow_BE/config/SwaggerConfig.java | 0 .../learningFlow_BE/config/redis/RedisConfig.java | 0 .../config/security/JwtConfig.java | 0 .../config/security/SecurityConfig.java | 0 .../converter/CollectionConverter.java | 0 .../learningFlow_BE/converter/MemoConverter.java | 0 .../learningFlow_BE/converter/UserConverter.java | 0 .../learningFlow_BE/domain/BaseEntity.java | 0 .../learningFlow_BE/domain/Collection.java | 0 .../learningFlow_BE/domain/CollectionEpisode.java | 0 .../domain/EmailVerificationToken.java | 0 .../learningFlow_BE/domain/Image.java | 0 .../learningFlow/learningFlow_BE/domain/Memo.java | 0 .../learningFlow_BE/domain/MemoId.java | 0 .../domain/PasswordResetToken.java | 0 .../learningFlow_BE/domain/Resource.java | 0 .../learningFlow/learningFlow_BE/domain/User.java | 0 .../learningFlow_BE/domain/UserCollection.java | 0 .../learningFlow_BE/domain/enums/Gender.java | 0 .../domain/enums/InterestField.java | 0 .../learningFlow_BE/domain/enums/Job.java | 0 .../learningFlow_BE/domain/enums/MediaType.java | 0 .../domain/enums/ResourceType.java | 0 .../learningFlow_BE/domain/enums/Role.java | 0 .../learningFlow_BE/domain/enums/SocialType.java | 0 .../EmailVerificationTokenRepository.java | 0 .../repository/ImageRepository.java | 0 .../repository/MemoRepository.java | 0 .../repository/PasswordResetTokenRepository.java | 0 .../repository/UserRepository.java | 0 .../collection/CollectionRepository.java | 0 .../collection/CollectionRepositoryCustom.java | 0 .../collection/CollectionRepositoryImpl.java | 0 .../security/auth/PrincipalDetails.java | 0 .../handler/CustomAuthenticationEntryPoint.java | 0 .../security/handler/JwtLogoutHandler.java | 0 .../handler/OAuth2LoginSuccessHandler.java | 0 .../security/jwt/JwtAuthenticationFilter.java | 0 .../security/jwt/JwtProperties.java | 0 .../security/jwt/JwtTokenProvider.java | 0 .../auth/common/AuthTokenCleanupScheduler.java | 0 .../auth/common/UserVerificationEmailService.java | 0 .../service/auth/local/LocalUserAuthService.java | 0 .../oauth/OAuth2UserAuthenticationService.java | 0 .../auth/oauth/OAuth2UserRegistrationService.java | 0 .../service/auth/oauth/OAuth2UserTemp.java | 0 .../service/collection/CollectionService.java | 0 .../service/memo/MemoCommandService.java | 0 .../service/memo/MemoCommandServiceImpl.java | 0 .../service/user/CustomUserDetailsService.java | 0 .../learningFlow_BE/service/user/UserService.java | 0 .../validation/annotation/CheckPage.java | 0 .../validator/CheckPageArgumentResolver.java | 0 .../web/controller/CollectionRestController.java | 0 .../web/controller/HomeRestController.java | 0 .../web/controller/LoginController.java | 0 .../web/controller/ResourceRestController.java | 0 .../web/controller/SearchRestController.java | 0 .../web/controller/UserRestController.java | 0 .../learningFlow_BE/web/dto/TempRequest.java | 0 .../learningFlow_BE/web/dto/TempResponse.java | 0 .../web/dto/bookmark/BookmarkDTO.java | 0 .../web/dto/collection/CollectionRequestDTO.java | 0 .../web/dto/collection/CollectionResponseDTO.java | 0 .../web/dto/home/HomeResponseDTO.java | 0 .../web/dto/memo/MemoRequestDTO.java | 0 .../web/dto/memo/MemoResponseDTO.java | 0 .../web/dto/resource/ResourceRequestDTO.java | 0 .../web/dto/resource/ResourceResponseDTO.java | 0 .../web/dto/search/SearchRequestDTO.java | 0 .../web/dto/user/UserRequestDTO.java | 0 .../web/dto/user/UserResponseDTO.java | 0 .../src => src}/main/resources/application.yml | 0 .../LearningFlowBeApplicationTests.java | 0 113 files changed, 4 insertions(+), 15 deletions(-) rename learningFlow/.gitattributes => .gitattributes (100%) rename learningFlow/Dockerfile => Dockerfile (100%) rename learningFlow/build.gradle => build.gradle (100%) rename learningFlow/docker-compose.yml => docker-compose.yml (100%) rename learningFlow/erd.md => erd.md (100%) rename {learningFlow/gradle => gradle}/wrapper/gradle-wrapper.jar (100%) rename {learningFlow/gradle => gradle}/wrapper/gradle-wrapper.properties (100%) rename learningFlow/gradlew => gradlew (100%) rename learningFlow/gradlew.bat => gradlew.bat (100%) delete mode 100644 learningFlow/.idea/compiler.xml rename learningFlow/settings.gradle => settings.gradle (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QImage.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QResource.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QUser.java (100%) rename {learningFlow/src => src}/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/LearningFlowBeApplication.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/ApiResponse.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseCode.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseErrorCode.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/code/ErrorReasonDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/code/ReasonDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/SuccessStatus.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/GeneralException.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/PageHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/UserHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/config/QueryDslConfig.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/config/SwaggerConfig.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/config/redis/RedisConfig.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/config/security/JwtConfig.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/Collection.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/CollectionEpisode.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/EmailVerificationToken.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/Image.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/Memo.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/MemoId.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/PasswordResetToken.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/Resource.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/User.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/Gender.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/InterestField.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/Job.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/MediaType.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/Role.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/EmailVerificationTokenRepository.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/ImageRepository.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/PasswordResetTokenRepository.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/UserRepository.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/auth/PrincipalDetails.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/handler/CustomAuthenticationEntryPoint.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/handler/JwtLogoutHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/jwt/JwtProperties.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/auth/common/AuthTokenCleanupScheduler.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserAuthenticationService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserTemp.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/user/CustomUserDetailsService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/service/user/UserService.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/validation/annotation/CheckPage.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/validation/validator/CheckPageArgumentResolver.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/TempRequest.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/TempResponse.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionRequestDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoResponseDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java (100%) rename {learningFlow/src => src}/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java (100%) rename {learningFlow/src => src}/main/resources/application.yml (100%) rename {learningFlow/src => src}/test/java/learningFlow/learningFlow_BE/LearningFlowBeApplicationTests.java (100%) diff --git a/learningFlow/.gitattributes b/.gitattributes similarity index 100% rename from learningFlow/.gitattributes rename to .gitattributes diff --git a/.gitignore b/.gitignore index d50b366c..f6412ab7 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,7 @@ bin/ ### IntelliJ IDEA ### .idea -#../.idea +../.idea *.iws *.iml @@ -43,3 +43,6 @@ out/ ### gradle ### .gradle/ + +### 환경변수 ### +.env diff --git a/learningFlow/Dockerfile b/Dockerfile similarity index 100% rename from learningFlow/Dockerfile rename to Dockerfile diff --git a/learningFlow/build.gradle b/build.gradle similarity index 100% rename from learningFlow/build.gradle rename to build.gradle diff --git a/learningFlow/docker-compose.yml b/docker-compose.yml similarity index 100% rename from learningFlow/docker-compose.yml rename to docker-compose.yml diff --git a/learningFlow/erd.md b/erd.md similarity index 100% rename from learningFlow/erd.md rename to erd.md diff --git a/learningFlow/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from learningFlow/gradle/wrapper/gradle-wrapper.jar rename to gradle/wrapper/gradle-wrapper.jar diff --git a/learningFlow/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from learningFlow/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties diff --git a/learningFlow/gradlew b/gradlew similarity index 100% rename from learningFlow/gradlew rename to gradlew diff --git a/learningFlow/gradlew.bat b/gradlew.bat similarity index 100% rename from learningFlow/gradlew.bat rename to gradlew.bat diff --git a/learningFlow/.idea/compiler.xml b/learningFlow/.idea/compiler.xml deleted file mode 100644 index cb931fb1..00000000 --- a/learningFlow/.idea/compiler.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/learningFlow/settings.gradle b/settings.gradle similarity index 100% rename from learningFlow/settings.gradle rename to settings.gradle diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java similarity index 100% rename from learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java rename to src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/LearningFlowBeApplication.java b/src/main/java/learningFlow/learningFlow_BE/LearningFlowBeApplication.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/LearningFlowBeApplication.java rename to src/main/java/learningFlow/learningFlow_BE/LearningFlowBeApplication.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/ApiResponse.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/ApiResponse.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/ApiResponse.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/ApiResponse.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseCode.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseCode.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseCode.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseCode.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseErrorCode.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseErrorCode.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseErrorCode.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/code/BaseErrorCode.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ErrorReasonDTO.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ErrorReasonDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ErrorReasonDTO.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ErrorReasonDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ReasonDTO.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ReasonDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ReasonDTO.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/code/ReasonDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/SuccessStatus.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/SuccessStatus.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/SuccessStatus.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/SuccessStatus.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/ExceptionAdvice.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/GeneralException.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/GeneralException.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/GeneralException.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/GeneralException.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/CollectionHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/LoginHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/PageHandler.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/PageHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/PageHandler.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/PageHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/ResourceHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/UserHandler.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/UserHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/UserHandler.java rename to src/main/java/learningFlow/learningFlow_BE/apiPayload/exception/handler/UserHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/QueryDslConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/QueryDslConfig.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/config/QueryDslConfig.java rename to src/main/java/learningFlow/learningFlow_BE/config/QueryDslConfig.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/SwaggerConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/SwaggerConfig.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/config/SwaggerConfig.java rename to src/main/java/learningFlow/learningFlow_BE/config/SwaggerConfig.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/redis/RedisConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/redis/RedisConfig.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/config/redis/RedisConfig.java rename to src/main/java/learningFlow/learningFlow_BE/config/redis/RedisConfig.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/JwtConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/JwtConfig.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/JwtConfig.java rename to src/main/java/learningFlow/learningFlow_BE/config/security/JwtConfig.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java rename to src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java rename to src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java rename to src/main/java/learningFlow/learningFlow_BE/converter/MemoConverter.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java rename to src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java b/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java rename to src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java b/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Collection.java rename to src/main/java/learningFlow/learningFlow_BE/domain/Collection.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/CollectionEpisode.java b/src/main/java/learningFlow/learningFlow_BE/domain/CollectionEpisode.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/CollectionEpisode.java rename to src/main/java/learningFlow/learningFlow_BE/domain/CollectionEpisode.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/EmailVerificationToken.java b/src/main/java/learningFlow/learningFlow_BE/domain/EmailVerificationToken.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/EmailVerificationToken.java rename to src/main/java/learningFlow/learningFlow_BE/domain/EmailVerificationToken.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Image.java b/src/main/java/learningFlow/learningFlow_BE/domain/Image.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Image.java rename to src/main/java/learningFlow/learningFlow_BE/domain/Image.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Memo.java b/src/main/java/learningFlow/learningFlow_BE/domain/Memo.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Memo.java rename to src/main/java/learningFlow/learningFlow_BE/domain/Memo.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java b/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java rename to src/main/java/learningFlow/learningFlow_BE/domain/MemoId.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/PasswordResetToken.java b/src/main/java/learningFlow/learningFlow_BE/domain/PasswordResetToken.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/PasswordResetToken.java rename to src/main/java/learningFlow/learningFlow_BE/domain/PasswordResetToken.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java b/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java rename to src/main/java/learningFlow/learningFlow_BE/domain/Resource.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/src/main/java/learningFlow/learningFlow_BE/domain/User.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/User.java rename to src/main/java/learningFlow/learningFlow_BE/domain/User.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java b/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java rename to src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/Gender.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/Gender.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/Gender.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/Gender.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/InterestField.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/InterestField.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/InterestField.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/InterestField.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/Job.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/Job.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/Job.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/Job.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/MediaType.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/MediaType.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/MediaType.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/MediaType.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/ResourceType.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/Role.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/Role.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/Role.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/Role.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java b/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java rename to src/main/java/learningFlow/learningFlow_BE/domain/enums/SocialType.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/EmailVerificationTokenRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/EmailVerificationTokenRepository.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/EmailVerificationTokenRepository.java rename to src/main/java/learningFlow/learningFlow_BE/repository/EmailVerificationTokenRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/ImageRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/ImageRepository.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/ImageRepository.java rename to src/main/java/learningFlow/learningFlow_BE/repository/ImageRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java rename to src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/PasswordResetTokenRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/PasswordResetTokenRepository.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/PasswordResetTokenRepository.java rename to src/main/java/learningFlow/learningFlow_BE/repository/PasswordResetTokenRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/UserRepository.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/UserRepository.java rename to src/main/java/learningFlow/learningFlow_BE/repository/UserRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java rename to src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepository.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java rename to src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java rename to src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/auth/PrincipalDetails.java b/src/main/java/learningFlow/learningFlow_BE/security/auth/PrincipalDetails.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/auth/PrincipalDetails.java rename to src/main/java/learningFlow/learningFlow_BE/security/auth/PrincipalDetails.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/handler/CustomAuthenticationEntryPoint.java b/src/main/java/learningFlow/learningFlow_BE/security/handler/CustomAuthenticationEntryPoint.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/handler/CustomAuthenticationEntryPoint.java rename to src/main/java/learningFlow/learningFlow_BE/security/handler/CustomAuthenticationEntryPoint.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/handler/JwtLogoutHandler.java b/src/main/java/learningFlow/learningFlow_BE/security/handler/JwtLogoutHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/handler/JwtLogoutHandler.java rename to src/main/java/learningFlow/learningFlow_BE/security/handler/JwtLogoutHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java b/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java rename to src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java rename to src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtProperties.java b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtProperties.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtProperties.java rename to src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtProperties.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java rename to src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/common/AuthTokenCleanupScheduler.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/common/AuthTokenCleanupScheduler.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/common/AuthTokenCleanupScheduler.java rename to src/main/java/learningFlow/learningFlow_BE/service/auth/common/AuthTokenCleanupScheduler.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java rename to src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java rename to src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserAuthenticationService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserAuthenticationService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserAuthenticationService.java rename to src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserAuthenticationService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java rename to src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserTemp.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserTemp.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserTemp.java rename to src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserTemp.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java rename to src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java b/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java rename to src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java b/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java rename to src/main/java/learningFlow/learningFlow_BE/service/memo/MemoCommandServiceImpl.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/CustomUserDetailsService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/CustomUserDetailsService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/CustomUserDetailsService.java rename to src/main/java/learningFlow/learningFlow_BE/service/user/CustomUserDetailsService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java rename to src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/validation/annotation/CheckPage.java b/src/main/java/learningFlow/learningFlow_BE/validation/annotation/CheckPage.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/validation/annotation/CheckPage.java rename to src/main/java/learningFlow/learningFlow_BE/validation/annotation/CheckPage.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/validation/validator/CheckPageArgumentResolver.java b/src/main/java/learningFlow/learningFlow_BE/validation/validator/CheckPageArgumentResolver.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/validation/validator/CheckPageArgumentResolver.java rename to src/main/java/learningFlow/learningFlow_BE/validation/validator/CheckPageArgumentResolver.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java rename to src/main/java/learningFlow/learningFlow_BE/web/controller/CollectionRestController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java rename to src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java rename to src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java rename to src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java rename to src/main/java/learningFlow/learningFlow_BE/web/controller/SearchRestController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java rename to src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/TempRequest.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/TempRequest.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/TempRequest.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/TempRequest.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/TempResponse.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/TempResponse.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/TempResponse.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/TempResponse.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/bookmark/BookmarkDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionRequestDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionRequestDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionRequestDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoRequestDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoResponseDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoResponseDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/memo/MemoResponseDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceRequestDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/search/SearchRequestDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java similarity index 100% rename from learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java rename to src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserResponseDTO.java diff --git a/learningFlow/src/main/resources/application.yml b/src/main/resources/application.yml similarity index 100% rename from learningFlow/src/main/resources/application.yml rename to src/main/resources/application.yml diff --git a/learningFlow/src/test/java/learningFlow/learningFlow_BE/LearningFlowBeApplicationTests.java b/src/test/java/learningFlow/learningFlow_BE/LearningFlowBeApplicationTests.java similarity index 100% rename from learningFlow/src/test/java/learningFlow/learningFlow_BE/LearningFlowBeApplicationTests.java rename to src/test/java/learningFlow/learningFlow_BE/LearningFlowBeApplicationTests.java From d72692ab5ba314c55286a5e07cb49e96656bd89d Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 17:14:44 +0900 Subject: [PATCH 108/256] =?UTF-8?q?[fix]=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0,=20main.yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 317a60ba..af3c505c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -29,8 +29,8 @@ jobs: - name: Build and push uses: docker/build-push-action@v4 with: - context: ./learningFlow # Dockerfile이 있는 디렉토리 - file: ./learningFlow/Dockerfile # Dockerfile 경로 지정 + context: . # Dockerfile이 있는 디렉토리 + file: ./Dockerfile # Dockerfile 경로 지정 push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} From 13b755ca27e84499ef7033f2ff722b18db8d7536 Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 21:10:24 +0900 Subject: [PATCH 109/256] =?UTF-8?q?[fix]=20main.yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index af3c505c..823f2bb5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,18 +39,15 @@ jobs: needs: [docker] steps: - # SSH Connect and Docker Image Pull and Container Run - - name: SSH Connect and Docker Image Pull and Container Run - uses: appleboy/ssh-action@v1.0.0 + - name: Deploy to Server + uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USER }} key: ${{ secrets.EC2_SSH_KEY }} - port: 22 + envs: GITHUB_SHA script: | - docker stop my-was || true - docker rm my-was || true - docker image rm ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} || true - docker run -d -p 8080:8080 \ - -v /root/my-proj/resources:/app/resources \ - --name my-was ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} + sudo docker ps -qa | xargs -r sudo docker rm -f + sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}:latest + sudo docker run -d -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}:latest + sudo docker image prune -f From 608355ca7b1db6127f3560a1e9429aac3e8c3d43 Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 21:47:21 +0900 Subject: [PATCH 110/256] =?UTF-8?q?[fix]=20jpa=20implementation=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC=EB=A1=9C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0=20=EC=8B=9C=EB=8F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../learningFlow_BE/security/jwt/JwtTokenProvider.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9e5316ac..9231c16b 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ repositories { dependencies { // Spring Boot 기본 - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' +// implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java index e24e669a..e677bd17 100644 --- a/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java +++ b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtTokenProvider.java @@ -22,6 +22,8 @@ public class JwtTokenProvider { private final JwtProperties jwtProperties; private final SecretKey jwtSecretKey; + + public String createAccessToken(Authentication authentication) { PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal(); User user = principalDetails.getUser(); From 8f121dd21344cd581f7ce34123d1e9a992206c4a Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 21:49:23 +0900 Subject: [PATCH 111/256] =?UTF-8?q?[fix]=20jpa=20implementation=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC=EB=A1=9C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0=20=EC=8B=9C=EB=8F=84=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9231c16b..9e5316ac 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ repositories { dependencies { // Spring Boot 기본 -// implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation 'org.springframework.boot:spring-boot-starter-test' From 8e95a7c50cf6470c619692a862494d33af2809f5 Mon Sep 17 00:00:00 2001 From: Karen Date: Sat, 25 Jan 2025 22:28:20 +0900 Subject: [PATCH 112/256] =?UTF-8?q?[fix]main.yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 823f2bb5..51683c16 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,5 +49,14 @@ jobs: script: | sudo docker ps -qa | xargs -r sudo docker rm -f sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}:latest - sudo docker run -d -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}:latest + sudo docker run -d -p 8080:8080 \ + -e MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }} \ + -e MAIL_USERNAME=${{ secrets.MAIL_USERNAME }} \ + -e SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID }} \ + -e SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET=${{ secrets.SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET }} \ + -e JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} \ + -e DB_URL=${{ secrets.DB_URL }} \ + -e DB_USER=${{ secrets.DB_USER }} \ + -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} \ + ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}:latest sudo docker image prune -f From 3215d5a7d47df633d1b61bc319df088935f55c00 Mon Sep 17 00:00:00 2001 From: JIMIN KIM <102471138+jimin-fundamental@users.noreply.github.com> Date: Sun, 26 Jan 2025 01:02:56 +0900 Subject: [PATCH 113/256] =?UTF-8?q?Revert=20"Develop=EC=9D=84=20deploy?= =?UTF-8?q?=EB=A1=9C=20merge=20=EC=9E=AC=EC=8B=9C=EB=8F=84"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 8 +- .../config/security/SecurityConfig.java | 4 +- .../converter/CollectionConverter.java | 6 - .../converter/HomeConverter.java | 37 ----- .../converter/ResourceConverter.java | 53 ++---- .../converter/UserConverter.java | 2 + .../learningFlow_BE/domain/User.java | 4 +- .../repository/UserCollectionRepository.java | 5 +- .../CollectionRepositoryCustom.java | 8 - .../collection/CollectionRepositoryImpl.java | 37 ----- .../security/jwt/JwtAuthenticationFilter.java | 151 +++++++++++------- .../service/collection/CollectionService.java | 67 -------- .../service/user/UserService.java | 3 +- .../web/controller/HomeRestController.java | 48 ++++-- .../web/dto/home/HomeResponseDTO.java | 36 +++-- 15 files changed, 184 insertions(+), 285 deletions(-) delete mode 100644 src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java diff --git a/build.gradle b/build.gradle index 136282b8..9e5316ac 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,8 @@ dependencies { //QueryDsl - implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + implementation 'com.querydsl:querydsl-core' annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" @@ -96,6 +97,11 @@ tasks.withType(JavaCompile).configureEach { options.generatedSourceOutputDirectory = file(generated) } +// gradle clean 시에 QClass 디렉토리 삭제 +clean { + delete file(generated) +} + configurations { compileOnly { extendsFrom annotationProcessor diff --git a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index dce1da23..ea7d02f6 100644 --- a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -45,11 +45,11 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte "/find/**", "/reset-password", "/search/**", - "/home/**", "/collections/{collectionId:[\\d]+}" ).permitAll() .requestMatchers( - "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**").permitAll() + "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", + "/home/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**", "/resources/**", "/collections/{collectionId}/bookmark").authenticated() .anyRequest().permitAll() diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index 59761a8d..8471c499 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -11,12 +11,6 @@ public class CollectionConverter { - public static List convertToHomeCollection(List collections) { - return collections.stream() - .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, null)) - .toList(); - } - public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( String keyword, InterestField interestFields, diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java deleted file mode 100644 index 8e58a92b..00000000 --- a/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java +++ /dev/null @@ -1,37 +0,0 @@ -package learningFlow.learningFlow_BE.converter; - -import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.User; -import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; - -import java.util.List; - -public class HomeConverter { - - public static HomeResponseDTO.GuestHomeInfoDTO convertToGuestHomeInfoDTO( - List collectionPreviewList - ) { - return HomeResponseDTO.GuestHomeInfoDTO.builder() - .recommendedCollections(collectionPreviewList) - .build(); - } - - public static HomeResponseDTO.UserHomeInfoDTO convertToUserHomeInfoDTO( - HomeResponseDTO.RecentLearningDTO recentLearning, - List recommendedCollections, - User user, - int size - ) { - List recommendedPreviewDTOs = recommendedCollections.stream() - .distinct() - .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, user)) - .limit(size) - .toList(); - - return HomeResponseDTO.UserHomeInfoDTO.builder() - .recentLearning(recentLearning) - .recommendedCollections(recommendedPreviewDTOs) - .build(); - } -} \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 8c072e7c..b1e689f5 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -3,39 +3,12 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.domain.UserCollection; -import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import java.util.List; public class ResourceConverter { - public static HomeResponseDTO.RecentLearningDTO toRecentLearningDTO(UserCollection userCollection) { - Collection collection = userCollection.getCollection(); - int currentEpisode = userCollection.getUserCollectionStatus(); - - List resources = collection.getEpisodes().stream() - .filter(episode -> episode.getEpisodeNumber() <= currentEpisode) - .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() - .resourceId(episode.getResource().getId()) - .episodeName(episode.getEpisodeName()) - .url(episode.getResource().getUrl()) - .resourceSource(extractResourceSource(episode.getResource().getUrl())) - .episodeNumber(episode.getEpisodeNumber()) - .build()) - .toList(); - - CollectionResponseDTO.CompletedCollectionDTO completedCollectionDTO - = CollectionConverter.convertToCompletedCollectionDTO(userCollection); - - return HomeResponseDTO.RecentLearningDTO.builder() - .collection(completedCollectionDTO) - .resources(resources) - .progressRatio(calculateProgressRatio(userCollection)) - .build(); - } - public static List getResourceDTOList(Collection collection) { return collection.getEpisodes().stream() @@ -49,19 +22,6 @@ public static List getResourceDTOLi .toList(); } - public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( - UserCollection userCollection - ) { - return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() - .resourceId(getResourceId(userCollection)) - .CollectionTitle(userCollection.getCollection().getTitle()) - .resourceSource(extractResourceSource(getResourceUrl(userCollection))) - .episodeNumber(userCollection.getUserCollectionStatus()) - .episodeName(getEpisodeName(userCollection)) - .progressRatio(calculateProgressRatio(userCollection)) - .build(); - } - private static String extractResourceSource(String url) { String lowerCaseUrl = url.toLowerCase(); @@ -79,6 +39,19 @@ private static String extractResourceSource(String url) { } } + public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( + UserCollection userCollection + ) { + return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() + .resourceId(getResourceId(userCollection)) + .CollectionTitle(userCollection.getCollection().getTitle()) + .resourceSource(extractResourceSource(getResourceUrl(userCollection))) + .episodeNumber(userCollection.getUserCollectionStatus()) + .episodeName(getEpisodeName(userCollection)) + .progressRatio(calculateProgressRatio(userCollection)) + .build(); + } + private static String getResourceUrl(UserCollection userCollection) { return userCollection.getCollection().getEpisodes().stream() .filter(episode -> episode.getEpisodeNumber().equals(userCollection.getUserCollectionStatus())) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java index 52439dc2..3e58d43c 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java @@ -6,9 +6,11 @@ import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; +import org.springframework.stereotype.Component; import java.util.List; +@Component public class UserConverter { public static UserResponseDTO.UserLoginResponseDTO toUserLoginResponseDTO(User user) { diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/src/main/java/learningFlow/learningFlow_BE/domain/User.java index 8bf7788e..c5299b90 100644 --- a/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -43,7 +43,7 @@ public class User extends BaseEntity { @Column(nullable = false) private Job job; - @ElementCollection(fetch = FetchType.EAGER) + @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "user_interests") @Enumerated(EnumType.STRING) @Column(name = "interest_field", nullable = false) @@ -68,7 +68,7 @@ public class User extends BaseEntity { @JoinColumn(name = "image_id") private Image image; - @ElementCollection(fetch = FetchType.EAGER) + @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "user_bookmarks", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "collection_id") private List bookmarkedCollectionIds = new ArrayList<>(); diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java index 28e4f1e3..81a8579d 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -6,10 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -import java.util.Optional; public interface UserCollectionRepository extends JpaRepository { List findByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); - - Optional findFirstByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); -} \ No newline at end of file +} diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java index 432c81a5..5db2bf75 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java @@ -1,8 +1,6 @@ package learningFlow.learningFlow_BE.repository.collection; import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.enums.MediaType; -import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import org.springframework.data.domain.Pageable; @@ -13,10 +11,4 @@ public interface CollectionRepositoryCustom { Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition); List searchNextPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection, Pageable pageable); Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, SearchRequestDTO.SearchConditionDTO condition); - List findTopBookmarkedCollections(int limit); - List findByInterestFieldAndPreferType(List interestFields, - MediaType preferType, - boolean matchInterest, - boolean matchPreferType, - int limit); } diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java index 7f6a3342..0bdc1e23 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java @@ -9,7 +9,6 @@ import learningFlow.learningFlow_BE.domain.QCollection; import learningFlow.learningFlow_BE.domain.QCollectionEpisode; import learningFlow.learningFlow_BE.domain.enums.InterestField; -import learningFlow.learningFlow_BE.domain.enums.MediaType; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -113,42 +112,6 @@ public Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, S return count != null ? count.intValue() : 0; } - @Override - public List findTopBookmarkedCollections(int limit) { - return jpaQueryFactory - .selectFrom(collection) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit) - .fetch(); - } - - @Override - public List findByInterestFieldAndPreferType( - List interestFields, - MediaType preferType, - boolean matchInterest, - boolean matchPreferType, - int limit - ) { - - BooleanExpression interestCondition = matchInterest ? - collection.interestField.in(interestFields) : collection.interestField.notIn(interestFields); - - BooleanExpression preferTypeCondition = null; - if (preferType != MediaType.NO_PREFERENCE) { - preferTypeCondition = preferType == MediaType.VIDEO ? - (matchPreferType ? collection.resourceTypeRatio.goe(50) : collection.resourceTypeRatio.lt(50)) : - (matchPreferType ? collection.resourceTypeRatio.lt(50) : collection.resourceTypeRatio.goe(50)); - } - - return jpaQueryFactory - .selectFrom(collection) - .where(interestCondition, preferTypeCondition) - .orderBy(collection.bookmarkCount.desc()) - .limit(limit) - .fetch(); - } - private BooleanExpression createDynamicInterestFields(InterestField interestFields) { if (interestFields == null) { return null; diff --git a/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index 785aab60..2399a229 100644 --- a/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -30,84 +30,117 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + log.info("JWT 필터 진입, URL: {}", request.getRequestURI()); - String jwt = getJwtFromRequest(request); + + /** + * 로그인, 회원가입 등 인증이 필요없는 경로는 토큰 검증을 건너뛰도록 설정 + * 인증 미필요 URL 체크 + */ + if (isPermitAllUrl(request.getRequestURI())) { + log.info("인증이 필요없는 URL: {}", request.getRequestURI()); + filterChain.doFilter(request, response); + return; + } try { - if (StringUtils.hasText(jwt)) { - if (jwtTokenProvider.validateToken(jwt)) { - log.info("유효한 Access Token"); + String jwt = getJwtFromRequest(request); + log.info("요청에서 추출한 토큰: {}", jwt); + + if (!StringUtils.hasText(jwt)) { + log.info("토큰이 없는 요청"); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) + ) + ); + return; + } + //AccessToken 검증 + if (jwtTokenProvider.validateToken(jwt)) { - if (!request.getRequestURI().equals("/logout/test")) { - Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); - log.info("블랙리스트 체크 결과: {}", isBlacklisted); + log.info("유효한 Access Token"); - if (Boolean.TRUE.equals(isBlacklisted)) { - throw new RuntimeException("이미 로그아웃된 토큰입니다."); - } + //로그아웃 요청이 아닌 경우에만 블랙리스트 체크 + if (!request.getRequestURI().equals("/logout/test")) { + //TODO : 테스트 위해서 URI 설정을 /logout/test로 해놓음. 추후 수정 필요 + //Redis에서 블랙리스트 체크하기 - 로그아웃된 사용자인지 여부 파악 + Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); + log.info("블랙리스트 체크 결과: {}", isBlacklisted); + + if (Boolean.TRUE.equals(isBlacklisted)) { + throw new RuntimeException("이미 로그아웃된 토큰입니다."); } + } + + //유효한 토큰이면 인증 처리 + String email = jwtTokenProvider.getEmailFromToken(jwt); + log.info("토큰에서 추출한 이메일: {}", email); + + UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + UsernamePasswordAuthenticationToken authentication + = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("인증 정보 SecurityContext에 저장"); + } else { + log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); + // Access Token이 만료된 경우, Refresh Token 확인 + String refreshToken = request.getHeader("Refresh-Token"); + log.info("전달받은 Refresh Token: {}", refreshToken); + + if (!StringUtils.hasText(refreshToken)) { + log.info("Refresh Token이 없음 - 재로그인 필요"); + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + String error = new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("401", "토큰이 만료되었습니다. 다시 로그인해주세요.", null) + ); + response.getWriter().write(error); + return; + } - String email = jwtTokenProvider.getEmailFromToken(jwt); - log.info("토큰에서 추출한 이메일: {}", email); + if (jwtTokenProvider.validateToken(refreshToken)) { + log.info("유효한 Refresh Token. 새로운 Access Token을 발급 시작"); + // Refresh Token이 유효하면 새로운 Access Token 발급 + String email = jwtTokenProvider.getEmailFromToken(refreshToken); UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); + UsernamePasswordAuthenticationToken authentication + = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + //새로운 AccessToken 발급 및 헤더에 추가 + String newAccessToken = jwtTokenProvider.createAccessToken(authentication); + log.info("새로 발급된 Access Token: {}", newAccessToken); + response.addHeader("Authorization", "Bearer " + newAccessToken); + + //새로운 토큰으로 인증 처리 authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("인증 정보 SecurityContext에 저장"); - - } else { - log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); - String refreshToken = request.getHeader("Refresh-Token"); - log.info("전달받은 Refresh Token: {}", refreshToken); - - if (!StringUtils.hasText(refreshToken)) { - if (!isPermitAllUrl(request.getRequestURI())) { - handleAuthenticationError(response, "토큰이 만료되었습니다. 다시 로그인해주세요."); - return; - } - } else if (jwtTokenProvider.validateToken(refreshToken)) { - String email = jwtTokenProvider.getEmailFromToken(refreshToken); - UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); - - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - - String newAccessToken = jwtTokenProvider.createAccessToken(authentication); - log.info("새로 발급된 Access Token: {}", newAccessToken); - response.addHeader("Authorization", "Bearer " + newAccessToken); - - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); - } + log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); } - } else if (!isPermitAllUrl(request.getRequestURI())) { - handleAuthenticationError(response, "로그인이 필요한 서비스입니다."); - return; } } catch (Exception e) { - if (!isPermitAllUrl(request.getRequestURI())) { - handleAuthenticationError(response, "로그인이 필요한 서비스입니다."); - return; - } + log.error("Security Context에서 사용자 인증을 설정할 수 없습니다: {}", e.getMessage()); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) + ) + ); + return; } filterChain.doFilter(request, response); } - private void handleAuthenticationError(HttpServletResponse response, String message) throws IOException { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write( - new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("AUTH4001", message, null) - ) - ); - } - private String getJwtFromRequest(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { @@ -128,7 +161,7 @@ private boolean isPermitAllUrl(String requestURI) { requestURI.startsWith("/webjars") || requestURI.startsWith("/find") || requestURI.startsWith("/search") || - requestURI.startsWith("/home") || + requestURI.matches("/collections/\\d+$") || requestURI.equals("/reset-password"); } } diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 5ee3732b..31aed43c 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -3,15 +3,10 @@ import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; import learningFlow.learningFlow_BE.converter.CollectionConverter; -import learningFlow.learningFlow_BE.converter.HomeConverter; -import learningFlow.learningFlow_BE.converter.ResourceConverter; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; -import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; -import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.RequiredArgsConstructor; @@ -19,20 +14,15 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.List; @Service @RequiredArgsConstructor -@Transactional(readOnly = true) public class CollectionService { private final CollectionRepository collectionRepository; - private final UserCollectionRepository userCollectionRepository; private static final int PAGE_SIZE = 8; - private static final int HOME_COLLECTION_SIZE = 6; public CollectionResponseDTO.CollectionPreviewDTO CollectionDetails(Long collectionId, PrincipalDetails principalDetails) { @@ -76,63 +66,6 @@ public CollectionResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchCondi return CollectionConverter.toSearchResultDTO(collections, lastCollection.getId(), hasNext, totalPages, currentPage, currentUser); } - public HomeResponseDTO.GuestHomeInfoDTO getGuestHomeCollections() { - List collections = collectionRepository.findTopBookmarkedCollections(HOME_COLLECTION_SIZE); - - return HomeConverter.convertToGuestHomeInfoDTO(CollectionConverter.convertToHomeCollection(collections)); - } - - public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { - // 최근 학습 컬렉션 조회 - HomeResponseDTO.RecentLearningDTO recentLearning = getRecentLearning(user); - - // 추천 컬렉션 목록 조회 - - // 1. interestField와 preferType 모두 충족 - List recommendedCollections = new ArrayList<>(collectionRepository.findByInterestFieldAndPreferType( - user.getInterestFields(), user.getPreferType(), true, true, HOME_COLLECTION_SIZE - )); - - // 2. interestField만 충족 - if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { - recommendedCollections.addAll( - collectionRepository.findByInterestFieldAndPreferType( - user.getInterestFields(), user.getPreferType(), true, false, - HOME_COLLECTION_SIZE - recommendedCollections.size() - ) - ); - } - - // 3. preferType만 충족 - if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { - recommendedCollections.addAll( - collectionRepository.findByInterestFieldAndPreferType( - user.getInterestFields(), user.getPreferType(), false, true, - HOME_COLLECTION_SIZE - recommendedCollections.size() - ) - ); - } - - // 4. 모두 불충족 - if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { - recommendedCollections.addAll( - collectionRepository.findByInterestFieldAndPreferType( - user.getInterestFields(), user.getPreferType(), false, false, - HOME_COLLECTION_SIZE - recommendedCollections.size() - ) - ); - } - - return HomeConverter.convertToUserHomeInfoDTO(recentLearning, recommendedCollections, user, HOME_COLLECTION_SIZE); - } - - private HomeResponseDTO.RecentLearningDTO getRecentLearning(User user) { - return userCollectionRepository - .findFirstByUserAndStatusOrderByLastAccessedAtDesc(user, UserCollectionStatus.IN_PROGRESS) - .map(ResourceConverter::toRecentLearningDTO) - .orElse(null); - } - private int calculateCurrentPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection) { return collectionRepository.getCountGreaterThanBookmark(lastCollection.getBookmarkCount(),lastCollection.getId(), condition) / PAGE_SIZE + 1; } diff --git a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 1daa94ce..6595e067 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -33,6 +33,7 @@ public class UserService { private final UserRepository userRepository; + private final UserConverter userConverter; private final CollectionRepository collectionRepository; private final UserCollectionRepository userCollectionRepository; @@ -42,7 +43,7 @@ public UserInfoDTO getUserInfo(String loginId) { User user = userRepository.findById(loginId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); - return UserConverter.convertToUserInfoDTO(user); + return userConverter.convertToUserInfoDTO(user); } @Transactional diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index ebf45e04..58c23fd8 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -7,22 +7,26 @@ import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.service.collection.CollectionService; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; +import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import static learningFlow.learningFlow_BE.converter.UserConverter.toUserLoginResponseDTO; + @RestController @RequiredArgsConstructor @RequestMapping("/home") +@Validated @Slf4j @Tag(name = "Home", description = "홈 화면 보여주는 API") public class HomeRestController { - private final CollectionService collectionService; @GetMapping @Operation(summary = "홈 화면 API", description = "홈 화면에 필요한 정보를 제공하는 API입니다.") @@ -30,15 +34,41 @@ public class HomeRestController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001", description = "사용자를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), }) - public ApiResponse getHome( + public ApiResponse getHome( +// @AuthenticationPrincipal PrincipalDetails principalDetails + ) { + // TODO : 추후 구현될 로직을 위한 주석 + + /** + * 1. 현재 로그인한 사용자 정보 조회 + * 2. 사용자 기반 추천 컬렉션 목록 조회 + * 3. 사용자의 최근 수강 컬렉션 목록 조회 + * 4. HomeInfoDto로 변환하여 반환 + */ + + /** + * Spring Security 사용하기 때문에 @AuthenticationPrincipal를 통해 바로 현재 인증된 사용자의 정보를 가져올 수 있음 + */ + +// User user = principalDetails.getUser(); + + return ApiResponse.onSuccess(null); + } + + + @GetMapping("/test") + @Operation(summary = "홈 화면 테스트용 API", description = "로그인, 로그아웃 상태 유지되는지 확인할 수 있는 API") + public ApiResponse getHomeTest( @AuthenticationPrincipal PrincipalDetails principalDetails ) { - if (principalDetails == null || principalDetails.getUser() == null) { - log.info("비회원"); - return ApiResponse.onSuccess(collectionService.getGuestHomeCollections()); - } else { - log.info("회원"); - return ApiResponse.onSuccess(collectionService.getUserHomeCollections(principalDetails.getUser())); + log.info("/home/test 시작"); + + if (principalDetails != null) { + log.info("인증된 사용자: {}", principalDetails.getUsername()); + return ApiResponse.onSuccess(toUserLoginResponseDTO(principalDetails.getUser())); } + + log.info("인증되지 않은 사용자"); + return ApiResponse.onSuccess(null); } } \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java index d379292c..6acc3fdb 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java @@ -1,12 +1,12 @@ package learningFlow.learningFlow_BE.web.dto.home; -import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; -import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; +import learningFlow.learningFlow_BE.domain.Image; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; import java.util.List; public class HomeResponseDTO { @@ -15,26 +15,38 @@ public class HomeResponseDTO { @Builder @NoArgsConstructor @AllArgsConstructor - public static class UserHomeInfoDTO { - RecentLearningDTO recentLearning; - List recommendedCollections; + public static class HomeInfoDTO { + List recommendedCollections; + List recentCollections; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class GuestHomeInfoDTO { - List recommendedCollections; + public static class RecommendedCollectionDTO { + Long collectionId; // 컬렉션 ID + String title; // 컬렉션 제목 + String creator; // 생성자 + Image image; // 컬렉션 이미지 URL + Integer difficulty; // 난이도 + String category; // 카테고리 + String detailInformation; // 상세 정보 + String collectionUrl; // 컬렉션 상세 페이지 URL } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class RecentLearningDTO { - private CollectionResponseDTO.CompletedCollectionDTO collection; - private List resources; - private String progressRatio; + public static class RecentCollectionDTO { + Long collectionId; // 컬렉션 ID + String title; // 컬렉션 제목 + String creator; // 생성자 + Image image; // 컬렉션 이미지 URL + LocalDateTime lastAccessedAt; // 마지막 접속 시간, UserCollection 엔티티의 lastAccessedAt 필드, 최신 순으로 정렬 시 사용 + Integer progress; // 진행률 + String collectionUrl; // 컬렉션 상세 페이지 URL + Integer currentEpisode; // 현재 학습 중인 에피소드 번호 } -} +} \ No newline at end of file From fdb373e4a61c9d9d70f4680339821610eb60959b Mon Sep 17 00:00:00 2001 From: Karen Date: Sun, 26 Jan 2025 02:30:24 +0900 Subject: [PATCH 114/256] Merged develop changes into deploy, excluding build.gradle --- ...eploy, excluding build.gradle\357\200\242" | 270 ++++++++++++++++++ .../config/security/SecurityConfig.java | 4 +- .../converter/CollectionConverter.java | 6 + .../converter/HomeConverter.java | 37 +++ .../converter/ResourceConverter.java | 53 +++- .../converter/UserConverter.java | 2 - .../learningFlow_BE/domain/User.java | 4 +- .../repository/UserCollectionRepository.java | 5 +- .../CollectionRepositoryCustom.java | 8 + .../collection/CollectionRepositoryImpl.java | 37 +++ .../security/jwt/JwtAuthenticationFilter.java | 151 ++++------ .../service/collection/CollectionService.java | 67 +++++ .../service/user/UserService.java | 3 +- .../web/controller/HomeRestController.java | 48 +--- .../web/dto/home/HomeResponseDTO.java | 36 +-- 15 files changed, 554 insertions(+), 177 deletions(-) create mode 100644 "into deploy, excluding build.gradle\357\200\242" create mode 100644 src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java diff --git "a/into deploy, excluding build.gradle\357\200\242" "b/into deploy, excluding build.gradle\357\200\242" new file mode 100644 index 00000000..59725788 --- /dev/null +++ "b/into deploy, excluding build.gradle\357\200\242" @@ -0,0 +1,270 @@ + + SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS + + Commands marked with * may be preceded by a number, _N. + Notes in parentheses indicate the behavior if _N is given. + A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K. + + h H Display this help. + q :q Q :Q ZZ Exit. + --------------------------------------------------------------------------- + + MMOOVVIINNGG + + e ^E j ^N CR * Forward one line (or _N lines). + y ^Y k ^K ^P * Backward one line (or _N lines). + f ^F ^V SPACE * Forward one window (or _N lines). + b ^B ESC-v * Backward one window (or _N lines). + z * Forward one window (and set window to _N). + w * Backward one window (and set window to _N). + ESC-SPACE * Forward one window, but don't stop at end-of-file. + d ^D * Forward one half-window (and set half-window to _N). + u ^U * Backward one half-window (and set half-window to _N). + ESC-) RightArrow * Right one half screen width (or _N positions). + ESC-( LeftArrow * Left one half screen width (or _N positions). + ESC-} ^RightArrow Right to last column displayed. + ESC-{ ^LeftArrow Left to first column. + F Forward forever; like "tail -f". + ESC-F Like F but stop when search pattern is found. + r ^R ^L Repaint screen. + R Repaint screen, discarding buffered input. + --------------------------------------------------- + Default "window" is the screen height. + Default "half-window" is half of the screen height. + --------------------------------------------------------------------------- + + SSEEAARRCCHHIINNGG + + /_p_a_t_t_e_r_n * Search forward for (_N-th) matching line. + ?_p_a_t_t_e_r_n * Search backward for (_N-th) matching line. + n * Repeat previous search (for _N-th occurrence). + N * Repeat previous search in reverse direction. + ESC-n * Repeat previous search, spanning files. + ESC-N * Repeat previous search, reverse dir. & spanning files. + ESC-u Undo (toggle) search highlighting. + ESC-U Clear search highlighting. + &_p_a_t_t_e_r_n * Display only matching lines. + --------------------------------------------------- + A search pattern may begin with one or more of: + ^N or ! Search for NON-matching lines. + ^E or * Search multiple files (pass thru END OF FILE). + ^F or @ Start search at FIRST file (for /) or last file (for ?). + ^K Highlight matches, but don't move (KEEP position). + ^R Don't use REGULAR EXPRESSIONS. + ^W WRAP search if no match found. + --------------------------------------------------------------------------- + + JJUUMMPPIINNGG + + g < ESC-< * Go to first line in file (or line _N). + G > ESC-> * Go to last line in file (or line _N). + p % * Go to beginning of file (or _N percent into file). + t * Go to the (_N-th) next tag. + T * Go to the (_N-th) previous tag. + { ( [ * Find close bracket } ) ]. + } ) ] * Find open bracket { ( [. + ESC-^F _<_c_1_> _<_c_2_> * Find close bracket _<_c_2_>. + ESC-^B _<_c_1_> _<_c_2_> * Find open bracket _<_c_1_>. + --------------------------------------------------- + Each "find close bracket" command goes forward to the close bracket + matching the (_N-th) open bracket in the top line. + Each "find open bracket" command goes backward to the open bracket + matching the (_N-th) close bracket in the bottom line. + + m_<_l_e_t_t_e_r_> Mark the current top line with . + M_<_l_e_t_t_e_r_> Mark the current bottom line with . + '_<_l_e_t_t_e_r_> Go to a previously marked position. + '' Go to the previous position. + ^X^X Same as '. + ESC-m_<_l_e_t_t_e_r_> Clear a mark. + --------------------------------------------------- + A mark is any upper-case or lower-case letter. + Certain marks are predefined: + ^ means beginning of the file + $ means end of the file + --------------------------------------------------------------------------- + + CCHHAANNGGIINNGG FFIILLEESS + + :e [_f_i_l_e] Examine a new file. + ^X^V Same as :e. + :n * Examine the (_N-th) next file from the command line. + :p * Examine the (_N-th) previous file from the command line. + :x * Examine the first (or _N-th) file from the command line. + :d Delete the current file from the command line list. + = ^G :f Print current file name. + --------------------------------------------------------------------------- + + MMIISSCCEELLLLAANNEEOOUUSS CCOOMMMMAANNDDSS + + -_<_f_l_a_g_> Toggle a command line option [see OPTIONS below]. + --_<_n_a_m_e_> Toggle a command line option, by name. + __<_f_l_a_g_> Display the setting of a command line option. + ___<_n_a_m_e_> Display the setting of an option, by name. + +_c_m_d Execute the less cmd each time a new file is examined. + + !_c_o_m_m_a_n_d Execute the shell command with $SHELL. + |XX_c_o_m_m_a_n_d Pipe file between current pos & mark XX to shell command. + s _f_i_l_e Save input to a file. + v Edit the current file with $VISUAL or $EDITOR. + V Print version number of "less". + --------------------------------------------------------------------------- + + OOPPTTIIOONNSS + + Most options may be changed either on the command line, + or from within less by using the - or -- command. + Options may be given in one of two forms: either a single + character preceded by a -, or a name preceded by --. + + -? ........ --help + Display help (from command line). + -a ........ --search-skip-screen + Search skips current screen. + -A ........ --SEARCH-SKIP-SCREEN + Search starts just after target line. + -b [_N] .... --buffers=[_N] + Number of buffers. + -B ........ --auto-buffers + Don't automatically allocate buffers for pipes. + -c ........ --clear-screen + Repaint by clearing rather than scrolling. + -d ........ --dumb + Dumb terminal. + -D xx_c_o_l_o_r . --color=xx_c_o_l_o_r + Set screen colors. + -e -E .... --quit-at-eof --QUIT-AT-EOF + Quit at end of file. + -f ........ --force + Force open non-regular files. + -F ........ --quit-if-one-screen + Quit if entire file fits on first screen. + -g ........ --hilite-search + Highlight only last match for searches. + -G ........ --HILITE-SEARCH + Don't highlight any matches for searches. + -h [_N] .... --max-back-scroll=[_N] + Backward scroll limit. + -i ........ --ignore-case + Ignore case in searches that do not contain uppercase. + -I ........ --IGNORE-CASE + Ignore case in all searches. + -j [_N] .... --jump-target=[_N] + Screen position of target lines. + -J ........ --status-column + Display a status column at left edge of screen. + -k [_f_i_l_e] . --lesskey-file=[_f_i_l_e] + Use a lesskey file. + -K ........ --quit-on-intr + Exit less in response to ctrl-C. + -L ........ --no-lessopen + Ignore the LESSOPEN environment variable. + -m -M .... --long-prompt --LONG-PROMPT + Set prompt style. + -n ......... --line-numbers + Suppress line numbers in prompts and messages. + -N ......... --LINE-NUMBERS + Display line number at start of each line. + -o [_f_i_l_e] . --log-file=[_f_i_l_e] + Copy to log file (standard input only). + -O [_f_i_l_e] . --LOG-FILE=[_f_i_l_e] + Copy to log file (unconditionally overwrite). + -p [_p_a_t_t_e_r_n] --pattern=[_p_a_t_t_e_r_n] + Start at pattern (from command line). + -P [_p_r_o_m_p_t] --prompt=[_p_r_o_m_p_t] + Define new prompt. + -q -Q .... --quiet --QUIET --silent --SILENT + Quiet the terminal bell. + -r -R .... --raw-control-chars --RAW-CONTROL-CHARS + Output "raw" control characters. + -s ........ --squeeze-blank-lines + Squeeze multiple blank lines. + -S ........ --chop-long-lines + Chop (truncate) long lines rather than wrapping. + -t [_t_a_g] .. --tag=[_t_a_g] + Find a tag. + -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e] + Use an alternate tags file. + -u -U .... --underline-special --UNDERLINE-SPECIAL + Change handling of backspaces. + -V ........ --version + Display the version number of "less". + -w ........ --hilite-unread + Highlight first new line after forward-screen. + -W ........ --HILITE-UNREAD + Highlight first new line after any forward movement. + -x [_N[,...]] --tabs=[_N[,...]] + Set tab stops. + -X ........ --no-init + Don't use termcap init/deinit strings. + -y [_N] .... --max-forw-scroll=[_N] + Forward scroll limit. + -z [_N] .... --window=[_N] + Set size of window. + -" [_c[_c]] . --quotes=[_c[_c]] + Set shell quote characters. + -~ ........ --tilde + Don't display tildes after end of file. + -# [_N] .... --shift=[_N] + Set horizontal scroll amount (0 = one half screen width). + --file-size + Automatically determine the size of the input file. + --follow-name + The F command changes files if the input file is renamed. + --header=[_N[,_M]] + Use N lines and M columns to display file headers. + --incsearch + Search file as each pattern character is typed in. + --line-num-width=N + Set the width of the -N line number field to N characters. + --mouse + Enable mouse input. + --no-keypad + Don't send termcap keypad init/deinit strings. + --no-histdups + Remove duplicates from command history. + --no-number-headers + Don't give line numbers to header lines. + --redraw-on-quit + Redraw final screen when quitting. + --rscroll=C + Set the character used to mark truncated lines. + --save-marks + Retain marks across invocations of less. + --search-options=[EFKNRW-] + Set default options for every search. + --status-col-width=N + Set the width of the -J status column to N characters. + --status-line + Highlight or color the entire line containing a mark. + --use-backslash + Subsequent options use backslash as escape char. + --use-color + Enables colored text. + --wheel-lines=N + Each click of the mouse wheel moves N lines. + + + --------------------------------------------------------------------------- + + LLIINNEE EEDDIITTIINNGG + + These keys can be used to edit text being entered + on the "command line" at the bottom of the screen. + + RightArrow ..................... ESC-l ... Move cursor right one character. + LeftArrow ...................... ESC-h ... Move cursor left one character. + ctrl-RightArrow ESC-RightArrow ESC-w ... Move cursor right one word. + ctrl-LeftArrow ESC-LeftArrow ESC-b ... Move cursor left one word. + HOME ........................... ESC-0 ... Move cursor to start of line. + END ............................ ESC-$ ... Move cursor to end of line. + BACKSPACE ................................ Delete char to left of cursor. + DELETE ......................... ESC-x ... Delete char under cursor. + ctrl-BACKSPACE ESC-BACKSPACE ........... Delete word to left of cursor. + ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor. + ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line. + UpArrow ........................ ESC-k ... Retrieve previous command line. + DownArrow ...................... ESC-j ... Retrieve next command line. + TAB ...................................... Complete filename & cycle. + SHIFT-TAB ...................... ESC-TAB Complete filename & reverse cycle. + ctrl-L ................................... Complete filename, list all. diff --git a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index ea7d02f6..dce1da23 100644 --- a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -45,11 +45,11 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte "/find/**", "/reset-password", "/search/**", + "/home/**", "/collections/{collectionId:[\\d]+}" ).permitAll() .requestMatchers( - "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", - "/home/**").permitAll() + "/register", "/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**", "/resources/**", "/collections/{collectionId}/bookmark").authenticated() .anyRequest().permitAll() diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index 8471c499..59761a8d 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -11,6 +11,12 @@ public class CollectionConverter { + public static List convertToHomeCollection(List collections) { + return collections.stream() + .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, null)) + .toList(); + } + public static SearchRequestDTO.SearchConditionDTO toSearchConditionDTO( String keyword, InterestField interestFields, diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java new file mode 100644 index 00000000..8e58a92b --- /dev/null +++ b/src/main/java/learningFlow/learningFlow_BE/converter/HomeConverter.java @@ -0,0 +1,37 @@ +package learningFlow.learningFlow_BE.converter; + +import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; + +import java.util.List; + +public class HomeConverter { + + public static HomeResponseDTO.GuestHomeInfoDTO convertToGuestHomeInfoDTO( + List collectionPreviewList + ) { + return HomeResponseDTO.GuestHomeInfoDTO.builder() + .recommendedCollections(collectionPreviewList) + .build(); + } + + public static HomeResponseDTO.UserHomeInfoDTO convertToUserHomeInfoDTO( + HomeResponseDTO.RecentLearningDTO recentLearning, + List recommendedCollections, + User user, + int size + ) { + List recommendedPreviewDTOs = recommendedCollections.stream() + .distinct() + .map(collection -> CollectionConverter.toCollectionPreviewDTO(collection, user)) + .limit(size) + .toList(); + + return HomeResponseDTO.UserHomeInfoDTO.builder() + .recentLearning(recentLearning) + .recommendedCollections(recommendedPreviewDTOs) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index b1e689f5..8c072e7c 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -3,12 +3,39 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.domain.UserCollection; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import java.util.List; public class ResourceConverter { + public static HomeResponseDTO.RecentLearningDTO toRecentLearningDTO(UserCollection userCollection) { + Collection collection = userCollection.getCollection(); + int currentEpisode = userCollection.getUserCollectionStatus(); + + List resources = collection.getEpisodes().stream() + .filter(episode -> episode.getEpisodeNumber() <= currentEpisode) + .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() + .resourceId(episode.getResource().getId()) + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .build()) + .toList(); + + CollectionResponseDTO.CompletedCollectionDTO completedCollectionDTO + = CollectionConverter.convertToCompletedCollectionDTO(userCollection); + + return HomeResponseDTO.RecentLearningDTO.builder() + .collection(completedCollectionDTO) + .resources(resources) + .progressRatio(calculateProgressRatio(userCollection)) + .build(); + } + public static List getResourceDTOList(Collection collection) { return collection.getEpisodes().stream() @@ -22,6 +49,19 @@ public static List getResourceDTOLi .toList(); } + public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( + UserCollection userCollection + ) { + return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() + .resourceId(getResourceId(userCollection)) + .CollectionTitle(userCollection.getCollection().getTitle()) + .resourceSource(extractResourceSource(getResourceUrl(userCollection))) + .episodeNumber(userCollection.getUserCollectionStatus()) + .episodeName(getEpisodeName(userCollection)) + .progressRatio(calculateProgressRatio(userCollection)) + .build(); + } + private static String extractResourceSource(String url) { String lowerCaseUrl = url.toLowerCase(); @@ -39,19 +79,6 @@ private static String extractResourceSource(String url) { } } - public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( - UserCollection userCollection - ) { - return ResourceResponseDTO.RecentlyWatchedEpisodeDTO.builder() - .resourceId(getResourceId(userCollection)) - .CollectionTitle(userCollection.getCollection().getTitle()) - .resourceSource(extractResourceSource(getResourceUrl(userCollection))) - .episodeNumber(userCollection.getUserCollectionStatus()) - .episodeName(getEpisodeName(userCollection)) - .progressRatio(calculateProgressRatio(userCollection)) - .build(); - } - private static String getResourceUrl(UserCollection userCollection) { return userCollection.getCollection().getEpisodes().stream() .filter(episode -> episode.getEpisodeNumber().equals(userCollection.getUserCollectionStatus())) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java index 3e58d43c..52439dc2 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java @@ -6,11 +6,9 @@ import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; -import org.springframework.stereotype.Component; import java.util.List; -@Component public class UserConverter { public static UserResponseDTO.UserLoginResponseDTO toUserLoginResponseDTO(User user) { diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/src/main/java/learningFlow/learningFlow_BE/domain/User.java index c5299b90..8bf7788e 100644 --- a/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -43,7 +43,7 @@ public class User extends BaseEntity { @Column(nullable = false) private Job job; - @ElementCollection(fetch = FetchType.LAZY) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "user_interests") @Enumerated(EnumType.STRING) @Column(name = "interest_field", nullable = false) @@ -68,7 +68,7 @@ public class User extends BaseEntity { @JoinColumn(name = "image_id") private Image image; - @ElementCollection(fetch = FetchType.LAZY) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "user_bookmarks", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "collection_id") private List bookmarkedCollectionIds = new ArrayList<>(); diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java index 81a8579d..28e4f1e3 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -6,7 +6,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface UserCollectionRepository extends JpaRepository { List findByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); -} + + Optional findFirstByUserAndStatusOrderByLastAccessedAtDesc(User user, UserCollectionStatus status); +} \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java index 5db2bf75..432c81a5 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java @@ -1,6 +1,8 @@ package learningFlow.learningFlow_BE.repository.collection; import learningFlow.learningFlow_BE.domain.Collection; +import learningFlow.learningFlow_BE.domain.enums.MediaType; +import learningFlow.learningFlow_BE.domain.enums.InterestField; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import org.springframework.data.domain.Pageable; @@ -11,4 +13,10 @@ public interface CollectionRepositoryCustom { Integer getTotalCount(SearchRequestDTO.SearchConditionDTO condition); List searchNextPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection, Pageable pageable); Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, SearchRequestDTO.SearchConditionDTO condition); + List findTopBookmarkedCollections(int limit); + List findByInterestFieldAndPreferType(List interestFields, + MediaType preferType, + boolean matchInterest, + boolean matchPreferType, + int limit); } diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java index 0bdc1e23..7f6a3342 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java @@ -9,6 +9,7 @@ import learningFlow.learningFlow_BE.domain.QCollection; import learningFlow.learningFlow_BE.domain.QCollectionEpisode; import learningFlow.learningFlow_BE.domain.enums.InterestField; +import learningFlow.learningFlow_BE.domain.enums.MediaType; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -112,6 +113,42 @@ public Integer getCountGreaterThanBookmark(Integer bookmarkCount, Long lastId, S return count != null ? count.intValue() : 0; } + @Override + public List findTopBookmarkedCollections(int limit) { + return jpaQueryFactory + .selectFrom(collection) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit) + .fetch(); + } + + @Override + public List findByInterestFieldAndPreferType( + List interestFields, + MediaType preferType, + boolean matchInterest, + boolean matchPreferType, + int limit + ) { + + BooleanExpression interestCondition = matchInterest ? + collection.interestField.in(interestFields) : collection.interestField.notIn(interestFields); + + BooleanExpression preferTypeCondition = null; + if (preferType != MediaType.NO_PREFERENCE) { + preferTypeCondition = preferType == MediaType.VIDEO ? + (matchPreferType ? collection.resourceTypeRatio.goe(50) : collection.resourceTypeRatio.lt(50)) : + (matchPreferType ? collection.resourceTypeRatio.lt(50) : collection.resourceTypeRatio.goe(50)); + } + + return jpaQueryFactory + .selectFrom(collection) + .where(interestCondition, preferTypeCondition) + .orderBy(collection.bookmarkCount.desc()) + .limit(limit) + .fetch(); + } + private BooleanExpression createDynamicInterestFields(InterestField interestFields) { if (interestFields == null) { return null; diff --git a/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java index 2399a229..785aab60 100644 --- a/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/learningFlow/learningFlow_BE/security/jwt/JwtAuthenticationFilter.java @@ -30,117 +30,84 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - log.info("JWT 필터 진입, URL: {}", request.getRequestURI()); - - /** - * 로그인, 회원가입 등 인증이 필요없는 경로는 토큰 검증을 건너뛰도록 설정 - * 인증 미필요 URL 체크 - */ - if (isPermitAllUrl(request.getRequestURI())) { - log.info("인증이 필요없는 URL: {}", request.getRequestURI()); - filterChain.doFilter(request, response); - return; - } + String jwt = getJwtFromRequest(request); try { - String jwt = getJwtFromRequest(request); - log.info("요청에서 추출한 토큰: {}", jwt); - - if (!StringUtils.hasText(jwt)) { - log.info("토큰이 없는 요청"); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write( - new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) - ) - ); - return; - } - //AccessToken 검증 - if (jwtTokenProvider.validateToken(jwt)) { + if (StringUtils.hasText(jwt)) { + if (jwtTokenProvider.validateToken(jwt)) { + log.info("유효한 Access Token"); - log.info("유효한 Access Token"); + if (!request.getRequestURI().equals("/logout/test")) { + Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); + log.info("블랙리스트 체크 결과: {}", isBlacklisted); - //로그아웃 요청이 아닌 경우에만 블랙리스트 체크 - if (!request.getRequestURI().equals("/logout/test")) { - //TODO : 테스트 위해서 URI 설정을 /logout/test로 해놓음. 추후 수정 필요 - //Redis에서 블랙리스트 체크하기 - 로그아웃된 사용자인지 여부 파악 - Boolean isBlacklisted = redisTemplate.hasKey("BLACKLIST:" + jwt); - log.info("블랙리스트 체크 결과: {}", isBlacklisted); - - if (Boolean.TRUE.equals(isBlacklisted)) { - throw new RuntimeException("이미 로그아웃된 토큰입니다."); + if (Boolean.TRUE.equals(isBlacklisted)) { + throw new RuntimeException("이미 로그아웃된 토큰입니다."); + } } - } - - //유효한 토큰이면 인증 처리 - String email = jwtTokenProvider.getEmailFromToken(jwt); - log.info("토큰에서 추출한 이메일: {}", email); - - UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); - UsernamePasswordAuthenticationToken authentication - = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("인증 정보 SecurityContext에 저장"); - } else { - log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); - // Access Token이 만료된 경우, Refresh Token 확인 - String refreshToken = request.getHeader("Refresh-Token"); - log.info("전달받은 Refresh Token: {}", refreshToken); - - if (!StringUtils.hasText(refreshToken)) { - log.info("Refresh Token이 없음 - 재로그인 필요"); - response.setContentType("application/json"); - response.setCharacterEncoding("UTF-8"); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - String error = new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("401", "토큰이 만료되었습니다. 다시 로그인해주세요.", null) - ); - response.getWriter().write(error); - return; - } - if (jwtTokenProvider.validateToken(refreshToken)) { - log.info("유효한 Refresh Token. 새로운 Access Token을 발급 시작"); + String email = jwtTokenProvider.getEmailFromToken(jwt); + log.info("토큰에서 추출한 이메일: {}", email); - // Refresh Token이 유효하면 새로운 Access Token 발급 - String email = jwtTokenProvider.getEmailFromToken(refreshToken); UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); - UsernamePasswordAuthenticationToken authentication - = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - - //새로운 AccessToken 발급 및 헤더에 추가 - String newAccessToken = jwtTokenProvider.createAccessToken(authentication); - log.info("새로 발급된 Access Token: {}", newAccessToken); - response.addHeader("Authorization", "Bearer " + newAccessToken); - - //새로운 토큰으로 인증 처리 authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); + log.info("인증 정보 SecurityContext에 저장"); + + } else { + log.info("Access Token이 만료되어 Refresh Token 확인을 시도"); + String refreshToken = request.getHeader("Refresh-Token"); + log.info("전달받은 Refresh Token: {}", refreshToken); + + if (!StringUtils.hasText(refreshToken)) { + if (!isPermitAllUrl(request.getRequestURI())) { + handleAuthenticationError(response, "토큰이 만료되었습니다. 다시 로그인해주세요."); + return; + } + } else if (jwtTokenProvider.validateToken(refreshToken)) { + String email = jwtTokenProvider.getEmailFromToken(refreshToken); + UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); + + String newAccessToken = jwtTokenProvider.createAccessToken(authentication); + log.info("새로 발급된 Access Token: {}", newAccessToken); + response.addHeader("Authorization", "Bearer " + newAccessToken); + + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("새로운 Access Token으로 인증 정보를 업데이트 완료"); + } } + } else if (!isPermitAllUrl(request.getRequestURI())) { + handleAuthenticationError(response, "로그인이 필요한 서비스입니다."); + return; } } catch (Exception e) { - log.error("Security Context에서 사용자 인증을 설정할 수 없습니다: {}", e.getMessage()); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write( - new ObjectMapper().writeValueAsString( - ApiResponse.onFailure("AUTH4001", "로그인이 필요한 서비스입니다.", null) - ) - ); - return; + if (!isPermitAllUrl(request.getRequestURI())) { + handleAuthenticationError(response, "로그인이 필요한 서비스입니다."); + return; + } } filterChain.doFilter(request, response); } + private void handleAuthenticationError(HttpServletResponse response, String message) throws IOException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + new ObjectMapper().writeValueAsString( + ApiResponse.onFailure("AUTH4001", message, null) + ) + ); + } + private String getJwtFromRequest(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { @@ -161,7 +128,7 @@ private boolean isPermitAllUrl(String requestURI) { requestURI.startsWith("/webjars") || requestURI.startsWith("/find") || requestURI.startsWith("/search") || - requestURI.matches("/collections/\\d+$") || + requestURI.startsWith("/home") || requestURI.equals("/reset-password"); } } diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 31aed43c..5ee3732b 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -3,10 +3,15 @@ import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.CollectionHandler; import learningFlow.learningFlow_BE.converter.CollectionConverter; +import learningFlow.learningFlow_BE.converter.HomeConverter; +import learningFlow.learningFlow_BE.converter.ResourceConverter; import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; +import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; +import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; import learningFlow.learningFlow_BE.web.dto.search.SearchRequestDTO; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import lombok.RequiredArgsConstructor; @@ -14,15 +19,20 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class CollectionService { private final CollectionRepository collectionRepository; + private final UserCollectionRepository userCollectionRepository; private static final int PAGE_SIZE = 8; + private static final int HOME_COLLECTION_SIZE = 6; public CollectionResponseDTO.CollectionPreviewDTO CollectionDetails(Long collectionId, PrincipalDetails principalDetails) { @@ -66,6 +76,63 @@ public CollectionResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchCondi return CollectionConverter.toSearchResultDTO(collections, lastCollection.getId(), hasNext, totalPages, currentPage, currentUser); } + public HomeResponseDTO.GuestHomeInfoDTO getGuestHomeCollections() { + List collections = collectionRepository.findTopBookmarkedCollections(HOME_COLLECTION_SIZE); + + return HomeConverter.convertToGuestHomeInfoDTO(CollectionConverter.convertToHomeCollection(collections)); + } + + public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { + // 최근 학습 컬렉션 조회 + HomeResponseDTO.RecentLearningDTO recentLearning = getRecentLearning(user); + + // 추천 컬렉션 목록 조회 + + // 1. interestField와 preferType 모두 충족 + List recommendedCollections = new ArrayList<>(collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), true, true, HOME_COLLECTION_SIZE + )); + + // 2. interestField만 충족 + if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { + recommendedCollections.addAll( + collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), true, false, + HOME_COLLECTION_SIZE - recommendedCollections.size() + ) + ); + } + + // 3. preferType만 충족 + if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { + recommendedCollections.addAll( + collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), false, true, + HOME_COLLECTION_SIZE - recommendedCollections.size() + ) + ); + } + + // 4. 모두 불충족 + if (recommendedCollections.size() < HOME_COLLECTION_SIZE) { + recommendedCollections.addAll( + collectionRepository.findByInterestFieldAndPreferType( + user.getInterestFields(), user.getPreferType(), false, false, + HOME_COLLECTION_SIZE - recommendedCollections.size() + ) + ); + } + + return HomeConverter.convertToUserHomeInfoDTO(recentLearning, recommendedCollections, user, HOME_COLLECTION_SIZE); + } + + private HomeResponseDTO.RecentLearningDTO getRecentLearning(User user) { + return userCollectionRepository + .findFirstByUserAndStatusOrderByLastAccessedAtDesc(user, UserCollectionStatus.IN_PROGRESS) + .map(ResourceConverter::toRecentLearningDTO) + .orElse(null); + } + private int calculateCurrentPage(SearchRequestDTO.SearchConditionDTO condition, Collection lastCollection) { return collectionRepository.getCountGreaterThanBookmark(lastCollection.getBookmarkCount(),lastCollection.getId(), condition) / PAGE_SIZE + 1; } diff --git a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 6595e067..1daa94ce 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -33,7 +33,6 @@ public class UserService { private final UserRepository userRepository; - private final UserConverter userConverter; private final CollectionRepository collectionRepository; private final UserCollectionRepository userCollectionRepository; @@ -43,7 +42,7 @@ public UserInfoDTO getUserInfo(String loginId) { User user = userRepository.findById(loginId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); - return userConverter.convertToUserInfoDTO(user); + return UserConverter.convertToUserInfoDTO(user); } @Transactional diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index 58c23fd8..ebf45e04 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -7,26 +7,22 @@ import io.swagger.v3.oas.annotations.tags.Tag; import learningFlow.learningFlow_BE.apiPayload.ApiResponse; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; -import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO.HomeInfoDTO; -import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; +import learningFlow.learningFlow_BE.service.collection.CollectionService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import static learningFlow.learningFlow_BE.converter.UserConverter.toUserLoginResponseDTO; - @RestController @RequiredArgsConstructor @RequestMapping("/home") -@Validated @Slf4j @Tag(name = "Home", description = "홈 화면 보여주는 API") public class HomeRestController { + private final CollectionService collectionService; @GetMapping @Operation(summary = "홈 화면 API", description = "홈 화면에 필요한 정보를 제공하는 API입니다.") @@ -34,41 +30,15 @@ public class HomeRestController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER4001", description = "사용자를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), }) - public ApiResponse getHome( -// @AuthenticationPrincipal PrincipalDetails principalDetails - ) { - // TODO : 추후 구현될 로직을 위한 주석 - - /** - * 1. 현재 로그인한 사용자 정보 조회 - * 2. 사용자 기반 추천 컬렉션 목록 조회 - * 3. 사용자의 최근 수강 컬렉션 목록 조회 - * 4. HomeInfoDto로 변환하여 반환 - */ - - /** - * Spring Security 사용하기 때문에 @AuthenticationPrincipal를 통해 바로 현재 인증된 사용자의 정보를 가져올 수 있음 - */ - -// User user = principalDetails.getUser(); - - return ApiResponse.onSuccess(null); - } - - - @GetMapping("/test") - @Operation(summary = "홈 화면 테스트용 API", description = "로그인, 로그아웃 상태 유지되는지 확인할 수 있는 API") - public ApiResponse getHomeTest( + public ApiResponse getHome( @AuthenticationPrincipal PrincipalDetails principalDetails ) { - log.info("/home/test 시작"); - - if (principalDetails != null) { - log.info("인증된 사용자: {}", principalDetails.getUsername()); - return ApiResponse.onSuccess(toUserLoginResponseDTO(principalDetails.getUser())); + if (principalDetails == null || principalDetails.getUser() == null) { + log.info("비회원"); + return ApiResponse.onSuccess(collectionService.getGuestHomeCollections()); + } else { + log.info("회원"); + return ApiResponse.onSuccess(collectionService.getUserHomeCollections(principalDetails.getUser())); } - - log.info("인증되지 않은 사용자"); - return ApiResponse.onSuccess(null); } } \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java index 6acc3fdb..d379292c 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/home/HomeResponseDTO.java @@ -1,12 +1,12 @@ package learningFlow.learningFlow_BE.web.dto.home; -import learningFlow.learningFlow_BE.domain.Image; +import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; +import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; import java.util.List; public class HomeResponseDTO { @@ -15,38 +15,26 @@ public class HomeResponseDTO { @Builder @NoArgsConstructor @AllArgsConstructor - public static class HomeInfoDTO { - List recommendedCollections; - List recentCollections; + public static class UserHomeInfoDTO { + RecentLearningDTO recentLearning; + List recommendedCollections; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class RecommendedCollectionDTO { - Long collectionId; // 컬렉션 ID - String title; // 컬렉션 제목 - String creator; // 생성자 - Image image; // 컬렉션 이미지 URL - Integer difficulty; // 난이도 - String category; // 카테고리 - String detailInformation; // 상세 정보 - String collectionUrl; // 컬렉션 상세 페이지 URL + public static class GuestHomeInfoDTO { + List recommendedCollections; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor - public static class RecentCollectionDTO { - Long collectionId; // 컬렉션 ID - String title; // 컬렉션 제목 - String creator; // 생성자 - Image image; // 컬렉션 이미지 URL - LocalDateTime lastAccessedAt; // 마지막 접속 시간, UserCollection 엔티티의 lastAccessedAt 필드, 최신 순으로 정렬 시 사용 - Integer progress; // 진행률 - String collectionUrl; // 컬렉션 상세 페이지 URL - Integer currentEpisode; // 현재 학습 중인 에피소드 번호 + public static class RecentLearningDTO { + private CollectionResponseDTO.CompletedCollectionDTO collection; + private List resources; + private String progressRatio; } -} \ No newline at end of file +} From d514dc5e9e44217e5d3cbe773ff297b57042e441 Mon Sep 17 00:00:00 2001 From: Karen Date: Sun, 26 Jan 2025 02:39:25 +0900 Subject: [PATCH 115/256] =?UTF-8?q?[hotfix]=20=EC=B6=A9=EB=8F=8C=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + ...eploy, excluding build.gradle\357\200\242" | 270 ------------------ 2 files changed, 1 insertion(+), 270 deletions(-) delete mode 100644 "into deploy, excluding build.gradle\357\200\242" diff --git a/build.gradle b/build.gradle index 9e5316ac..7a7ae726 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,7 @@ dependencies { annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" + } tasks.named('test') { diff --git "a/into deploy, excluding build.gradle\357\200\242" "b/into deploy, excluding build.gradle\357\200\242" deleted file mode 100644 index 59725788..00000000 --- "a/into deploy, excluding build.gradle\357\200\242" +++ /dev/null @@ -1,270 +0,0 @@ - - SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS - - Commands marked with * may be preceded by a number, _N. - Notes in parentheses indicate the behavior if _N is given. - A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K. - - h H Display this help. - q :q Q :Q ZZ Exit. - --------------------------------------------------------------------------- - - MMOOVVIINNGG - - e ^E j ^N CR * Forward one line (or _N lines). - y ^Y k ^K ^P * Backward one line (or _N lines). - f ^F ^V SPACE * Forward one window (or _N lines). - b ^B ESC-v * Backward one window (or _N lines). - z * Forward one window (and set window to _N). - w * Backward one window (and set window to _N). - ESC-SPACE * Forward one window, but don't stop at end-of-file. - d ^D * Forward one half-window (and set half-window to _N). - u ^U * Backward one half-window (and set half-window to _N). - ESC-) RightArrow * Right one half screen width (or _N positions). - ESC-( LeftArrow * Left one half screen width (or _N positions). - ESC-} ^RightArrow Right to last column displayed. - ESC-{ ^LeftArrow Left to first column. - F Forward forever; like "tail -f". - ESC-F Like F but stop when search pattern is found. - r ^R ^L Repaint screen. - R Repaint screen, discarding buffered input. - --------------------------------------------------- - Default "window" is the screen height. - Default "half-window" is half of the screen height. - --------------------------------------------------------------------------- - - SSEEAARRCCHHIINNGG - - /_p_a_t_t_e_r_n * Search forward for (_N-th) matching line. - ?_p_a_t_t_e_r_n * Search backward for (_N-th) matching line. - n * Repeat previous search (for _N-th occurrence). - N * Repeat previous search in reverse direction. - ESC-n * Repeat previous search, spanning files. - ESC-N * Repeat previous search, reverse dir. & spanning files. - ESC-u Undo (toggle) search highlighting. - ESC-U Clear search highlighting. - &_p_a_t_t_e_r_n * Display only matching lines. - --------------------------------------------------- - A search pattern may begin with one or more of: - ^N or ! Search for NON-matching lines. - ^E or * Search multiple files (pass thru END OF FILE). - ^F or @ Start search at FIRST file (for /) or last file (for ?). - ^K Highlight matches, but don't move (KEEP position). - ^R Don't use REGULAR EXPRESSIONS. - ^W WRAP search if no match found. - --------------------------------------------------------------------------- - - JJUUMMPPIINNGG - - g < ESC-< * Go to first line in file (or line _N). - G > ESC-> * Go to last line in file (or line _N). - p % * Go to beginning of file (or _N percent into file). - t * Go to the (_N-th) next tag. - T * Go to the (_N-th) previous tag. - { ( [ * Find close bracket } ) ]. - } ) ] * Find open bracket { ( [. - ESC-^F _<_c_1_> _<_c_2_> * Find close bracket _<_c_2_>. - ESC-^B _<_c_1_> _<_c_2_> * Find open bracket _<_c_1_>. - --------------------------------------------------- - Each "find close bracket" command goes forward to the close bracket - matching the (_N-th) open bracket in the top line. - Each "find open bracket" command goes backward to the open bracket - matching the (_N-th) close bracket in the bottom line. - - m_<_l_e_t_t_e_r_> Mark the current top line with . - M_<_l_e_t_t_e_r_> Mark the current bottom line with . - '_<_l_e_t_t_e_r_> Go to a previously marked position. - '' Go to the previous position. - ^X^X Same as '. - ESC-m_<_l_e_t_t_e_r_> Clear a mark. - --------------------------------------------------- - A mark is any upper-case or lower-case letter. - Certain marks are predefined: - ^ means beginning of the file - $ means end of the file - --------------------------------------------------------------------------- - - CCHHAANNGGIINNGG FFIILLEESS - - :e [_f_i_l_e] Examine a new file. - ^X^V Same as :e. - :n * Examine the (_N-th) next file from the command line. - :p * Examine the (_N-th) previous file from the command line. - :x * Examine the first (or _N-th) file from the command line. - :d Delete the current file from the command line list. - = ^G :f Print current file name. - --------------------------------------------------------------------------- - - MMIISSCCEELLLLAANNEEOOUUSS CCOOMMMMAANNDDSS - - -_<_f_l_a_g_> Toggle a command line option [see OPTIONS below]. - --_<_n_a_m_e_> Toggle a command line option, by name. - __<_f_l_a_g_> Display the setting of a command line option. - ___<_n_a_m_e_> Display the setting of an option, by name. - +_c_m_d Execute the less cmd each time a new file is examined. - - !_c_o_m_m_a_n_d Execute the shell command with $SHELL. - |XX_c_o_m_m_a_n_d Pipe file between current pos & mark XX to shell command. - s _f_i_l_e Save input to a file. - v Edit the current file with $VISUAL or $EDITOR. - V Print version number of "less". - --------------------------------------------------------------------------- - - OOPPTTIIOONNSS - - Most options may be changed either on the command line, - or from within less by using the - or -- command. - Options may be given in one of two forms: either a single - character preceded by a -, or a name preceded by --. - - -? ........ --help - Display help (from command line). - -a ........ --search-skip-screen - Search skips current screen. - -A ........ --SEARCH-SKIP-SCREEN - Search starts just after target line. - -b [_N] .... --buffers=[_N] - Number of buffers. - -B ........ --auto-buffers - Don't automatically allocate buffers for pipes. - -c ........ --clear-screen - Repaint by clearing rather than scrolling. - -d ........ --dumb - Dumb terminal. - -D xx_c_o_l_o_r . --color=xx_c_o_l_o_r - Set screen colors. - -e -E .... --quit-at-eof --QUIT-AT-EOF - Quit at end of file. - -f ........ --force - Force open non-regular files. - -F ........ --quit-if-one-screen - Quit if entire file fits on first screen. - -g ........ --hilite-search - Highlight only last match for searches. - -G ........ --HILITE-SEARCH - Don't highlight any matches for searches. - -h [_N] .... --max-back-scroll=[_N] - Backward scroll limit. - -i ........ --ignore-case - Ignore case in searches that do not contain uppercase. - -I ........ --IGNORE-CASE - Ignore case in all searches. - -j [_N] .... --jump-target=[_N] - Screen position of target lines. - -J ........ --status-column - Display a status column at left edge of screen. - -k [_f_i_l_e] . --lesskey-file=[_f_i_l_e] - Use a lesskey file. - -K ........ --quit-on-intr - Exit less in response to ctrl-C. - -L ........ --no-lessopen - Ignore the LESSOPEN environment variable. - -m -M .... --long-prompt --LONG-PROMPT - Set prompt style. - -n ......... --line-numbers - Suppress line numbers in prompts and messages. - -N ......... --LINE-NUMBERS - Display line number at start of each line. - -o [_f_i_l_e] . --log-file=[_f_i_l_e] - Copy to log file (standard input only). - -O [_f_i_l_e] . --LOG-FILE=[_f_i_l_e] - Copy to log file (unconditionally overwrite). - -p [_p_a_t_t_e_r_n] --pattern=[_p_a_t_t_e_r_n] - Start at pattern (from command line). - -P [_p_r_o_m_p_t] --prompt=[_p_r_o_m_p_t] - Define new prompt. - -q -Q .... --quiet --QUIET --silent --SILENT - Quiet the terminal bell. - -r -R .... --raw-control-chars --RAW-CONTROL-CHARS - Output "raw" control characters. - -s ........ --squeeze-blank-lines - Squeeze multiple blank lines. - -S ........ --chop-long-lines - Chop (truncate) long lines rather than wrapping. - -t [_t_a_g] .. --tag=[_t_a_g] - Find a tag. - -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e] - Use an alternate tags file. - -u -U .... --underline-special --UNDERLINE-SPECIAL - Change handling of backspaces. - -V ........ --version - Display the version number of "less". - -w ........ --hilite-unread - Highlight first new line after forward-screen. - -W ........ --HILITE-UNREAD - Highlight first new line after any forward movement. - -x [_N[,...]] --tabs=[_N[,...]] - Set tab stops. - -X ........ --no-init - Don't use termcap init/deinit strings. - -y [_N] .... --max-forw-scroll=[_N] - Forward scroll limit. - -z [_N] .... --window=[_N] - Set size of window. - -" [_c[_c]] . --quotes=[_c[_c]] - Set shell quote characters. - -~ ........ --tilde - Don't display tildes after end of file. - -# [_N] .... --shift=[_N] - Set horizontal scroll amount (0 = one half screen width). - --file-size - Automatically determine the size of the input file. - --follow-name - The F command changes files if the input file is renamed. - --header=[_N[,_M]] - Use N lines and M columns to display file headers. - --incsearch - Search file as each pattern character is typed in. - --line-num-width=N - Set the width of the -N line number field to N characters. - --mouse - Enable mouse input. - --no-keypad - Don't send termcap keypad init/deinit strings. - --no-histdups - Remove duplicates from command history. - --no-number-headers - Don't give line numbers to header lines. - --redraw-on-quit - Redraw final screen when quitting. - --rscroll=C - Set the character used to mark truncated lines. - --save-marks - Retain marks across invocations of less. - --search-options=[EFKNRW-] - Set default options for every search. - --status-col-width=N - Set the width of the -J status column to N characters. - --status-line - Highlight or color the entire line containing a mark. - --use-backslash - Subsequent options use backslash as escape char. - --use-color - Enables colored text. - --wheel-lines=N - Each click of the mouse wheel moves N lines. - - - --------------------------------------------------------------------------- - - LLIINNEE EEDDIITTIINNGG - - These keys can be used to edit text being entered - on the "command line" at the bottom of the screen. - - RightArrow ..................... ESC-l ... Move cursor right one character. - LeftArrow ...................... ESC-h ... Move cursor left one character. - ctrl-RightArrow ESC-RightArrow ESC-w ... Move cursor right one word. - ctrl-LeftArrow ESC-LeftArrow ESC-b ... Move cursor left one word. - HOME ........................... ESC-0 ... Move cursor to start of line. - END ............................ ESC-$ ... Move cursor to end of line. - BACKSPACE ................................ Delete char to left of cursor. - DELETE ......................... ESC-x ... Delete char under cursor. - ctrl-BACKSPACE ESC-BACKSPACE ........... Delete word to left of cursor. - ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor. - ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line. - UpArrow ........................ ESC-k ... Retrieve previous command line. - DownArrow ...................... ESC-j ... Retrieve next command line. - TAB ...................................... Complete filename & cycle. - SHIFT-TAB ...................... ESC-TAB Complete filename & reverse cycle. - ctrl-L ................................... Complete filename, list all. From 54c0bd75730eafd65d49141c4aa49f5f58ab38a2 Mon Sep 17 00:00:00 2001 From: Karen Date: Sun, 26 Jan 2025 14:23:30 +0900 Subject: [PATCH 116/256] =?UTF-8?q?feat:=20S3=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + .../learningFlow_BE/config/AmazonConfig.java | 52 +++++++++++++++++++ .../learningFlow_BE/s3/AmazonS3Manager.java | 48 +++++++++++++++++ .../web/controller/LoginController.java | 1 + src/main/resources/application.yml | 12 +++++ 5 files changed, 115 insertions(+) create mode 100644 src/main/java/learningFlow/learningFlow_BE/config/AmazonConfig.java create mode 100644 src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java diff --git a/build.gradle b/build.gradle index 7a7ae726..4d16a7bc 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,8 @@ dependencies { annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" + //AWS S3 + implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' } diff --git a/src/main/java/learningFlow/learningFlow_BE/config/AmazonConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/AmazonConfig.java new file mode 100644 index 00000000..fda3fc29 --- /dev/null +++ b/src/main/java/learningFlow/learningFlow_BE/config/AmazonConfig.java @@ -0,0 +1,52 @@ +package learningFlow.learningFlow_BE.config; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import jakarta.annotation.PostConstruct; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Getter +public class AmazonConfig { + + private AWSCredentials awsCredentials; + + @Value("${cloud.aws.credentials.accessKey}") + private String accessKey; + + @Value("${cloud.aws.credentials.secretKey}") + private String secretKey; + + @Value("${cloud.aws.region.static}") + private String region; + + @Value("${cloud.aws.s3.bucket}") + private String bucket; + + + @PostConstruct + public void init() { + this.awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + } + + @Bean + public AmazonS3 amazonS3() { + AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return AmazonS3ClientBuilder.standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .build(); + } + + @Bean + public AWSCredentialsProvider awsCredentialsProvider() { + return new AWSStaticCredentialsProvider(awsCredentials); + } +} diff --git a/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java b/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java new file mode 100644 index 00000000..ae134a67 --- /dev/null +++ b/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java @@ -0,0 +1,48 @@ +package learningFlow.learningFlow_BE.s3; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import hackathon.spring.config.AmazonConfig; +import hackathon.spring.domain.uuid.Uuid; +import hackathon.spring.domain.uuid.UuidRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AmazonS3Manager { + + private final AmazonS3 amazonS3; + + private final AmazonConfig amazonConfig; + + private final UuidRepository uuidRepository; + + public String uploadFile(String keyName, MultipartFile file){ + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); // Content-Type 설정 + metadata.setContentDisposition("inline"); // Content-Disposition 설정 + + try { + amazonS3.putObject(new PutObjectRequest(amazonConfig.getBucket(), keyName, file.getInputStream(), metadata)); + + } catch (IOException e){ + log.error("error at AmazonS3Manager uploadFile : {}", (Object) e.getStackTrace()); + } + + return amazonS3.getUrl(amazonConfig.getBucket(), keyName).toString(); + } + + public String generateKeyName(Uuid uuid) { + return uuid.getUuid(); + } + + +} diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java index d8309e47..c09ff5b0 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java @@ -64,6 +64,7 @@ public ApiResponse login( log.info("/login 시작"); return ApiResponse.onSuccess(localUserAuthService.login(request, response)); //TODO: 로그인 후에도 /home으로 리다이렉트 되는게 나을 것 같은데 이 부분 설정 안함(리다이렉트 설정 시 스웨거 테스트 불편) + // 화면 redirect는 프엔쪽에서 처리해주시는 부분이어서 백엔드는 처리를 안하는 게 맞습니다! } /** diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1dcbaa63..6197cdcc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -64,5 +64,17 @@ logging: org.hibernate.SQL: DEBUG org.hibernate.type.descriptor.sql.BasicBinder: DEBUG +cloud: + aws: + s3: + bucket: learningflow + region: + static: ap-northeast-2 + stack: + auto: false + credentials: + accessKey: ${AWS_ACCESS_KEY_ID} + secretKey: ${AWS_SECRET_ACCESS_KEY} + From 411db8a461cfa4462dbdf026e94f76dc31597cf8 Mon Sep 17 00:00:00 2001 From: Karen Date: Sun, 26 Jan 2025 14:31:15 +0900 Subject: [PATCH 117/256] =?UTF-8?q?s3=20=EC=97=B0=EA=B2=B0=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 ++ .../learningFlow_BE/domain/uuid/Uuid.java | 20 +++++++++++++++++++ .../domain/uuid/UuidRepository.java | 6 ++++++ .../learningFlow_BE/s3/AmazonS3Manager.java | 7 ++++--- 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 src/main/java/learningFlow/learningFlow_BE/domain/uuid/Uuid.java create mode 100644 src/main/java/learningFlow/learningFlow_BE/domain/uuid/UuidRepository.java diff --git a/docker-compose.yml b/docker-compose.yml index 298b1e7d..ff5c1889 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,6 +19,8 @@ services: DB_URL: ${DB_URL} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} volumes: db_data: diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/uuid/Uuid.java b/src/main/java/learningFlow/learningFlow_BE/domain/uuid/Uuid.java new file mode 100644 index 00000000..e47f98be --- /dev/null +++ b/src/main/java/learningFlow/learningFlow_BE/domain/uuid/Uuid.java @@ -0,0 +1,20 @@ +package learningFlow.learningFlow_BE.domain.uuid; + +import hackathon.spring.domain.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Builder +@Getter +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Uuid extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(unique = true) + private String uuid; +} diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/uuid/UuidRepository.java b/src/main/java/learningFlow/learningFlow_BE/domain/uuid/UuidRepository.java new file mode 100644 index 00000000..83ed8ae1 --- /dev/null +++ b/src/main/java/learningFlow/learningFlow_BE/domain/uuid/UuidRepository.java @@ -0,0 +1,6 @@ +package learningFlow.learningFlow_BE.domain.uuid; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UuidRepository extends JpaRepository { +} diff --git a/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java b/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java index ae134a67..ff0b7eea 100644 --- a/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java +++ b/src/main/java/learningFlow/learningFlow_BE/s3/AmazonS3Manager.java @@ -3,9 +3,10 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; -import hackathon.spring.config.AmazonConfig; -import hackathon.spring.domain.uuid.Uuid; -import hackathon.spring.domain.uuid.UuidRepository; + +import learningFlow.learningFlow_BE.config.AmazonConfig; +import learningFlow.learningFlow_BE.domain.uuid.Uuid; +import learningFlow.learningFlow_BE.domain.uuid.UuidRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; From 06921fa29a9bc8115a2dd67c530176c9f522b761 Mon Sep 17 00:00:00 2001 From: Karen Date: Sun, 26 Jan 2025 14:40:41 +0900 Subject: [PATCH 118/256] =?UTF-8?q?[feat]=20s3=20login=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=EC=97=90=20=EA=B5=AC=ED=98=84,=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20image=20=EC=82=AD=EC=A0=9C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/Image.java | 1 - .../service/user/UserService.java | 17 ++++++++++++++++- .../web/dto/user/UserRequestDTO.java | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/Image.java b/src/main/java/learningFlow/learningFlow_BE/domain/Image.java index d925689c..42d85b68 100644 --- a/src/main/java/learningFlow/learningFlow_BE/domain/Image.java +++ b/src/main/java/learningFlow/learningFlow_BE/domain/Image.java @@ -23,7 +23,6 @@ public class Image { @Column(nullable = false) private String fileType; - @Column(nullable = false) private BigInteger fileSize; diff --git a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 1daa94ce..18c7bd82 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -9,9 +9,12 @@ import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.domain.UserCollection; import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import learningFlow.learningFlow_BE.domain.uuid.Uuid; +import learningFlow.learningFlow_BE.domain.uuid.UuidRepository; import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.repository.UserRepository; +import learningFlow.learningFlow_BE.s3.AmazonS3Manager; import learningFlow.learningFlow_BE.web.dto.bookmark.BookmarkDTO; import learningFlow.learningFlow_BE.web.dto.collection.CollectionResponseDTO; import learningFlow.learningFlow_BE.web.dto.user.UserRequestDTO.UpdateUserDTO; @@ -25,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.UUID; @Slf4j @Service @@ -35,6 +39,8 @@ public class UserService { private final UserRepository userRepository; private final CollectionRepository collectionRepository; private final UserCollectionRepository userCollectionRepository; + private final AmazonS3Manager s3Manager; + private final UuidRepository uuidRepository; private static final int BOOKMARK_PAGE_SIZE = 8; @@ -52,9 +58,18 @@ public UserInfoDTO updateUserInfo(String loginId, UpdateUserDTO updateUserDTO, M // TODO: 이미지 업데이트 로직 추가 예정 if (imageFile != null && !imageFile.isEmpty()) { - log.info("이미지 업데이트 요청 발생 - 추후 구현 예정"); + log.info("이미지 업데이트 요청 발생"); + // UUID 생성 및 저장 + String uuid = UUID.randomUUID().toString(); + Uuid savedUuid = uuidRepository.save(Uuid.builder() + .uuid(uuid).build()); + + // 이미지 업로드 + String imageKey = s3Manager.generateKeyName(savedUuid); // 프로필 이미지에 적합한 KeyName 생성 + String imageUrl = s3Manager.uploadFile(imageKey, imageFile); } + // 각 필드가 null이 아닌 경우에만 업데이트 if (updateUserDTO.getName() != null) { user.updateName(updateUserDTO.getName()); diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java index 2c4b9749..29f6eb80 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java @@ -95,6 +95,7 @@ public static class UpdateUserDTO { String name; Job job; List interestFields; + String imageUrl; } } From 63460421f68c00dafb0065f73e4468fb257a0a7d Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 26 Jan 2025 14:52:19 +0900 Subject: [PATCH 119/256] =?UTF-8?q?feat=20:=20CORS=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/config/WebConfig.java | 19 +++++++++++++++++ .../config/security/SecurityConfig.java | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/learningFlow/learningFlow_BE/config/WebConfig.java diff --git a/src/main/java/learningFlow/learningFlow_BE/config/WebConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/WebConfig.java new file mode 100644 index 00000000..09769403 --- /dev/null +++ b/src/main/java/learningFlow/learningFlow_BE/config/WebConfig.java @@ -0,0 +1,19 @@ +package learningFlow.learningFlow_BE.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") // 프론트엔드 주소 + .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true) + .maxAge(86400L); + } +} diff --git a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index dce1da23..c8d9dd33 100644 --- a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -18,6 +18,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +import java.util.Arrays; +import java.util.List; @Slf4j @Configuration @@ -32,6 +38,7 @@ public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception { http + .cors(cors -> cors.configurationSource(corsConfigurationSource())) .csrf(AbstractHttpConfigurer::disable) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) @@ -76,4 +83,18 @@ public AuthenticationManager authenticationManager(AuthenticationConfiguration c public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowedOrigins(List.of("http://localhost:3000")); // 프론트엔드 주소 + configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); + configuration.setAllowedHeaders(List.of("*")); + configuration.setAllowCredentials(true); + configuration.setMaxAge(86400L); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } } \ No newline at end of file From 5530ce2642d449c0454f617b95a07b8186809940 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 26 Jan 2025 14:52:37 +0900 Subject: [PATCH 120/256] =?UTF-8?q?feat=20:=20QueryDsl=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=ED=95=B4=EC=84=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=88=98=EC=A0=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QBaseEntity.java | 39 --------- .../learningFlow_BE/domain/QCollection.java | 81 ------------------ .../domain/QCollectionEpisode.java | 58 ------------- .../domain/QEmailVerificationToken.java | 53 ------------ .../learningFlow_BE/domain/QImage.java | 48 ----------- .../learningFlow_BE/domain/QMemo.java | 59 ------------- .../learningFlow_BE/domain/QMemoId.java | 39 --------- .../domain/QPasswordResetToken.java | 61 ------------- .../learningFlow_BE/domain/QResource.java | 60 ------------- .../learningFlow_BE/domain/QUser.java | 85 ------------------- .../domain/QUserCollection.java | 60 ------------- 11 files changed, 643 deletions(-) delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java deleted file mode 100644 index dd141e5b..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntity is a Querydsl query type for BaseEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntity extends EntityPathBase { - - private static final long serialVersionUID = -301952604L; - - public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); - - public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); - - public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); - - public QBaseEntity(String variable) { - super(BaseEntity.class, forVariable(variable)); - } - - public QBaseEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntity(PathMetadata metadata) { - super(BaseEntity.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java deleted file mode 100644 index 0cd82658..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java +++ /dev/null @@ -1,81 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QCollection is a Querydsl query type for Collection - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCollection extends EntityPathBase { - - private static final long serialVersionUID = -819230162L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QCollection collection = new QCollection("collection"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath amount = createNumber("amount", Integer.class); - - public final NumberPath bookmarkCount = createNumber("bookmarkCount", Integer.class); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath creator = createString("creator"); - - public final StringPath detailInformation = createString("detailInformation"); - - public final ListPath> difficulty = this.>createList("difficulty", Integer.class, NumberPath.class, PathInits.DIRECT2); - - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); - - public final NumberPath id = createNumber("id", Long.class); - - public final QImage image; - - public final EnumPath interestField = createEnum("interestField", learningFlow.learningFlow_BE.domain.enums.InterestField.class); - - public final ListPath keywords = this.createList("keywords", String.class, StringPath.class, PathInits.DIRECT2); - - public final NumberPath resourceTypeRatio = createNumber("resourceTypeRatio", Integer.class); - - public final StringPath title = createString("title"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); - - public QCollection(String variable) { - this(Collection.class, forVariable(variable), INITS); - } - - public QCollection(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QCollection(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QCollection(PathMetadata metadata, PathInits inits) { - this(Collection.class, metadata, inits); - } - - public QCollection(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java deleted file mode 100644 index a0cd685b..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java +++ /dev/null @@ -1,58 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QCollectionEpisode is a Querydsl query type for CollectionEpisode - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCollectionEpisode extends EntityPathBase { - - private static final long serialVersionUID = -297427987L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QCollectionEpisode collectionEpisode = new QCollectionEpisode("collectionEpisode"); - - public final QCollection collection; - - public final StringPath episodeName = createString("episodeName"); - - public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); - - public final NumberPath id = createNumber("id", Long.class); - - public final QResource resource; - - public QCollectionEpisode(String variable) { - this(CollectionEpisode.class, forVariable(variable), INITS); - } - - public QCollectionEpisode(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QCollectionEpisode(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QCollectionEpisode(PathMetadata metadata, PathInits inits) { - this(CollectionEpisode.class, metadata, inits); - } - - public QCollectionEpisode(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; - this.resource = inits.isInitialized("resource") ? new QResource(forProperty("resource")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java deleted file mode 100644 index 39ab4679..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java +++ /dev/null @@ -1,53 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QEmailVerificationToken is a Querydsl query type for EmailVerificationToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QEmailVerificationToken extends EntityPathBase { - - private static final long serialVersionUID = -1162432526L; - - public static final QEmailVerificationToken emailVerificationToken = new QEmailVerificationToken("emailVerificationToken"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath email = createString("email"); - - public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); - - public final StringPath password = createString("password"); - - public final StringPath token = createString("token"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final BooleanPath verified = createBoolean("verified"); - - public QEmailVerificationToken(String variable) { - super(EmailVerificationToken.class, forVariable(variable)); - } - - public QEmailVerificationToken(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QEmailVerificationToken(PathMetadata metadata) { - super(EmailVerificationToken.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java deleted file mode 100644 index 83f4cd1e..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java +++ /dev/null @@ -1,48 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QImage is a Querydsl query type for Image - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QImage extends EntityPathBase { - - private static final long serialVersionUID = -41036853L; - - public static final QImage image = new QImage("image"); - - public final ListPath collections = this.createList("collections", Collection.class, QCollection.class, PathInits.DIRECT2); - - public final NumberPath fileSize = createNumber("fileSize", java.math.BigInteger.class); - - public final StringPath fileType = createString("fileType"); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath imageURL = createString("imageURL"); - - public final ListPath users = this.createList("users", User.class, QUser.class, PathInits.DIRECT2); - - public QImage(String variable) { - super(Image.class, forVariable(variable)); - } - - public QImage(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QImage(PathMetadata metadata) { - super(Image.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java deleted file mode 100644 index 228ad549..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java +++ /dev/null @@ -1,59 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QMemo is a Querydsl query type for Memo - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QMemo extends EntityPathBase { - - private static final long serialVersionUID = -1386685238L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QMemo memo = new QMemo("memo"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath contents = createString("contents"); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final QMemoId id; - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public QMemo(String variable) { - this(Memo.class, forVariable(variable), INITS); - } - - public QMemo(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QMemo(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QMemo(PathMetadata metadata, PathInits inits) { - this(Memo.class, metadata, inits); - } - - public QMemo(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.id = inits.isInitialized("id") ? new QMemoId(forProperty("id")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java deleted file mode 100644 index 9874dad6..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QMemoId is a Querydsl query type for MemoId - */ -@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") -public class QMemoId extends BeanPath { - - private static final long serialVersionUID = -1164649595L; - - public static final QMemoId memoId = new QMemoId("memoId"); - - public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); - - public final StringPath userId = createString("userId"); - - public QMemoId(String variable) { - super(MemoId.class, forVariable(variable)); - } - - public QMemoId(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QMemoId(PathMetadata metadata) { - super(MemoId.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java deleted file mode 100644 index b1c17280..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java +++ /dev/null @@ -1,61 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QPasswordResetToken is a Querydsl query type for PasswordResetToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QPasswordResetToken extends EntityPathBase { - - private static final long serialVersionUID = -1219280267L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QPasswordResetToken passwordResetToken = new QPasswordResetToken("passwordResetToken"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); - - public final StringPath token = createString("token"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final QUser user; - - public QPasswordResetToken(String variable) { - this(PasswordResetToken.class, forVariable(variable), INITS); - } - - public QPasswordResetToken(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QPasswordResetToken(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QPasswordResetToken(PathMetadata metadata, PathInits inits) { - this(PasswordResetToken.class, metadata, inits); - } - - public QPasswordResetToken(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java deleted file mode 100644 index 067289e9..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java +++ /dev/null @@ -1,60 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QResource is a Querydsl query type for Resource - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QResource extends EntityPathBase { - - private static final long serialVersionUID = 2055422878L; - - public static final QResource resource = new QResource("resource"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath embeddedUrl = createString("embeddedUrl"); - - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath resourceDetails = createString("resourceDetails"); - - public final NumberPath runtime = createNumber("runtime", Integer.class); - - public final StringPath title = createString("title"); - - public final EnumPath type = createEnum("type", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final StringPath url = createString("url"); - - public QResource(String variable) { - super(Resource.class, forVariable(variable)); - } - - public QResource(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QResource(PathMetadata metadata) { - super(Resource.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java deleted file mode 100644 index d8faf04c..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java +++ /dev/null @@ -1,85 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUser is a Querydsl query type for User - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUser extends EntityPathBase { - - private static final long serialVersionUID = -1386433701L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QUser user = new QUser("user"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final ListPath> bookmarkedCollectionIds = this.>createList("bookmarkedCollectionIds", Long.class, NumberPath.class, PathInits.DIRECT2); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath email = createString("email"); - - public final EnumPath gender = createEnum("gender", learningFlow.learningFlow_BE.domain.enums.Gender.class); - - public final QImage image; - - public final BooleanPath inactive = createBoolean("inactive"); - - public final ListPath> interestFields = this.>createList("interestFields", learningFlow.learningFlow_BE.domain.enums.InterestField.class, EnumPath.class, PathInits.DIRECT2); - - public final EnumPath job = createEnum("job", learningFlow.learningFlow_BE.domain.enums.Job.class); - - public final StringPath loginId = createString("loginId"); - - public final StringPath name = createString("name"); - - public final EnumPath preferType = createEnum("preferType", learningFlow.learningFlow_BE.domain.enums.MediaType.class); - - public final StringPath providerId = createString("providerId"); - - public final StringPath pw = createString("pw"); - - public final EnumPath role = createEnum("role", learningFlow.learningFlow_BE.domain.enums.Role.class); - - public final EnumPath socialType = createEnum("socialType", learningFlow.learningFlow_BE.domain.enums.SocialType.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); - - public QUser(String variable) { - this(User.class, forVariable(variable), INITS); - } - - public QUser(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QUser(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QUser(PathMetadata metadata, PathInits inits) { - this(User.class, metadata, inits); - } - - public QUser(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java deleted file mode 100644 index 78ef0e58..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java +++ /dev/null @@ -1,60 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUserCollection is a Querydsl query type for UserCollection - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUserCollection extends EntityPathBase { - - private static final long serialVersionUID = -1884551079L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QUserCollection userCollection = new QUserCollection("userCollection"); - - public final QCollection collection; - - public final NumberPath id = createNumber("id", Long.class); - - public final DatePath lastAccessedAt = createDate("lastAccessedAt", java.time.LocalDate.class); - - public final EnumPath status = createEnum("status", learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus.class); - - public final QUser user; - - public final NumberPath userCollectionStatus = createNumber("userCollectionStatus", Integer.class); - - public QUserCollection(String variable) { - this(UserCollection.class, forVariable(variable), INITS); - } - - public QUserCollection(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QUserCollection(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QUserCollection(PathMetadata metadata, PathInits inits) { - this(UserCollection.class, metadata, inits); - } - - public QUserCollection(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; - this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; - } - -} - From 079979a7d1239dfb912e5351b6c03e3480265ea5 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 26 Jan 2025 14:52:52 +0900 Subject: [PATCH 121/256] =?UTF-8?q?feat=20:=20QueryDsl=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=ED=95=B4=EC=84=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=88=98=EC=A0=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QBaseEntity.java | 39 +++++++++ .../learningFlow_BE/domain/QCollection.java | 81 ++++++++++++++++++ .../domain/QCollectionEpisode.java | 58 +++++++++++++ .../domain/QEmailVerificationToken.java | 53 ++++++++++++ .../learningFlow_BE/domain/QImage.java | 48 +++++++++++ .../learningFlow_BE/domain/QMemo.java | 59 +++++++++++++ .../learningFlow_BE/domain/QMemoId.java | 39 +++++++++ .../domain/QPasswordResetToken.java | 61 +++++++++++++ .../learningFlow_BE/domain/QResource.java | 60 +++++++++++++ .../learningFlow_BE/domain/QUser.java | 85 +++++++++++++++++++ .../domain/QUserCollection.java | 60 +++++++++++++ 11 files changed, 643 insertions(+) create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java create mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java new file mode 100644 index 00000000..dd141e5b --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java @@ -0,0 +1,39 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = -301952604L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java new file mode 100644 index 00000000..0cd82658 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java @@ -0,0 +1,81 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QCollection is a Querydsl query type for Collection + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCollection extends EntityPathBase { + + private static final long serialVersionUID = -819230162L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QCollection collection = new QCollection("collection"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final NumberPath amount = createNumber("amount", Integer.class); + + public final NumberPath bookmarkCount = createNumber("bookmarkCount", Integer.class); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath creator = createString("creator"); + + public final StringPath detailInformation = createString("detailInformation"); + + public final ListPath> difficulty = this.>createList("difficulty", Integer.class, NumberPath.class, PathInits.DIRECT2); + + public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); + + public final NumberPath id = createNumber("id", Long.class); + + public final QImage image; + + public final EnumPath interestField = createEnum("interestField", learningFlow.learningFlow_BE.domain.enums.InterestField.class); + + public final ListPath keywords = this.createList("keywords", String.class, StringPath.class, PathInits.DIRECT2); + + public final NumberPath resourceTypeRatio = createNumber("resourceTypeRatio", Integer.class); + + public final StringPath title = createString("title"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); + + public QCollection(String variable) { + this(Collection.class, forVariable(variable), INITS); + } + + public QCollection(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QCollection(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QCollection(PathMetadata metadata, PathInits inits) { + this(Collection.class, metadata, inits); + } + + public QCollection(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java new file mode 100644 index 00000000..a0cd685b --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java @@ -0,0 +1,58 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QCollectionEpisode is a Querydsl query type for CollectionEpisode + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCollectionEpisode extends EntityPathBase { + + private static final long serialVersionUID = -297427987L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QCollectionEpisode collectionEpisode = new QCollectionEpisode("collectionEpisode"); + + public final QCollection collection; + + public final StringPath episodeName = createString("episodeName"); + + public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final QResource resource; + + public QCollectionEpisode(String variable) { + this(CollectionEpisode.class, forVariable(variable), INITS); + } + + public QCollectionEpisode(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QCollectionEpisode(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QCollectionEpisode(PathMetadata metadata, PathInits inits) { + this(CollectionEpisode.class, metadata, inits); + } + + public QCollectionEpisode(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; + this.resource = inits.isInitialized("resource") ? new QResource(forProperty("resource")) : null; + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java new file mode 100644 index 00000000..39ab4679 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java @@ -0,0 +1,53 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QEmailVerificationToken is a Querydsl query type for EmailVerificationToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QEmailVerificationToken extends EntityPathBase { + + private static final long serialVersionUID = -1162432526L; + + public static final QEmailVerificationToken emailVerificationToken = new QEmailVerificationToken("emailVerificationToken"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); + + public final StringPath password = createString("password"); + + public final StringPath token = createString("token"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final BooleanPath verified = createBoolean("verified"); + + public QEmailVerificationToken(String variable) { + super(EmailVerificationToken.class, forVariable(variable)); + } + + public QEmailVerificationToken(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QEmailVerificationToken(PathMetadata metadata) { + super(EmailVerificationToken.class, metadata); + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java new file mode 100644 index 00000000..83f4cd1e --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QImage.java @@ -0,0 +1,48 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QImage is a Querydsl query type for Image + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QImage extends EntityPathBase { + + private static final long serialVersionUID = -41036853L; + + public static final QImage image = new QImage("image"); + + public final ListPath collections = this.createList("collections", Collection.class, QCollection.class, PathInits.DIRECT2); + + public final NumberPath fileSize = createNumber("fileSize", java.math.BigInteger.class); + + public final StringPath fileType = createString("fileType"); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath imageURL = createString("imageURL"); + + public final ListPath users = this.createList("users", User.class, QUser.class, PathInits.DIRECT2); + + public QImage(String variable) { + super(Image.class, forVariable(variable)); + } + + public QImage(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QImage(PathMetadata metadata) { + super(Image.class, metadata); + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java new file mode 100644 index 00000000..228ad549 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java @@ -0,0 +1,59 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemo is a Querydsl query type for Memo + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemo extends EntityPathBase { + + private static final long serialVersionUID = -1386685238L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemo memo = new QMemo("memo"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final StringPath contents = createString("contents"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final QMemoId id; + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMemo(String variable) { + this(Memo.class, forVariable(variable), INITS); + } + + public QMemo(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemo(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemo(PathMetadata metadata, PathInits inits) { + this(Memo.class, metadata, inits); + } + + public QMemo(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.id = inits.isInitialized("id") ? new QMemoId(forProperty("id")) : null; + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java new file mode 100644 index 00000000..9874dad6 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java @@ -0,0 +1,39 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMemoId is a Querydsl query type for MemoId + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QMemoId extends BeanPath { + + private static final long serialVersionUID = -1164649595L; + + public static final QMemoId memoId = new QMemoId("memoId"); + + public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); + + public final StringPath userId = createString("userId"); + + public QMemoId(String variable) { + super(MemoId.class, forVariable(variable)); + } + + public QMemoId(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMemoId(PathMetadata metadata) { + super(MemoId.class, metadata); + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java new file mode 100644 index 00000000..b1c17280 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java @@ -0,0 +1,61 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QPasswordResetToken is a Querydsl query type for PasswordResetToken + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPasswordResetToken extends EntityPathBase { + + private static final long serialVersionUID = -1219280267L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QPasswordResetToken passwordResetToken = new QPasswordResetToken("passwordResetToken"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); + + public final StringPath token = createString("token"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final QUser user; + + public QPasswordResetToken(String variable) { + this(PasswordResetToken.class, forVariable(variable), INITS); + } + + public QPasswordResetToken(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QPasswordResetToken(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QPasswordResetToken(PathMetadata metadata, PathInits inits) { + this(PasswordResetToken.class, metadata, inits); + } + + public QPasswordResetToken(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java new file mode 100644 index 00000000..067289e9 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java @@ -0,0 +1,60 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QResource is a Querydsl query type for Resource + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QResource extends EntityPathBase { + + private static final long serialVersionUID = 2055422878L; + + public static final QResource resource = new QResource("resource"); + + public final QBaseEntity _super = new QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath embeddedUrl = createString("embeddedUrl"); + + public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath resourceDetails = createString("resourceDetails"); + + public final NumberPath runtime = createNumber("runtime", Integer.class); + + public final StringPath title = createString("title"); + + public final EnumPath type = createEnum("type", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final StringPath url = createString("url"); + + public QResource(String variable) { + super(Resource.class, forVariable(variable)); + } + + public QResource(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QResource(PathMetadata metadata) { + super(Resource.class, metadata); + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java new file mode 100644 index 00000000..d8faf04c --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java @@ -0,0 +1,85 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QUser is a Querydsl query type for User + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUser extends EntityPathBase { + + private static final long serialVersionUID = -1386433701L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QUser user = new QUser("user"); + + public final QBaseEntity _super = new QBaseEntity(this); + + public final ListPath> bookmarkedCollectionIds = this.>createList("bookmarkedCollectionIds", Long.class, NumberPath.class, PathInits.DIRECT2); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final EnumPath gender = createEnum("gender", learningFlow.learningFlow_BE.domain.enums.Gender.class); + + public final QImage image; + + public final BooleanPath inactive = createBoolean("inactive"); + + public final ListPath> interestFields = this.>createList("interestFields", learningFlow.learningFlow_BE.domain.enums.InterestField.class, EnumPath.class, PathInits.DIRECT2); + + public final EnumPath job = createEnum("job", learningFlow.learningFlow_BE.domain.enums.Job.class); + + public final StringPath loginId = createString("loginId"); + + public final StringPath name = createString("name"); + + public final EnumPath preferType = createEnum("preferType", learningFlow.learningFlow_BE.domain.enums.MediaType.class); + + public final StringPath providerId = createString("providerId"); + + public final StringPath pw = createString("pw"); + + public final EnumPath role = createEnum("role", learningFlow.learningFlow_BE.domain.enums.Role.class); + + public final EnumPath socialType = createEnum("socialType", learningFlow.learningFlow_BE.domain.enums.SocialType.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); + + public QUser(String variable) { + this(User.class, forVariable(variable), INITS); + } + + public QUser(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QUser(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QUser(PathMetadata metadata, PathInits inits) { + this(User.class, metadata, inits); + } + + public QUser(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.image = inits.isInitialized("image") ? new QImage(forProperty("image")) : null; + } + +} + diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java new file mode 100644 index 00000000..78ef0e58 --- /dev/null +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java @@ -0,0 +1,60 @@ +package learningFlow.learningFlow_BE.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QUserCollection is a Querydsl query type for UserCollection + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUserCollection extends EntityPathBase { + + private static final long serialVersionUID = -1884551079L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QUserCollection userCollection = new QUserCollection("userCollection"); + + public final QCollection collection; + + public final NumberPath id = createNumber("id", Long.class); + + public final DatePath lastAccessedAt = createDate("lastAccessedAt", java.time.LocalDate.class); + + public final EnumPath status = createEnum("status", learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus.class); + + public final QUser user; + + public final NumberPath userCollectionStatus = createNumber("userCollectionStatus", Integer.class); + + public QUserCollection(String variable) { + this(UserCollection.class, forVariable(variable), INITS); + } + + public QUserCollection(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QUserCollection(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QUserCollection(PathMetadata metadata, PathInits inits) { + this(UserCollection.class, metadata, inits); + } + + public QUserCollection(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection"), inits.get("collection")) : null; + this.user = inits.isInitialized("user") ? new QUser(forProperty("user"), inits.get("user")) : null; + } + +} + From 4978d556b292ad2f4abc5437ffb096e0120becca Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 26 Jan 2025 15:33:13 +0900 Subject: [PATCH 122/256] =?UTF-8?q?feat=20:=20=EC=9D=B4=EB=A9=94=EC=9D=BC?= =?UTF-8?q?=20=EC=9D=B8=EC=A6=9D=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20?= =?UTF-8?q?html=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EC=81=98?= =?UTF-8?q?=EA=B2=8C=20=EA=BE=B8=EB=AF=B8=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/UserVerificationEmailService.java | 86 ++++++++++++++++--- src/main/resources/application.yml | 2 +- 2 files changed, 76 insertions(+), 12 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java index 9bac0296..e8c3a811 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/auth/common/UserVerificationEmailService.java @@ -1,10 +1,13 @@ package learningFlow.learningFlow_BE.service.auth.common; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; @Service @@ -19,20 +22,81 @@ public class UserVerificationEmailService { public void sendVerificationEmail(String email, String token) { try { - SimpleMailMessage message = new SimpleMailMessage(); - message.setTo(email); - message.setSubject("[OnBoarding] 이메일 인증"); - message.setText( - "안녕하세요, OnBoarding입니다.\n\n" + - "회원가입을 완료하기 위해 아래 링크를 클릭하여 추가 정보를 입력해주세요:\n\n" + - baseUrl + "/register/complete?token=" + token + "\n\n" + - "이 링크는 24시간 동안 유효합니다.\n" + - "본인이 요청하지 않은 경우 이 이메일을 무시해주세요." - ); + MimeMessage message = emailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setTo(email); + helper.setSubject("[OnBoarding] 이메일 인증"); + String htmlContent = """ + + + + + + + + + + + + + + +
+
+
+ OnBoarding +
+ +
+

+ 회원가입을 위해 메일을 인증해주세요 +

+ +

+ 안녕하세요, OnBoarding입니다.
+ 회원가입을 완료하기 위해 메일을 인증해주세요.
+ 버튼을 누르면 자동으로 인증 후 추가 정보 입력 페이지로 이동합니다. +

+ + + 이메일 인증하기 + + +

+ 이 메일은 24시간 동안 유효합니다.
+ 본인이 요청하지 않은 경우, 이 메일을 무시해주세요. +

+
+
+
+ + + """.formatted(baseUrl, token); + + helper.setText(htmlContent, true); emailSender.send(message); log.info("이메일 인증 메일 발송 완료: {}", email); - } catch (Exception e) { + } catch (MessagingException e) { log.error("이메일 발송 실패: {}", e.getMessage()); throw new RuntimeException("이메일 발송에 실패했습니다."); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1dcbaa63..01981b2d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -55,7 +55,7 @@ custom: refresh-token-validity-in-seconds: 604800 # Refresh Token 1주일 app: - url: http://localhost:8080 + url: http://54.180.118.227:8080 server: port: 8080 # Spring Boot ?????? ?? ?? From 912af6f2c4ae678acae9b34fa4830043f57d523f Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Sun, 26 Jan 2025 15:45:39 +0900 Subject: [PATCH 123/256] =?UTF-8?q?=ED=98=84=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/config/app/AppConfig.java | 24 +++++++++++ .../config/app/CorsConfig.java | 38 +++++++++++++++++ .../config/cors/CorsConfig.java | 22 ---------- .../config/security/SecurityConfig.java | 6 ++- .../learningFlow_BE/domain/BaseEntity.java | 4 +- .../learningFlow_BE/domain/Resource.java | 2 +- .../service/resource/ResourceService.java | 2 + .../web/controller/ProxyController.java | 41 +++++++++---------- .../src/main/resources/application.yml | 2 +- 9 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/AppConfig.java create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/CorsConfig.java delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/AppConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/AppConfig.java new file mode 100644 index 00000000..a67d7584 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/AppConfig.java @@ -0,0 +1,24 @@ +/* +package learningFlow.learningFlow_BE.config.app; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.net.InetSocketAddress; +import java.net.Proxy; + +@Configuration +public class AppConfig { + + @Bean + public RestTemplate restTemplate() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxyHost", proxyPort)); + factory.setProxy(proxy); + return new RestTemplate(factory); + } +} + +*/ diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/CorsConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/CorsConfig.java new file mode 100644 index 00000000..b71dc6b0 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/app/CorsConfig.java @@ -0,0 +1,38 @@ +/*package learningFlow.learningFlow_BE.config.cors; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig { + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/proxy/blog/**") // 프록시 서버 API에 대해 CORS 허용 + .allowedOriginPatterns("*") // 모든 도메인에서 접근 가능 (필요하면 특정 도메인만 허용 가능) + .allowedMethods("GET", "POST", "OPTIONS") + .allowedHeaders("*") + .maxAge(3000); // 원하는 시간만큼 pre-flight 리퀘스트를 캐싱 + } + }; + } + + @Bean + public UrlBasedCorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.addAllowedOrigin("http://localhost"); // 허용할 도메인 + configuration.addAllowedMethod("*"); // 모든 HTTP 메서드 허용 + configuration.addAllowedHeader("*"); // 모든 헤더 허용 + configuration.setAllowCredentials(true); // 자격 증명 허용 + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } +}*/ diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java deleted file mode 100644 index 0307d5c8..00000000 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/cors/CorsConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package learningFlow.learningFlow_BE.config.cors; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class CorsConfig { - @Bean - public WebMvcConfigurer corsConfigurer() { - return new WebMvcConfigurer() { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/proxy/blog") // 프록시 서버 API에 대해 CORS 허용 - .allowedOrigins("*") // 모든 도메인에서 접근 가능 (필요하면 특정 도메인만 허용 가능) - .allowedMethods("GET") - .allowedHeaders("*"); - } - }; - } -} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index 953b1ebf..fcdb20ec 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -18,6 +18,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @Slf4j @Configuration @@ -28,7 +30,6 @@ public class SecurityConfig { private final OAuth2UserAuthenticationService OAuth2UserAuthenticationService; private final OAuth2LoginSuccessHandler oAuth2LoginSuccessHandler; private final CustomAuthenticationEntryPoint authenticationEntryPoint; - @Bean public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception { http @@ -44,7 +45,8 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilte "/webjars/**", "/find/**", "/reset-password", - "/search/**" + "/search/**", + "/proxy/blog/**" ).permitAll() .requestMatchers( "/register","/register/complete", "/login", "/login/google", "/oauth2/**", "/logout/**", diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java index 1ebae67a..0417b701 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/BaseEntity.java @@ -14,11 +14,11 @@ @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { @CreatedDate - @Column(nullable = false, updatable = false) + @Column(nullable = true, updatable = false) private LocalDateTime createdAt; @LastModifiedDate - @Column(nullable = false) + @Column(nullable = true) private LocalDateTime updatedAt; // 다시 바꿀것 } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java index 6e802307..e4bed6b1 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java @@ -31,7 +31,7 @@ public class Resource extends BaseEntity { @Column(nullable = false) private String url; // 자료 링크 - @Column(name = "client_url") + @Column(name = "client_url", columnDefinition = "TEXT") private String clientUrl; // 클라이언트에게 보내줄 url @Column(nullable = false, columnDefinition = "INTEGER DEFAULT 0") diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index e58eaeb3..8d1baa94 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -47,6 +47,8 @@ public UserEpisodeProgress getUserEpisodeProgress(Long episodeId, String loginId if (resourceQuantity == null) throw new ResourceHandler(ErrorStatus.QUANTITY_IS_NULL); UserEpisodeProgress userEpisodeProgress = new UserEpisodeProgress(userEpisodeProgressId, episode.getEpisodeNumber(), 0, episode.getResource().getResourceQuantity(), episode.getResource().getType()); + log.info("resourceType", episode.getResource().getType()); + return userEpisodeProgressRepository.save(userEpisodeProgress); }); } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java index 92eda348..494a668c 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ProxyController.java @@ -1,38 +1,37 @@ package learningFlow.learningFlow_BE.web.controller; -import learningFlow.learningFlow_BE.apiPayload.ApiResponse; -import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; -import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; -import learningFlow.learningFlow_BE.converter.ResourceConverter; -import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.http.*; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; +import java.net.URI; @RestController @RequestMapping("/proxy") -@RequiredArgsConstructor -@Slf4j public class ProxyController { - private final RestTemplate restTemplate; // HTTP 요청을 보내는 Spring 제공 유틸리티, 외부 블로그 페이지의 HTML을 가져오기 위해 사용 + private final RestTemplate restTemplate = new RestTemplate(); @GetMapping("/blog") - public ApiResponse fetchBlogContent(@RequestParam String url) { + public ResponseEntity proxyBlog(@RequestParam String url) { try { - HttpHeaders headers = new HttpHeaders(); // HTTP 요청 헤더를 생성 - headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + // URL 검증 (기본적인 보안) + if (!url.startsWith("http://") && !url.startsWith("https://")) { + return ResponseEntity.badRequest().body("Invalid URL".getBytes()); + } - HttpEntity entity = new HttpEntity<>(headers); // HTTP 요청 엔티티를 생성 (헤더 포함). - ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); + // 외부 URL로 요청 + URI targetUri = URI.create(url); + HttpHeaders headers = new HttpHeaders(); + headers.set("User-Agent", "Mozilla/5.0"); // 벨로그 같은 사이트에서 User-Agent 없으면 차단할 수도 있음 - return ApiResponse.onSuccess(ResourceConverter.proxyBlogResponse(url, response)); + HttpEntity entity = new HttpEntity<>(headers); + ResponseEntity response = restTemplate.exchange(targetUri, HttpMethod.GET, entity, byte[].class); + + return ResponseEntity.status(response.getStatusCode()) + .headers(response.getHeaders()) + .body(response.getBody()); } catch (Exception e) { - throw new ResourceHandler(ErrorStatus.BLOG_FETCH_FAILED); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(("Error fetching URL: " + e.getMessage()).getBytes()); } } } diff --git a/learningFlow/src/main/resources/application.yml b/learningFlow/src/main/resources/application.yml index 0b4e0e78..a1054d41 100644 --- a/learningFlow/src/main/resources/application.yml +++ b/learningFlow/src/main/resources/application.yml @@ -6,7 +6,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? jpa: hibernate: - ddl-auto: update # ??? ?? ???? (?? ????? ??) + ddl-auto: update # ??? ?? ???? (?? ????? ??) show-sql: true # SQL ?? ?? sql: init: From aed3e3c9aed3a8212a93f0fbaa24dbf9b6afb59a Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Sun, 26 Jan 2025 20:33:23 +0900 Subject: [PATCH 124/256] =?UTF-8?q?=EB=B8=94=EB=A1=9C=EA=B7=B8=20=EC=9E=84?= =?UTF-8?q?=EB=B2=A0=EB=93=9C=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- learningFlow/build.gradle | 7 +++ .../learningFlow_BE/domain/QResource.java | 2 + .../converter/ResourceConverter.java | 21 +++++++-- .../learningFlow_BE/domain/Resource.java | 4 ++ .../service/embed/BlogEmbedService.java | 47 ++++++++++++------- .../service/resource/ResourceService.java | 4 +- .../controller/ResourceRestController.java | 34 ++++++++++---- .../web/controller/SeleniumTest.java | 24 ++++++++++ .../web/dto/resource/ResourceResponseDTO.java | 11 +---- 9 files changed, 114 insertions(+), 40 deletions(-) create mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SeleniumTest.java diff --git a/learningFlow/build.gradle b/learningFlow/build.gradle index e061575a..6dd986c8 100644 --- a/learningFlow/build.gradle +++ b/learningFlow/build.gradle @@ -30,6 +30,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation 'org.springframework.boot:spring-boot-starter-test' + // Selenium WebDriver + implementation 'org.seleniumhq.selenium:selenium-java:4.28.1' + + // WebDriver Manager (ChromeDriver 자동 다운로드) + implementation 'io.github.bonigarcia:webdrivermanager:5.9.2' + + // 데이터베이스 implementation 'mysql:mysql-connector-java:8.0.33' diff --git a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java index ddc976cd..db0e7d3a 100644 --- a/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java +++ b/learningFlow/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java @@ -35,6 +35,8 @@ public class QResource extends EntityPathBase { public final NumberPath resourceQuantity = createNumber("resourceQuantity", Integer.class); + public final StringPath sourceCode = createString("sourceCode"); + public final NumberPath studyDuration = createNumber("studyDuration", Integer.class); public final StringPath title = createString("title"); diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 5c7a8b1a..4f5d8520 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -18,13 +18,28 @@ public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collect .collectionTitle(collection.getTitle()) .interestField(collection.getInterestField()) .resourceType(userProgress.getResourceType()) - .clientUrl(resource.getClientUrl()) + .episodeContents(resource.getClientUrl()) .urlTitle(resource.getTitle()) .progress(userProgress.getCurrentProgress()) .memoContents(memoContents) .episodeInformationList(episodeInformationList(collection)) .build(); } + public static ResourceResponseDTO.ResourceUrlDTO watchBlogEpisode(Collection collection, UserEpisodeProgress userProgress, String pageResource,String resourceTitle, Optional memo){ + String memoContents = "작성하신 글의 첫 줄은 노트의 제목이 됩니다, 최대 2,000자까지 입력하실 수 있어요"; + if (!memo.isEmpty()) + memoContents = memo.get().getContents(); + return ResourceResponseDTO.ResourceUrlDTO.builder() + .collectionTitle(collection.getTitle()) + .interestField(collection.getInterestField()) + .resourceType(userProgress.getResourceType()) + .episodeContents(pageResource) + .urlTitle(resourceTitle) + .progress(userProgress.getCurrentProgress()) + .memoContents(memoContents) + .episodeInformationList(episodeInformationList(collection)) + .build(); + } public static List episodeInformationList(Collection collection) { List episodeInformationList = new ArrayList<>(); @@ -39,12 +54,12 @@ public static List episodeInformationLis return episodeInformationList; } - public static ResourceResponseDTO.BlogResponseDTO proxyBlogResponse(String url, ResponseEntity response){ +/* public static ResourceResponseDTO.BlogResponseDTO proxyBlogResponse(String url, ResponseEntity response){ return ResourceResponseDTO.BlogResponseDTO.builder() .url(url) .htmlContent(response.getBody()) .build(); - } + }*/ public static ResourceResponseDTO.ProgressResponseDTO toSaveProgressResponse(ResourceRequestDTO.ProgressRequestDTO request){ return ResourceResponseDTO.ProgressResponseDTO.builder() diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java index e4bed6b1..4e81fb67 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/domain/Resource.java @@ -33,6 +33,10 @@ public class Resource extends BaseEntity { @Column(name = "client_url", columnDefinition = "TEXT") private String clientUrl; // 클라이언트에게 보내줄 url + // 블로그일 경우 + @Setter + @Column(name = "source_code", columnDefinition = "TEXT") + private String sourceCode; @Column(nullable = false, columnDefinition = "INTEGER DEFAULT 0") private Integer studyDuration; // 학습 시간 (초 단위 저장) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java index 035e45f1..9098571a 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java @@ -1,33 +1,48 @@ package learningFlow.learningFlow_BE.service.embed; +import io.github.bonigarcia.wdm.WebDriverManager; import learningFlow.learningFlow_BE.apiPayload.code.status.ErrorStatus; import learningFlow.learningFlow_BE.apiPayload.exception.handler.ResourceHandler; -import learningFlow.learningFlow_BE.domain.Resource; -import learningFlow.learningFlow_BE.repository.ResourceRepository; +import learningFlow.learningFlow_BE.domain.CollectionEpisode; +import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; import lombok.RequiredArgsConstructor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; - @Service @RequiredArgsConstructor @Transactional public class BlogEmbedService { - private final ResourceRepository resourceRepository; + private final CollectionEpisodeRepository collectionEpisodeRepository; + @Transactional + public String getBlogSource(Long episodeId) { - public Resource getResource(Long episodeId) { - Resource resource = resourceRepository.findById(episodeId) - .orElseThrow(() -> new ResourceHandler(ErrorStatus.RESOURCE_NOT_FOUND)); + CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) + .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); + String blogUrl = episode.getResource().getUrl(); - // 이미 변환된 URL이 존재하면 바로 반환 - if (resource.getClientUrl() == null) { - String proxyUrl = "/proxy/blog?url=" + URLEncoder.encode(resource.getUrl(), StandardCharsets.UTF_8); - resource.setClientUrl(proxyUrl); - return resourceRepository.save(resource); - } + WebDriverManager.chromedriver().setup(); + + // test + ChromeOptions options = new ChromeOptions(); + options.addArguments("--headless"); // 브라우저를 띄우지 않음 (필요 시 제거 가능) + options.addArguments("--no-sandbox"); + options.addArguments("--disable-dev-shm-usage"); - return resource; + WebDriver driver = new ChromeDriver(); + + try { + driver.get(blogUrl); + Thread.sleep(50000); // 5초 동안 브라우저가 열린 상태로 유지 + return driver.getPageSource();// 블로그 페이지의 HTML 반환 + } catch (InterruptedException e){ + throw new RuntimeException(e); + } + finally { + driver.quit(); // WebDriver 종료 + } } } diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java index 8d1baa94..4ea2833b 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/resource/ResourceService.java @@ -59,10 +59,10 @@ public Collection getCollection(Long episodeId) { return episode.getCollection(); } @Transactional - public ResourceType getResourceType(Long episodeId) { + public String getResourceTitle(Long episodeId) { CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); - return episode.getResource().getType(); + return episode.getResource().getTitle(); } @Transactional public Optional getMemoContents(Long episodeId){ diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java index b6e0ab7e..ae07a88f 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/ResourceRestController.java @@ -44,7 +44,7 @@ public class ResourceRestController { private final ResourceService resourceService; private final YoutubeUrlEmbedService youtubeUrlEmbedService; private final BlogEmbedService blogEmbedService; - @GetMapping("/{episode-id}") + @GetMapping("/{episode-id}/youtube") @Operation(summary = "강의 시청, 강좌로 이동 API", description = "강의 에피소드를 시청하기 위해 강좌로 이동하는 API, 그리고 강의를 시청 처리하는 로직도 포함") @ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), @@ -60,20 +60,36 @@ public ApiResponse watchEpisode( String loginId = principalDetails.getUser().getLoginId(); UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); Collection collection = resourceService.getCollection(episodeId); - ResourceType resourceType = resourceService.getResourceType(episodeId); Optional memo = resourceService.getMemoContents(episodeId); + Resource resource = youtubeUrlEmbedService.getResource(episodeId); - Resource resource = null; + return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memo)); + } - if (resourceType == ResourceType.VIDEO) { - resource = youtubeUrlEmbedService.getResource(episodeId); - } else if (resourceType == ResourceType.TEXT) { - resource = blogEmbedService.getResource(episodeId); - } + @GetMapping("/{episode-id}/blog") + @Operation(summary = "강의 시청, 강좌로 이동 API", description = "강의 에피소드를 시청하기 위해 강좌로 이동하는 API, 그리고 강의를 시청 처리하는 로직도 포함") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "RESOURCE4001", description = "강의 에피소드를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))), + }) + @Parameters({ + @Parameter(name = "episode-id", description = "시청할 강의 에피소드 ID") + }) + public ApiResponse watchBlogEpisode( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable("episode-id") Long episodeId) { - return ApiResponse.onSuccess(ResourceConverter.watchEpisode(collection, userEpisodeProgress, resource, memo)); + String loginId = principalDetails.getUser().getLoginId(); + UserEpisodeProgress userEpisodeProgress = resourceService.getUserEpisodeProgress(episodeId, loginId); + Collection collection = resourceService.getCollection(episodeId); + Optional memo = resourceService.getMemoContents(episodeId); + String resourceTitle = resourceService.getResourceTitle(episodeId); + String blogSource = blogEmbedService.getBlogSource(episodeId); + + return ApiResponse.onSuccess(ResourceConverter.watchBlogEpisode(collection, userEpisodeProgress, blogSource,resourceTitle , memo)); } + @PostMapping("/{episode-id}/save-progress") @Operation(summary = "강의 진도 저장 API", description = "강의 진도 저장 API") @ApiResponses({ diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SeleniumTest.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SeleniumTest.java new file mode 100644 index 00000000..2b1a2653 --- /dev/null +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SeleniumTest.java @@ -0,0 +1,24 @@ +package learningFlow.learningFlow_BE.web.controller; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import io.github.bonigarcia.wdm.WebDriverManager; + +public class SeleniumTest { + public static void main(String[] args) { + // WebDriver 자동 설정 + WebDriverManager.chromedriver().setup(); + + // Chrome 브라우저 실행 + WebDriver driver = new ChromeDriver(); + + // Google 페이지 접속 + driver.get("https://www.google.com"); + + // 현재 페이지 제목 출력 + System.out.println("Page Title: " + driver.getTitle()); + + // 브라우저 종료 + driver.quit(); + } +} diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 767cadae..a286b8c4 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -19,7 +19,7 @@ public static class ResourceUrlDTO { InterestField interestField; ResourceType resourceType; @NotBlank - String clientUrl; + String episodeContents; String urlTitle; Integer progress; String memoContents; @@ -45,15 +45,6 @@ public static class SearchResultResourceDTO { Integer episodeNumber; } - @Getter - @AllArgsConstructor - @NoArgsConstructor - @Builder - public static class BlogResponseDTO { - private String url; // 요청된 블로그 URL - private String htmlContent; // 블로그 HTML 데이터 - } - @Getter @NoArgsConstructor @AllArgsConstructor From 56b3157530b079ea79b908918a926229ebdb41b0 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Mon, 27 Jan 2025 12:48:44 +0900 Subject: [PATCH 125/256] =?UTF-8?q?feat=20:=20User=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20gender=20=ED=95=84=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow/learningFlow_BE/domain/QUser.java | 2 -- .../learningFlow_BE/converter/UserConverter.java | 1 - .../java/learningFlow/learningFlow_BE/domain/User.java | 8 -------- .../service/auth/local/LocalUserAuthService.java | 4 +--- .../service/auth/oauth/OAuth2UserRegistrationService.java | 1 - .../learningFlow_BE/web/controller/LoginController.java | 5 ++--- .../learningFlow_BE/web/dto/user/UserRequestDTO.java | 6 ------ 7 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java index d8faf04c..132637e6 100644 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java +++ b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java @@ -31,8 +31,6 @@ public class QUser extends EntityPathBase { public final StringPath email = createString("email"); - public final EnumPath gender = createEnum("gender", learningFlow.learningFlow_BE.domain.enums.Gender.class); - public final QImage image; public final BooleanPath inactive = createBoolean("inactive"); diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java index 52439dc2..699522e5 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/UserConverter.java @@ -28,7 +28,6 @@ public static UserInfoDTO convertToUserInfoDTO(User user) { .email(user.getEmail()) .job(user.getJob()) .interestFields(user.getInterestFields()) - .gender(user.getGender()) .preferType(user.getPreferType()) .profileImageUrl(user.getImage() != null ? user.getImage().getImageURL() : null) .build(); diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/User.java b/src/main/java/learningFlow/learningFlow_BE/domain/User.java index 8bf7788e..2c812b41 100644 --- a/src/main/java/learningFlow/learningFlow_BE/domain/User.java +++ b/src/main/java/learningFlow/learningFlow_BE/domain/User.java @@ -49,10 +49,6 @@ public class User extends BaseEntity { @Column(name = "interest_field", nullable = false) private List interestFields; - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private Gender gender; - @Enumerated(EnumType.STRING) @Column(nullable = false) private Role role; @@ -139,10 +135,6 @@ public void updateInterestFields(List interestFields) { // this.birthDay = birthDay; // } - public void updateGender(Gender gender) { - this.gender = gender; - } - public void updatePreferType(MediaType preferType) { this.preferType = preferType; } diff --git a/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java index 43f24fe1..ff664e08 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/auth/local/LocalUserAuthService.java @@ -93,8 +93,7 @@ public EmailVerificationToken validateRegistrationToken(String token) { @Transactional public UserResponseDTO.UserLoginResponseDTO completeRegister( String token, - UserRequestDTO.CompleteRegisterDTO requestDTO, - HttpServletResponse response + UserRequestDTO.CompleteRegisterDTO requestDTO ) { //이메일 토큰 검증 EmailVerificationToken verificationToken = validateRegistrationToken(token); @@ -111,7 +110,6 @@ public UserResponseDTO.UserLoginResponseDTO completeRegister( .name(requestDTO.getName()) .job(requestDTO.getJob()) .interestFields(requestDTO.getInterestFields()) - .gender(requestDTO.getGender()) .preferType(requestDTO.getPreferType()) .socialType(SocialType.LOCAL) .role(Role.USER) diff --git a/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java index 20bea7b1..647bc249 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java @@ -75,7 +75,6 @@ public UserResponseDTO.UserLoginResponseDTO updateAdditionalInfo( .socialType(socialType) .job(additionalInfo.getJob()) .interestFields(additionalInfo.getInterestFields()) - .gender(additionalInfo.getGender()) .preferType(additionalInfo.getPreferType()) .role(Role.USER) .inactive(false) diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java index d8309e47..882929b3 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/LoginController.java @@ -48,10 +48,9 @@ public ApiResponse goCompleteRegister( @Operation(summary = "회원가입 완료 API", description = "이메일 인증 후 추가 정보를 입력받아 회원가입을 완료하는 API") public ApiResponse completeRegister( @RequestParam String token, - @Valid @RequestBody UserRequestDTO.CompleteRegisterDTO request, - HttpServletResponse response + @Valid @RequestBody UserRequestDTO.CompleteRegisterDTO request ) { - return ApiResponse.onSuccess(localUserAuthService.completeRegister(token, request, response)); + return ApiResponse.onSuccess(localUserAuthService.completeRegister(token, request)); //TODO: 회원가입 후 로그인 창으로 리다이렉트 하는게 나을것 같은데 이 부분은 아직 설정 안함(리다이렉트 설정 시 스웨거 테스트 불편) } diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java index 2c4b9749..eab3b178 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/user/UserRequestDTO.java @@ -38,9 +38,6 @@ public static class CompleteRegisterDTO { @Size(max = 3, message = "관심 분야는 최대 3개까지만 선택이 가능합니다.") List interestFields; - @NotNull(message = "성별은 필수 선택값입니다") - Gender gender; - @NotNull(message = "선호하는 미디어 타입은 필수 선택값입니다") MediaType preferType; } @@ -65,9 +62,6 @@ public static class AdditionalInfoDTO { @Size(max = 3, message = "관심 분야는 최대 3개까지만 선택이 가능합니다.") List interestFields; - @NotNull(message = "성별은 필수 선택값입니다") - Gender gender; - @NotNull(message = "선호하는 미디어 타입은 필수 선택값입니다") MediaType preferType; } From dec08e124768ec035f84ab820a6ef11b187a1527 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 27 Jan 2025 14:31:44 +0900 Subject: [PATCH 126/256] =?UTF-8?q?=EB=B8=94=EB=A1=9C=EA=B7=B8=20=EC=9E=84?= =?UTF-8?q?=EB=B2=A0=EB=93=9C=20api=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 20 ++--- .../service/embed/BlogEmbedService.java | 78 +++++++++++++++---- .../controller/ResourceRestController.java | 11 ++- .../web/controller/SeleniumTest.java | 24 ------ .../web/dto/resource/ResourceResponseDTO.java | 16 ++++ .../src/main/resources/application.yml | 5 +- 6 files changed, 97 insertions(+), 57 deletions(-) delete mode 100644 learningFlow/src/main/java/learningFlow/learningFlow_BE/web/controller/SeleniumTest.java diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 4f5d8520..f834c2b4 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -2,17 +2,14 @@ import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.enums.ResourceType; import learningFlow.learningFlow_BE.web.dto.resource.ResourceRequestDTO; import learningFlow.learningFlow_BE.web.dto.resource.ResourceResponseDTO; -import org.springframework.http.ResponseEntity; - import java.util.*; public class ResourceConverter { public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collection, UserEpisodeProgress userProgress, Resource resource, Optional memo){ String memoContents = "작성하신 글의 첫 줄은 노트의 제목이 됩니다, 최대 2,000자까지 입력하실 수 있어요"; - if (!memo.isEmpty()) + if (memo.isPresent()) memoContents = memo.get().getContents(); return ResourceResponseDTO.ResourceUrlDTO.builder() .collectionTitle(collection.getTitle()) @@ -25,11 +22,11 @@ public static ResourceResponseDTO.ResourceUrlDTO watchEpisode(Collection collect .episodeInformationList(episodeInformationList(collection)) .build(); } - public static ResourceResponseDTO.ResourceUrlDTO watchBlogEpisode(Collection collection, UserEpisodeProgress userProgress, String pageResource,String resourceTitle, Optional memo){ + public static ResourceResponseDTO.ResourceBlogUrlDTO watchBlogEpisode(Collection collection, UserEpisodeProgress userProgress, byte[] pageResource, String resourceTitle, Optional memo){ String memoContents = "작성하신 글의 첫 줄은 노트의 제목이 됩니다, 최대 2,000자까지 입력하실 수 있어요"; - if (!memo.isEmpty()) + if (memo.isPresent()) memoContents = memo.get().getContents(); - return ResourceResponseDTO.ResourceUrlDTO.builder() + return ResourceResponseDTO.ResourceBlogUrlDTO.builder() .collectionTitle(collection.getTitle()) .interestField(collection.getInterestField()) .resourceType(userProgress.getResourceType()) @@ -50,17 +47,10 @@ public static List episodeInformationLis episode.getResource().getTitle() )); } - Collections.sort(episodeInformationList, Comparator.comparingInt(ResourceResponseDTO.episodeInformation::getEpisodeNumber)); + episodeInformationList.sort(Comparator.comparingInt(ResourceResponseDTO.episodeInformation::getEpisodeNumber)); return episodeInformationList; } -/* public static ResourceResponseDTO.BlogResponseDTO proxyBlogResponse(String url, ResponseEntity response){ - return ResourceResponseDTO.BlogResponseDTO.builder() - .url(url) - .htmlContent(response.getBody()) - .build(); - }*/ - public static ResourceResponseDTO.ProgressResponseDTO toSaveProgressResponse(ResourceRequestDTO.ProgressRequestDTO request){ return ResourceResponseDTO.ProgressResponseDTO.builder() .progress(request.getProgress()) diff --git a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java index 9098571a..1bbccd94 100644 --- a/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java +++ b/learningFlow/src/main/java/learningFlow/learningFlow_BE/service/embed/BlogEmbedService.java @@ -6,43 +6,93 @@ import learningFlow.learningFlow_BE.domain.CollectionEpisode; import learningFlow.learningFlow_BE.repository.CollectionEpisodeRepository; import lombok.RequiredArgsConstructor; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; +import java.util.zip.GZIPOutputStream; + @Service @RequiredArgsConstructor @Transactional public class BlogEmbedService { private final CollectionEpisodeRepository collectionEpisodeRepository; - @Transactional - public String getBlogSource(Long episodeId) { + + @Async // 비동기 처리 + public CompletableFuture getBlogSource(Long episodeId) { CollectionEpisode episode = collectionEpisodeRepository.findById(episodeId) .orElseThrow(() -> new ResourceHandler(ErrorStatus.EPISODE_NOT_FOUND)); String blogUrl = episode.getResource().getUrl(); WebDriverManager.chromedriver().setup(); - - // test + // Headless 모드 설정 ChromeOptions options = new ChromeOptions(); - options.addArguments("--headless"); // 브라우저를 띄우지 않음 (필요 시 제거 가능) - options.addArguments("--no-sandbox"); - options.addArguments("--disable-dev-shm-usage"); + options.addArguments("--headless"); // GUI 없이 실행 + options.addArguments("--no-sandbox"); // 리눅스 환경에서 필요한 옵션 + options.addArguments("--disable-dev-shm-usage"); // 메모리 문제 방지 + options.addArguments("--disable-gpu"); // GPU 가속 비활성화 (필요 시) - WebDriver driver = new ChromeDriver(); + WebDriver driver = new ChromeDriver(options); try { driver.get(blogUrl); - Thread.sleep(50000); // 5초 동안 브라우저가 열린 상태로 유지 - return driver.getPageSource();// 블로그 페이지의 HTML 반환 - } catch (InterruptedException e){ - throw new RuntimeException(e); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // ✅ Duration.ofSeconds()로 변경 + wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("body"))); + + // JavaScript 실행 후 전체 HTML 가져오기 + JavascriptExecutor js = (JavascriptExecutor) driver; + String fullHTML = (String) js.executeScript("return document.documentElement.outerHTML;"); + + // 광고 제거 + String cleanedHtml = removeAdsFromHtml(fullHTML); + + // JSON 포맷으로 변환 + String jsonResponse = "{\"html\":\"" + escapeJson(cleanedHtml) + "\"}"; + + // Gzip 압축 + byte[] gzippedResponse = compressGzip(jsonResponse); + + return CompletableFuture.completedFuture(gzippedResponse); } - finally { - driver.quit(); // WebDriver 종료 + catch (IOException e) { + throw new RuntimeException("Gzip 압축 중 오류 발생", e); // ✅ IOException 처리 + } finally { + driver.quit(); } } + + // 광고 코드 제거 + private String removeAdsFromHtml(String html) { + return html.replaceAll("(?i)]*>(.*?)", "") // 모든 ", "") // 모든 "; + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write(redirectScript); } } From 9f605ee6568a0baa2c15aaf2665aad8000d6ae7b Mon Sep 17 00:00:00 2001 From: JungJaehoon0430 <80247965+JungJaehoon0430@users.noreply.github.com> Date: Fri, 14 Feb 2025 01:48:19 +0900 Subject: [PATCH 240/256] =?UTF-8?q?home=20swagger=20=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?=ED=8E=B8=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/controller/HomeRestController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java index c9f1af71..8a190640 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/HomeRestController.java @@ -31,8 +31,8 @@ public class HomeRestController { @GetMapping @Operation(summary = "홈 화면 API", description = """ 사용자의 인증 상태에 따라 맞춤형 홈 화면을 제공합니다. - - 인증 헤더: + --- + [인증 헤더]\n [비로그인 사용자] - 인증 헤더 없음 @@ -40,6 +40,8 @@ public class HomeRestController { - Authorization: Bearer {access_token} (필수) - Refresh-Token: {refresh_token} (필수) + --- + [응답 정보]\n [비로그인 사용자 응답] - Authorization 헤더 없음 1. 추천 컬렉션 (6개) From 92775c8ce32e367a427f55264e5fff87a79f14b9 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Fri, 14 Feb 2025 02:48:39 +0900 Subject: [PATCH 241/256] =?UTF-8?q?feat=20:=20=ED=99=88=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20recentlyCollection=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow/learningFlow_BE/domain/UserCollection.java | 2 +- .../learningFlow_BE/repository/UserCollectionRepository.java | 2 +- .../learningFlow_BE/service/collection/CollectionService.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java b/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java index 8fef140a..ff1f9b0f 100644 --- a/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java +++ b/src/main/java/learningFlow/learningFlow_BE/domain/UserCollection.java @@ -33,7 +33,7 @@ public class UserCollection extends BaseEntity{ @Column(name = "user_collection_status", nullable = false) private Integer userCollectionStatus; // 가장 최신에 수강한 강의 저장 - @Column(name = "completed_time", nullable = false) + @Column(name = "completed_time") private LocalDate completedTime; @Enumerated(EnumType.STRING) diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java index 09e6579d..9d2a6339 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -11,5 +11,5 @@ public interface UserCollectionRepository extends JpaRepository { Optional findByUserAndCollection(User user, Collection collection); List findByUserAndStatusOrderByCompletedTimeDesc(User user, UserCollectionStatus status); - Optional findFirstByUserAndStatusOrderByCompletedTimeDesc(User user, UserCollectionStatus status); + Optional findFirstByUserAndStatusOrderByUpdatedAtDesc(User user, UserCollectionStatus status); } \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 309d7fe0..3f5fe33a 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -226,7 +226,6 @@ public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { CollectionResponseDTO.CollectionPreviewDTO recentLearning = getRecentLearning(user); // 추천 컬렉션 목록 조회 - // 1. interestField와 preferType 모두 충족 List recommendedCollections = new ArrayList<>(collectionRepository.findByInterestFieldAndPreferType( user.getInterestFields(), user.getPreferType(), true, true, HOME_COLLECTION_SIZE @@ -279,7 +278,7 @@ public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { private CollectionResponseDTO.CollectionPreviewDTO getRecentLearning(User user) { return userCollectionRepository - .findFirstByUserAndStatusOrderByCompletedTimeDesc(user, UserCollectionStatus.IN_PROGRESS) + .findFirstByUserAndStatusOrderByUpdatedAtDesc(user, UserCollectionStatus.IN_PROGRESS) .map(userCollection -> CollectionConverter.toCollectionPreviewDTO( userCollection.getCollection(), getLearningInfo(userCollection.getCollection(), user, false), From a230dbdcd9b6cb925a8b52f8a5308c3a3f6e4a48 Mon Sep 17 00:00:00 2001 From: JungJaehoon0430 <80247965+JungJaehoon0430@users.noreply.github.com> Date: Sat, 15 Feb 2025 01:13:09 +0900 Subject: [PATCH 242/256] =?UTF-8?q?user=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 컨트롤러에 user/withdraw 추가 서비스에 삭제 기능 추가 메모, 유저컬렉션, 유저에피소드프로그레스 레포에 기능 추가 --- .../apiPayload/code/status/ErrorStatus.java | 1 + .../repository/MemoRepository.java | 7 +++- .../repository/UserCollectionRepository.java | 10 ++++- .../UserEpisodeProgressRepository.java | 8 +++- .../service/user/UserService.java | 26 ++++++++++++ .../web/controller/UserRestController.java | 40 +++++++++++++++++++ 6 files changed, 89 insertions(+), 3 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java index 7dd2dde5..d74127ce 100644 --- a/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/learningFlow/learningFlow_BE/apiPayload/code/status/ErrorStatus.java @@ -30,6 +30,7 @@ public enum ErrorStatus implements BaseErrorCode { USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER4001", "사용자를 찾을 수 없습니다."), NICKNAME_NOT_EXIST(HttpStatus.BAD_REQUEST, "USER4002", "닉네임은 필수 입니다."), + WITHDRAWAL_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "USER5001", "계정 탈퇴 처리 중 오류가 발생했습니다."), // 비밀번호 관련 에러 추가 INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "PASSWORD4001", "유효하지 않은 비밀번호입니다."), diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java index e4bf088e..010aecf6 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/MemoRepository.java @@ -3,6 +3,7 @@ import learningFlow.learningFlow_BE.domain.Memo; import learningFlow.learningFlow_BE.domain.MemoId; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -11,4 +12,8 @@ public interface MemoRepository extends JpaRepository { @Query("SELECT m FROM Memo m WHERE m.id.collectionEpisodeId = :episodeId") Optional findByEpisodeId(@Param("episodeId") Long episodeId); -} + + @Modifying + @Query("DELETE FROM Memo m WHERE m.id.userId = :loginId") + void deleteAllByUserId(@Param("loginId") String loginId); +} \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java index 9d2a6339..367ea49b 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/UserCollectionRepository.java @@ -3,8 +3,12 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.User; import learningFlow.learningFlow_BE.domain.UserCollection; -import org.springframework.data.jpa.repository.JpaRepository; import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + import java.util.List; import java.util.Optional; @@ -12,4 +16,8 @@ public interface UserCollectionRepository extends JpaRepository findByUserAndCollection(User user, Collection collection); List findByUserAndStatusOrderByCompletedTimeDesc(User user, UserCollectionStatus status); Optional findFirstByUserAndStatusOrderByUpdatedAtDesc(User user, UserCollectionStatus status); + + @Modifying + @Query("DELETE FROM UserCollection uc WHERE uc.user.loginId = :loginId") + void deleteAllByUserId(@Param("loginId") String loginId); } \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java b/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java index b49b10c9..ea9be24e 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/UserEpisodeProgressRepository.java @@ -3,6 +3,12 @@ import learningFlow.learningFlow_BE.domain.UserEpisodeProgress; import learningFlow.learningFlow_BE.domain.UserEpisodeProgressId; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface UserEpisodeProgressRepository extends JpaRepository { -} + @Modifying + @Query("DELETE FROM UserEpisodeProgress uep WHERE uep.id.userId = :loginId") + void deleteAllByUserId(@Param("loginId") String loginId); +} \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index b2fd187e..b5b91eee 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -10,6 +10,7 @@ import learningFlow.learningFlow_BE.domain.Collection; import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; import learningFlow.learningFlow_BE.domain.uuid.UuidRepository; +import learningFlow.learningFlow_BE.repository.MemoRepository; import learningFlow.learningFlow_BE.repository.UserCollectionRepository; import learningFlow.learningFlow_BE.repository.UserEpisodeProgressRepository; import learningFlow.learningFlow_BE.repository.UserRepository; @@ -43,6 +44,7 @@ public class UserService { private final UuidRepository uuidRepository; private final CollectionService collectionService; private final UserEpisodeProgressRepository userEpisodeProgressRepository; + private final MemoRepository memoRepository; private static final int BOOKMARK_PAGE_SIZE = 8; @@ -238,4 +240,28 @@ public UserResponseDTO.UserMyPageResponseDTO getUserMyPageResponseDTO(String log return UserConverter.convertToUserMyPageResponseDTO(user, recentlyWatchedEpisodeDTOList, completedCollectionList); } + + @Transactional + public void withdrawUser(String loginId) { + User user = userRepository.findById(loginId) + .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); + + try { + // 유저의 메모 삭제 + memoRepository.deleteAllByUserId(loginId); + + // 유저의 학습 진도 삭제 + userEpisodeProgressRepository.deleteAllByUserId(loginId); + + // 유저의 컬렉션 관계 삭제 + userCollectionRepository.deleteAllByUserId(loginId); + + // 유저 완전 삭제 + userRepository.delete(user); + + } catch (Exception e) { + throw new UserHandler(ErrorStatus.WITHDRAWAL_FAILED); + } + } + } \ No newline at end of file diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java index 65af3e89..38546a0d 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java @@ -279,4 +279,44 @@ public ApiResponse goChangeEmail( EmailVerificationToken verificationToken = localUserAuthService.validateRegistrationToken(emailResetCode); return ApiResponse.onSuccess(localUserAuthService.changeEmail(verificationToken)); } + + @DeleteMapping("/withdraw") + @Operation(summary = "회원 탈퇴 API", description = """ + 회원 탈퇴를 처리합니다. + + [처리 내용] + - 계정 영구 삭제 + - 모든 개인 데이터 삭제 + * 학습 데이터 + * 메모 + * 북마크 + * 프로필 정보 + + [주의사항] + - 탈퇴 후 데이터 복구 불가능 + - 탈퇴 후 동일 이메일로 새로운 계정 생성 가능 + """) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "탈퇴 성공" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "로그인이 필요한 서비스입니다.", + content = @Content(schema = @Schema(implementation = ApiResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "500", + description = "계정 탈퇴 처리 중 오류가 발생했습니다.", + content = @Content(schema = @Schema(implementation = ApiResponse.class)) + ) + }) + public ApiResponse withdrawUser( + @AuthenticationPrincipal PrincipalDetails principalDetails + ) { + userService.withdrawUser(principalDetails.getUser().getLoginId()); + return ApiResponse.onSuccess("회원 탈퇴가 완료되었습니다."); + } + } \ No newline at end of file From 8d5c2768b282c31921158da8508476885c5d324c Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 16 Feb 2025 12:43:41 +0900 Subject: [PATCH 243/256] =?UTF-8?q?feat=20:=20resourceId=EC=97=90=EC=84=9C?= =?UTF-8?q?=20episodeId=EB=A1=9C=20=ED=95=84=EB=93=9C=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/web/dto/resource/ResourceResponseDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index ca5824ea..6b191cad 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -59,7 +59,7 @@ public static class episodeInformation { @NoArgsConstructor @Builder public static class SearchResultResourceDTO { - Long resourceId; + Long episodeId; String episodeName; String url; String resourceSource; From 12b5a8239b2d2d7297f50506a2bfdd56c92889cc Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 16 Feb 2025 12:51:02 +0900 Subject: [PATCH 244/256] =?UTF-8?q?feat=20:=20resourceId=EC=97=90=EC=84=9C?= =?UTF-8?q?=20episodeId=EB=A1=9C=20=ED=95=84=EB=93=9C=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/ResourceConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 49a0d5a3..b58d0b19 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -76,7 +76,7 @@ public static ResourceResponseDTO.changeEpisodeIsCompleteDTO toChangeEpisodeIsCo public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO(CollectionEpisode episode) { return ResourceResponseDTO.SearchResultResourceDTO.builder() - .resourceId(episode.getId()) + .episodeId(episode.getId()) .episodeName(episode.getEpisodeName()) .url(episode.getResource().getUrl()) .resourceSource(extractResourceSource(episode.getResource().getUrl())) From 41d9c8e4adf01689dc91f690a157f978c8a4f0ca Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 16 Feb 2025 23:38:47 +0900 Subject: [PATCH 245/256] =?UTF-8?q?feat=20:=20=ED=99=88=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 20 ++++++++- .../service/collection/CollectionService.java | 45 ++++++++++++++++--- .../web/dto/resource/ResourceResponseDTO.java | 1 + 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index b58d0b19..179b42ce 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -74,7 +74,9 @@ public static ResourceResponseDTO.changeEpisodeIsCompleteDTO toChangeEpisodeIsCo .build(); } - public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO(CollectionEpisode episode) { + public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO( + CollectionEpisode episode + ) { return ResourceResponseDTO.SearchResultResourceDTO.builder() .episodeId(episode.getId()) .episodeName(episode.getEpisodeName()) @@ -101,6 +103,22 @@ public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWat .build(); } + public static List convertToResourceDTOWithToday( + List episodes, + int nextEpisodeNumber + ) { + return episodes.stream() + .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() + .episodeId(episode.getId()) + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .today(episode.getEpisodeNumber().equals(nextEpisodeNumber)) + .build()) + .toList(); + } + private static String extractResourceSource(String url) { String lowerCaseUrl = url.toLowerCase(); diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 3f5fe33a..42b82c16 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -277,13 +277,48 @@ public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { } private CollectionResponseDTO.CollectionPreviewDTO getRecentLearning(User user) { + return userCollectionRepository .findFirstByUserAndStatusOrderByUpdatedAtDesc(user, UserCollectionStatus.IN_PROGRESS) - .map(userCollection -> CollectionConverter.toCollectionPreviewDTO( - userCollection.getCollection(), - getLearningInfo(userCollection.getCollection(), user, false), - user - )) + .map(userCollection -> { + Collection collection = userCollection.getCollection(); + + List episodes = collection.getEpisodes(); + int totalEpisodes = episodes.size(); + int currentEpisode = userCollection.getUserCollectionStatus(); + int nextEpisode = currentEpisode + 1; + + List selectedEpisodes = new ArrayList<>(); + if (totalEpisodes <= 4) { + // 4회차 이하의 컬렉션은 전체 표시 + selectedEpisodes.addAll(episodes); + } else { + // 5회차 이상의 컬렉션 + // today 에피소드(다음 에피소드)가 가능한 2번째에 오도록 계산 + int idealStart = nextEpisode - 2; // today가 2번째에 오기 위한 이상적인 시작 인덱스 + + // 실제 시작 인덱스 계산 (0 이상, totalEpisodes-4 이하) + int startIdx = Math.max(0, Math.min(idealStart, totalEpisodes - 4)); + + // 4개의 에피소드 선택 + for (int i = 0; i < 4; i++) { + selectedEpisodes.add(episodes.get(startIdx + i)); + } + } + + CollectionResponseDTO.CollectionLearningInfo learningInfo = CollectionResponseDTO.CollectionLearningInfo.builder() + .learningStatus("IN_PROGRESS") + .progressRate(calculateProgressRate(userCollection)) + .startDate(userCollection.getCreatedAt().toLocalDate()) + .currentEpisode(currentEpisode) + .resourceDTOList(ResourceConverter.convertToResourceDTOWithToday( + selectedEpisodes, + nextEpisode + )) + .build(); + + return CollectionConverter.toCollectionPreviewDTO(collection, learningInfo, user); + }) .orElse(null); } diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 6b191cad..b4a98da6 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -64,6 +64,7 @@ public static class SearchResultResourceDTO { String url; String resourceSource; Integer episodeNumber; + Boolean today; } @Getter From 4fb39ea47bd483a654a50e3250261f4c51030b7a Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Mon, 17 Feb 2025 07:30:18 +0900 Subject: [PATCH 246/256] =?UTF-8?q?feat=20:=20=EC=99=84=EB=A3=8C=EB=90=9C?= =?UTF-8?q?=20=EC=97=90=ED=94=BC=EC=86=8C=EB=93=9C=20=EB=82=98=ED=83=80?= =?UTF-8?q?=EB=82=B4=EA=B8=B0=20=EC=9C=84=ED=95=B4=20completed=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 18 ++++++++++-------- .../service/collection/CollectionService.java | 3 ++- .../web/dto/resource/ResourceResponseDTO.java | 1 + 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 179b42ce..c225a40a 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -105,17 +105,19 @@ public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWat public static List convertToResourceDTOWithToday( List episodes, - int nextEpisodeNumber + int nextEpisodeNumber, + int lastCompletedEpisode ) { return episodes.stream() .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() - .episodeId(episode.getId()) - .episodeName(episode.getEpisodeName()) - .url(episode.getResource().getUrl()) - .resourceSource(extractResourceSource(episode.getResource().getUrl())) - .episodeNumber(episode.getEpisodeNumber()) - .today(episode.getEpisodeNumber().equals(nextEpisodeNumber)) - .build()) + .episodeId(episode.getId()) + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .today(episode.getEpisodeNumber().equals(nextEpisodeNumber)) + .completed(episode.getEpisodeNumber() <= lastCompletedEpisode) + .build()) .toList(); } diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 42b82c16..ab3514be 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -313,7 +313,8 @@ private CollectionResponseDTO.CollectionPreviewDTO getRecentLearning(User user) .currentEpisode(currentEpisode) .resourceDTOList(ResourceConverter.convertToResourceDTOWithToday( selectedEpisodes, - nextEpisode + nextEpisode, + currentEpisode )) .build(); diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index b4a98da6..65a9c199 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -65,6 +65,7 @@ public static class SearchResultResourceDTO { String resourceSource; Integer episodeNumber; Boolean today; + Boolean completed; } @Getter From ede320bb58356c751ba85ce8542f9657aa00d8b7 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 17 Feb 2025 07:43:36 +0900 Subject: [PATCH 247/256] =?UTF-8?q?episodeId=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/ResourceConverter.java | 1 + .../learningFlow_BE/web/dto/resource/ResourceResponseDTO.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index c225a40a..b25a2ea5 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -52,6 +52,7 @@ public static List episodeInformationLis for (CollectionEpisode episode : collection.getEpisodes()) { episodeInformationList.add(new ResourceResponseDTO.episodeInformation( + episode.getId(), episode.getEpisodeNumber(), episode.getResource().getTitle(), userEpisodeProgress.getIsComplete() diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 65a9c199..1c03aba6 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -49,6 +49,7 @@ public static class ResourceBlogUrlDTO { @NoArgsConstructor @Builder public static class episodeInformation { + Long episodeId; Integer episodeNumber; String urlTitle; Boolean isCompleted; From 7b2b954626821c8bc565c9eeeb3828cdf65e63c7 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 17 Feb 2025 20:16:52 +0900 Subject: [PATCH 248/256] =?UTF-8?q?///=20->=20//=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=99=84=EB=A3=8C=20=EB=B0=8F=20episodeType=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/ResourceConverter.java | 3 ++- .../learningFlow_BE/service/embed/YoutubeUrlEmbedService.java | 4 ++-- .../learningFlow_BE/service/lambda/LambdaService.java | 3 --- .../learningFlow_BE/web/dto/resource/ResourceResponseDTO.java | 1 + 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index b25a2ea5..c56b5e75 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -55,7 +55,8 @@ public static List episodeInformationLis episode.getId(), episode.getEpisodeNumber(), episode.getResource().getTitle(), - userEpisodeProgress.getIsComplete() + userEpisodeProgress.getIsComplete(), + episode.getResource().getType() )); } episodeInformationList.sort(Comparator.comparingInt(ResourceResponseDTO.episodeInformation::getEpisodeNumber)); diff --git a/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java b/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java index 4de89a0e..8b523397 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/embed/YoutubeUrlEmbedService.java @@ -48,14 +48,14 @@ public String EmbedUrl(String youtubeUrl){ for (String param : params) { if (param.startsWith("v=")){ String videoId = param.substring(2); - return "https:///www.youtube-nocookie.com/embed/" + videoId; + return "https://www.youtube-nocookie.com/embed/" + videoId; } } } // 축약형: https://youtu.be/ if (host.contains("youtube.be") && path != null && path.length() > 1) { String videoId = path.substring(1); // 맨 앞 "/" 제거 - return "https:///www.youtube-nocookie.com/embed/" + videoId; + return "https://www.youtube-nocookie.com/embed/" + videoId; } throw new ResourceHandler(ErrorStatus.YOUTUBE_URI_SYNTAX_ERROR); } catch (URISyntaxException e) { diff --git a/src/main/java/learningFlow/learningFlow_BE/service/lambda/LambdaService.java b/src/main/java/learningFlow/learningFlow_BE/service/lambda/LambdaService.java index 4db69669..d5d620c8 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/lambda/LambdaService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/lambda/LambdaService.java @@ -32,7 +32,6 @@ public String invokeLambda(String url,int width, int height, Resource resource) try { String payload = String.format("{\"url\":\"%s\", \"width\":%d, \"height\":%d}", url, width, height); SdkBytes payloadBytes = SdkBytes.fromUtf8String(payload); - // Lambda 요청 InvokeRequest request = InvokeRequest.builder() .functionName("docker-selenium-lambda-prod-demo") @@ -47,7 +46,6 @@ public String invokeLambda(String url,int width, int height, Resource resource) log.error("❌ Lambda 내부 오류 발생: {}", response.functionError()); throw new RuntimeException("Lambda 내부 오류: " + response.functionError()); } - // ✅ Lambda 응답을 JSON으로 변환 JsonNode jsonResponse = objectMapper.readTree(responseJson); @@ -78,5 +76,4 @@ public String invokeLambda(String url,int width, int height, Resource resource) return null; } } - } diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 1c03aba6..7cf235bd 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -53,6 +53,7 @@ public static class episodeInformation { Integer episodeNumber; String urlTitle; Boolean isCompleted; + ResourceType resourceType; } @Getter From 376f032eaae4b77b305ff394c0cbb3f7aa3bc392 Mon Sep 17 00:00:00 2001 From: LJYeon12 Date: Mon, 17 Feb 2025 20:23:08 +0900 Subject: [PATCH 249/256] =?UTF-8?q?cors=EC=97=90=20https=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EC=A3=BC=EC=86=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/config/security/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index 1e23f7df..474e89c9 100644 --- a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -100,7 +100,8 @@ public CorsConfigurationSource corsConfigurationSource() { "http://localhost:8081", "http://onboarding.p-e.kr:8080", "http://54.180.118.227", - "https://accounts.google.com" + "https://accounts.google.com", + "https://onboarding.p-e.kr" )); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); From 1cd0884ec849dbaae7e8c9c03bfab06aac2f88fe Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Mon, 17 Feb 2025 23:35:45 +0900 Subject: [PATCH 250/256] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EC=97=90=EC=84=9C=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=20=EB=82=B4=EB=B6=80=EC=97=90=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EC=97=90=ED=94=BC=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20resourceSource=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=8B=B4=EA=B3=A0=EC=9E=88=EB=8A=94=20List=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/CollectionConverter.java | 6 ++++++ .../learningFlow_BE/converter/ResourceConverter.java | 2 +- .../web/dto/collection/CollectionResponseDTO.java | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java index 35a5fea8..d8e05c15 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/CollectionConverter.java @@ -80,6 +80,11 @@ public static CollectionResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO( Integer videoCount = countResourcesByType(collection, ResourceType.VIDEO); + List resourceSourceTypes = collection.getEpisodes().stream() + .map(episode -> ResourceConverter.extractResourceSource(episode.getResource().getUrl())) + .distinct() + .toList(); + return CollectionResponseDTO.CollectionPreviewDTO.builder() .collectionId(collection.getId()) .imageUrl(collection.getCollectionImgUrl()) @@ -92,6 +97,7 @@ public static CollectionResponseDTO.CollectionPreviewDTO toCollectionPreviewDTO( .runtime(getTotalHours(collection)) .textCount(textCount) .videoCount(videoCount) + .resourceSourceTypes(resourceSourceTypes) .resource(learningInfo.getResourceDTOList()) .likesCount(collection.getBookmarkCount()) //북마크 -> 좋아요로 이름만 변경 .isLiked(currentUser != null && currentUser.hasBookmarked(collection.getId())) //북마크 -> 좋아요로 이름만 변경 diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index c225a40a..3f455258 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -121,7 +121,7 @@ public static List convertToResourc .toList(); } - private static String extractResourceSource(String url) { + public static String extractResourceSource(String url) { String lowerCaseUrl = url.toLowerCase(); diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java index b29e3a53..b7837890 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/collection/CollectionResponseDTO.java @@ -43,6 +43,7 @@ public static class CollectionPreviewDTO { Integer runtime; //TODO : 필드 이름 수정 필요, 해당 컬렉션 수강 전체에 드느 시간이기 때문에 좀 더 좋은 필드 이름으로.. Integer textCount; Integer videoCount; + List resourceSourceTypes; List resource; Integer likesCount; //북마크 -> 좋아요로 이름만 변경 boolean isLiked; //북마크 -> 좋아요로 이름만 변경 From fefef0f19f3a7af435491bf3cd5a53a621a0bad8 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 18 Feb 2025 00:50:45 +0900 Subject: [PATCH 251/256] =?UTF-8?q?feat=20:=20localhost:3000=20=ED=94=84?= =?UTF-8?q?=EB=A1=A0=ED=8A=B8=20=EB=B0=B0=ED=8F=AC=20url=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/handler/OAuth2LoginSuccessHandler.java | 8 +------- .../service/auth/oauth/OAuth2UserRegistrationService.java | 1 - src/main/resources/application.yml | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java b/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java index ea8655fe..914667fd 100644 --- a/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java +++ b/src/main/java/learningFlow/learningFlow_BE/security/handler/OAuth2LoginSuccessHandler.java @@ -1,18 +1,14 @@ package learningFlow.learningFlow_BE.security.handler; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import learningFlow.learningFlow_BE.apiPayload.ApiResponse; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.security.jwt.JwtTokenProvider; import learningFlow.learningFlow_BE.service.auth.oauth.OAuth2UserTemp; -import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseCookie; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -21,8 +17,6 @@ import java.io.IOException; -import static learningFlow.learningFlow_BE.converter.UserConverter.toUserLoginResponseDTO; - @Component @RequiredArgsConstructor @Slf4j @@ -103,7 +97,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo String redirectScript = ""; response.setContentType("text/html;charset=UTF-8"); diff --git a/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java index eadf7e2c..da94c9be 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/auth/oauth/OAuth2UserRegistrationService.java @@ -19,7 +19,6 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; import java.util.Arrays; import java.util.Collections; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 39cf2cd8..cbbc7d01 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -56,7 +56,7 @@ custom: refresh-token-validity-in-seconds: 604800 # Refresh Token 1주일 app: - frontend-url: http://localhost:3000 #http://54.180.118.227:8080 + frontend-url: https://onboarding-kappa.vercel.app/ #http://54.180.118.227:8080 server: port: 8080 From 30a76a947cbd5b4a53aa35e649461eb795271a50 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 18 Feb 2025 15:15:11 +0900 Subject: [PATCH 252/256] =?UTF-8?q?feat=20:=20=ED=94=84=EB=A1=A0=ED=8A=B8?= =?UTF-8?q?=20=EB=B0=B0=ED=8F=AC=20=EB=A7=81=ED=81=AC=20CORS=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/config/security/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java index 1e23f7df..fc15d416 100644 --- a/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java +++ b/src/main/java/learningFlow/learningFlow_BE/config/security/SecurityConfig.java @@ -100,7 +100,8 @@ public CorsConfigurationSource corsConfigurationSource() { "http://localhost:8081", "http://onboarding.p-e.kr:8080", "http://54.180.118.227", - "https://accounts.google.com" + "https://accounts.google.com", + "https://onboarding-kappa.vercel.app/" )); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); From 3ed931f2f7dd522d29dfa2e34ff3f72b398bca9f Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 18 Feb 2025 16:36:23 +0900 Subject: [PATCH 253/256] =?UTF-8?q?feat=20:=20=EC=BB=AC=EB=A0=89=EC=85=98?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=20progress=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 10 +++++- .../service/collection/CollectionService.java | 31 +++++++++++++++---- .../web/dto/resource/ResourceResponseDTO.java | 1 + 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 576314cd..59d93ca9 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -77,7 +77,8 @@ public static ResourceResponseDTO.changeEpisodeIsCompleteDTO toChangeEpisodeIsCo } public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO( - CollectionEpisode episode + CollectionEpisode episode, + UserEpisodeProgress progress ) { return ResourceResponseDTO.SearchResultResourceDTO.builder() .episodeId(episode.getId()) @@ -85,9 +86,16 @@ public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO( .url(episode.getResource().getUrl()) .resourceSource(extractResourceSource(episode.getResource().getUrl())) .episodeNumber(episode.getEpisodeNumber()) + .progress(progress != null ? progress.getCurrentProgress() : null) .build(); } + public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO( + CollectionEpisode episode + ) { + return convertToResourceDTO(episode, null); + } + public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWatchedEpisodeDTO( UserCollection userCollection, UserEpisodeProgress userEpisodeProgress diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index ab3514be..630dd00e 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -5,12 +5,11 @@ import learningFlow.learningFlow_BE.converter.CollectionConverter; import learningFlow.learningFlow_BE.converter.HomeConverter; import learningFlow.learningFlow_BE.converter.ResourceConverter; +import learningFlow.learningFlow_BE.domain.*; import learningFlow.learningFlow_BE.domain.Collection; -import learningFlow.learningFlow_BE.domain.CollectionEpisode; -import learningFlow.learningFlow_BE.domain.User; -import learningFlow.learningFlow_BE.domain.UserCollection; import learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus; import learningFlow.learningFlow_BE.repository.UserCollectionRepository; +import learningFlow.learningFlow_BE.repository.UserEpisodeProgressRepository; import learningFlow.learningFlow_BE.repository.collection.CollectionRepository; import learningFlow.learningFlow_BE.security.auth.PrincipalDetails; import learningFlow.learningFlow_BE.web.dto.home.HomeResponseDTO; @@ -34,6 +33,7 @@ @Transactional(readOnly = true) public class CollectionService { + private final UserEpisodeProgressRepository userEpisodeProgressRepository; private final CollectionRepository collectionRepository; private final UserCollectionRepository userCollectionRepository; private static final int PAGE_SIZE = 8; @@ -68,6 +68,25 @@ private List getAllResources( .toList(); } + private List getAllResources( + Collection collection, + User user + ) { + List episodes = collection.getEpisodes(); + + return episodes.stream() + .sorted(Comparator.comparing(CollectionEpisode::getEpisodeNumber)) + .map(episode -> { + UserEpisodeProgress progress = null; + if (user != null) { + UserEpisodeProgressId progressId = new UserEpisodeProgressId(episode.getId(), user.getLoginId()); + progress = userEpisodeProgressRepository.findById(progressId).orElse(null); + } + return ResourceConverter.convertToResourceDTO(episode, progress); + }) + .toList(); + } + public CollectionResponseDTO.SearchResultDTO search(SearchRequestDTO.SearchConditionDTO condition, Integer page, PrincipalDetails principalDetails) { Authentication authentication = (principalDetails != null) ? SecurityContextHolder.getContext().getAuthentication() : null; @@ -122,7 +141,7 @@ public CollectionResponseDTO.CollectionLearningInfo getLearningInfo( .learningStatus("BEFORE") .progressRate(null) .resourceDTOList(isDetailView ? - getAllResources(collection) : // 상세 조회면 전체 리소스 + getAllResources(collection, null) : // 상세 조회면 전체 리소스 getFilteredResources(collection, null, 0)) // 아니면 필터링된 리소스 .build(); } @@ -134,7 +153,7 @@ public CollectionResponseDTO.CollectionLearningInfo getLearningInfo( .learningStatus("BEFORE") .progressRate(null) .resourceDTOList(isDetailView ? - getAllResources(collection) : // 상세 조회면 전체 리소스 + getAllResources(collection, user) : // 상세 조회면 전체 리소스 getFilteredResources(collection, null, 0)) // 아니면 필터링된 리소스 .build(); } @@ -159,7 +178,7 @@ public CollectionResponseDTO.CollectionLearningInfo getLearningInfo( .startDate(realUserCollection.getCreatedAt().toLocalDate()) .currentEpisode(realUserCollection.getUserCollectionStatus()) .resourceDTOList(isDetailView ? - getAllResources(collection) : + getAllResources(collection, user) : getFilteredResources(collection, user, realUserCollection.getUserCollectionStatus())) .build(); } diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 7cf235bd..cf9d595b 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -68,6 +68,7 @@ public static class SearchResultResourceDTO { Integer episodeNumber; Boolean today; Boolean completed; + Integer progress; } @Getter From a262e1c48f6d1602af691f095eb02fa6a11a4966 Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Tue, 18 Feb 2025 16:48:31 +0900 Subject: [PATCH 254/256] =?UTF-8?q?feat=20:=20=EB=94=94=ED=8F=B4=EB=93=9C?= =?UTF-8?q?=20=EA=B0=92=20tistory=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/converter/ResourceConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index 59d93ca9..c2f2bc27 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -144,7 +144,7 @@ public static String extractResourceSource(String url) { } else if (lowerCaseUrl.contains("tistory")) { return "tistory"; } else { - return "unknown"; + return "tistory"; } } From 6a784de1081972ae1d13745db3396c386347319d Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 19 Feb 2025 11:48:16 +0900 Subject: [PATCH 255/256] =?UTF-8?q?feat=20:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20=EC=B5=9C=EC=8B=A0=EC=88=9C,=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=88=9C=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow_BE/domain/QBaseEntity.java | 39 ---------- .../learningFlow_BE/domain/QCollection.java | 70 ------------------ .../domain/QCollectionEpisode.java | 58 --------------- .../domain/QEmailVerificationToken.java | 67 ----------------- .../learningFlow_BE/domain/QMemo.java | 59 --------------- .../learningFlow_BE/domain/QMemoId.java | 39 ---------- .../domain/QPasswordResetToken.java | 61 --------------- .../learningFlow_BE/domain/QResource.java | 62 ---------------- .../learningFlow_BE/domain/QUser.java | 74 ------------------- .../domain/QUserCollection.java | 68 ----------------- .../domain/QUserEpisodeProgress.java | 67 ----------------- .../domain/QUserEpisodeProgressId.java | 39 ---------- .../learningFlow_BE/domain/uuid/QUuid.java | 47 ------------ .../CollectionRepositoryCustom.java | 1 + .../collection/CollectionRepositoryImpl.java | 23 ++++++ .../service/user/UserService.java | 17 +++-- .../web/controller/UserRestController.java | 8 +- 17 files changed, 42 insertions(+), 757 deletions(-) delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java delete mode 100644 src/main/generated/learningFlow/learningFlow_BE/domain/uuid/QUuid.java diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java deleted file mode 100644 index dd141e5b..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QBaseEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QBaseEntity is a Querydsl query type for BaseEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QBaseEntity extends EntityPathBase { - - private static final long serialVersionUID = -301952604L; - - public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); - - public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); - - public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); - - public QBaseEntity(String variable) { - super(BaseEntity.class, forVariable(variable)); - } - - public QBaseEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QBaseEntity(PathMetadata metadata) { - super(BaseEntity.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java deleted file mode 100644 index deccd60b..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollection.java +++ /dev/null @@ -1,70 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QCollection is a Querydsl query type for Collection - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCollection extends EntityPathBase { - - private static final long serialVersionUID = -819230162L; - - public static final QCollection collection = new QCollection("collection"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final NumberPath amount = createNumber("amount", Integer.class); - - public final NumberPath bookmarkCount = createNumber("bookmarkCount", Integer.class); - - public final StringPath collectionImgUrl = createString("collectionImgUrl"); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath creator = createString("creator"); - - public final StringPath detailInformation = createString("detailInformation"); - - public final ListPath> difficulty = this.>createList("difficulty", Integer.class, NumberPath.class, PathInits.DIRECT2); - - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); - - public final NumberPath id = createNumber("id", Long.class); - - public final EnumPath interestField = createEnum("interestField", learningFlow.learningFlow_BE.domain.enums.InterestField.class); - - public final ListPath keywords = this.createList("keywords", String.class, StringPath.class, PathInits.DIRECT2); - - public final NumberPath resourceTypeRatio = createNumber("resourceTypeRatio", Integer.class); - - public final StringPath title = createString("title"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); - - public QCollection(String variable) { - super(Collection.class, forVariable(variable)); - } - - public QCollection(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QCollection(PathMetadata metadata) { - super(Collection.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java deleted file mode 100644 index 9bd5e4af..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QCollectionEpisode.java +++ /dev/null @@ -1,58 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QCollectionEpisode is a Querydsl query type for CollectionEpisode - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QCollectionEpisode extends EntityPathBase { - - private static final long serialVersionUID = -297427987L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QCollectionEpisode collectionEpisode = new QCollectionEpisode("collectionEpisode"); - - public final QCollection collection; - - public final StringPath episodeName = createString("episodeName"); - - public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); - - public final NumberPath id = createNumber("id", Long.class); - - public final QResource resource; - - public QCollectionEpisode(String variable) { - this(CollectionEpisode.class, forVariable(variable), INITS); - } - - public QCollectionEpisode(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QCollectionEpisode(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QCollectionEpisode(PathMetadata metadata, PathInits inits) { - this(CollectionEpisode.class, metadata, inits); - } - - public QCollectionEpisode(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection")) : null; - this.resource = inits.isInitialized("resource") ? new QResource(forProperty("resource")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java deleted file mode 100644 index a1dd4c84..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QEmailVerificationToken.java +++ /dev/null @@ -1,67 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QEmailVerificationToken is a Querydsl query type for EmailVerificationToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QEmailVerificationToken extends EntityPathBase { - - private static final long serialVersionUID = -1162432526L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QEmailVerificationToken emailVerificationToken = new QEmailVerificationToken("emailVerificationToken"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath email = createString("email"); - - public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); - - public final StringPath password = createString("password"); - - public final StringPath token = createString("token"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final QUser user; - - public final BooleanPath verified = createBoolean("verified"); - - public QEmailVerificationToken(String variable) { - this(EmailVerificationToken.class, forVariable(variable), INITS); - } - - public QEmailVerificationToken(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QEmailVerificationToken(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QEmailVerificationToken(PathMetadata metadata, PathInits inits) { - this(EmailVerificationToken.class, metadata, inits); - } - - public QEmailVerificationToken(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.user = inits.isInitialized("user") ? new QUser(forProperty("user")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java deleted file mode 100644 index 228ad549..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemo.java +++ /dev/null @@ -1,59 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QMemo is a Querydsl query type for Memo - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QMemo extends EntityPathBase { - - private static final long serialVersionUID = -1386685238L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QMemo memo = new QMemo("memo"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath contents = createString("contents"); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final QMemoId id; - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public QMemo(String variable) { - this(Memo.class, forVariable(variable), INITS); - } - - public QMemo(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QMemo(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QMemo(PathMetadata metadata, PathInits inits) { - this(Memo.class, metadata, inits); - } - - public QMemo(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.id = inits.isInitialized("id") ? new QMemoId(forProperty("id")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java deleted file mode 100644 index 9874dad6..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QMemoId.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QMemoId is a Querydsl query type for MemoId - */ -@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") -public class QMemoId extends BeanPath { - - private static final long serialVersionUID = -1164649595L; - - public static final QMemoId memoId = new QMemoId("memoId"); - - public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); - - public final StringPath userId = createString("userId"); - - public QMemoId(String variable) { - super(MemoId.class, forVariable(variable)); - } - - public QMemoId(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QMemoId(PathMetadata metadata) { - super(MemoId.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java deleted file mode 100644 index cda3efda..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QPasswordResetToken.java +++ /dev/null @@ -1,61 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QPasswordResetToken is a Querydsl query type for PasswordResetToken - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QPasswordResetToken extends EntityPathBase { - - private static final long serialVersionUID = -1219280267L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QPasswordResetToken passwordResetToken = new QPasswordResetToken("passwordResetToken"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final DateTimePath expiryDate = createDateTime("expiryDate", java.time.LocalDateTime.class); - - public final StringPath token = createString("token"); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final QUser user; - - public QPasswordResetToken(String variable) { - this(PasswordResetToken.class, forVariable(variable), INITS); - } - - public QPasswordResetToken(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QPasswordResetToken(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QPasswordResetToken(PathMetadata metadata, PathInits inits) { - this(PasswordResetToken.class, metadata, inits); - } - - public QPasswordResetToken(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.user = inits.isInitialized("user") ? new QUser(forProperty("user")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java deleted file mode 100644 index ddc976cd..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QResource.java +++ /dev/null @@ -1,62 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QResource is a Querydsl query type for Resource - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QResource extends EntityPathBase { - - private static final long serialVersionUID = 2055422878L; - - public static final QResource resource = new QResource("resource"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath clientUrl = createString("clientUrl"); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final ListPath episodes = this.createList("episodes", CollectionEpisode.class, QCollectionEpisode.class, PathInits.DIRECT2); - - public final NumberPath id = createNumber("id", Long.class); - - public final StringPath resourceDetails = createString("resourceDetails"); - - public final NumberPath resourceQuantity = createNumber("resourceQuantity", Integer.class); - - public final NumberPath studyDuration = createNumber("studyDuration", Integer.class); - - public final StringPath title = createString("title"); - - public final EnumPath type = createEnum("type", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final StringPath url = createString("url"); - - public QResource(String variable) { - super(Resource.class, forVariable(variable)); - } - - public QResource(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QResource(PathMetadata metadata) { - super(Resource.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java deleted file mode 100644 index aa6ef6fb..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUser.java +++ /dev/null @@ -1,74 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUser is a Querydsl query type for User - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUser extends EntityPathBase { - - private static final long serialVersionUID = -1386433701L; - - public static final QUser user = new QUser("user"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final StringPath bannerImgUrl = createString("bannerImgUrl"); - - public final ListPath> bookmarkedCollectionIds = this.>createList("bookmarkedCollectionIds", Long.class, NumberPath.class, PathInits.DIRECT2); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final StringPath email = createString("email"); - - public final BooleanPath inactive = createBoolean("inactive"); - - public final ListPath> interestFields = this.>createList("interestFields", learningFlow.learningFlow_BE.domain.enums.InterestField.class, EnumPath.class, PathInits.DIRECT2); - - public final EnumPath job = createEnum("job", learningFlow.learningFlow_BE.domain.enums.Job.class); - - public final StringPath loginId = createString("loginId"); - - public final StringPath name = createString("name"); - - public final EnumPath preferType = createEnum("preferType", learningFlow.learningFlow_BE.domain.enums.MediaType.class); - - public final StringPath profileImgUrl = createString("profileImgUrl"); - - public final StringPath providerId = createString("providerId"); - - public final StringPath pw = createString("pw"); - - public final EnumPath role = createEnum("role", learningFlow.learningFlow_BE.domain.enums.Role.class); - - public final EnumPath socialType = createEnum("socialType", learningFlow.learningFlow_BE.domain.enums.SocialType.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final ListPath userCollections = this.createList("userCollections", UserCollection.class, QUserCollection.class, PathInits.DIRECT2); - - public QUser(String variable) { - super(User.class, forVariable(variable)); - } - - public QUser(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QUser(PathMetadata metadata) { - super(User.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java deleted file mode 100644 index 9318e38a..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserCollection.java +++ /dev/null @@ -1,68 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUserCollection is a Querydsl query type for UserCollection - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUserCollection extends EntityPathBase { - - private static final long serialVersionUID = -1884551079L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QUserCollection userCollection = new QUserCollection("userCollection"); - - public final QBaseEntity _super = new QBaseEntity(this); - - public final QCollection collection; - - public final DatePath completedTime = createDate("completedTime", java.time.LocalDate.class); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final NumberPath id = createNumber("id", Long.class); - - public final EnumPath status = createEnum("status", learningFlow.learningFlow_BE.domain.enums.UserCollectionStatus.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final QUser user; - - public final NumberPath userCollectionStatus = createNumber("userCollectionStatus", Integer.class); - - public QUserCollection(String variable) { - this(UserCollection.class, forVariable(variable), INITS); - } - - public QUserCollection(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QUserCollection(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QUserCollection(PathMetadata metadata, PathInits inits) { - this(UserCollection.class, metadata, inits); - } - - public QUserCollection(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.collection = inits.isInitialized("collection") ? new QCollection(forProperty("collection")) : null; - this.user = inits.isInitialized("user") ? new QUser(forProperty("user")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java deleted file mode 100644 index e7aba947..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgress.java +++ /dev/null @@ -1,67 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QUserEpisodeProgress is a Querydsl query type for UserEpisodeProgress - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUserEpisodeProgress extends EntityPathBase { - - private static final long serialVersionUID = 820001901L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QUserEpisodeProgress userEpisodeProgress = new QUserEpisodeProgress("userEpisodeProgress"); - - public final QBaseEntity _super = new QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final NumberPath currentProgress = createNumber("currentProgress", Integer.class); - - public final NumberPath episodeNumber = createNumber("episodeNumber", Integer.class); - - public final BooleanPath isComplete = createBoolean("isComplete"); - - public final EnumPath resourceType = createEnum("resourceType", learningFlow.learningFlow_BE.domain.enums.ResourceType.class); - - public final NumberPath totalProgress = createNumber("totalProgress", Integer.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final QUserEpisodeProgressId userEpisodeProgressId; - - public QUserEpisodeProgress(String variable) { - this(UserEpisodeProgress.class, forVariable(variable), INITS); - } - - public QUserEpisodeProgress(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QUserEpisodeProgress(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QUserEpisodeProgress(PathMetadata metadata, PathInits inits) { - this(UserEpisodeProgress.class, metadata, inits); - } - - public QUserEpisodeProgress(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.userEpisodeProgressId = inits.isInitialized("userEpisodeProgressId") ? new QUserEpisodeProgressId(forProperty("userEpisodeProgressId")) : null; - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java b/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java deleted file mode 100644 index 2ed90664..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/QUserEpisodeProgressId.java +++ /dev/null @@ -1,39 +0,0 @@ -package learningFlow.learningFlow_BE.domain; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QUserEpisodeProgressId is a Querydsl query type for UserEpisodeProgressId - */ -@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") -public class QUserEpisodeProgressId extends BeanPath { - - private static final long serialVersionUID = 2042814056L; - - public static final QUserEpisodeProgressId userEpisodeProgressId = new QUserEpisodeProgressId("userEpisodeProgressId"); - - public final NumberPath collectionEpisodeId = createNumber("collectionEpisodeId", Long.class); - - public final StringPath userId = createString("userId"); - - public QUserEpisodeProgressId(String variable) { - super(UserEpisodeProgressId.class, forVariable(variable)); - } - - public QUserEpisodeProgressId(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QUserEpisodeProgressId(PathMetadata metadata) { - super(UserEpisodeProgressId.class, metadata); - } - -} - diff --git a/src/main/generated/learningFlow/learningFlow_BE/domain/uuid/QUuid.java b/src/main/generated/learningFlow/learningFlow_BE/domain/uuid/QUuid.java deleted file mode 100644 index a5c6a6dc..00000000 --- a/src/main/generated/learningFlow/learningFlow_BE/domain/uuid/QUuid.java +++ /dev/null @@ -1,47 +0,0 @@ -package learningFlow.learningFlow_BE.domain.uuid; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QUuid is a Querydsl query type for Uuid - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QUuid extends EntityPathBase { - - private static final long serialVersionUID = 1905925310L; - - public static final QUuid uuid1 = new QUuid("uuid1"); - - public final learningFlow.learningFlow_BE.domain.QBaseEntity _super = new learningFlow.learningFlow_BE.domain.QBaseEntity(this); - - //inherited - public final DateTimePath createdAt = _super.createdAt; - - public final NumberPath id = createNumber("id", Long.class); - - //inherited - public final DateTimePath updatedAt = _super.updatedAt; - - public final StringPath uuid = createString("uuid"); - - public QUuid(String variable) { - super(Uuid.class, forVariable(variable)); - } - - public QUuid(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QUuid(PathMetadata metadata) { - super(Uuid.class, metadata); - } - -} - diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java index 0ebb6103..a505e232 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryCustom.java @@ -18,4 +18,5 @@ List findByInterestFieldAndPreferType(List interestFi boolean matchInterest, boolean matchPreferType, int limit); + List findBookmarkedCollections(List bookmarkedIds, Integer sortType, Pageable pageable); } diff --git a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java index 8a3159e8..c0392a20 100644 --- a/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java +++ b/src/main/java/learningFlow/learningFlow_BE/repository/collection/CollectionRepositoryImpl.java @@ -169,6 +169,29 @@ public List findByInterestFieldAndPreferType( .fetch(); } + @Override + public List findBookmarkedCollections(List bookmarkedIds, Integer sortType, Pageable pageable) { + int skip = pageable.getPageNumber() * pageable.getPageSize(); + + return jpaQueryFactory + .selectFrom(collection) + .where(collection.id.in(bookmarkedIds)) + .orderBy(createBookmarkOrderSpecifier(sortType)) + .offset(skip) + .limit(pageable.getPageSize()) + .fetch(); + } + + private OrderSpecifier[] createBookmarkOrderSpecifier(Integer sortType) { + if (sortType == null || sortType == 0) { + return new OrderSpecifier[]{ collection.createdAt.desc() }; + } + return new OrderSpecifier[]{ + collection.bookmarkCount.desc(), + collection.id.desc() + }; + } + private BooleanExpression createDynamicInterestFields(InterestField interestFields) { if (interestFields == null) { return null; diff --git a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index b5b91eee..62f16676 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -25,6 +25,7 @@ import learningFlow.learningFlow_BE.web.dto.user.UserResponseDTO.UserInfoDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -137,7 +138,10 @@ public BookmarkDTO.BookmarkResponseDTO toggleBookmark(String loginId, Long colle return new BookmarkDTO.BookmarkResponseDTO(!isCurrentlyBookmarked); } - public CollectionResponseDTO.SearchResultDTO getBookmarkedCollections(String loginId, Integer page) { + public CollectionResponseDTO.SearchResultDTO getBookmarkedCollections( + String loginId, + Integer sortType, + Integer page) { User user = userRepository.findById(loginId) .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); @@ -164,11 +168,12 @@ public CollectionResponseDTO.SearchResultDTO getBookmarkedCollections(String log page = totalPages; } - int startIndex = (page - 1) * BOOKMARK_PAGE_SIZE; - int endIndex = Math.min(startIndex + BOOKMARK_PAGE_SIZE, totalCount); - - List pageBookmarkIds = bookmarkedIds.subList(startIndex, endIndex); - List collections = collectionRepository.findByIdIn(pageBookmarkIds); + PageRequest pageRequest = PageRequest.of(page - 1, BOOKMARK_PAGE_SIZE); + List collections = collectionRepository.findBookmarkedCollections( + bookmarkedIds, + sortType, + pageRequest + ); if (collections.isEmpty()) { return CollectionConverter.toSearchResultDTO( diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java index 38546a0d..1062abb9 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java @@ -158,6 +158,10 @@ public ApiResponse getMyPage( @Operation(summary = "좋아요한 컬렉션 조회 API", description = """ 사용자가 좋아요 표시한 컬렉션 목록을 조회합니다. + [정렬 기준] + - sortType = 0: 최신순 (기본값) + - sortType = 1: 좋아요순 + [조회 결과] 1. 컬렉션 기본 정보 - ID, 제목, 생성자 @@ -184,14 +188,16 @@ public ApiResponse getMyPage( @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "로그인이 필요한 서비스입니다.") }) @Parameters({ + @Parameter(name = "sortType", description = "정렬 기준 (0:최신순, 1:좋아요순)", example = "0"), @Parameter(name = "page", description = "페이지 번호 (1부터 시작)") }) public ApiResponse getBookmarkedCollections( + @RequestParam(required = false, defaultValue = "0") Integer sortType, @RequestParam(required = false, defaultValue = "1") Integer page, @AuthenticationPrincipal PrincipalDetails principalDetails ) { return ApiResponse.onSuccess( - userService.getBookmarkedCollections(principalDetails.getUser().getLoginId(), page) + userService.getBookmarkedCollections(principalDetails.getUser().getLoginId(), sortType, page) ); } From 9d4b350dd6fe79cb9318f23da38230f50803e6cf Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Wed, 19 Feb 2025 13:53:41 +0900 Subject: [PATCH 256/256] =?UTF-8?q?feat=20:=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BB=AC=EB=A0=89=EC=85=98=20=ED=95=9C=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=8B=B9=2012=EA=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learningFlow/learningFlow_BE/service/user/UserService.java | 2 +- .../learningFlow_BE/web/controller/UserRestController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java index 62f16676..0dbca90c 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/user/UserService.java @@ -47,7 +47,7 @@ public class UserService { private final UserEpisodeProgressRepository userEpisodeProgressRepository; private final MemoRepository memoRepository; - private static final int BOOKMARK_PAGE_SIZE = 8; + private static final int BOOKMARK_PAGE_SIZE = 12; public UserInfoDTO getUserInfo(String loginId) { User user = userRepository.findById(loginId) diff --git a/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java index 1062abb9..e4dcb21e 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/controller/UserRestController.java @@ -180,7 +180,7 @@ public ApiResponse getMyPage( [페이지네이션] - 커서 기반 페이징 - - 한 페이지당 8개 조회 + - 한 페이지당 12개 조회 - 좋아요 시간 기준 내림차순 정렬 """) @ApiResponses({