From be6e1fab8e501eec7e7a47254da573db9822970a Mon Sep 17 00:00:00 2001 From: Anahita-Mahmoudi Date: Sun, 17 May 2026 03:36:28 +0330 Subject: [PATCH] refactor: restructure project into layered architecture --- backend/.config | 40 -------- backend/.env | 1 + backend/__pycache__/config.cpython-313.pyc | Bin 0 -> 716 bytes backend/__pycache__/main.cpython-313.pyc | Bin 0 -> 638 bytes backend/__pycache__/schemas.cpython-313.pyc | Bin 0 -> 913 bytes backend/alembic.ini | 2 +- .../alembic/__pycache__/env.cpython-313.pyc | Bin 2600 -> 759 bytes backend/alembic/env.py | 78 ++-------------- .../alembic/versions/96dff3d4cf1c_initial.py | 28 ++++++ .../96dff3d4cf1c_initial.cpython-313.pyc | Bin 0 -> 953 bytes backend/api/__pycache__/admin.cpython-313.pyc | Bin 0 -> 1692 bytes backend/api/__pycache__/user.cpython-313.pyc | Bin 0 -> 1613 bytes backend/api/admin | 37 -------- backend/api/admin.py | 64 +++++++++++++ backend/api/user | 38 -------- backend/api/user.py | 59 ++++++++++++ backend/app/db/__init__.py | 0 .../db/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 137 bytes .../app/db/__pycache__/model.cpython-313.pyc | Bin 0 -> 3282 bytes .../app/db/__pycache__/models.cpython-313.pyc | Bin 0 -> 672 bytes .../db/__pycache__/session.cpython-313.pyc | Bin 0 -> 554 bytes backend/app/db/model.py | 87 ------------------ backend/app/db/models.py | 21 +++++ backend/app/db/session.py | 15 +-- backend/config.py | 10 ++ backend/main.py | 17 ++-- backend/requirements.txt | Bin 0 -> 802 bytes .../services/__pycache__/crud.cpython-313.pyc | Bin 0 -> 1665 bytes backend/services/crud.py | 45 +++++++-- 29 files changed, 240 insertions(+), 302 deletions(-) delete mode 100644 backend/.config create mode 100644 backend/.env create mode 100644 backend/__pycache__/config.cpython-313.pyc create mode 100644 backend/__pycache__/main.cpython-313.pyc create mode 100644 backend/__pycache__/schemas.cpython-313.pyc create mode 100644 backend/alembic/versions/96dff3d4cf1c_initial.py create mode 100644 backend/alembic/versions/__pycache__/96dff3d4cf1c_initial.cpython-313.pyc create mode 100644 backend/api/__pycache__/admin.cpython-313.pyc create mode 100644 backend/api/__pycache__/user.cpython-313.pyc delete mode 100644 backend/api/admin create mode 100644 backend/api/admin.py delete mode 100644 backend/api/user create mode 100644 backend/api/user.py create mode 100644 backend/app/db/__init__.py create mode 100644 backend/app/db/__pycache__/__init__.cpython-313.pyc create mode 100644 backend/app/db/__pycache__/model.cpython-313.pyc create mode 100644 backend/app/db/__pycache__/models.cpython-313.pyc create mode 100644 backend/app/db/__pycache__/session.cpython-313.pyc delete mode 100644 backend/app/db/model.py create mode 100644 backend/app/db/models.py create mode 100644 backend/config.py create mode 100644 backend/requirements.txt create mode 100644 backend/services/__pycache__/crud.cpython-313.pyc diff --git a/backend/.config b/backend/.config deleted file mode 100644 index d31c4ed..0000000 --- a/backend/.config +++ /dev/null @@ -1,40 +0,0 @@ -import sys -from os.path import abspath, dirname -import logging.config -from alembic import context - -sys.path.insert(0, dirname(dirname(abspath(__file__)))) - -from config import DATABASE_URL, LOGGING_CONFIG -from database import Base, engine -import models - -#log-settings - -logging.config.dictConfig(LOGGING_CONFIG) - -target_metadata = Base.metadata - -def run_migrations_offline(): - context.configure( - url=DATABASE_URL, - target_metadata=target_metadata, - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - ) - with context.begin_transaction(): - context.run_migrations() - -def run_migrations_online(): - with engine.connect() as connection: - context.configure( - connection=connection, - target_metadata=target_metadata, - ) - with context.begin_transaction(): - context.run_migrations() - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() \ No newline at end of file diff --git a/backend/.env b/backend/.env new file mode 100644 index 0000000..b686fce --- /dev/null +++ b/backend/.env @@ -0,0 +1 @@ +DATABASE_URL=sqlite:///./wheel.db \ No newline at end of file diff --git a/backend/__pycache__/config.cpython-313.pyc b/backend/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a0cad92c3ce9a5ee6a6fa64f9ccf7ae09400953 GIT binary patch literal 716 zcmY*X&ubGw6n?Wio2+%y&>w*|AeMs2ddSIKN)b}+MI{GE(Zj;9O}24sIvd|?3KcJ2 zROq>Xga`i`FEStqo^n$X5O2=g-H4sTH}B1S?|t9=m^T_LV8@F;{>f)M|Da?!yegRA zwZSC_5bO~=WXN`43wA*`Z4hq6x^BrsCvtY7TNR-@;-NRAEMz7)h;<^8JWtg~4=PGA z@hYiAB0wep9l_AO1rd)t;oP>ALeRB>yz7(|SQ8%BN42nS{AK4ESuw$b-qYSePaMi; zPaaN|Au!Gb@mDRVa@nbs`xaK(yT~% znhmF8iUTQMPvdd5)0FZ!MV*gRm8i^a`?lOJjT6(7Qs;4=4rH9?m>x~@L`#X+t;(D% znwy7vk(i`v=lRPd8AnI);8miA(V%eCnVg$iX$-GfHks1|@8Rpl_Jxn@HpWc?>evr` z3@B+3tP(UW7+2?LtjSoZjLc+;JQQVXM55ZV)dofM8w#L1)+F%(zOT2w@YZk6y!HYt zlyqYDLvGe4=fhahDRuSoNVP>1k3wk6Yx=^GY)x{R@JaA(0i*8cc* R0e1Se3c=>Z-n;U|e*vW+p`QQ% literal 0 HcmV?d00001 diff --git a/backend/__pycache__/main.cpython-313.pyc b/backend/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02039a97118eefe5c052b8a4101b9bd69dea7090 GIT binary patch literal 638 zcmZ{i&1zaf6vxjv*Za{#p-K$2gi0U_B^W3OZ6bwGTBy>rcmv&BkkOgwwD*g-iey*l z3%KbcWRY#&q|j0s5DKM>?hL*_XY^{a=~GtECi3A*_5`CW9CG3(Ye&F_gNSbAfDy_>a#q=v)`jXu zVlJ@iE_YK^3pPz_y+|a&(5H^_)d&rED6(2_FS(PBWb4yWqK4bjdA*HE9LqeRv~yQe z=6TrjN0gGk83Mr+?sZ2Gv^=to#@L8P82X#!o1GgTmA(OpB$-!L;;fwQ4cn0#v*O6J_Rw WjdRlY4&`5fSNA3-Kj4YbpWz?wU!x-c literal 0 HcmV?d00001 diff --git a/backend/__pycache__/schemas.cpython-313.pyc b/backend/__pycache__/schemas.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..069f2abe526d95d19731591155b430499c7eb153 GIT binary patch literal 913 zcmZ`%O=}ZD7@pa$Y`(fmQER|92qJswtp}y#U=cB54zA#3Vb~^m7wW-F zFZ~hz4Sz)$@Z>2sVIv;(eRoq#q`t7v%=`JwJ~KtT-C$_FkH6!uxPB+++U(V)IK<5* z3s}Hku|5ahWjpL43ycm6%#a_LRUH^*)WWE}7Bwf1Ut3U#&vpG-l*`xING8LoslwF+ zR&>$7WFZ3{FfalR<|7tbp&b~HF%y{JOf28ljh9MJk3dFBE~r=ADpra7!Uld#yF#SV zR0^RRLQJ#KJfVF{h!689S!FyS#xdk7iBp+om^O0-8lzE~W-3x~mgX3}BScQ#P((^W zd^}eY!{8!ifgjV|=TF067N^~JCsHQiaWs4{(@~fYPvkVp_h+X-B9=hs%xegr*j01u zybrgoGaFJ^7$qxu2>+KNbWjwNMENWFfkBN(R|_0)CpF*IEfVUD%xCyNa^YZ78}SI} z7#pmd`p}9UgiY4K01Jh;OX0WI=j|V5={TM&=motkMH%=G)X@V9L6e|`puI6<(=`pj zqZG+lsc@T$oN650Lx=iHvCi35XZN#Lm363rx(0szMjkUx6>L#eo1m<}feN-MOF)X` zcM3%M2?o*yCUiMhjEXKYv0xDxGh8q>s=CCaf~!VNmzi9!WGK4I)Pifq6}`^t zU1UpUvuwACOtBSnXQNB9WLq_FmTD9CD=UV2irLxtCArYU7HTmA#g<-G)S0k2bVj9%lQ<4ww+2o|UuS^$fTR?noYE}w zBQFJ(!gx%B^i3mu6_8+bM8ng;F$0$e3g#*D}I9p1n4{q9s&B`JKaiww3r%_xTZ}f$fsfOB#*s^(}20 zoeYxGT)q#FKMv>vb{&%V52P+E7os2tbF_Po`g62%&gU(FIchJI?T?)goww2gNi)=% zqShI{c82RS+@9k0pQwionRsK$XYVI&yg!*~y{Xpwf$uJwtuK3@_TFi%1#SKU DY$3HT literal 2600 zcmZ`)%}*Og6rc63?cMbkA2mq~g2Cb=P6?$=XhlC2XjBC%gzQ9>iY05k9-B?pyYB3o zgh-V*roB`>M7{KoYi~XDA0UUGg9A0$l0#MH&>Ia%NICV*u9r0_8N*#OK6d!9AelR&~1UHKoVW42X>b2_VVN`n(Y`bc18sx<=OJ{nDIR5ERExl7UtQeylS-!cZS=dW)lM)NtYlNvRzxb|Zui@KG%f<@6 zmH$#!j0!eP&;|y33l(CR-}i8a6hYcB5%Su=`2t8(q=WHB#T0Zc_cG zBR3SP)Gd2MCr;Q<>ZFnr93G~el&#Pju}gJgD;337oP@5~gerQetQi%{iB~j5C#qdC z8@9Eai#ic6zfQ{iO3@590~Mj{emT-f_GyCYy=4NIzhqOzuoRW~IZ4_yNWbkbU&Ull0U}DIAU*C6V0Q zma;7=yDN?Di>bCa+!BX(M10I6dAu!+{UMFLve<^V#DQy*{MMv=Z8oZce$q~``T&ju zSY-!u+iK_5!&MIZwqWd1DS=;9B%-w^DO_bHJ{c($lz8_DETZB z24>(^fr!0U;O799U0=NA&je$Da+eW;=&UHOwZIn`L0~`sbpO|D!kZal`JBfPZ}zAO z9S#ZK|Mn~bF;4Nv4Fm85ptn?FC{!~6>K(&!iJ$h_k#UoIVd|CC$)$ z8)di35to~~z5+qrr-kjvMJ8p%bc51BBbJImJ z%zXg=*7wi>%#x^od|ynq#mu&t`T70!;MMKHtG||?igSCZq5ZyrpDzD+`QNC}AK6?w zh$A`OmWH;ap&e=X(IppR7h2+ly>p|#efE+MN%E11lIeD0qLrA~ORh#xQN_mLl$U(Kd3b?tAc6i9ks9ThtP94~jUt-Ma zh>S+d@RC!;1e86mPJ}&By5)#I&3ct!&~UTqq%_NCu@dwB1s%d1^2#8745p?|KBZG& zV|-#YpgZ6>j(d*AU!dG`H24Ay9*DqRKMa32ycq#eklTD_oBd5Z6Os?s+o_4|)WnW3 zc^pSv_D_`9^D48MI_gPtqenCS-1xy10)pf-Ek4uchqn2lXF_II82U@NuqzDGw_(x$ E0OzMe_y7O^ diff --git a/backend/alembic/env.py b/backend/alembic/env.py index 209048d..c0a64ec 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -5,76 +5,18 @@ from sqlalchemy import pool from alembic import context -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. +from app.db.session import Base +from config import settings +from app.db import models + config = context.config -# Interpret the config file for Python logging. -# This line sets up loggers basically. +config.set_main_option( + "sqlalchemy.url", + settings.DATABASE_URL +) + if config.config_file_name is not None: fileConfig(config.config_file_name) -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -from database import Base, engine -import models -target_metadata = Base.metadata - -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. - - -def run_migrations_offline() -> None: - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - url = config.get_main_option("sqlalchemy.url") - context.configure( - url=url, - target_metadata=target_metadata, - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - ) - - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online() -> None: - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - - with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata - ) - - with context.begin_transaction(): - context.run_migrations() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() +target_metadata = Base.metadata \ No newline at end of file diff --git a/backend/alembic/versions/96dff3d4cf1c_initial.py b/backend/alembic/versions/96dff3d4cf1c_initial.py new file mode 100644 index 0000000..359eec9 --- /dev/null +++ b/backend/alembic/versions/96dff3d4cf1c_initial.py @@ -0,0 +1,28 @@ +"""initial + +Revision ID: 96dff3d4cf1c +Revises: +Create Date: 2026-05-17 03:07:55.231096 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '96dff3d4cf1c' +down_revision: Union[str, Sequence[str], None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/alembic/versions/__pycache__/96dff3d4cf1c_initial.cpython-313.pyc b/backend/alembic/versions/__pycache__/96dff3d4cf1c_initial.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7534f9678be99db8811434af1b7608d091f32c3 GIT binary patch literal 953 zcmah|&ubGw6rTN&WV6jCZ7~WJbfJhwNyv{Tr9pZzJ=j1GF4fDzve})cTQ|Gu+f6kE zA;%o!p`f=M_2!?_l8cNNK|FXXR`IAan-r^19hh(5+wbk0?|s9bDT<8fn*5aZvOGec zSaQC^S#b7_21n=?(hwkx)A%O0$pgPBfS|HmXo{OLh()p3j6*_;futvOS&QGMUuq)E z=>pApJsFGg6@fh|pP2EfOL%F(y$Z zTqzaTYO?%=YDYPqNE+VnVb8)Ow(Zg8IgaptcZ;Mh9zZ0RolO+mf94s#(-xSXwQIO$ z3%dc4ZQRA49T>i6u>;N*M+1TGGjG)fwbid=&k%rn;DSqPuuK?n1Xd6$Op#bctTI(%t)?yOOqW=%8O%Um zqn24VnJI0VT6WoDmIEHCz``&E%em$_Fx$)3%W3-OtDE(V`o!~nid^fw;wcsI>;$ad54x=z2`j{vFta>HqZEfVb3_VS~J` zZjk$ArK&I!tf^5fWo`m?%7c8vKjqAfvkfl=P=v^iaCbpqOqHSvPkc(9?MN=1+< z$muVkLLyT;)Q@@%trb`$NTxV*OcsXTr-6yfR8?69mpIp8)Q{+z$Q|oZ7&R#}Cpwmu zaB<3USY8;$QYEIGPovs}r(<9j_j2W5bLF0C^-TM&b=&Ies%<2o>P8=(V5d0fdHxfT zWi1RojWa{^LZ>?V%1%E(@c%kZyJ{<|%2|;MCBXi!iC9ux;wr9sUZKR*T>Uk28mh)h z_&rX-PT?|^yP{`jeAM1w;D z2YX2%6It=aNn9j-l1MIka#9k<#XF&1#fM)+g(TW9k~ks>++F(1Li?jaxp%7EE6p6} z>WGD`X061A?ASLK5>*j2E4snNxK&TYnGGL1=!Q(BWMT?rNpXRH)Wkb_owjbyby$mu zpJtrl!r=4RE#+S#(THM1x?HwY*!H{@A1&9NWxn zQkqlB0ZJ+e1(oK`DSrU}2Pg-um2yCBk$PL>9(w43H@k5XA|b?+{oZe8-psuBoA-8* zOzMEbrTE%U62K!d7>aTP25AED04%Ub85Rj6roa?2Wi-SRVu?v1mdo;@!jupzWtFMu ztCnMn8q>nLSUJ9^Gu;H66kzV?3YM_695BO9RPw{?PplQUQ?^=}I++i-e#?joTokp$II31LX z0}<=M3xSC*aN{UHIOeSlQ?Lx1@PL?TD-yb%kzwv8titqv`mDhF(yOpS-jPUyW?v{(|iG>%!qfnY@Z2PIU^e8AQ3_iVe%02hcNvF3XdRl2oq0WrmupYy_ers z|57!Q4aR|LU+3=Rda}{Wp4*H4KK|x!_{+W(C_oJ)iqgIg+1%c1KhE|gnN0Pxk!QjV o;5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~h`t5r;JL1vyp zct&b!PE1l_a&~H7N=#xwK}&ryk0@&Ee@O9{FKt1RJ$Tpphl3v#URE< MW=2NFB4!{908pSFCIA2c literal 0 HcmV?d00001 diff --git a/backend/app/db/__pycache__/model.cpython-313.pyc b/backend/app/db/__pycache__/model.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eb1b500d6ebea50d81386d71d8d66f680bf6c01 GIT binary patch literal 3282 zcma)8-ESMm5#PNJejGm}lKKiIOSEKLX6#C7Y*|v9xTqW(wbVEUPi_o^z~RI@$>)$q zX76OhF51#fkti-&D@}|D$cu_T6n^VV|AYPkQuQEulb|kAr0^S6DL^0k(3v})=%@+Y zm2PKtXJ>ZzH?uR`OC%Hm?N@&hZ(a`*@&yip7HKhiivl4Jh)PsCM`kIbvjP)lMJDEO zPMDKsWhQ&PI2W1?v#`fYa}gE+xilALQI9H20V>bMX5%bAn_!6?DMktd!FFw07;N(a zS2!AQZCXsIp=khbMkCKY#V& z+a&|t~%yJ$^~P=!9(Qu@r&Opsx`~by?(k$-4jwLpGCWWJy@Sk@q9NQU1Lu_{@KtE?E4_ z*cAP(G(vutnxcP5Pl$gOr|6x~xaFD^2jEXK)2UT$$JD$%8LE^HaDoA1g5Ta4bbulB zek(v0I^2cM{Jrz* z!`rbVo6?azm?T_6{nFDLqno|s%>eW4<6ZA8pvIv#(XtpES!9Sck3r<=uIU|`%dX{? zP4FltNDn3lwQ@QC3Ya1pcBAk)s9q=g3W;~_#QOgl>tCPwqw;%YJ9cVQI>q`ydZ*KO z!T3+{N}6T-jE7s?*Y1b8&AZ=qVE&)`1$VK9YXSxfHUo;v8)(UEDpdtloEA)~N~-(< zJx21OE7nKg^gGGRaG0E3b#sf=W!rct@R;N3?y{qmAR>9lFkRg$^Kb=Ty1r!IiF@lI zR!!G5@&RoA*n^GXt{}((@j&z7bMQvF0J;+>!)_ct2lM11=(b}g>#uwn>-a3$-{|Xa zWJY#nu|sJRF{(5blIU6c`DX0IrgXvwRvvfYU41Qv4?uhuj6WO1b`0C}8htj1*JvRG zh7UEE#m9fBsq&Z*K)!~Mr>|6V=y)fm-vVs)g|f+pL5YV}EZa62ydS|b*bq$Rqkdc} zctLFi6NiT{!)ocR;EMBBSudAvm=(w!7pmpuip|59ZP#2f84sy0v+Sk3?0W()#;}~S z?_h`T+d-tjF)i0{33p=Xmmi>X7CP`vh$PeZwR_rnVLOqlU-~kZ3OqCVlxN~3nrfu` zKF)uTZ*=#6T>PL2!i>@s<#?z`WI5!y3oF2k?wBPoeb53l_s+r815zZ6s)PwDWuhuD zsVGC852+&jNz)<=d*g^I!>ee)TR8~pTU2w?4vTHh;#-?xqrUpNu;I9jY9bUjW3f;S; z(bZpn^-;8AExa-Rr>?E&x%$kbczW&J#>K7p^Y2{rwNWRZn!Qo*C150=OD2y07To+vD)i@T#9bUlY z5va~O3c1ospirf`2&IiDb;Howdw6Ayi%=N2RJI(Kd-+rNr#J;?Rv?>i&77;LrC(-OTGusv#W4CtZj}CeN&{A{*9d3B4<7)!=IBEzaWWE zN%B(?`zOgiCZYFYcVj!GYm0R4kfALywDFToq^JKLO1xv$#b$_5X@{h@NV*}V8=0Q9 zEPPvK9W6=2glF6>0_;7qzmgwn* zlG;%Qwv>UU2&2c5j(wa(E7MH@xMmWqWbbA->zZJK`6JGg%9!(Z%@6g{*0`aTj|nrRBaeRYh`?7k$@Q>$mcB0#)w{4W5{s;U40 literal 0 HcmV?d00001 diff --git a/backend/app/db/__pycache__/models.cpython-313.pyc b/backend/app/db/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c2cd42c567043db812546cea06607276ea2bbe8 GIT binary patch literal 672 zcmYL{&ui2`6vtnFXSdBRYSqP3U3w4#vL_WP;-ONZTkK^7Jp_jAX57Y3vgw-y+*?5q z|AGDy{zpropooXwTvpHeX0yc!dHH=){VOd(qjq0TWtHVb z-eF#fi9o%{N=)+!k-Z-)F>V4I>#oJ}DZvFqfCd9JnSmBF(T<#5h+JmTW$#(&t+dY^ z=I)u;Vji|9e%Pw*!%}2dKBcIglu*41&3dE2G>dV@PsNP3^F(}nMLqa=C1pI4;wv17 z8@11Q9%q8{y3KhuO)9B*lk>AGmTOO!^Yk9rhn>*{8jpdNDV zlxZnNeVcPt#$`I@aY;iMRi#jzV~1W@(hc>)gJ%&d(!BrnLcf6 zkC19m%us*Z%4krJ$b5!xTifTazqh(`zdPUR%{w<2p51oO_ZOQG+?xBH`HedZ#|qp} z2YB~7{5bULwmOrs9G{46_P_O}?G6db<0hf9#QQ-Z)WuZw@K1} h25N`QFUv5DOW3)D`(%H@gWqmoxL+Rs0eY;${{cnas1X1F literal 0 HcmV?d00001 diff --git a/backend/app/db/__pycache__/session.cpython-313.pyc b/backend/app/db/__pycache__/session.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20b6f71a4605b7fcc9e96746bb91a8eaa97de71b GIT binary patch literal 554 zcmYL`&ubGw6vy9WCzIWElcrjVK@TA)C5Xj~hl&U()Tn2Iw@!-vnyExmX^c`kC?>le4yf?FMHeE3B{hxidKmfn0^hyb!*~qBs*qXon(5xa39rPWWT4D$P?usW{J4 zJ{8jBwh~1VXOYs|!9)a8U-4A<#l%>JFRJ<=&oU7dK9`Z|TiWIGA`kL3jSKBme45PF zMB{Osg)jRzw5#4GJTX@3xwK4Qx^*q==Q5Sph_YUt5MzBBN3wcG?L8m78XOMjk^lPS zSd+^cv_~(yJ%N%?k+3ljrXmX&pUqe}W}7MZXXn~} zn&#m=5zpkVxo7?m)W|GouAHbiM=1V^A&f>oA*D>zidBT)h)NS jAS)NzcgwAvvURI;wpIOIcQIpqNbzvWklWO^GqRD_Qu4ndiA;iw&sIqFl@$L{Ol9!&FUUChyXF9SZZp+?MCXCd3 zg_@3Sm3^s^7#)YfHWu?uR>Z-R_yQ$YFUfta{z@AKZv_o&W#< literal 0 HcmV?d00001 diff --git a/backend/services/__pycache__/crud.cpython-313.pyc b/backend/services/__pycache__/crud.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9889186398ecedaceea68c8f871ecc2fb9e91d4 GIT binary patch literal 1665 zcmbtU&2Jk;6rb5|d)FV3atSn9s({!_Kq3{PqCK@$5~B#&SR7(0a=epd%i2z7HlRox z91*Dvt>hjWiGQL04N;L=4VAD21#vTS;LLmD-F#RTmp*Ccy?JlmeEfcIW>hHT3CKrU z?#{0oA-~}u6C*W7As9!bMryP|IBKmzS2V8qXzLYy#oz|mMnhZBYUVV#V{j8kHLGDQ z7&TjYY~^tp4tR3PlS?!5YLwrif%_M3xf)Pu*O(Adw*#iJoUpdk!i^S94}?lj+h_@l zBT^^T^HH1uvIbWg%hfbmH8andzM7hIuc5t8-np~q81a47T*o$clKm%izVw399?i15*=LOZRmPr=n${i zUp!oVeDlGLXYS==_wrMB_9tU@1Ysi0BuZk|Iz2l0@F;lU(Ra`tk+svS)@hA?N;?`{ zALA2J*RpH-2+;prUB&H*bQoS(L7O9i2ITMpL;~O(6aW;4(rR_v?I@8pXPcaf?Lb$E zsfp51AmH(Q-{)9v(rt0pOqha)Pl2ZdO)Ns!BPV&{m7f=<{?;|m>fHpeO#9yL{oD5! z4n7|k*1hHZ<%0?uEBh<=lb?-C1Gm(xa1YnDajW$xd^LD4V9M)N%2_>CEm&+q>hu~E zV+MIOHxY(mR%t+(_CXqMz6&suD%Qw^TmYX`5%mel)&u&09F7DAHpfyMlVfd0al*LN zqEMQf5f_QHLKZXdm2qxL(<(zzP;k6r(TT>cKE%A&X%H{;eeYwyi>d7C4Dve4YwnGZMS+g%_~s7g>@kkm!O)pL`2 z)JZr}s*du6s71$b)A5PMvv`_Kyx)?fD-%q8eTR literal 0 HcmV?d00001 diff --git a/backend/services/crud.py b/backend/services/crud.py index f483ea2..b9545a4 100644 --- a/backend/services/crud.py +++ b/backend/services/crud.py @@ -1,32 +1,61 @@ -from sqlalchemy.orm import Session -from models import Item import random -def get_items(db: Session): +from sqlalchemy.orm import Session + +from app.db.models import Item + + +def get_items( + db: Session +): + return db.query(Item).all() -def create_item(db: Session, title: str): - item = Item(title=title) + +def create_item( + db: Session, + title: str +): + + item = Item( + title=title + ) db.add(item) + db.commit() + db.refresh(item) return item -def delete_item(db: Session, item_id: int): - item = db.query(Item).filter(Item.id == item_id).first() + +def delete_item( + db: Session, + item_id: int +): + + item = db.query(Item).filter( + Item.id == item_id + ).first() if item: + db.delete(item) + db.commit() return item -def spin_wheel(db: Session): + +def spin_wheel( + db: Session +): + items = db.query(Item).all() if not items: + return None return random.choice(items) \ No newline at end of file