From f1de8530003737e936c6bcfe547c56a9b0fd0f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=91=D0=B0=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D1=81=D0=BA=D0=B0=D1=8F?= Date: Fri, 21 Jun 2024 01:32:57 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B5=D1=81....=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B8=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC?= =?UTF-8?q?=D0=BE=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../favorites/service/FavoriteService.java | 6 --- .../movies/api/MovieUserController.java | 47 ++++++++++++++++++ .../backend/movies/service/MovieService.java | 8 ++- .../viewed/repository/ViewedRepository.java | 5 ++ .../backend/viewed/service/ViewedService.java | 5 ++ .../resources/templates/card-category.html | 19 ------- .../main/resources/templates/card-film.html | 27 ++++++++++ .../src/main/resources/templates/movies.html | 18 +++++-- data.mv.db | Bin 385024 -> 344064 bytes 9 files changed, 105 insertions(+), 30 deletions(-) delete mode 100644 backend/src/main/resources/templates/card-category.html create mode 100644 backend/src/main/resources/templates/card-film.html diff --git a/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java b/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java index 7ba916f..faab61f 100644 --- a/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java +++ b/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java @@ -36,12 +36,6 @@ public class FavoriteService { return repository.findByUserIdAndMovieId(uId, mId); } - // @Transactional(readOnly = true) - // public List getForAddToFavorite(Integer userId, Integer - // movieId) { - // return repository.findByUserIdAndMovieId(userId, movieId); - // } - @Transactional public FavoriteEntity create(FavoriteEntity entity) { return repository.save(entity); diff --git a/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java b/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java index 4ae84a2..b83c732 100644 --- a/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java +++ b/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java @@ -181,6 +181,53 @@ public class MovieUserController { return Constants.REDIRECT_VIEW + URL; } + @PostMapping("/changeViewStatus/{id}") + public String changeViewStatus(@PathVariable(name = "id") Integer movieId, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + + boolean isViewed = false; + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + ViewedEntity view = viewedServise.findByUserIdAndMovieId(currentUserId, movieId); + + if (view == null) { + isViewed = false; + } else { + isViewed = true; + } + + if (isViewed == false) { + + UserEntity user = userService.get(currentUserId); + MovieEntity movie = movieService.get(movieId); + + ViewedEntity newView = new ViewedEntity(null, user, movie); + + viewedServise.create(newView); + + } else { + + ViewedEntity delView = viewedServise.findByUserIdAndMovieId(currentUserId, movieId); + + viewedServise.delete(delView.getId()); + } + + model.addAttribute(PAGE_ATTRIBUTE, page); + + return Constants.REDIRECT_VIEW + URL; + } + + @GetMapping("/card/{id}") + public String getCardFilm(@PathVariable(name = "id") Integer movieId, + Model model) { + MovieEntity movie = movieService.get(movieId); + model.addAttribute("movie", movie); + return "card-film"; + } + @GetMapping("/countView") public Integer countView(@RequestParam(name = "movieId", defaultValue = "0") Integer movieId) { return movieService.countView(movieId); diff --git a/backend/src/main/java/com/example/backend/movies/service/MovieService.java b/backend/src/main/java/com/example/backend/movies/service/MovieService.java index 1789034..ac5457c 100644 --- a/backend/src/main/java/com/example/backend/movies/service/MovieService.java +++ b/backend/src/main/java/com/example/backend/movies/service/MovieService.java @@ -10,16 +10,20 @@ import com.example.backend.core.errors.NotFoundException; import com.example.backend.favorites.repository.FavoriteRepository; import com.example.backend.movies.model.MovieEntity; import com.example.backend.movies.repository.MovieRepository; +import com.example.backend.viewed.repository.ViewedRepository; @Service public class MovieService { private final MovieRepository repository; private final FavoriteRepository favoriteRepository; + private final ViewedRepository viewedRepository; - public MovieService(MovieRepository repository, FavoriteRepository favoriteRepository) { + public MovieService(MovieRepository repository, FavoriteRepository favoriteRepository, + ViewedRepository viewedRepository) { this.repository = repository; this.favoriteRepository = favoriteRepository; + this.viewedRepository = viewedRepository; } private void checkName(String name) { @@ -71,6 +75,8 @@ public class MovieService { public MovieEntity delete(Integer id) { final MovieEntity exisEntity = get(id); favoriteRepository.deleteByMovieId(exisEntity.getId()); + viewedRepository.deleteByMovieId(exisEntity.getId()); + repository.delete(exisEntity); return exisEntity; } diff --git a/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java b/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java index 114049f..fbad52f 100644 --- a/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java +++ b/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.List; import org.springframework.data.repository.CrudRepository; + import com.example.backend.viewed.model.ViewedEntity; public interface ViewedRepository extends CrudRepository { @@ -12,4 +13,8 @@ public interface ViewedRepository extends CrudRepository Optional findOneByUserIdAndId(Integer userId, Integer id); + ViewedEntity findByUserIdAndMovieId(Integer userId, Integer movieId); + + Optional deleteByMovieId(Integer movieId); + } diff --git a/backend/src/main/java/com/example/backend/viewed/service/ViewedService.java b/backend/src/main/java/com/example/backend/viewed/service/ViewedService.java index 51810b3..67e2888 100644 --- a/backend/src/main/java/com/example/backend/viewed/service/ViewedService.java +++ b/backend/src/main/java/com/example/backend/viewed/service/ViewedService.java @@ -31,6 +31,11 @@ public class ViewedService { return repository.findById(id).orElseThrow(() -> new NotFoundException(ViewedEntity.class, id)); } + @Transactional + public ViewedEntity findByUserIdAndMovieId(Integer uId, Integer mId) { + return repository.findByUserIdAndMovieId(uId, mId); + } + @Transactional public ViewedEntity create(ViewedEntity entity) { return repository.save(entity); diff --git a/backend/src/main/resources/templates/card-category.html b/backend/src/main/resources/templates/card-category.html deleted file mode 100644 index 37ffe6b..0000000 --- a/backend/src/main/resources/templates/card-category.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Категории - - - -
-
-
- - {categorie.name} -
-
-
- - - \ No newline at end of file diff --git a/backend/src/main/resources/templates/card-film.html b/backend/src/main/resources/templates/card-film.html new file mode 100644 index 0000000..24d6bd5 --- /dev/null +++ b/backend/src/main/resources/templates/card-film.html @@ -0,0 +1,27 @@ + + + + + Карточка фильма + + + +
+ + +
+
+ +

+

+

+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/backend/src/main/resources/templates/movies.html b/backend/src/main/resources/templates/movies.html index 9e63504..a83ca76 100644 --- a/backend/src/main/resources/templates/movies.html +++ b/backend/src/main/resources/templates/movies.html @@ -96,8 +96,10 @@ th:each="movie : ${movies}">
- + + +
@@ -109,8 +111,16 @@ method="post"> + +
+ +
diff --git a/data.mv.db b/data.mv.db index 58631d5bdab5708b57e40e9b51182aee96fc4bfc..f5509a04e7605d9aee59926d8d2c841c94630940 100644 GIT binary patch delta 14391 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 R8C0`UG4f?v(oX)S@xPuBx-tL& delta 12173 zcmd^Fdz2K_nXjr_)vxJ!!_4#m!_0s)Fbp&G?y3QFNDxFL3fWb6e8lSNs)!FB2GqoO zrcsYcj++D=GRsZ?`UT^0L2PrbGMj&^oeJD1wnDXP8KI;#eh-Zj=o zosSI|z1LYc4akZk!k0Azl2){F%VsoV+6~V2A6vP4)qpI+6|0<^)(t3b@4D6YfaJRR z$mm&TT&g8e1lwGHXQ28Lnoz{j_t8Qca2x7G7axOY2Jt6N*eDQz8XVt02-ZZ5v= zIQJ0$!ptAA-fI^B44+K@aBe5Zb&T}i=z2ZZ@mHj~m`?dV#Ih`tf;;m1W;zO=-`LV3 zfO&l`!wALv_i$+*8p#w=Oke6hfj z^T5b%?S%wG?q3>XvImCf{S(P8*<8lHYW=Ef`eexv87BGSf+vzp4xhCN^|BJSHlZd@ zI*4jG+{f{c;5CQQt6mM_Ro44J9XiTp3`ry(Rd(=`ucDotB;wM!s7tyCo>*eo-9s=A zGJGHMNBCc44*v^A_)91D(GlzzU3+dVE*;|1UEwxW>_gcXBumO0dCP!}SmvEL#8s{7 z09PR!D+L>?(T%mO*uH)WqZw0U_p^e1)#<(#6c_Hc1V8k9l;FO^;Kw(jnM0lX*>BB8 z%qzA02KI?semi@6Ex(r~)=utxo!bdN-Co=IL~Z9QwVmW(_lzD?vAVaG80NgK*{Kz) zo2j3z@p!=|G*o4TKgi-eEPsnP{Vw!1#6F1k--G6kls=cNC60OR${U>X!Am7e!HLai z9yS-DD%fQWU%44|AX|DE?|q4ziw}*UM4c+eu8?g5vj@0&_`8~r0Q5S{l}alM2T)$ild46 z$Zl@ZnPzWnQH^jhdso}``Zd-n`{NKYJEP~B!Shsw?w34Lf4C9XF6I(={WYk0PSN&v zMb*kCsKmDsDUp1dq2REG!s^QNW zC!dABe}gCBw%uG8zThfUgLi%uHQ~=A{?WhlcDKQHKNc;2KHP4-y!<)* z^yA!QT(cRa6(d}A$tM4F+^U;~Efy=iAlQa^#F1idkPo&&vg6y}els$p((iJ3^))Cl zo5XAA?)fNmgFqecl?c2NZ(E5bH&;Hq?1T8?1b=yd+0{dYh}jwA7u9g}f?8Avrr;CP zQP#@)OB5iAN)bg;^_X2jl>C{+iajeI{0-kcNs?@zM*whUZDa(Fp#B(m&xFjH_k%4T0S8s75hsWM#yLy>!X%zVzTw?gwPrbo;mmhg< zaJRq1U@YwL(}Iw=^~{Xm-Owhy#z)Q^I%kE0MFd$?M8mSIvNQJ>e}Nvuzz-0=(?|T+ z-Hmb-5*buMmtPL)^2t-v-5|(Zvy3A9$yr4PmxRDR%|4%*~qeAM#v+?09 zY9wgbIO~)S8pps8gw7E2f6-yx({osY-7)H%0J|rm&i4W0cvKT6jWc*+$UX&gQXU+~ zoc^(pIfL1R%<1Fh=`rVph=1cB0-!c6=5lNl=V9DdL}C=@4q#Nlk8{-Cp23&T5pM2j zSf2U{)uvC>?yF^ZDq1^vDquVLeMHQHTt(^n&1rAOb6f(U`mGt<`vPa^Q|jNTB8r!u zG*0o>|7SK*y!(8`du7x0)m{(&U7EdAXzHr@P7l5y!!DcC-E^dulG4p%OwHC-NH+$V z>UmqUtzpzsQc6A4Hdu#``~vl5^W`602ammnCbMFYakQL``kM-rdvy)qKa>Z+!+68X zpoUwjP?mFx_!lpujyhSh#66+NklZ{TUC%Y)CV_9je|U*&l7n1Ml>)fS7pcxEXs#Gj zm#SElj3CDGp~I+cp%{fW+?8^XVrp`Xj9gc8V^4NMoh4J;RdKDr=a6CUlujjQFwf*!Y`tHKJ0S|Pi(InD|^I)eIe-yw86zGX4$qj`iG&k7(v z+`AZ^!;1L)!>EI`y(3G|uh}$>SX~6M`}|V0lT~RBHyq?}J6ZvoOAOjK71(W%Neajx zYhI*d>d7s1%s4Gn3umW2!3aHrOt$-O7)wm{H&0S+oPFEZ#@Y8ujBx%KQ_b&Zgk=m< zJ#|0fO{QA%wK6yhoikqQDEepC&j}@eDWk2BMJcKeNV@A7szs7>$O*rUsxIsleUYmM z3a&`Kh-OITWdEgc$-W+>AFvO=a*C!Ge31spe*GbaYXp%tJO;`BMMRw8{o7F21j)Yu z`i9)z-;CN=4gU!|FyX>Sl)S?nUts@# zVf>_tM5uS<8uTXnH`R~^{@0heya}40L>Fj&8a?TEU!c*Gd7P)wlKDx3MoZ>cf<{N? ze;^9sQ^k9mj`9zt{V)lgKE@b&EKF=gGfa!Pb&%$m?>Eiy6W(z-p{3YTAs&)u5JA3T zmmm}OBZ#Cq_xWkgt%H9)%}Jk}=JcFVs!Vg>9wf~fS6Zp-{}H04m55OwGyUrY;%Qe` z{*lvd57O=bKB>rZno@CGb|tG5XIIM~VDDu6!1wdk-0pzN>VOu15hX8`w z;|#~85u^n)Bl(y|)k?rKGG2Xlyr?X}B{UmWEy^=$(I!!{2&#`DvIT&}fmN?ZH1{w}Cb_xkneRoz=y@0G8ktNG;BGdPaRF?idp z+@szf-{5y5fF1sU{_lDh>_lJXxt_0iZ;hfK^U2i33!W3WK3wxU_dz_|z@LLRzRun6 zwKenYoOgH<|0L^Oc?CZo;jya@oD{0!iZWjQGj5VuER-*D#OSLOeYK;n#ptU; z(C8y9{#6?FPc|t%n)#SK(=9wJgO<*6BT$trzxR;WZ7U}BG*ES-gx{$`kKm2JL=R0a z*ZHJkA=IA$^t*Eb4J-KqJ_6b8d?(1|olpkrR0f;6Vn+hhESi#L#Zz5HlnN%UuR@KI zp28edKb|*Q-a6O8o1>l!rPf^4RZ7Hu#A*hj5td6X?l1}}^gqz1~DNWL=~OUIC6}F zi1#$0_PPR{lS&744DxXFw+(3e)qvt8nIb4olPW-QG7=OgV^Z{!Er4!FrUsenUC+W; zVrtqJ!w4C*{ArMd3{!L7hajnf<9EVk@TuAOL4Smdn|uJ-M%T`Rn9*Lg#tz6uyr2etQ@D z4Z+(u!tUY;Lo~B+T6M#!JJN7k>kfXm_sbpp4-%gENACCN(e@wQ<12+#U(L`WtTV4|6JGvv?pwoA^}%q1h*tgTL)h&GfPr4(g|zeS zKdK_K!mug?rQUK64rqZuj*(YmrFzZM6xob0Fc~*+o~g&;9_*okW`Z<|_<`hn5h|Nn zX!FRZ(Sd*XI5%lQ*^sdFqiYmyDxps+NTL=8W+J)|mjMV)_uoR0 zU3~Z$n>*JBASGTuQADM@Qb7+{jSTcFIZm9wz#dVNDIT6tX^-D}mR&90CNm_j?pNHe z*(!h(vg(pb z-r(Ng#-Z=mPl>*-`RMyu^{NCn4L`jLt;P$60HB9F^bx^_N3Z=)+-JCCdTn(&`Th|) z`yjV81^w#gtJzt2Yevw$moma$in!mU%3KvFu+t`2GJBxuHiEx@4yHlKr#@i`8SkGq z@i(T>O%GLhKluW`B!$)sS+8XWKd-uH$xt-~Y1o0>o=fP;XLtK!&807vTcHa#)WkqK zuLRxDo)2B(7oK6GQXeN9HpWc3<-qvD^G_GuNej=-rm08R92KE0rF_&ra8u8CbCc9J^_YD{U_GpG06I(v^PHgiBDsA@TSSz~mS2bK$iIveUC4gh4NNrZ} z!6r7hLe(ZRFi2|3RdvYH2~e6v5Od|Ky5{PpsZMNP<(k5?$(kzA|E(k~WmlOlEHxx8 zzcwANsT610upR)dhNyc175_lQ7DBt-&LHK`O=7nsi%y(w;q3&&XaB`kTvUS%#7@mL z;D|6D(X5ykJ+LYf0X`$*qtK=+K8fm6J@$hZgyow~}{t(alR?gMtW@Q@STS zn)0p&r$_uB=UwoOz&QW4ps-|b$DGrm9HBTdaiqv}amkB&u(*Cjh5Bb3yu1YKMb^>K z-B{+POGO8oFeHS!E8Gz#bh{NhzKn3aZ@zBQ%t9Xyr;z z)0t!zK*<3`0_%l(0oanv30snpup=1>JCafO7bq=}FN7A!NNACaga*l2bK;A1Y*2kc zF=>T=9?&6h?;w-=x7+*?K%IQ1tV8~I3#ncAr~E9XtP7$n1rC*kgq|H0zpllMe|6j8?=iz{>lT;b~of5SCbQQ>y*J|~pk&giOa@!T@zm)@Y|!|nqT zf;qdR1s`Zfo$N3^(T=*8`Xx5#3V||s;4<1B${YeE0GHG>4bibq1qA_@q9y+C4NESg z<+s*cYd@6V+WN`sp?>)dltDwF4B8J8Wzd^Q%=$3mT4@z-z4xQb`Bq*?AiaZF1hLZ1xuWPDrUSxu4rT(vzVSA{T?7k3 zTfOkdCvQ8c)%(csGg;E=ZKg#uJoGbKH!V}E8*#52v8)@gETl(A)8%FoRLf`;3(FZK z7X7WDzwx>Q46V%uH(YWb%ZC7 zb(9rY-3YebSh@s11h5^pxu+aLxkb?Cjz~qep@J0#V}Q}+_WP+D-#$cF>?=&DJ(VqQ z5mv>A=$5>HyLIhQQ zA-@H03@GsOTr^WHI&S#VFyf!Y{AU9l8_EwqmbW)e&xBUpFeK%*rRATGg@*5A5Y8h7~v@#D&wi?6kNxZ=sS<3 G>hr(lQ^Fbm