From 4287240917a9f4d6c73cef1491cf18cae3f253a4 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 24 Mar 2026 15:05:37 +0800 Subject: [PATCH] feat: implement users API Co-Authored-By: Claude Opus 4.6 --- .../app/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 192 bytes .../app/__pycache__/config.cpython-310.pyc | Bin 0 -> 1219 bytes .../app/__pycache__/database.cpython-310.pyc | Bin 0 -> 603 bytes .../app/__pycache__/main.cpython-310.pyc | Bin 0 -> 1029 bytes .../api/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 285 bytes .../app/api/__pycache__/auth.cpython-310.pyc | Bin 0 -> 1831 bytes .../app/api/__pycache__/deps.cpython-310.pyc | Bin 0 -> 1192 bytes .../api/__pycache__/history.cpython-310.pyc | Bin 0 -> 207 bytes .../api/__pycache__/images.cpython-310.pyc | Bin 0 -> 206 bytes .../app/api/__pycache__/users.cpython-310.pyc | Bin 0 -> 1225 bytes imagecreator/backend/app/api/deps.py | 2 +- imagecreator/backend/app/api/users.py | 33 +++++++++++- .../core/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 176 bytes .../core/__pycache__/security.cpython-310.pyc | Bin 0 -> 1551 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 180 bytes .../__pycache__/history.cpython-310.pyc | Bin 0 -> 1307 bytes .../models/__pycache__/user.cpython-310.pyc | Bin 0 -> 828 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 182 bytes .../schemas/__pycache__/auth.cpython-310.pyc | Bin 0 -> 1016 bytes .../schemas/__pycache__/user.cpython-310.pyc | Bin 0 -> 1256 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 184 bytes .../services/__pycache__/auth.cpython-310.pyc | Bin 0 -> 1688 bytes imagecreator/backend/test.db | Bin 0 -> 20480 bytes ...test_auth_api.cpython-310-pytest-9.0.2.pyc | Bin 0 -> 4216 bytes .../test_models.cpython-310-pytest-9.0.2.pyc | Bin 0 -> 3171 bytes ...test_security.cpython-310-pytest-9.0.2.pyc | Bin 0 -> 2582 bytes ...est_users_api.cpython-310-pytest-9.0.2.pyc | Bin 0 -> 2714 bytes imagecreator/backend/tests/test_users_api.py | 49 ++++++++++++++++++ prompt-optimizer | 1 + 29 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 imagecreator/backend/app/__pycache__/__init__.cpython-310.pyc create mode 100644 imagecreator/backend/app/__pycache__/config.cpython-310.pyc create mode 100644 imagecreator/backend/app/__pycache__/database.cpython-310.pyc create mode 100644 imagecreator/backend/app/__pycache__/main.cpython-310.pyc create mode 100644 imagecreator/backend/app/api/__pycache__/__init__.cpython-310.pyc create mode 100644 imagecreator/backend/app/api/__pycache__/auth.cpython-310.pyc create mode 100644 imagecreator/backend/app/api/__pycache__/deps.cpython-310.pyc create mode 100644 imagecreator/backend/app/api/__pycache__/history.cpython-310.pyc create mode 100644 imagecreator/backend/app/api/__pycache__/images.cpython-310.pyc create mode 100644 imagecreator/backend/app/api/__pycache__/users.cpython-310.pyc create mode 100644 imagecreator/backend/app/core/__pycache__/__init__.cpython-310.pyc create mode 100644 imagecreator/backend/app/core/__pycache__/security.cpython-310.pyc create mode 100644 imagecreator/backend/app/models/__pycache__/__init__.cpython-310.pyc create mode 100644 imagecreator/backend/app/models/__pycache__/history.cpython-310.pyc create mode 100644 imagecreator/backend/app/models/__pycache__/user.cpython-310.pyc create mode 100644 imagecreator/backend/app/schemas/__pycache__/__init__.cpython-310.pyc create mode 100644 imagecreator/backend/app/schemas/__pycache__/auth.cpython-310.pyc create mode 100644 imagecreator/backend/app/schemas/__pycache__/user.cpython-310.pyc create mode 100644 imagecreator/backend/app/services/__pycache__/__init__.cpython-310.pyc create mode 100644 imagecreator/backend/app/services/__pycache__/auth.cpython-310.pyc create mode 100644 imagecreator/backend/test.db create mode 100644 imagecreator/backend/tests/__pycache__/test_auth_api.cpython-310-pytest-9.0.2.pyc create mode 100644 imagecreator/backend/tests/__pycache__/test_models.cpython-310-pytest-9.0.2.pyc create mode 100644 imagecreator/backend/tests/__pycache__/test_security.cpython-310-pytest-9.0.2.pyc create mode 100644 imagecreator/backend/tests/__pycache__/test_users_api.cpython-310-pytest-9.0.2.pyc create mode 100644 imagecreator/backend/tests/test_users_api.py create mode 160000 prompt-optimizer diff --git a/imagecreator/backend/app/__pycache__/__init__.cpython-310.pyc b/imagecreator/backend/app/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02ae2e1fd8e3c0142f6e782628e75d57ba4724b2 GIT binary patch literal 192 zcmd1j<>g`kg0;qnGBtqoV-N=!FakLaKwQiLBvKfn7*ZI688n%y6g_hj(^H*`QWHz^ zixiR)le1IvQWO#k3UV@&6H7Al^Yr{Q8E>)2$EV~c$H%W^C}INY2NS={^z#c!^fN*F slOg(1IZ(s&frjbF$7kkcmc+;F6;$5hu*uC&Da}c>1G%XfWF7|t0GM_%?f?J) literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/__pycache__/config.cpython-310.pyc b/imagecreator/backend/app/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..936bf642dc96649f9badcdfe918bb49bd6657069 GIT binary patch literal 1219 zcmZux&2H056rQo2#0gH*rf|6kT~=(eNK^HPMOC4iVA2ShRBp`o;8;4kB zn{Psun=2z&=l7wW2im?VV!4xNs+dWkJ|+jf-a-j^kcUbgC0P_E7oa=X-`m~k#q)3` zA}PWmliGRdPTd!-@3FJVo8{BXY$3Y}wMF-Xxa>w3VLB7tIPK;#vs5>HuRrmo z?6vn!SC0Li{b#!Fz8Q=s!|CzK)e~rve(d)9p6|2i__a4;-rLjR#A7GJ(b?4VuWD%V zXyUz^c>eKilb7y0fBE2|C~~OaSKhnZ+uPddk0(BZD1+h1*F>)kJUDU4+|yy1%G&tU z8@WIE(&>eH-dp5J7ILNA!xMMlF@HLq;Pcd-9{+F96cRgvt=2)@3>wGG4QREwY~8ea ztDmLk@oZ^riS+ML$I>=qX*d^*=>}tS=v0E(VeI1~Onzu=ux00QB0dxO2Lvd^_q|@0 z7q@0|o4gOB4jeJ9WbuO7#HJG2sIwv4c=#rY`zR_Pw5bZITa1Ni zniV0AQ86Z~sJBtz9n@x=7Sci5L~125c(ssYL*xbu4Du`eYxEG`VH&s<*47}7;g}A^ zU)wB^*)~d>JGt?+T@znJAe0ad#i1EBtYgsv-Y^$EZ`&8~G&< z(;|+3T1m9f_47p<6Y0G6e*X;iKl6(9S7T6)T&6Jazg4q zz_FKp1fSt6Cw_qwb}FEZG~;>C^30pDn$0rscKhgi_k{rb2;ja=Jb32a9QnY369JNx zgoK<5Dx)%zaT$*|5)+w}2>~RSyxrn4pIp;2#fT?7!IW=ZN97dbD=0Ib^66(Nw|TaP zV*97B4Fz$tMkBLWVc&K=7S!bijpa^i;X#PaozR230?n~pB+-~fiw?&_yiWN-~(J_mv96G z-oPb%CEt9;Vf{CM?`0nZq3b)L`>J8WO&Xy_b(GgPpl80^ug6O@*kvbKi{q3^{|{=` zoMO+HY#5fDSr+D74CgLs(N??;zhpw79}_}JN*++XW{lthp%<{^VQ*MZ?%3=y?(XtlDp08(8$GmUc%U9oZw!VhwJo- XRD2`wX;_^JR1Ui&r*k?di9de>x0;xD literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/__pycache__/main.cpython-310.pyc b/imagecreator/backend/app/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfbfdd4b9457f43815b6a444b5923b4af695cd1f GIT binary patch literal 1029 zcmY*Yy>b&V5I)_%FXxMsIB}qwXbf`(yWG6Um+gh{Bb@raXhmZQ7#NHQUAq0Ku$ zNx@6-7;2&66`)}yn;7dxd%K@j`{`TVHSKod!1(s~JA2|e&JPp(KOzX8!<0Y45QiY{ zR47Nt_%3%VFZZnPalZ=kpbGP_it?z6^Vs4(Z&gX2SU=!fRhp;P4|%)F@(l8}kwX!Q zNK9HcZr-7t=??X1GTkK!*(#Bp=}iDxo#`G8rd`q|8Q|MDz-+M)unyVTz#_nQ$=(JQ z1J)(`YwYtrIrxG|j~sq-KBD}9+&OppcYlFWr;l{>5=-^s%?RA=`1I`jH6w)6D=cW= z*FK)Bi4NwH3aLX@;gU)nO_)@TxP~3Eq)M^6l;DT7E?G_cuJ%p7Fg;y#MrO~kpcr=C z1DZwfaBws@f~-I>#i@?oLv7a7Z#8-VjBU($b2V-RgJM$eEW<)jLTkk^m;W*gj$z6e3_-+Y2%77i=uj%G=2E-O!0Oukel%=mYG^q@nQ6^t@D3N3 zv?g$l*|5T_9?Y(Fx;(+Sn9$<#&`=ug*cHY<>GyPW0T&74g~4@i6%DG}`y3RFkODq` zM@LY3U~)~5Y#*$2D^@3Fv1sZGRth6arv@Nc;ddA=wq+ojQ#FKgDa@~>+pB(!EvP-% zqBBg$c+Ia<^L>p^&ql9CC+9k2b;0L^jzu$9ROoQ^_DZU(sCC1ZUeEBvPk~_0=`#e8 iybmUIQgrC1C`BEVy1wfoADQW+@J~1HBJ;#r8$Zfj9fvL%YW zQ_-mEnXLHR#r@O6!a6mLy8Fge>}4*ew9EArb%?n!R&I67?asvH!r^h%<`zJ?0U)>1 z`%Zcj%K1g2%B!JEz T^6cjL=q*L3*dRE$qL=I!!@Ee( literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/api/__pycache__/auth.cpython-310.pyc b/imagecreator/backend/app/api/__pycache__/auth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14be8fa6a90f2ffd3edfbc1c57af251314d222e9 GIT binary patch literal 1831 zcmZvd&u=3&6vxM&pGjuYv`tHa1;TFyq_m6Bo)DsJD{T?VE@=zWT%zgNZ70lRg6(W+ zlp;j9_J7zO`)}}P_{xbZM-ISyPFlJu6ZyqIo}b5`_qC^tqN)Xt{phz$_?GoMHts$i zG`@f${{+JwCT|YbSiqOKGgxPpOPf<3%*ZieRbFK^ z?j1WUWYMqgjKr@P-#QQ3(j~p)S6lcs*s}54Fn%ld{Gx^5Dr*|QSJ~RW)n5Mt_HDHt zUD@6r(5`Kd)#*ML&$ASptEu3L z;{7B|VX?l#7?aATSS-+{x(L$HiMh@*1;IS43mOumlxongHa;oSt*#Vew*ZD zzAHp2gafk#zOHU!7W$uVZS}w0-s$&tzd799KhU;RqV0-hbX!3;AHpI!?cf5M@M}xF z1p|LQ+AK$EGb@r4ZjhGZ<;GEx0$R42j7Cth%>>fW8J&wYm>fcpxSxPh(j*?KlNA#D zO#d;X6K^xe47Z6`0-t-NaSw*{S5UbjeV6kUMaFVXIm#V)j4+BkmCtMyOzlBsMl!;j zOLF0;>eQJ!%)O)_TCY2Kb8naeC7!C*4bN67S~n=gDy#^M#z)u0FuJBXysIP~iMbHx z!fMy%X$o=ke5kS%q$k!Ph}b~$UpCej*?8DL>~0?(JbBvNi+6WK9lc)1MQO$aO6+cO z!~-0D1I>GAFfVh{f|_;>MdU3pl>u!Khfq_zzngAIMH{*&0f^rmo_nBCC%2#xBi>>c zlvq=gGX;So=BBchGjN#=ND;Hg+^PM-XYLhZ_6+6#FvASy8_+>l5D1N@k#Rg$FQ3L} zZ}>dPGuASP(=ZorgTHtO&AT|WqL)Ee9mo~$NS=;Grq0DjIQ%}ETdv|mY$8Q%!;NyE zAkNYLC^^r|g#9l?e?bS=l_=cMt^&h4Y0^3o9q8z`U(^0^0@uVS6L>8M8_n%Y=(_wN zPxADX7w4T)6av2vpc~i#-X=#094z>VSh|5-68#d{LCJ^!169yq?nUjM7phd?Tg`zi z4(nnzUJ>GBG=_jD<`=OuDy7m5qqtAD9`+yicDD~eY^W3?3A3v^YBIWN!Ke;CgFA7Y d^UpDV66LpHg(RdK1T6eK+Mo|e7(j_yRW8MUW-H?z!(?w$}^ z;|rTpB(9v{$lu^spuTeAFK}3>8arg^QJ1T~{;IlOZYGn+f%WXu--|z(Ytzw*-iB0hKKlfNJyXHM+s zOIb_BO{3BYs@Cogl^nxd(#uMIbyo>Lp)#TSw*sq7)@k2~|cQN@NM z@rjZ`)~4X42G_y4)EZDw{VQoQu>$RZka;6y#`7F*Gt+!0kuXL-=Tf~Wa%so;TR)bH zRZcP3{Tjh<2>S_a{WFN(xpubHke=RYzxS0wo91W@vfv97Q^~N8eWu}$s2=#r3hpPwPDNU>G9^? zo4Za+H3J}7qEa_zcG+~bn2%Kqe1-Fzj33)K?0J z%LbPm8UihH;dG~b(>=b>65cJ$TKPx_&?eE}m%PlM%WA!7RHbk#Z45Cl1UG!eAz>U= zdw@{hDEZb2Hfe|N>!TMO{s6nuhyT5Wp$-+hBi={T@UyBBT`51u5z$DCop;C-)1{cQ QPkq-X?3P06lqR?T0_EI3)Bpeg literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/api/__pycache__/history.cpython-310.pyc b/imagecreator/backend/app/api/__pycache__/history.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2abe7f52a29ee94cbc97e4c285d80d32d76def74 GIT binary patch literal 207 zcmd1j<>g`k0y(oonZ`i+F^Gc8Z&@sfi`|MW~#l#N_PMycGS!f&w7U)X&H)2CAvlE2zB1VUwGmQks)$#|Sj7 Mm<34iFmN#e04JX^&;S4c literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/api/__pycache__/images.cpython-310.pyc b/imagecreator/backend/app/api/__pycache__/images.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b262bfaaa6feb92789dbeeb3c4e00ba00eb44e23 GIT binary patch literal 206 zcmd1j<>g`k0$H;|nZ`i+F^Gc8Z&@sfi`|MW~#l#N_PMycGS!f&w7Ugh&?a6;$5hu*uC&Da}c>V+0yj%mO5M H7`T`K=<_l% literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/api/__pycache__/users.cpython-310.pyc b/imagecreator/backend/app/api/__pycache__/users.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fc9cb2e145b5a90d14479f04e809893b585e1be GIT binary patch literal 1225 zcmZ8hOK%)S5T5FJ?(Xc<1bibWl$Fr#ja(2S3YOqvMR9VO%W6DbYmYs>GwJR@akRPM zTqE%lyhr{9;#c&Q6Mq3IK-H`RHZ4{4SJhuX>M>IfhkcL6SC4-!j{?v8osGLAA>&&T z^BXDYNvJ#p87PqnmSrtiXQ$UY&?gZms}Cd3qS zh+}5U5k~7sj^(7=@u{4ic=OpG6p1$vT<^)VAD-8(MeXA6u)&QqZutF+7tfAf7ueXc z-nhuv+_q*8Ex{H0>wNZ)c-s+L%}^zOL@@SAT3W0t2RhHB<*Jqinse<7tuWb5%q z_2=Vd-PmQR@-r+n=C;=Njnlliq`;SX(~y))4#F&&EBE04p{>fzx=#5@K`Ib>N|OsH zqTC62TKHss93cUg?u8oy*4v6}c-eu>KBi0_&5PRxZiD2x&dM z^mpPW+Ieq-ZJ;07Sb`MNe=mOOcw1Nj?M`--44Qje*a0D+Tm;AE&y=Azhes+etA}|- zq06g>8qZ2Yu_a`sfKW4%)6U?sXC`7(OY9 zX7GgwAcX`H(T4!^=j1+~f9B$KPC+!K=89-8K=&risdppus>-Y49M#pL)=Ee0OsUQb zF4<{LuZsV5(IE?ojnVwMyD_u6E;I{nh@|E~e(UBxhaT{bX}7kI(=2l8?tLO7 zz5l*^>ZX0e_)TlO0PZBAYu7Fl$=7skTj4j{-{ujiLobC?kidi_5~(g`kf^Ei!GKGQkV-N=!FakLaKwQiLBvKfn7*ZI688n%yc%1W#QWbLZQ%ZAE z_53s$Z?VV6r{pKc$FF24Vgf1!6ThtW^9xG!GjkKuQ8 j1^UTA1NGzMGxIV_;^XxSDsOSvK#aEoxuF35m48^Ss<4nR zMXv5MSU@g$i=vOQ*Pi+cy|gn+$F18Xb~!VgUCw;-&F0;%OJMx`^tbq(Mab`{{ChM( z`2uG7D=dsKnvj(EB&9y3s2hoqn!cG@zNK|DX{5GqYuQSgspC6o%WrADk+^BwZ)@33 zI%(JMQo`G;Ij78FtsBGdF_-sQoA)m*)?wYZmcPY%VCie?_NC3X*fv;q*b&?1yKIk} zoE{Rr!)E(z@V4Rau>%v?6J?%c)sU*b7pFzSr(w#=B8)iteEn)R5h54LT&yJcbjG48;aFTKvF9eSu2Bw@MEX!3cn6d?zOOZtsgS;Ckn=r>PODvTn zw{%T5)Fbcd6wYiHD;7lc&y{r*mRCb6`r!DUh&_1y`D~OIaulcGoJWF(G8Ye(i!l0u zXKWM}#VE=JAC){>ida@pib{3yz~DoKZ4API#ie2ZFV!oOFwXA3t3JAOc5jH#`NKdN zC|0M^0ijN1O*e)|#5Nd)hS-6ZvVY_vzN|n!098D~1#_vFeRS#9F86=xfl-Inq2dVS zsj{HNq3ZHCMJ#w3=n_AOrvYv_HMBDj*5sCK$hEPiqATgGu_0@EK(5Wqtu<*%Ytdlz zMqAg$t<8+J8Pg54f^06FwE^E-FkNQenAg_Y0?JuaphPo`v!#T>n-C7@tuUGAfbms2 zY%43ui%K9m%3jJS%U1#`F0k6__+&hucwR6&doh^?lkdMhJ)ZwNAeI^6dO{_SMT_LmcCwkI}Uy^We_guJKXrT4w=p`oCE3 zYToc5j3Qo^fy{v~SgsO5cc?{sbkBeZlK2$QZ)leXJjV1eObzyP5PsT~WC2W;#=?YY z!5u&WG%6d+hynO_^cVVyc)%EGS07P=&uh4GJhCD~6G3(FK`eE|!{!|jj3W>lKk+gA zN_>KgjSF69K&#K-rJ6-pC3(pHmu|iPLAr=tiJUd)fNs$awW;x!7=fWC?m*X1*G<{7 zDxm!Za$O+70FSERrH(*Zi@fAIjyl>tHdhi~Jh|&((ZU@rbR$|W<9VHj?hCV&qHa9v zBF_^|bl`a$NsW6Q&p(Z#CEYE~^E7A6gny3LNr|nyMKBAT9iwOL7z6XMdF1{L|DAZh literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/models/__pycache__/__init__.cpython-310.pyc b/imagecreator/backend/app/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de418c59d04402ddf9f69d41220267b934a4ac51 GIT binary patch literal 180 zcmd1j<>g`kg5Ac4GDU&(V-N=!FakLaKwQiLBvKfn7*ZI688n%y_c_`t=4F<|$LkeT-r}%#&<$$9yl<5XFeAXr~+e-+<+guYvFb_D?L!P~qC z!Vtp}QM-E*D@-xAye~cFQ(qBER6qk2(ojV-QZXHUbWbXVI@0N znsC3>qFfp>=WkmRKLU+8Xqe=2rMXy^Px;D_ow8GgJnsYpFRA9TXhl^vhoS~d9uy5< z*cfLQ25=AFW(x>M6f;CUhN;gyN|+CM5i{E5CD+c^vx-5?7IL^HRI%h{=(Zm0O#>6> zd08l)=O)Q>Rk2Q5KF#yjT_JycneV)q-}>j-{oNfibXyNTBW<&A`od|hY zmqjPrcX8Kn-E0f?*bZCSNm(37{^L4SKp+pHDb|;Phe-lGP>F1y8H=*++I%h0w)Gm0gG|`9i?VuS5;sZU zy=b-lH9(e-&*{+h+<9wv0Z0aKa|wtYpozDMQ+OsP&j=(=YkE#!vlcE=(!7?1TpV(> z>Wg8Mb*Jsqu~pEqB{wZ`r5c^uY*$*HWXA1XPGP#Y;crkJz}?kDFfo49YF7;x{BOCN b_)dTE?%K=U*k;8j#Wx`N7^mKrw?+O3eZxz` literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/models/__pycache__/user.cpython-310.pyc b/imagecreator/backend/app/models/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32a65db4dcca02c0cb44b8da8133654dae66f687 GIT binary patch literal 828 zcmY*Yy>8qv43^|S#dnuniy-LMtX^_UmI6f)v_;#Y$dYu?A}B{S=R~r7vW?{CbiD`Z z+&AcBXzi3&=+aVle-Z&A`H>X;k&^4#EGM|W9e*!BFhYI=@NmTlPH?v$Q2+sIhzOb) zYN?}3%^i6GgTlw^?b7ghu`CE*gW6Z~&`VufZeyv))3}+v%6u}AZ_7;UEf&vi?sEBl| z6JR>M${^ZCf+OC6_>KZYP7Km*Eb_sZJ@QTd`4Zq;CZ>pIdiQD%b`Z_~qQR46-6t@? zo~FpM)y^k9%J#fqe$u$oDz}l>dgC+DpH*+V`$Hu8u84fvSLM3bo>#pw>cVKBlojaP z`(Kz)P`5j(Nl?rM<#}E8O&Hi|@zirED`mBmK9|zg(3@aSrCj&Q{E5t@>_X`gx(JK7 zFfAYVI8daD^4PNyT)1n`1ND&W6Kz##{N75nD-E(yZF^HYa7n0uZ-pTJZduhgK3_VG zj6kZ+=Oepdei$&dZ3!KHJ9dnIFUP6AqKMk?t8g-<&*+rxv)_EB(x?Cc literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/schemas/__pycache__/__init__.cpython-310.pyc b/imagecreator/backend/app/schemas/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1b238a5edadc00637851ae2e4680e1813e8836b GIT binary patch literal 182 zcmd1j<>g`kf`i6~GR1)OV-N=!FakLaKwQiLBvKfn7*ZI688n%y_=A%(QgaiF6>{@a zN^?^6{4^PFvB$@!0I-5h|j^QjT-(b?kGGZ@TF;V;Iqk@AU`H*bgH6BLO+bDchEaT$XrT7Zkd6Y!B9gO39j;HjQ~PXZt5?2^q+eqv`fi~QuZa^`)f z&Dy7L8da|^2U}5Yf5af?c-&KfVI|kBjINo9O``c3GXisjnRt8#Jvc%5{Ms3NVV1QU zjP>aTtW}Ni!q7QB?Ui$1I;$76kx!+hoRmJ3vg!0@P4BsspEqiKmxe;>Bqu42cK5!!dse?9(9oO~@+5c%PMYyvBIt6r&ytwLMj?Yz98Rz5>*wmVj*0|Lj z9o-mZaidwt%3<3ZT;cIj9zn#xdhR1Z#qPOXa7)qS6+K4w-->hu^|8-``iq@f`v6N9 zwg4VHopz$L99??G;3Y*CvoShzt5rMHm5mSy9Ts{Zm>u+mrH6L)>DjJ(U*W%IjxM!e LMO26)c_@AZUYf;X literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/schemas/__pycache__/user.cpython-310.pyc b/imagecreator/backend/app/schemas/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70a8ba8e6612514b329b1c10a5f5f146fc6e5292 GIT binary patch literal 1256 zcmZ`&&2H2%5VjpB>rJ!mLMwhQ+#{jxjRUGsML~!Ii$vK=E|I%-OGN&#y@GNrZ^DV! z;4ysV#4B)O#%ZDLwuwBMZ*0%ZH#6xbla#>2p8Tx7Q$l_rxcqPc`>^a65Q->TlZF3LJPoSz+;sHP6JK> zZ>S7#7S3;|$sx%%e?xSVGe3SVt$x!fU3>AekyU-@OisOc+qsaAT%kcA_ZFz9cixU9?>y;*&b05MCM*BtTq_dixp_CY_yLx#-8Vi z7iEc-vh-{Cp3b`7&8kM8 z=%vxpb>=EKlFN^}RWsT5GrRl%DcBiiwA-JW5qL>pSrjP|G^4?GJNJ8VaGkqiz&Y|M zaz4N$fORje{oENf&trqbVm44@C?+U2QT(GZXj8P^0f84R4pB-VCA8e0(qq_NPwAo^ zFc^{IFc|!d6^V)=(Zpw%=sRtDsHyg>Qa%l})2ftiEfNg)(0EMmB9fv-G|>LKec9XY zLDwEvC-3Juzed|{9h8(IYS1#zGnk}PC0kc54ZCpT6L;EI?aAO6$$P$9RcfdRPIZ`>Kr#5a bsVrXX4S(Jcow6yPMmwXwRx|Gu literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/services/__pycache__/__init__.cpython-310.pyc b/imagecreator/backend/app/services/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82a316850a1e7ae26a6edfd0e9c95724d52e2de6 GIT binary patch literal 184 zcmd1j<>g`kg5$=AGR1-PV-N=!FakLaKwQiLBvKfn7*ZI688n%y1cFnG$}*EvixqP7 zQ%ZAE_53s$Z?VV6r{pKc$FF24Vgf1$6Tj^B^9xG!GjkKuQ81^UHML-ph1GxIV_;^XxSDsOSvK&-F>xuqCnFb4ww%%(6M literal 0 HcmV?d00001 diff --git a/imagecreator/backend/app/services/__pycache__/auth.cpython-310.pyc b/imagecreator/backend/app/services/__pycache__/auth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1046d4ff329f49548634d09ec0c3a7bd915e47f3 GIT binary patch literal 1688 zcmZ`(&2A$_5bo~zwLP)3VL_}3kQH3!;@l7t2rYj?T!KUt4!(>g)9rYY8IM!l-d#tN z3)w60usQB)@ECpNgv1kY0IJ%t@h+jI>iN35y1TymnPz9F%W!y~{969uGxi%Twugs{ zCn)+yoFtRHVl^LgPFPf;_QsyWUgg)pIB?jn!a5p94hL0ScgCH%JMMD!9h0GqUN9Nm zh;dKG$1Lsqj`y;Z+xUmMDVtedA&!of*0@0EpPYREjr(c^sjxfKTu-xkuJyA9q#Zm} zP)?Q`MM1Z1j~EwEP_)EJu`!oyEF@RnL`WgM7yj6nz6xZ35~4&ZoWwGg9o&iB&Pp4r z@DZDYvMYPI(~*hlqU}oS%N^NAZBGu6(XQ=%xiHgX1y9RDSs_mgfp4z|VUn*=G{wH< zEz2;R$Ltk9N;z~;heUm?s)<{?VvwNj&(98b@ExDa14)P}e0+HZY$WFpCL_|M$Lt#`w( z10ygPq79_@#k&sOJ)JhZ#cFf7d&}-n?@k+HyuG8Vk5BGAK4{>;`FxO97$Uhm0CiSs zqd>{jg8_O6yExeam64L0x=9lkY8zZG6fA-G*l*+lzMiXKtymRbS zJ*0K(9W$VMO=A}-c!<~q3f?B~XZjv!Kece_rv&22>C%S!p57TfTpC;y-Cnp1cmCo4(`L@5<3A|E1t)BXOLGMV$@ zbcv39geI=N_W9Lt+wIrQj?#o$lDaI*Y&Xm5MlLGCNtRtM@@lmMlt$>|WIb(Q74G** zM;#0w&_qn(F-`vl)*&h-p#L9<`_;s(&xhV{FpQm^oCwWwPQ^&~*}lH4@~W7sdO2#K zcCTZFE-(!AiXGsuWrUupN{?LKx;}Y8+M)q9(yCZMX_l@lR&_vc-{+W(KVMP)f|GaT OaKaKycp`TBp7;l~cz==r literal 0 HcmV?d00001 diff --git a/imagecreator/backend/test.db b/imagecreator/backend/test.db new file mode 100644 index 0000000000000000000000000000000000000000..c4f393eddc37187bbe2ed6bd821344a2f8775172 GIT binary patch literal 20480 zcmeI(&2Q3R90%~HgUx{%Eb-9Ok|&YF8fEJngU*<&ZjFOc=4#oC9!Q}zG*V!+IP_u` zFaC4>2m2Ft+`*%5S&fr9J-X!kq~&?(uTP(T%H`L<>w~%*IP~3MNHt9sx9TelXUJ0$z9~X<-Udu6bL{70uX=z1Rwwb2tWV= z5cr=3-liAWb(Z<;_HAe4PFiE%8Ts*N-}0QeH@|IYs;SXtqk7QPXtlAU9n+amy5FF2 zI9-jZ=xokNEwCKR_%|naJj?CHq3Jtkj^lorHtuuhedYnnvdouffz|F!R~Sz=cRiV@ zzNl--QnDG>rrW!!u_}oiZS0%0(X7{>(rhMKBt2A(TLY$-PmYSE(#`X`mfv;k*3k0( zv%$#zIn7L9XXIEx7#U{bJ0YW4)wTHgL;JSjS4LG=jT5@3ozPX+=CT|&x4=GU84@G< zr@b(MdttdBdKw)){yO zv0V_vLVbN)+SoljJQdEWb+_YnZFQhKo_}1^`+8%t*Ey2+Yad2$wuMhM(>(szl>GNE zMPA$}@={ThDPP{?`AtDt;}u@1RQ_~C5whWZG5HG;ZYU6d00bZa0SG_<0uX=z1Rwwb z2;4(~$0G>l0F!a#5C8xG literal 0 HcmV?d00001 diff --git a/imagecreator/backend/tests/__pycache__/test_auth_api.cpython-310-pytest-9.0.2.pyc b/imagecreator/backend/tests/__pycache__/test_auth_api.cpython-310-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7831f623f3d3d89114d7879fc848c45c78041d8 GIT binary patch literal 4216 zcmbtX&2Jn@74Pcq>FMeD9)Bmhi#L#EM~h|>+i{j9Uh=h&<-;t*yGSFUR(q;qx6>a( zRXd4Ij|7C%N{Lv+jUd?)7jxmv5l*axI3W&oLgJKv!4in~s%IuWVOdth*1UREue#o= zs`q~HRa~t)8vOlo{g3|dOPcl%?BxGU=v;-Lu!*Kojgmm?5!LFUp=(47&0c|I602t^ zNwHUiRuAm3)GH~O5jbJFS5~|kRKjYns`x@s3+ugl*yuG>-wK*xtJhL|F_;Nwd$WqS zgSl|NHxGQNx4?>fi$_ar;h6AERy;a`9MM>rI&9%r+OKt5rWK#i>La~(mQ~qVT6;u# zFVQ+}{7mb;%wA@#y;oS{ipEN;^^o*F$Lf2_d#`5mKtq$ZVBR@8LuaA=Je{NS(0+j~ z&_!s^Q*v8tFFnOG+H4c)Y%!7C2z(YL(5v=2^AhH=XvdEj3{(UY!jGfSyUTc6m*#a( zFlp_u#HHIHH@v|B8uNVtV)%a76T9xf6XJf%>0z^*goADZ8eDHb+3nEnLr45D@Duh{ zx7(G?{x0j^b%hr)H`xWv^lPZHA4d`E!zX-4;M&`MMEhv(_z!MUv*Cw>;&mWD(Gu;U zHq;KCRQmw#^!r+>9g$<;sCIk8-`Cn?6ZX)+E#J=e^{u$?1+vf&Vu9P$>Gp}n8?fZ* zMmHWLT|e}8m^zf0Pj|Mx{#_PPwL9@_kFGcHJA(sRkMA+geahVItY*+wbXEPw7SV}K z=5^kJ?$pLAFi?cw4fu)2u+2o;>UZ^_ks9I~ ziE(67J2mbQTEg)=`msr!q;O;%Yxgwq2FQ!422OVYI2*Z$fE;;pOjN5M6Iy;^%xgoF zR%kUfeFA(TDS^~U3&-Rk`6&dCsSOGI4A8F~m5;Tdm0Gm6qz#J{Z7HS(*kq@+cnII2 zO*Yt6$8oetX)2C18lbW9LrOU zhvRt-bbhk?-@-hQ!tQ^k^aBUGpQj5-cbP8IrL?ScniO3P2Pr(eASg!jK7&}?OkCcK{m}F8f@lJG(L5j<)PMHAK^7E*@BCWoHAZZR_k;rmx zbJDpwILIJ`%ccwA8n~PdI2`Z5<4jgS>~8P-LE=Y3S^);Mkc+O^jrRkprn);pyzK?9 zI{6ad%^ij-$l5h^8~|_ca2|6xx@aR+78m7U?md}l4+ zS{XT%(GKd5s48jfm zJOBK!V3R$P5`GJYr+^31bOJnogHDF0i2|Pl;O8Ns<|AWBAm9yz3xcR>BEmvjz&5e= zinIV=WzizF0jf#>ReGxLVbD55Gc{5ZV4;u}L_aAVIkcP>02V4ZuAr)#l#eP3s&0b3 zngST{cY&)R2fF|}0i7Lz(i8!5oc1gZ=GjsgH025@sz+Ux;D ztsm_i&W^dMkTo$RPYe|ndX=K$IK73?k}L7(C0 zki3TEi$G4Ayox*?IEQ)#qQavT+&>OOKjAeTUPZEoABM%h=9Tt#vX$#o={;BpSMJncYqe-QY6ECa@H^#;rrxL1p`hy%&X zCYC<-s>cQXJrGU#(^Mk+Gn~o`_!A_(CpsHoqkvd>Y6US9LLLV-H zzqTeeJyJH=;Nibeb^r$+-l8+3bTmunM(M~Jc{C)fiAR@)4xOLU`}fbN_v4A)zx$$k&n>g(|NM0c5#@PWQkAD}5 ziuwNFt$`MsskEBIflHzQ+hu9oPT|2+T;O3dJn`?Avgu;e+B6a zgdjjVgrJ=Z!O|y$AXJFp_T@L>(jP%VBoKyQF6-sf?&gRXWs zH(~Sc$hTnk$_4rRz{%=l7Cut=2PjqW{Sg4wr@J5jHcoyI$#d7Xl)E;y{v=(z3$w*6 zkpH~B$0q*)2->endtAXNke5qtR`YbSVgu@s4rli{Je*`{G9-(mF_j{um3<=hSjg5L z4@xL_iJ(1@P_)54eE?wPynzD1JD;mm$aogASH%+wj`s1sLKMj@vj6 zg=@sISdewqg#t7X9hG&^=VTK{0RUJ>u>L;Se2^u&%GNu#x7?f8-S@6--GV~TOLnED zQZSTloQ3dUg1&lqX0eLJi=3rw0M9HI^$*w%$bL<`JXg2X*m&4M1?PX>0) zRzAZ|1y0RTw&|yXOf94Agr5y^wVbjoKOYoog`ij~5{=n3d6(2m%wZ*JZ;;vuO;P8b zRvV>hnt}TmCAYLn_D^7=-K-FqZE)sBtj^jkug$=b5ljd#YzOXb#-VM#?F#gp9|>sd zvUrWP8FwQHdCwD3$k%0V-*qFTtXmSF`Ci24r>3Un0~SEY{5A}*azB|HMQ73HC~(6hG4UGf#oq^b3FxJ<}TR*JwxkD1)o6_f8F+MyZ6 zB>NO5UqXM(!?2a3Bd{%9QfwY!gvCQbUA#IFky8)947Py`-^Kn>(dqCd@(S}3uUy#3|Zir$wQt|uXXT&QEsXV1uSx@8@bXM>`&MCr4?^d zSy+Us-HNyA^|0ak9F#|shD)impooDNN!_E;x!hUD0@qzGi*<zs8sM08xvWCptH zORJtAd2JyrA4d{$qAr%hRiCQRddm-&T)(cSAypS{li>(5cSV&6G~g=dA(tcdX2=6K zs(;8`HWbI2^w@Iw%hq}1sWA3;wVbH}wlJKUHVZk&r7@z8U_jSJfvpN4UE z-k1tI(UcdsEv5<;@`H^fw{e@b=@gbhD69t{QNE~l)@5E52WKvJreQ=;0>}}I;F%@A{#^_MJ<|)oRu`SQLHztzOG~rglI_S^p#ZK z0GTs;M$ZJ9OY{<=9c4DNC`}-98T2ce%SO4)ypp*Op}&BF#uvdVq6IRSRW`_*x|<+# zIVE!z%~KFIC3DHB1id4@2v(bsT@(-&YwpT#}HmXIF5k&&C3WcB3K9~5b#0i?2pA?Lhs86ClOvj zcopFkLIvS9ggJzZ2&VxmY5qFesJ;9W!X!c!VG7|4!dZY}{hb|_-1EbYi%NZCIEPOi zQ&QU6`!uW%CN>sUoKt~R_k~s0O`^j;Mr+5hQEY!CKcm>b3!#;9Y409R>Rsj0dVHK! z<8uQJpDJf-9KJMVYR@H;1D~ptwBkpk1D~X>-&khBItQ)RWNzP4g`J8)EsB+ITn$0n%z?z zhdT;PMF9*$nIfiPX!s6L@B!%9f`*EQhAtKFy*#W~Z&+O z<1p%WW39t9c@PiHl8n2FoHurH$H}h=iVx!*7`g?ONS?ElW$c9KJmVRAP|8In^!q7) zDkNwJT$a#&AWj|Wq@}0MDSOEDDy+L1KjrEgXdY@qE*l3le z@{%k|KP&Y(=uTP&4?lBG`3e6FPBIs1C1V*s5xFZXxtF<_H)eS`E9)P@Q^;yohP-NM zr@ZRZr~{0eRv@avsHj0yIOD0ur|6MkUMJ{*8s&9X+gId)wS7w-MQx0#R)x4$EB_<=m6cQB{Jfs>;Q@mQ}MFROMyf*IYMXSFFo}x-Q_# zxw?LXbz9f(7=Kb1E+_6O2*X8r_g{)55H;U{VGuaEs zz6!(3Ym&kHxx8l<(paaHx3ayl8SrOfbvNLTFI>GoI$jU-%IfY4svChe9=^1(H2&m< zK$sGEq1brbgm*huDS6)lZ!q5aFyKb?H0-y7n}E6cNujLReIdkkw6p_#a}p@1<|{o- zv+Y1DY|+3~*vGhOTh%~Q^psGrkU-jPT7*9BilvxbBQNJImc%-_?U=*p? z)L}W?ANTrcZwSZRPryT)i=jSD#(hby;r)KHAN9jwG>Aq6SeK#*aq*Xc(oiVo$EADtKN93RA;?HsiLP*t<4oCtI^_#frV>_UuaGW;eKF zYq68|`mEor*~zw@SihaQo7z7x^#&yQYbz4xa*mD*$cG39fgcF$G{1;p(8Bn*9t>uTcvlqOMa57l@j)^M64ow5-TEVie-L z6d#~a#76|4#RogZuS^lyrTBn4bx1Km14LH-fBek-xSGRf1Ry6e?|~qM|3uLz2nYMQ z=-*AFfB&!OfI6}ve(O(4`0Lw~~O*)%cMo_h26!fQd-eSDCvC>YOA(fR3xa7T0ruP<#=W{PJIb8vu!sx z60kfWRq8uM+C1_bJn;j(%qzU`3l&0~Gu~a&K9k7fbD25!Imdak=^60*e(Trx&x&FE zfym;|2IMw8;%``}K}llxM8D0{G7Vy+wqGG7$MGG_srprTn~9s&{F>%jiI>*>x`yqf zkv9FNhAT-cZTs!C<99UfBui=6?`pW3ET=2}iiX`}HC^-9(i8p(z-#_GtByAgPO|km z;h(eW!6}4@!Rpjw>pvMko3u_FF`><8rhl3>*=gE(M*KHun|6LM{4?wf>yF=Kof`(L zvF<+cH(7i9*7$6>4>T;%F6?`oF4GlwpQGe~(OdlsB4FI_5#>E(LVl3MER%pWBhEs} z0+#K>83RH?Fd^bROT$Nu_e^Eq4Fyxq4wC^L0^bTJ6L{HQ2+eMeLNN*^p%71UPSx_E zxG;)9Od#_|ESq)*GMx-0s10`El<3pp)DvGPv1IQL1_QMejac+35Mjy!IRbm=$7o2D zXBmrR5b_;?8i#R4BlP0vM*wi)L87<-%Xfw}_Kle_^$O!l$nIB0VH}V-K-73}3_me? zKuCN zEP6Wg@OJi2-B&L52rSNN2cg^SX_!tD){pX3+1O)xmU5AwL90*|mWFYn+Sq{@J?=r% z<^ZnV0Jn)jinqC1*0K2OHz?B{d1>Cf*(1{{=Pyk5F874@%^|RPa}%M9J<%631UrH# zr_7se-Ygl{dP2FJiAkP8ldzNpdvUpp%e83>>|VLRrui^yOD3bdLH$gp_xC zvZuRy$kkE+jWh{3n{W^}f%c;szz&AHaU$bPC?~;IE7W=*M)__+_10h~$%kPQ=)Bfo z5^OV+pjvlyOre*3#CguuaLhCkyGW7k@PY6_>vnL!TtEwH7Fr%8rui+V| zJfh58sP1+MnS@D&R+X9NID8b&=P-f6obGW839bJKeaHdFfuI`jG0?}F8^T8dhc7UL zJ4knt4!1MoI2lx1qi~rL(bxIG%2P{7jdITVfIqYdHB$N(DNw3CBLylhD19=5#kOB(v$Ib3b40m)i3Az`LhbxF%|&4&Fi^Sb|a literal 0 HcmV?d00001 diff --git a/imagecreator/backend/tests/test_users_api.py b/imagecreator/backend/tests/test_users_api.py new file mode 100644 index 0000000..dd0faa2 --- /dev/null +++ b/imagecreator/backend/tests/test_users_api.py @@ -0,0 +1,49 @@ +import pytest +import os +from fastapi.testclient import TestClient +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from app.database import Base, get_db +from app.main import app +from app.models.user import User +from app.core.security import hash_password, create_access_token + +# Use file-based SQLite for testing to avoid in-memory connection issues +TEST_DB_PATH = "/tmp/test_users.db" +if os.path.exists(TEST_DB_PATH): + os.remove(TEST_DB_PATH) + +engine = create_engine(f"sqlite:///{TEST_DB_PATH}", connect_args={"check_same_thread": False}) +TestSessionLocal = sessionmaker(bind=engine) + +def override_get_db(): + db = TestSessionLocal() + try: + yield db + finally: + db.close() + +app.dependency_overrides[get_db] = override_get_db +client = TestClient(app) + +# Create tables once at module level +Base.metadata.create_all(bind=engine) + +def get_auth_header(user_id): + token = create_access_token({"sub": str(user_id)}) + return {"Authorization": f"Bearer {token}"} + +def test_get_current_user(): + db = TestSessionLocal() + user = User(username="testuser", email="test@example.com", hashed_password=hash_password("pass")) + db.add(user) + db.commit() + db.refresh(user) + db.close() + + response = client.get("/api/users/me", headers=get_auth_header(user.id)) + assert response.status_code == 200 + data = response.json() + assert data["username"] == "testuser" + assert data["email"] == "test@example.com" + assert "password" not in data \ No newline at end of file diff --git a/prompt-optimizer b/prompt-optimizer new file mode 160000 index 0000000..0a4785d --- /dev/null +++ b/prompt-optimizer @@ -0,0 +1 @@ +Subproject commit 0a4785d36533d90e4758e618d5bdc65436bf8990