From 3c0b7596ccee43f2deb2c3dd7e52b76d8fa36ba8 Mon Sep 17 00:00:00 2001 From: Amagasu Date: Wed, 11 Jun 2025 13:04:06 +0900 Subject: [PATCH 1/3] app name changed(login page) and app icon created --- frontend/public/index.html | 2 +- frontend/public/testicon.ico | Bin 0 -> 786486 bytes frontend/src/pages/LoginPage.tsx | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 frontend/public/testicon.ico diff --git a/frontend/public/index.html b/frontend/public/index.html index 8793c25..ce35ac2 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -2,7 +2,7 @@ - + %V_~|Ni5z#lQak{mY+!|Lg1f?;n5u```Zj-@o7YpFjV@|44uYNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZjAA$e> zzcl{sfA_^neC-Iuo+Lm5BtQad2^60Dth6=(-ARB1NPq-(5Xc_; zLSaWP_9OukAOR9sOQ7)FXQj0X=uQG8KmsISP9S^f%LVgXY)AqmKmsJNmO%Nr&#G%f z(47QGfCNauoIv){mkZ{(*pLKBfCNZjErIfLpHo`>eD)1RIb536KB@*b>NI`f|ZG6uXfC36KB@EGJNY z?z8Ih9Be=WBtQZrU`rr->B|M%Q0ztmBtQZru$(~oxzDQ0bFcvkkN^pgfGvUSr7sk0 z6R{f!kN^pgfCYiVbDxzga9J31wu#t{1W14c zNWg+X`qr1eEpo6236KB@kbo_L(tDrQY!k5?36KB@kbnh&^sO&_TjXF55+DH*AOTwf zrT0Fq*(PE)5+DH*AOQ;k>04j=w#dOABtQZrKmxV|O7DGIvrWWqdkCbr?(cgK7j`9q zO9_B~;+IbU;#lB~dzQU;ZJe0|77zgc%olW~r5yqAmJgEIv12C^xRe0?_kJmWYsbQG z_Gsm`_s79VU_Al+Z-0FjcF-Y!-{~Dn9cpwTf%gdDFTi_jj+_|3(94uIw^f8@)0$mK zK$k%A$6PGx_NALHf#Q`tSk$GOy9r2hF)JkCoPh9qPPUv6@@Bl`j`;ZzSoce4;$7F8 z&LpscK=UX46Rc=W&lv*X#XTsSp(>wk!jzA5mjt{KX#S)>fw#=egWTH7nnk~mCelTH zX-fi&2sD4vpI}jI+71vv?u(igKU$FLz@7343G5<({Hk|lW8atna#PgA1Y&yg>)2UX z&o`n2378QOe#v3WEDRgf2!y*ZSkyA?t&a_^l^O4@)sa3VU_b!*VH?C?3xNP~M*|w6 zquZ@rW8!_?qGK=;$O#}n?EDlfW(1H6!Zl{Gmo~!Z{gf(6>^rK&rU?ni1dt!L?7-c1 z1d!VSHS0p!JA)$!*<`}t11=`p@i+;X5kP*@W?|SUCV*TGsEKXwSc8KH+04|z1YFGY za&@*iud9UX!W3t>FRmN#=Zs9WIs^T40?56{n%wiUiadV4J3M}FC0B+UxjHD!=ql$x z7-2NGTLWVvN050DA8Hf{AeU0qC}udqst7?SjtwOk7PrQ_xH?swD=xZ9i-d{8pSwmT z?b0A9x(q3vB!JvVQ8U^1(BnlEwc@~xH7lV$(8b#kVY=Uzx4^YL%|VV6)FvIPBjb-b z^V9$V*ln zsrfYPy^Z|no1+DRlguH{Ym0gQ2(kGtbPxz2SCDH2!#B5bM8!%koT3R*>}}*nk4zUd z+hd0$Z!RYJBhV&W@VHC>xq?I^8$P?6P%3`*!YP`7#ok^{^x$+swkviB@c3ewKgey^ zp9h-+z$=JlP0wcqF{RqN7f#IwsrUABqDMwcH1^4p0FQr;@du%ene$YW0LVXHUOqJ+q~6=hi5?j(*O-ORTeI>b(0c_Sw_aQ7K>{HEAOmfml?713q8E-})!gds zka}+~CwgSGqGnzGV!N5* zx~RI&12f_Q5Ods(N}K>f{-?n`sYIyuQbIgyn%-Vc^tExC^+oxceR08}giCGl>4Fl> z6ZFCYw4w|rAka>>a8D{f0tvn1XD_It30Umy>U}*hS-8u zl;H#r>^}|eN##cX0ow}-@vLcjdpXh9#%b2o^EW%n0`)u_4dqFbT_k66r1pteQG*kx zaW2+zTPi;SMTSYS7gTb*_p`U12Yv61L9ZJ=*!C`TWB76F;?Rr@x;1?$zzKlNe=^*b z${zs)Z!asvQ_%Fb^Pm^Tk+*ci%e`v5x*5E=)uztt&E)x!Vx{Rr0Z5>Tw^jr_DN6{{ zc!qkSZ+?b@V~eK0LxG1$2QoM$xgrusrr8?tX_`=g6F`9fG`J^~34tc$MBn^u8a4&Z z7TyHSiE@GN2)RE}(aqr5O@)SviDyc#vLUpC##QpO!UTr3MejH@AH3e%al0NFZD~j( zK%!Zi$D4UFd-1cGxp*omHcco12_#^JPtcIE8UbClf*ZJ1%jvd`%(X5&(mm0v3**x{ z8Nc=^hp(NA>#_rPaRM<_d5wEgStC#+TocRnqE&BEZsBbgnQmQXr29{^E`xJt5Rp6u zVp4QK4$7LM?ZrizM!b75ghNM*Z)bRY*6hfbizY%^|1^sNoMMZBl4t31K*U`dIooBs zAeqaizGEEl?qu0nDCAjwyDKI_`mXD~Vxo1P2rIce=zz#pXyot*?SgO)n&_RV;N2mz zgP`pi2kHCM90YSwRD_k>8gcNfk*D*s3o`T*m`MTw@a_;<@btgfG7i%8r|}QaAR&TF zj)6FwqLC-vxQhea7?Q1P1d!|d&VsU97jJcBoKK?|8|?U#DfT_r3Lz#>hd7+2k>}mA z3j*AdjZK>bkn8(Q5ZR|`w(}!ECQ?j`wEJlkn;vb25R(T)98T28Q(Nxh^ej`c7f1lS zzRwL;f~~j9kckvSBJDnnV#m|15Ms3%k+Y|3YO|Zwae!u#*r)98S4iSdN4A`ZR7?Z3%`zi-RHh zi#0I{n>7g2CJeg_5I}A)*mjA-DYpyDaV&ee1>PI13mPJRMAOT8Opn7H^XDl80>~wX z7+vCU%I(5z9Hh~waSLi!FoavkhKQfi1Tu>jAk0PGX**A#_Xd0Q^9h$aAmgY6KpK4- zm0mZQAl$;dh`3i1%)v#k|7txLdrSs~A2a7E0|LkmCNTz%Bo2N)&1NxcL|5$!p41x?7`sH|)Tc3?WuP50 z$bfBf#HLHq^p4K~bjXoJa}cW}`S9ob$Vlt?E_7H*VC)i+Q=evOausuAkoiV7UFLH- zbeKVhoc(DW4&ID}PghemTgZZ%ZCsZfxa)yHd|$ND#gr6aXxTjSp1yt za-~C&RZ^4(PsGJf*}?N}ah$H=*mPivF>{`>B+$IdVwmQspP+cwPZ617KCMlc`J4_N z=F!bNIK+}fLS_^+i5v1MxP>jmhnnpK!hO{i#e_9+UN0VZQq0rlmHDW-XI`1_a-~BK zDzC_c=lZ-NI~=r|j|NtHXGCm!J*nS9pm~+GRLz4wLG8GQIx@n1PMa?CIUPF8qnmed zh@}<@8MdgY8P@7WlcZQX%epH9$*tv|wY0giR;f8`uh#;{_4$yoTWvkx|<|9nE5F7r7ZI?SV+cW{VB zj)aU{)X28+Zt-|hjP+c*C6L@&{wXBS#l?!?uy?DNHYv_0Obm;k^Ih(9D1yq1^5D5X zugDIE?&f1QEBK^Mt51NtQMrr2{5>KLZhs6&`1z}`=`x?wn*+kF`O`v7ybZ3E2bn$B zAl>s*c?I#IW-o#K*7Ay+FxM9=vdOO9V$`HKpDi&ge$IEf%%MoBSd<4Z9!ZL_!_m9R zq~K?BWW=XwLcw+dD)*>jvIT`ra+@w&0Iq9_K>IY!0Ekc1tId!5hel|_+5EN$@io(>wsjwv+ z=av%!;j)B9GpcYl-fH^T3*vaS^?a(Db6lVAa+5<$Mpz>w3&+D2;&Xu}%nL4rkr4;s zIJcY-(7H#&=hHZuI>bO?2l4O%>EaO1@VxT}6^S8M^MOxsKxo98+FY@wwyvFJ-4B7< z-NkhzZLAm8h?S*Ah#Iz3@&q?wq0;CM6M<5^g$x_(Yiq>k4o!`KP%jQH=)+d=Ad9XD zgv$~ZNMPZ3vW2*rX_9QkPn9r5=cK68=mL`jOYIY!w01nMgH{*F;;F%Pacbmj@gR$? z2q@koV)fHFApizeNsIJSX>@@J!s^q2lOk@Q)g3YfNTSIHPXxu!{1hv$2o!HEDdK^X zgTg27xl}16jJH%W#D=xCN}~%*YJ8G9IB9aK_z7BFBP&7>iuvGzIBeyoSn)<6Tvlz- z6}V=S*Sl<2i1SFbic0sId0ba%bh=3lL|Efv3MOF-ce_j(2s9VT;7$D}NRIH+A%W&S zc4cn51wohX3UNpxFSJ_AU4FY-y^i)lKz$l~M#Ky2|F?bK&H&JdyWY4Ew!4e{2eD8~>Xr%oa8a?a*G4!~)8{saTgT1V^?A|17+ zJJbh3)ceZ;Jr5;BTZxdYioqhPt!#P zvF$RvQanIu;K-Hejvi{=B_hs0jXgjxn{F_qscy%E+z>cH(=}H(B`mrOuM`V#!d5bP zs0)ka2tU0M5biE)jb#qUk;Pbx;ZsPYPc!UaJcu+c9(M}DgwGWL zgmz(TMPJXJVesZ+c#5X;Cm1%r=HM8mu~XMTyI>HT8$`O~8g;yRi&{m!^=DY?mDE?X zcI%nUE_@D;Ab5tYVe@Ma1{A^~A65{@Tlqm&oDhhwskWYvT61pJ=UWGdX0KQfPU$Y< z7PYl*N6&6G0(pISirlJL8TP;CU=d4F%!f?`wa@$@D^3X1t}L#rM2!u5*Y*KaI_4(G z;Q6U5D+r39872@M^{Mx5c9aDJd1S+6cfcP%lJqKm;%UAQMI$f=0Gd z*$usfg-RozCc@Okt;s2ho_TSy%N@saEP16iX|AkQY7XbtYm7jhh#f8*=0_swYK-p% z3~!ujT|02zAX7{dJcWf~yQ8fHL}9BrU{E#}O{*gW%`rcL=RthtM^b5Nw%iU9eoL?w zO_5=PMmIpP6&AW3&vg?Jg)L;dAZ{)YH|Lt>jGw^s2yXKu!R9r)t_DfIE1Pa#WYVC~ zZT-0gXJMh<^iV?qQP@I83*zPiadWO|&iDyDkKjB%5^q?u@m`S38{?_8MrMpPDoqoU z*uS<;jy(HW;}h2rII$jCBc5(Grw@2Uek5eCX74WwOuIMaOm}d=Ae-qWoDKfMLOA}^ zmVhX1fk1*DT!6L?WypXIV~0p*Hx`l1f@Wj#xV4Zl-inX-U&qP8_0pk` z3`+x?Vvd0NG+pC>p0TXUf0sB8jI4L%MEahaA4#5Q5FlonB%APQ7HP7PFoLi(*;GC* z^bK3G!y~(ahP>#dA-ffKds`Umi<#x3aYDSE96RjdhW5%3vbnI&*6i5K{1Y^NJP5#9 z64~nHNxS0b>I_Ht7s({Wu|X0OXtX zvDedHp9BU!4RRt$3}X0iu?`gCoNK%h%M;=iZ?l9v$Ou8q#R>w*6?~c%t+hPC5fYhJ zciAUtTKtq99@#CDNs7ZL5+CGqxR?4tB(0!P&!cE4#131E?P!$~2%MXX{OtBhGjma3 z8M_!DDO%=n+bdyG{G1G5^lTOW@`#&x*MEr=Kll+F&=M$+`>=e3KSkYRvM2G zx2~;?Bl&DsgA>>1lgDoOdcJS31D;J#_BJ)v3(4ax<5Ul}i)lC4PWUu)76r!Piy88w zaVnqfax8geK6&m5R_0rS4q%?93~aYi)*RszY>f9#Yvdwg&2}8ka331Z#uXO6w=qf=EPqDLiNPCPS1?oORO1~H$J{}J&;ZJ2r`{+$3xvV zfFxzin;9J!iUBMckMjMqXcvn^y~voM|;Z3l$}aHa8ln@BbUCgMZQ z3IfRO#F}D;SYWv>hS^d?rrr|FTT>69kPIF)-tKNJ4?=RxnWyFnAh+XFGe5hc1A-{D zD~iMJ#f#$LdC`VI-q%mXhJZ~MgsM#vcF74Kx8qQg53;v{Ao?W~lzT^5-CY z_$Pfme1>e-ED);K413}r$OXC5IE0Mw`C>O^4oB09)SNvCv^pX_q3QMolJ+EMdE#7GW=1Y+m&Q481j{!< zQ|5fk;dsr#gJ8JD{K1f6^?6lUU;8DtY{v#G}b;Kbe_Ci-3INzg?|f^wA}N++CMOH=Zjugu@pYl(`yh zCJZv~PczenXMGX?Z{KHlruq>8FR>Rdxc;GtKZW%j(1Zc=tvg2M6fuGPmh(!i z=b8i#C6NEH^U60`UMyA)g^yUu?vz{Do)i2TY|qI6Brs0^`L)Mg5dBXRpYp%HbuRzpy(L6` z3Ena@4+)GB=>4@L`l4nmp4q8l=3>z-5*uwHP`vb{xFr~yl7Kpa%TaY68t4 zd=j9k?-C^D#-9g8H74_BJMj1LCLB(EC4uH|KA*aIWK57ZT3YD}xiksQoe)5N5>BEr z1_@{p5PtTx7Qzvgty*8jdRI=xzO-^n0QpI{4bNaCFifEM%NN{=dflSXeSWJq>U>8! z_$Pq;D*R8ugd|`<0QqB4)F@8Wn@X`YtvnMzei)wfGaCt554&<5a$m2&4 z0Dl-q%)*c)U`7D^!%>$F3^qWL zk;mcgeFTu7-+fbaA`-A9fc%wh*H{8!FDC?$U!9Yvj6njY6F~ml>@}xTW&U9T$d7H< zoCisO1Zo73KRp9YEgtJH5I}xlFL2FbwU97X*r3?7$k5j0p!nc zk>*yUoC_g<{HPEgYDj0tLe>0a|D90fI5+DJP0N;NQ6lEkp0wi!50lxp2T`0#P z0TLhqkO1F*5ENx3KmsIi83Dfkmt82wApsH~0gwRSe-IR9BtQZra2Wx<|Ce1T#~}d{ zAOVm7-+vGkWh6iXBybr4zWv^%vnf)1W14cJ_5-5Pf#R40wh2J_YvUxf8U*QA`&105 z{YNNKLjoi~0+$g$9{*2s+0-0|1W14cNC0{NNr?nVfCNb3J_3CI@4Hh@L;@s00tf-V z{|F^&NPq-L;64I;|L?m~PDBDEKmrH>zW)d%YDjvKeE;veQ%*zzBtQZP0lxnT zC2B~31W4dM0(}4PyHid?0wh2J2m!wT2qkJrfCNb3J_3CI@4Hh@L;@s00tf-V{|F^& zNPq-L;64I;|L?m~PDBDEKmrH>zW)d%YDjvKeE;veQ%*zzBtQZP0lxnTC2B~3 z1W4dM0(}4PyHid?0wh2J2m!wT2qkJrfCNb3J_3CI@4Hh@q)VXoH=^5xZX{q&p!VC2 z>-MSGkp!F&i2o4swUdyHK>}k0@}G2G8FS_-5;&be{IBA40KW zoQmy8K#@T4C!G`(+tG>yP9c!|71TaY8HYJZASY1!Rmb)G6e}cfJ%RX7Kv-YTfdgJl zK=@&Yt&7L!Xe3Z05PtviqIR5h67Wwz{%!wu{ZGM!B%n?J`P29`>V0WQ0%in|AGui= zHX;E(1du-szW;vii%A9uAV2Z}TOJ{S(+TiT5qQ z{Hg2aupj~C@8Z*dZj_OLPXfsA+-Gv8B7t=TkiQGQ|LgeE*?<6lU?g zn7NApf8<@bD1L_k@~80*4NiI`0pv&iX|9}|Ly>?$0Qu7pj&q9yoD)EP;XjS@K^Tt& z)CnMe9qLVKNCIXAkYD(xG0Ve7B;bbt^4H-fEt8NyF9H6-dx=s14gvmkymQxYPRd{S zoA=JC5d!?{KqygjE&=|+&%HY)Urm629jgh`e>;KZk9>PV1|Weg1e$*upI}QcHYEWq z0?i+}RwMe5z*z*Ee;R!M&$>{i%?UJr{Q| z0wkbFAUyKILa`mKNPq-LfCQWn5T5<8R&kN^pg010Rj2rs<6&}v5?5+DH*AOR-? z!V51fw0hBp1W14cNWc#P;n@#ce$p}t36KB@kbo9}@W=}b ztzPsY0TLhq5^zF5c=O{eCutdj1W14cNI;7~{KyMyt#W_v)+&u?LINZ}0wmyyK<&+s>#hPb3<;0`2@Dg6UpAlX z;n4;TA_N9(d4vQ=fCT&yKpr|*8XI)T$TmsXg#<`|1k?#2Pn=JUI*Qy789YD53JH(^ z2{ zqSmw}0TLjA0RqUYb)RMcRPzWzscAw136KB@tR{dwR(EUE2_v}Fo6?X3NWe3J;G3sy`qK64o6^z@hvdPd2_U~8#Q~9aiW&ZrwE`d=wR+KKm;iE3x|-prJa{ev%N;(p9r~* zb2aL?Rv039SM>GZxpa2KT+n#nW0OIE5Vo|E1Vdq=)r&p?0fGO0TLOpeTL|s#Ar}Q$ zH#_27)GV6Rvu%+>Qq;sl|G9kh*Q>t;N{IYv=iYYkHKkLy~! z=#vwOIlsBinQW|pSFkbRqSoNxpR6|k?)+2s`roHVh-po2*-I<)H9iRZ7c_n@6r}AZ zuvU^qgM+p~rZvvdK7od?&>B!^5w^5?(I+Ml@Qy8FE0y(F48>C_Q%stG<4ksOczng+ zpyyBKkjbt{2sf>4mc6txU*Lma7c}b#2u%&P*3AVvgEN9|r^psf4cdOPQ$X3|M7U`s zvFxRl`E(zIc~Rqb@M7Ar;@%m-%zHzscV9F$X#2_3Cpy{?;ifg9WiPGFNBbbai<%>* zE++3P?i~}1x;LbHcVz0`rikZH)9ZY_9zmxC!LpZD=5u`z+C|NABNwLtiyMdapKt{n zWa{3&i07y2wS7U4pwr@j^zx?Bn%&-~m!y3{-HyHU{`9&Ty4=9PU7r5M$kbg^AcouT zx@#g!F+xuz57Nl9Mg@YUNf%7ZU`u;-P5p_NhLO#|sItj%yU5gCLm`HHFS=_SV=+Q+ zJ`&R9EX_QVr4GF?mxeJmKV^12r!l~#?U1Rv0w9K;rpxmkF+y*W2GZgV%_Jzr<6S%z z`#P~YVthQL6RIjPkg4%Th});Z4PR3t0B4vW{+DTHaA}>zk!p2x=mSF7l^l%s$#x}N z(HEH-?~Axy1`vmXC=q~&PfdgP->0e3FstK8%_41SgmBmr>}!f-`)PJ1T+tVq8t<#? zhWEWjxf&qif4#>3*8(E74`$pE;b0sov_rD}G~vhv3uJ11OkFp;?={NR01^L3G?u>^ z1gT}7UA^3LK!OF$E_y5ahM|N7-d8XQTe#bU%0Nk2%wQ30-`tvkiJwK-;%?_E-Eu&J z1kV%LsbRu>3_E&Gu}Yj9zoa9u}aWW2ks z8{YRCr5Ql8M(S6CB%jo%XAXwNU}5+AMREM3Xb&L?(EPMdxUOS!*iV3W*LB1DUZXSv zXx3=;)gXh6X;vqH&>y)7dn`z*L}MRvQO9Ji;wRp^cswcMZVxIGR>e;hEJf#}sM5&T zBpG4y(>VO~?U3uRhk&F?H1;7Ebxh_ee&Vf*$CD!N_MkFhRs2-JQglv=Dvh?7B!kR+ zZpnXZQ{*D-XGc;c8vBroIwo@!Kk?SZ<4F;Bdr+CMDt@Y9DLN-bl|~y)l5vJVH;!;w zYvc;-M@CX58vBroIwo@!Kk?SZ<4F;Bdr+CMDt@Y9DLN-bl}3I{lIieIKO>x;1YvGJ zBa$l7*oR!yF`29QiMK8uPl~wPgUWG?IsY0pfoD@|W`7}u;ZGQTk;yP( zUtKr6?;T2n-ltI+7U`wZ$g>FoA!s}ga!R%UQ&`x~B7_mP>~pT@C=3|3@V?=Qu)y73 zQwq@HEfp-WVQsC_$hk>v_Pp+VkR#&dRP&1cAbAF)VxMzGN8L$v-B!%&*%P7nX;el) zdZ{$>Z-SuE!tS5O(u4@=r2&fONUEZy=yq1II9F1{CrS<$KXJFGltor~QHx3LoL97Z z`S;0Z&ny0?@SiZJnpf5(2kxB8Ux^8&i3zP`DPop&{(oUv4jC5jtLujMJza@#`!tGUA{`amIkzGWn+tNt8HrTW*g#v_r8Zhz#{ z9c7JGQdb0$I2S(^+c~!?j-M2rk8ni11ZnZpc#vWSuxK20MLT3tysxes-uHB+JvaM~ zp6`e>Y;MOJXC#lHv4OUk77Pj!w!VzJCyS<!D5)g+HxEr2DoLJc115_OuVnI8{YR^B|_}es1JzrRd4Fn zkTeXg#vx=RQd47qZc&ToXg>ko9Wlh+u2&+sKFtaaNb41SeR`6H!M!+yj6`Z`4A3oV z(H!k3z`G-cxZB-IgjFwpoEXv_cRO848U{D$5Hb>}sWCves6}(MPtes`-LR|sSz?6M zPqSh!r2C4#K0Qgp;9eX;Mj{~^19~f3sE?*@xMFG#o(QO)W>H!sz@pX;ZAru6QXE1? zA|VKKVXn5rpDY)|=Y&eeM( z>V~I~?9GXQ>V@Bx0SVA$c(j-_mR=u%_orDJBR9u`HI=!!|4MVHPtY|5V%Y2172pUl zNNFi3B*PIfRYH=63dWiVg7>GXIV`H^q3aw&X7kg%^>zaJQdwg=cRD=Xwu_JY?{5O{B5zE)cdq z&AJRVXC&Kq7Lk3LS{JujDVQNVe}d zBHJ~BFkN#CnX74%2oTQ`StVnReS&Zd_#jEfW<2o}X{@_7&usB*i1O2{!??m38ET;K zBHMu^u8tsBej0<=co?%t22bF7b@DwSB77JJv|%^<9(ZN%Bg_mT%Q6;fV7^Eq`1e8zFY6t;d`X zJynB{)Xk<#`huTk@r)ZG;~Pi1pdCW>)9jjbAl|@{UDF|bk#P{8T!T1&n*89c6$FUo z>`0zmW0}yhS3YT8vCMNpuN+{lvTN8{p17W5i?@Vza?0(eFhbZG4j&wZ#jyEt2L%XW z%W|mDv}<9R(6Sc-!7|V3y%3&1&BjTQkV!n`$frq8`TSfx3*zsS%!*XrXdroV%?dKx zJ@YY(mF+o?2v9^P6gLhfqzYSkys#xN@`K(ga{jP896LD3i(&tR4$1_=uH{6bY1hIs zp;<4GfLWe%8-XN)Z11EYhOo#J3gTodKkKKGL=`@VGYg){)^Lj>4kp72pO)hYG2|`F zkT$*Kd4Ib$NzUzpFw8Z3=gsrvl{{gt5i0p{4;3MBvNf4DajSh!cJX|?Hgd6UIY==8 zQnUC`O~b9ajriIuqfL*bum&>EGA4e!e{aL#-b24-vd)6xRy&O8!hAq~O z^A|IKMdPST+dVk47EcgeO{NuN*rygOuGh?Cjj*mA-%=NH7PnMF7M=5=N-tL?`HVuv zKDiL4xn-YrQOD+_L9i&mp|%0b@WR93NcdV#)M ze=^)wUD=hhC{~YTX;_@7ShP&#q*sx{WYNiJaSUXlSf8&Ehgg$47*yf_$XY!T()81) z_q8_!C;iFnwbE%{)au_bEL|SBm4ApFnn8cc{sfD<+t`9L2ANH&T9*)Gcu{lqUk69_KZr^~kj9uyCE+3yWFn+B;uC8SPc2Q{ zS6*v%Ec(c;lz0! zOf+5oUE-vX@Y!WMEEWP3w}u-TA1sC!ipKG3?SzEATeTM6>iAsVlB?vw#~)LwgtRn4 z#_Y<27#1~MT@Z1xORb0)s%UBfYIT*SOHFFYYxSjJy3A_{2kKpYcZs{^+7(i;)7c@R%Q)7!477yR?BqQkmk9zd?FOET{)C(n21J1RQl@n$ND!B$vxjkY3y zrDxZ$lVZ!c)O#Vb4>Uz=Wz9g-a71=acEc&NMG^q{G|PrJLSiQx+}uW)#GCxI$voDj zYqYTzPEK`AIxluI^>7S?z?eDWjA(khBc8FQ*Iz{+2f)`VtyN6$%t5KrSJxzD6Bb`b zVK?5=&8FxUheXzjt<9{ExfC^KbFFTKFd5E(n0INKNxIxVano>-pf_i(Ulgonn+NEv z)SNfgkrBRli0r4?I7_WH9^UN;wb6d{-T{a8a*RWF5gIe2A^y8GGjq+Kou7I>1L82B z^K(EN*=vx|eyI@UPh&rY&=HUAFnn#U-l698wImnR5jc}$A}zLPCg++wt~K&xjM{On zc%M(L#r8TfV+e_ef0}S)`vTAWDYvJU19Z(YFP6hxvx|V59~S9iteGEb(qYBClaapT z>Z#@F9Y*jCPTO>j*PThtx+6j-fHQva=fLjKXbXe zhh2m~oD5!(2H0rZx87`XlXPbmv+N;uMGaqGhW)>_#^&Agg^4 zL`eqZ2&hS%XFkD>xooECinDn_^~#Fa=XxS|S5JpznAfbHLd$=C(v1#U5Nv!9P)QQx z$SIm+wC$hkxNRTJZ2*M1O?V{9u*PNt#V*5>?mDPAyQNhVS01K$3%yDFe817Fq);eXl4r;meNnY!k5Xmb7{F8RoBw|LNb5t++OGt9~?;oXf8 z{&y2NcRJ+mCN<~6u}nS*+3dI_6QtMh;D|Xj2m#~@5Fcvx5;OS5;J6T5fewG{h= zIYz+eEa#>|ZsFYN-bs$!BcgeS*t$s(&NiBLGtN5?5SVXDhlBuf3&|0FIwXMHV^iaB zt_vbHv9A#L=Y~)1f0lC-BDZkvbWbHmt}@p=g=p`vIs8SHy<>vi!P!AK%EkyFw=m|+ zQ}zUSoA%5HIwIH9s~L!~@d!BG#)OZwMlRwJ6gQ3eyVjc~;w(22K%SjXbJNH^XF)E) zXL6<@0TMWr0G}Nv7srcmauJL{0`Cyuv*YBhc@a)7f-y+o9RhrIoZK}p!pTK21_``F zfX|MTyXHkWxd_G}fp-Y-+3|4K$Sr&t4^f$c1W4c-0?5mA&9H6<;Vrnm8U`bQiwW@M z@o>4k1rN8t3?%Rx0lqvQZk)H^;TD*I1YRS+m&e16^AFU0AC&tH_lt|a0|>p0}S z8|N)}xCLe)f!7G|+b|BtQZJ0X{z42_ON48{`%VkN^pc5kMZF zPcvqI#HsBBkN`)JWJnSqf#V3g{Qe-b|1|5a70Ix!JDo{@1YRca^816#{%Mx}Jdg}a z1JIlVNZ?rlFTX#??0o;9{nOy!Byc?eJ0QJ0TOtVfbi_ZTi3vehia}3rfz2V z1O_qKf&@t5K?2D8bJG(9&ij)Y{2q`z1~J%z1W4db0`ELQ$fQAI^J56@goRBKb|C>0 zc#web^2A%GlZj_R);9C{Nn$fEyO010xFUc&L7&D|=H4*ij6v4xKdcWOg~hNr50U^0 zkU*1w@c4wSrio`km;zjw&4T1H3&TbvKmrdEKwhCwb0`^bx*)S0Gc*+zmU-BV1W4dD z0>a~yY#m1?$>01m9da&BtQc15D;FW zc*`M>I9}I!?<`2vy$RW!1W4c!0?2dp)3^eH$4->nr%3V?KevZu01_a9M+g+3pkmPp zkYYBZ=pp|pIX$pq1`;5F)dY|iDQH%QLHt9Qt_9+3pg}Sl#9#{&AORBi5kMZLpxFy8 z#OPY=%^Y_}V#j)}Nq_`MU?~CQQHnK7!_>^<0A1^v;g&j*d`mDkB>@t6mH_fD#TsK! zaqF(Nan5EtBz)6^0umqr5>O<7yi18jvAbZEH0}KqoVRQt`L_gPQxYJ7X9*zhQcbfC zTCF2kUl(lH8A(2D&VwXC0wgd-0C}2fnz4?;sahkvE|_oJLh^5n$JQi30?!gaUZYI&?I~CIJ$-k^u5* zS!&LOj8HmvIwmIp61bHB@^%?$j>e1dIeI{bCjk<;m;myEt<#(i79n%`jLc60ByceS zt~cf&@t5RszU7Hm|vl9>V0lsW}k|kicaGkf&@|a~Z2J4gw^IxgY@& zAOW`okk<^?xE)h57(zp_9j!=!1V~^t0pwXLYE}nx=wIXz7aeA1BoZJ25;nXBR0wnMPf#kuDKVKN1Gm-!as1x{KV;)!y literal 0 HcmV?d00001 diff --git a/frontend/src/pages/LoginPage.tsx b/frontend/src/pages/LoginPage.tsx index 77272ee..6312431 100644 --- a/frontend/src/pages/LoginPage.tsx +++ b/frontend/src/pages/LoginPage.tsx @@ -64,7 +64,7 @@ const LoginPage: React.FC = () => { - ToDoアプリ ログイン + shopchop ログイン {/* エラーがある場合のみアラートを表示 */} {error && ( From fed5a2e92371d19d2843c38fccd76549a152b03d Mon Sep 17 00:00:00 2001 From: "zhang.pengcheng" Date: Wed, 11 Jun 2025 17:19:51 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todoapp/controller/StocksController.java | 2 -- .../todoapp/controller/ToBuysController.java | 11 ++++++----- .../java/com/example/todoapp/model/ToBuys.java | 1 - .../repository/RecipeStuffsRepository.java | 6 ------ .../todoapp/repository/StuffsRepository.java | 4 +++- .../todoapp/repository/ToBuysRepository.java | 6 +++--- .../example/todoapp/service/ToBuysService.java | 16 +++++++++------- 7 files changed, 21 insertions(+), 25 deletions(-) diff --git a/backend/src/main/java/com/example/todoapp/controller/StocksController.java b/backend/src/main/java/com/example/todoapp/controller/StocksController.java index 932f450..c419af8 100644 --- a/backend/src/main/java/com/example/todoapp/controller/StocksController.java +++ b/backend/src/main/java/com/example/todoapp/controller/StocksController.java @@ -1,6 +1,5 @@ package com.example.todoapp.controller; -import com.example.todoapp.dto.DeleteStockRequest; import com.example.todoapp.dto.DeleteStockRequestDTO; import com.example.todoapp.dto.StockResponseDTO; import com.example.todoapp.dto.StockDTO; @@ -10,7 +9,6 @@ import com.example.todoapp.model.User; import com.example.todoapp.repository.UserRepository; import com.example.todoapp.service.StocksService; import jakarta.validation.Valid; -import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; diff --git a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java index 1b4b919..901e813 100644 --- a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java +++ b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java @@ -96,7 +96,7 @@ public class ToBuysController { /** * 指定されたユーザーIDに基づいてすべての「買うもの」リストを取得する * - * @param userId ユーザーID + * @param authentication 認証情報 * @return ユーザーに紐づく「買うもの」リスト */ @GetMapping("/get") @@ -135,14 +135,14 @@ public class ToBuysController { * ユーザーが指定したIDの「買うもの」を削除する * * @param request 削除する「買うもの」の情報を含むリクエストボディ + * @param authentication 認証情報 * @return 削除が成功した場合にtrueを含むレスポンス */ @DeleteMapping("/delete") public ResponseEntity> deleteToBuy( - @RequestBody DeleteToBuyRequestDTO request, - Authentication authentication) { + @RequestBody DeleteToBuyRequestDTO request) { - int deletedCount = toBuysService.deleteToBuyById(request.getTobuyId()); + int deletedCount = toBuysService.deleteToBuysByTobuyId(request.getTobuyId()); Map response = new HashMap<>(); @@ -160,7 +160,8 @@ public class ToBuysController { * 買うものリストから削除し,追加情報を付加して在庫リストに追加 * * @param request 「買うもの」の情報を含むリクエストボディ - * @return + * @param authentication 認証情報 + * @return 購入処理が成功した場合にtrueを含むレスポンス */ @PostMapping("/buy") public ResponseEntity> buyToBuys( diff --git a/backend/src/main/java/com/example/todoapp/model/ToBuys.java b/backend/src/main/java/com/example/todoapp/model/ToBuys.java index 6ab9052..e33edfb 100644 --- a/backend/src/main/java/com/example/todoapp/model/ToBuys.java +++ b/backend/src/main/java/com/example/todoapp/model/ToBuys.java @@ -74,7 +74,6 @@ public class ToBuys { /** * 購入するお店 */ - @NotNull @Column(nullable = false) private String store; diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java index a660f21..eb053c4 100644 --- a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java @@ -9,16 +9,10 @@ package com.example.todoapp.repository; import com.example.todoapp.model.RecipeStuffs; -import jakarta.transaction.Transactional; 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 org.springframework.stereotype.Repository; -import java.util.List; - /** * 料理-材料エンティティのリポジトリインターフェース *

diff --git a/backend/src/main/java/com/example/todoapp/repository/StuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/StuffsRepository.java index 065fe18..15fb1c3 100644 --- a/backend/src/main/java/com/example/todoapp/repository/StuffsRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/StuffsRepository.java @@ -16,6 +16,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; /** @@ -28,7 +29,8 @@ import org.springframework.stereotype.Repository; @Repository public interface StuffsRepository extends JpaRepository { // 材料情報を主キーで取得するメソッド(必要に応じて追加) - Stuffs findByStuffId(Long stuffId); + @Query("SELECT s FROM Stuffs s WHERE s.stuffId = ?1") + Optional findByStuffId(Long stuffId); Optional findByStuffName(String stuffName); diff --git a/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java b/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java index f07f742..7b15b89 100644 --- a/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java @@ -34,7 +34,7 @@ public interface ToBuysRepository extends JpaRepository { * @return 「買うもの」レコード */ @Query("SELECT t FROM ToBuys t WHERE t.tobuyId = ?1") - ToBuys findById(Long tobuyId); + ToBuys findByTobuyId(Long tobuyId); /** * 指定されたユーザーIDに基づいて「買うもの」リストを取得する @@ -43,13 +43,13 @@ public interface ToBuysRepository extends JpaRepository { * @return 「買うもの」リスト */ @Query("SELECT t FROM ToBuys t WHERE t.user.id = ?1") - List findByUser(Long userId); + List findByUserIdOrderByTobuyIdAsc(Long userId); /** * 指定された「買うもの」IDに基づいて「買うもの」リストを削除 * * @param tobuyId 「買うもの」ID - * @return + * @return 削除された行数 */ @Modifying @Query("DELETE FROM ToBuys t WHERE t.tobuyId = :tobuyId") diff --git a/backend/src/main/java/com/example/todoapp/service/ToBuysService.java b/backend/src/main/java/com/example/todoapp/service/ToBuysService.java index 5cc9cde..971fa4b 100644 --- a/backend/src/main/java/com/example/todoapp/service/ToBuysService.java +++ b/backend/src/main/java/com/example/todoapp/service/ToBuysService.java @@ -61,6 +61,8 @@ public class ToBuysService { * 購入リストに新しいアイテムを追加する * * @param toBuyDTO 追加する購入アイテムのデータ(DTO) + * @param authentication 認証情報 + * @return 追加された購入アイテム */ public ToBuys addToBuys(ToBuysDTO toBuyDTO, Authentication authentication) { @@ -78,7 +80,7 @@ public class ToBuysService { stuff = stuffsRepository.save(stuff); } else { // 材料情報を取得 - Optional optionalStuffs = stuffsRepository.findById(toBuyDTO.getStuffId()); + Optional optionalStuffs = stuffsRepository.findByStuffId(toBuyDTO.getStuffId()); if (!optionalStuffs.isPresent()) { throw new RuntimeException("材料がありません"); } @@ -114,11 +116,11 @@ public class ToBuysService { Optional existingStuffs = stuffsRepository.findByStuffName(toBuyDTO.getStuffName()); // 新しい材料を作成 if (existingStuffs.isPresent()) { - // 如果存在,更新已有材料的属性 + // 材料が存在する場合、更新 stuffs = existingStuffs.get(); stuffs.setCategory(toBuyDTO.getCategory()); // 可选:更新分类 } else { - // 否则新建材料 + // 材料が存在しない場合、新規作成 stuffs = new Stuffs(); stuffs.setStuffName(toBuyDTO.getStuffName()); stuffs.setCategory(toBuyDTO.getCategory()); @@ -154,7 +156,7 @@ public class ToBuysService { * @return ユーザーに紐づく「買うもの」リスト */ public List getToBuysByUser(User user) { - return toBuysRepository.findByUser(user.getId()); + return toBuysRepository.findByUserIdOrderByTobuyIdAsc(user.getId()); } /** @@ -163,7 +165,7 @@ public class ToBuysService { * @param tobuyId 購入リストID */ @Transactional - public int deleteToBuyById(Long tobuyId) { + public int deleteToBuysByTobuyId(Long tobuyId) { return toBuysRepository.deleteByTobuyId(tobuyId); } @@ -179,7 +181,7 @@ public class ToBuysService { User user = getUserByUsername(username); // Tobuy情報の取得 - ToBuys tobuy = toBuysRepository.findById(dto.getTobuyId()); + ToBuys tobuy = toBuysRepository.findByTobuyId(dto.getTobuyId()); // 新しい在庫を作成 Stocks stock = new Stocks(); @@ -193,7 +195,7 @@ public class ToBuysService { // 買うものリストから削除 System.out.println("tobuy.getTobuyId()=" + tobuy.getTobuyId()); - deleteToBuyById(tobuy.getTobuyId()); + deleteToBuysByTobuyId(tobuy.getTobuyId()); // データベースに保存 return stocksRepository.save(stock); From e3ba1d5b4966225fe582b5f5b003fc888ea60963 Mon Sep 17 00:00:00 2001 From: "zhang.pengcheng" Date: Thu, 12 Jun 2025 13:04:12 +0900 Subject: [PATCH 3/3] =?UTF-8?q?1.=20recipesStuffsRepository=20=E2=86=92=20?= =?UTF-8?q?recipeStuffsRepository=20=20=20=20=20=E6=97=A2=E5=AD=98?= =?UTF-8?q?=E3=81=AErecipeStuffsRepository.java=E3=82=92=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=89=E3=80=81=E6=9C=AC=E6=9D=A5=E3=81=AE?= =?UTF-8?q?recipesStuffsRepository=E3=82=92recipeStuffsRepositor=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E3=82=8F=E3=82=8B=202.=20tobuy/addByRecipe=E3=82=92?= =?UTF-8?q?=E5=AE=9F=E8=A3=85=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/todoapp/config/InitTables.java | 4 +- .../todoapp/controller/ToBuysController.java | 35 +++++++++++ .../repository/RecipeStuffsRepository.java | 42 ++++++++----- .../repository/RecipesStuffsRepository.java | 37 ----------- .../todoapp/repository/ToBuysRepository.java | 14 +++++ .../todoapp/service/RecipeService.java | 20 +++--- .../todoapp/service/ToBuysService.java | 61 +++++++++++++++++++ 7 files changed, 148 insertions(+), 65 deletions(-) delete mode 100644 backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java diff --git a/backend/src/main/java/com/example/todoapp/config/InitTables.java b/backend/src/main/java/com/example/todoapp/config/InitTables.java index 413f9f2..10bfa66 100644 --- a/backend/src/main/java/com/example/todoapp/config/InitTables.java +++ b/backend/src/main/java/com/example/todoapp/config/InitTables.java @@ -36,7 +36,7 @@ public class InitTables { @Autowired private RecipesRepository recipesRepository; @Autowired - private RecipeStuffsRepository recipeStuffsRepository; + private RecipeStuffsRepository RecipeStuffsRepository; @Autowired private StuffsRepository stuffsRepository; @@ -128,6 +128,6 @@ public class InitTables { recipeStuff.setRecipes(recipe); recipeStuff.setRecipeStuffsId(stuffId); recipeStuff.setAmount(amount); - recipeStuffsRepository.save(recipeStuff); + RecipeStuffsRepository.save(recipeStuff); } } diff --git a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java index 901e813..799d3f9 100644 --- a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java +++ b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java @@ -175,4 +175,39 @@ public class ToBuysController { return ResponseEntity.ok(response); } + + /** + * レシピから「買うもの」を追加する + * + * @param payload レシピIDを含むペイロード + * @param authentication 認証情報 + * @return 追加された「買うもの」のリスト + */ + @PostMapping("/addByRecipe") + public ResponseEntity> addByRecipe( + @RequestBody Map payload, + Authentication authentication) { + + Long recipeId = payload.get("recipeId"); + List responseList = toBuysService.addByRecipeId(recipeId, authentication); + + //shopのフィールドを削除 + List> filteredList = responseList.stream() + .map(dto -> { + Map map = new HashMap<>(); + map.put("tobuyId", dto.getTobuyId()); + map.put("stuffId", dto.getStuffId()); + map.put("stuffName", dto.getStuffName()); + map.put("amount", dto.getAmount()); + return map; + }) + .collect(Collectors.toList()); + + Map response = new HashMap<>(); + response.put("result", true); + response.put("data", filteredList); + + return ResponseEntity.ok(response); +} + } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java index eb053c4..cbbb485 100644 --- a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java @@ -1,27 +1,37 @@ -//-------------------------------- -// RecipeStuffsRepository.java -// -// -// 更新履歴:2025/06/10 新規作成 -// Copyright(c) 2025 IVIS All rights reserved. -//-------------------------------------------- package com.example.todoapp.repository; -import com.example.todoapp.model.RecipeStuffs; - +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; + +import com.example.todoapp.model.RecipeStuffs; /** - * 料理-材料エンティティのリポジトリインターフェース + * レシピ食材関連データのリポジトリインターフェース *

- * このインターフェースは料理-材料データへのアクセスと操作を提供します。 + * このインターフェースはレシピと食材の関連データへのアクセスを提供します。 * Spring Data JPAによって自動的に実装されます。 *

*/ - -@Repository public interface RecipeStuffsRepository extends JpaRepository { - -} \ No newline at end of file + /** + * レシピIDで食材情報を検索する + * + * @param recipeId 検索するレシピID + * @return 関連する食材情報リスト + */ + List findByRecipesRecipeId(Long recipeId); + + /** + * レシピIDと食材IDで関連情報を検索する + * + * @param recipeId 検索するレシピID + * @param stuffId 検索する食材ID + * @return 関連情報(存在する場合) + */ + Optional findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId); +} + + + diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java deleted file mode 100644 index 729b825..0000000 --- a/backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.example.todoapp.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.example.todoapp.model.RecipeStuffs; - -/** - * レシピ食材関連データのリポジトリインターフェース - *

- * このインターフェースはレシピと食材の関連データへのアクセスを提供します。 - * Spring Data JPAによって自動的に実装されます。 - *

- */ -public interface RecipesStuffsRepository extends JpaRepository { - /** - * レシピIDで食材情報を検索する - * - * @param recipeId 検索するレシピID - * @return 関連する食材情報リスト - */ - List findByRecipesRecipeId(Long recipeId); - - /** - * レシピIDと食材IDで関連情報を検索する - * - * @param recipeId 検索するレシピID - * @param stuffId 検索する食材ID - * @return 関連情報(存在する場合) - */ - Optional findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId); -} - - - diff --git a/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java b/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java index 7b15b89..d9b6861 100644 --- a/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java @@ -7,9 +7,12 @@ //-------------------------------------------- package com.example.todoapp.repository; +import com.example.todoapp.model.Stuffs; import com.example.todoapp.model.ToBuys; +import com.example.todoapp.model.User; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; @@ -54,4 +57,15 @@ public interface ToBuysRepository extends JpaRepository { @Modifying @Query("DELETE FROM ToBuys t WHERE t.tobuyId = :tobuyId") int deleteByTobuyId(@Param("tobuyId") Long tobuyId); + + /** + * ユーザーとスタッフに基づいて「買うもの」レコードを取得する + * + * @param user ユーザー + * @param stuff スタッフ + * @return 「買うもの」レコード + */ + @Query("SELECT t FROM ToBuys t WHERE t.user = :user AND t.stuff = :stuff") + Optional findByUserAndStuff(@Param("user") User user, @Param("stuff") Stuffs stuff); + } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/service/RecipeService.java b/backend/src/main/java/com/example/todoapp/service/RecipeService.java index 2eab2b8..5e23662 100644 --- a/backend/src/main/java/com/example/todoapp/service/RecipeService.java +++ b/backend/src/main/java/com/example/todoapp/service/RecipeService.java @@ -24,7 +24,7 @@ import com.example.todoapp.dto.StuffRequestDTO; import com.example.todoapp.model.RecipeStuffs; import com.example.todoapp.model.Recipes; import com.example.todoapp.model.Stuffs; -import com.example.todoapp.repository.RecipesStuffsRepository; +import com.example.todoapp.repository.RecipeStuffsRepository; import com.example.todoapp.repository.RecipesRepository; import com.example.todoapp.repository.StuffsRepository; @@ -47,7 +47,7 @@ public class RecipeService { private StuffsRepository stuffsRepository; @Autowired - private RecipesStuffsRepository recipeStuffsRepository; + private RecipeStuffsRepository RecipeStuffsRepository; /** * レシピを新規登録する @@ -89,7 +89,7 @@ public class RecipeService { recipeStuffsList.add(recipeStuffs); } - recipeStuffsRepository.saveAll(recipeStuffsList); + RecipeStuffsRepository.saveAll(recipeStuffsList); return recipe; } @@ -113,7 +113,7 @@ public class RecipeService { Recipes recipe = recipesRepository.findById(recipeId) .orElseThrow(() -> new RuntimeException("レシピが見つかりません")); - List recipeStuffsList = recipeStuffsRepository.findByRecipesRecipeId(recipeId); + List recipeStuffsList = RecipeStuffsRepository.findByRecipesRecipeId(recipeId); List stuffList = recipeStuffsList.stream() .map(rs -> { @@ -168,19 +168,19 @@ public class RecipeService { rs.setRecipes(recipe); rs.setStuff(newStuff); rs.setAmount(stuffDTO.getAmount()); - recipeStuffsRepository.save(rs); + RecipeStuffsRepository.save(rs); incomingStuffIds.add(newStuff.getStuffId()); } else { // 材料IDが提供されている場合、既存のRecipeStuffsエントリを検索 - Optional optionalRs = recipeStuffsRepository + Optional optionalRs = RecipeStuffsRepository .findByRecipesRecipeIdAndStuffStuffId(dto.getRecipeId(), stuffDTO.getStuffId()); if (optionalRs.isPresent()) { // RecipeStuffsエントリが存在する場合、数量を更新 RecipeStuffs rs = optionalRs.get(); rs.setAmount(stuffDTO.getAmount()); - recipeStuffsRepository.save(rs); + RecipeStuffsRepository.save(rs); incomingStuffIds.add(rs.getStuff().getStuffId()); } else { // オプション:見つからない場合、新しいRecipeStuffsエントリを作成 @@ -191,17 +191,17 @@ public class RecipeService { rs.setRecipes(recipe); rs.setStuff(existingStuff); rs.setAmount(stuffDTO.getAmount()); - recipeStuffsRepository.save(rs); + RecipeStuffsRepository.save(rs); incomingStuffIds.add(existingStuff.getStuffId()); } } } // 入ってきたリストにないRecipeStuffsエントリを削除 - List existingStuffs = recipeStuffsRepository.findByRecipesRecipeId(dto.getRecipeId()); + List existingStuffs = RecipeStuffsRepository.findByRecipesRecipeId(dto.getRecipeId()); for (RecipeStuffs rs : existingStuffs) { if (!incomingStuffIds.contains(rs.getStuff().getStuffId())) { - recipeStuffsRepository.delete(rs); + RecipeStuffsRepository.delete(rs); } } diff --git a/backend/src/main/java/com/example/todoapp/service/ToBuysService.java b/backend/src/main/java/com/example/todoapp/service/ToBuysService.java index 971fa4b..8172606 100644 --- a/backend/src/main/java/com/example/todoapp/service/ToBuysService.java +++ b/backend/src/main/java/com/example/todoapp/service/ToBuysService.java @@ -10,11 +10,14 @@ package com.example.todoapp.service; import com.example.todoapp.util.MessageUtils; import com.example.todoapp.dto.BuyRequestDTO; +import com.example.todoapp.dto.ToBuyResponseDTO; import com.example.todoapp.dto.ToBuysDTO; +import com.example.todoapp.model.RecipeStuffs; import com.example.todoapp.model.Stocks; import com.example.todoapp.model.Stuffs; import com.example.todoapp.model.ToBuys; import com.example.todoapp.model.User; +import com.example.todoapp.repository.RecipeStuffsRepository; import com.example.todoapp.repository.StocksRepository; import com.example.todoapp.repository.StuffsRepository; import com.example.todoapp.repository.ToBuysRepository; @@ -27,6 +30,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -56,6 +60,8 @@ public class ToBuysService { @Autowired private MessageUtils messageUtils; + @Autowired + private RecipeStuffsRepository RecipeStuffsRepository; /** * 購入リストに新しいアイテムを追加する @@ -201,6 +207,58 @@ public class ToBuysService { return stocksRepository.save(stock); } + /** + * 指定されたレシピIDに基づいて「買うもの」を追加する + * + * @param recipeId レシピID + * @param authentication 認証情報 + * @return 追加された「買うもの」のリスト + */ + public List addByRecipeId(Long recipeId, Authentication authentication) { + // ユーザー情報を取得 + String username = authentication.getName(); + User user = userRepository.findByUsername(username) + .orElseThrow(() -> new RuntimeException("ユーザーが見つかりません: " + username)); + + // 料理情報を取得 + List recipeStuffsList = RecipeStuffsRepository.findByRecipesRecipeId(recipeId); + + List result = new ArrayList<>(); + + for (RecipeStuffs rs : recipeStuffsList) { + Stuffs stuff = rs.getStuff(); + int requiredAmount = rs.getAmount(); + + Optional existingToBuyOpt = toBuysRepository.findByUserAndStuff(user, stuff); + + ToBuys toBuy; + if (existingToBuyOpt.isPresent()) { + toBuy = existingToBuyOpt.get(); + toBuy.setAmount(toBuy.getAmount() + requiredAmount); // 既存の数量を更新 + } else { + toBuy = new ToBuys(); + toBuy.setUser(user); + toBuy.setStuff(stuff); + toBuy.setAmount(requiredAmount); + toBuy.setStore(""); + } + + toBuy = toBuysRepository.save(toBuy); + + // ToBuyResponseDTOに変換 + ToBuyResponseDTO dto = new ToBuyResponseDTO(); + dto.setTobuyId(toBuy.getTobuyId()); + dto.setStuffId(toBuy.getStuff().getStuffId()); + dto.setStuffName(toBuy.getStuff().getStuffName()); + dto.setAmount(toBuy.getAmount()); + + result.add(dto); + } + + return result; + + } + /** * ユーザー名からユーザーエンティティを取得する * @@ -213,4 +271,7 @@ public class ToBuysService { .orElseThrow(() -> new UsernameNotFoundException(messageUtils.getMessage("error.auth.user.not.found.with.name", new Object[]{username}))); } + + + } \ No newline at end of file