From 651703c0f8a21ab1963039be116620bf9be35ba2 Mon Sep 17 00:00:00 2001 From: juyoungk09 Date: Wed, 9 Jul 2025 09:16:59 +0900 Subject: [PATCH] initial test --- __pycache__/app.cpython-313.pyc | Bin 0 -> 1023 bytes __pycache__/db.cpython-313.pyc | Bin 0 -> 236 bytes app.py | 20 +++++++ db.py | 3 ++ instance/dotori.db | Bin 0 -> 12288 bytes models/__pycache__/dotori.cpython-313.pyc | Bin 0 -> 2815 bytes models/dotori.py | 41 +++++++++++++++ requirements.txt | Bin 0 -> 446 bytes routes/__init__.py | 8 +++ routes/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 581 bytes routes/__pycache__/buy.cpython-313.pyc | Bin 0 -> 1327 bytes routes/__pycache__/cart.cpython-313.pyc | Bin 0 -> 565 bytes routes/__pycache__/dotori.cpython-313.pyc | Bin 0 -> 3359 bytes routes/__pycache__/order.cpython-313.pyc | Bin 0 -> 570 bytes routes/__pycache__/product.cpython-313.pyc | Bin 0 -> 2154 bytes routes/dotori.py | 40 ++++++++++++++ routes/product.py | 37 +++++++++++++ .../dotori_service.cpython-313.pyc | Bin 0 -> 3719 bytes services/dotori_service.py | 49 ++++++++++++++++++ 19 files changed, 198 insertions(+) create mode 100644 __pycache__/app.cpython-313.pyc create mode 100644 __pycache__/db.cpython-313.pyc create mode 100644 app.py create mode 100644 db.py create mode 100644 instance/dotori.db create mode 100644 models/__pycache__/dotori.cpython-313.pyc create mode 100644 models/dotori.py create mode 100644 requirements.txt create mode 100644 routes/__init__.py create mode 100644 routes/__pycache__/__init__.cpython-313.pyc create mode 100644 routes/__pycache__/buy.cpython-313.pyc create mode 100644 routes/__pycache__/cart.cpython-313.pyc create mode 100644 routes/__pycache__/dotori.cpython-313.pyc create mode 100644 routes/__pycache__/order.cpython-313.pyc create mode 100644 routes/__pycache__/product.cpython-313.pyc create mode 100644 routes/dotori.py create mode 100644 routes/product.py create mode 100644 services/__pycache__/dotori_service.cpython-313.pyc create mode 100644 services/dotori_service.py diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9f29bcf9c6f55e5ce03a6e7b6a5b3eeee0970fc GIT binary patch literal 1023 zcmey&%ge>Uz`($}B{$;gJcKx`&&CNJh9 zW-y!Co5hQ@h!xCc@n-X4D`Eq)S-si4IEpwF7-ATe7-Be086hSXaRsx*a0Q7$c*tZh zyE+2{Lof#pSx%5_3|o){vK|Oqi6MpyX1)SL31)Ffb$v zFfhb$1t}vL3S|cK1@l`nDlnvTrE@7V=rCwN#Zwp=7}A&&7~~lg7!(-%Ol+Cu8PXUv z1zv*WH5qTQy5%GmXKOOv;!8|PiO);SO)V}+OinG(k=1eKp#gRXAf83$aojW5JxA+VAuH2AWyej za!4{EL5|Me@xJ~po^GDbjv=1@e!+fKtokYW$zbbJ@{@0I#K-3*X6D7mhk)FclA2VS zt|@ejH4Ws*B4!2#hFfe!`K2YP#YHS24mVgLz9_Z0q@swGfq|h2l+bSRLWFZ6PA*~x zDdmU<`z}8I7IR`j!7aAr{JgZx^jjR6d6^~gAQ5(`@>|@A1qJcR`FSO&6(zU0l8aIk zOH$(#b8n&Ma3~*p^^Tfe(o_Ysm0kP`2{h~`6-!s z=`q2#fP<+V7-Qm%k-@trB!?uCBovV@S0=LRV2Gtw-CNQq{MFyP* z3{36ZP23&MR~Q6tatTgQo=|j|OR9nW1}jH#qO+ literal 0 HcmV?d00001 diff --git a/__pycache__/db.cpython-313.pyc b/__pycache__/db.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b88d78fa444c73986374f85206775c1dcf13bf5 GIT binary patch literal 236 zcmey&%ge>Uz`&qnmz!b3z`*br#DQTZDC4sn0|UcUhG2$ZMsEf$#v(=qh8RXA22-eX z5mP#oCi6=WPm}Q$S8$+@V@`5LYHp>UCi5+Uw4B7^?D*osoJ5FV5i7U}R))P*7lCU|?lnU|?oI07eD|1{MUD0mMh*Vr8;2 z=#_Qz^8a99;=9ejcboqpR#l^dqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zKz;}`CNr{&D=RZL^Ohtg<)oGtrxwMhP3@oh-O|6U#^(@RSO)SiD$e0=!I54s?2s1l6 z8X6n%7k)!lXJ%z+X=P}vXKrp}V2EadfsvJwiJqB}k%_4>7r6ibj)DIt|2r!BZq%sJ z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S@j*0WM}qM#z8z6C1NIr=hVC E05yGvb^rhX literal 0 HcmV?d00001 diff --git a/models/__pycache__/dotori.cpython-313.pyc b/models/__pycache__/dotori.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97ebce8a78ddee4f70cc32eed9753b629a956657 GIT binary patch literal 2815 zcmey&%ge>Uz`&riF*hTam4V?ghy%l{P{!vV1_p+y48aV+jNS}hj75wJAU2aXlNVDF z6PV5H&FsZo#H_#|!Jxzt%p%1Q%o@WS!~xZhM42)}I7O`KY?|yZK^#rSTU^0`K8`ub z8L7FInvAzNQW8s2OEPm)H5qR)r6eVT6u~eXl<|26BgjcH3`LB=3`I=Aj77}BOhqg) ztU)|b6-bm4Lkw#WACdr+8O$8aV#!p*fk&4RR4Edr#1PDC$_Nn%W)5ZxX18Q6;=*GF zHk&zuIW3urxbf(cfY^Xc#_$HoAoC$?uu1&XFbRkGT$ap50>Ru;3`K&$JW>orLcv18 zyiyEVj77r1Lcx4smPjza6ho0{ut1Smx}c`;Ew0ew)FPMslKi5~m!M>Hi@UTqwJ1IX zEE1y0c#FHBC^I*)s4_k~wen>O0|SGbCetmp(!9*V($rfVd8IiyiAg!BMNA9~44RC$ z*i%x|5=(PRG?|J(p?QlVKd-a^luVML5djVgP~rfkug~ki={1xAly1Q?NJJ<@5Xev@ z5fC$!A&3P;qvBA8Ads1;f(${NXaWoj45m<_P=+9Ieu8qL6h0lnjC!mp44O=Snyj~& zGE;7`g99ovROY=%@aU~a}CYGe8#3z>A;)3`c#MWdh5@cXtC<3L^B4H3q zgn@zK7H4L0ep-G}ZemH1C<6n-O2%6(#i==I#h}nqxaFQ~6$6T&;ux>cNdHhj_ZXMd z;_QoU3*Wpr;y$<5cFsefI{ z_@b2YWhqm1{zq;$0j>`WY@A%5LE(rJ)u3nw;m;-{M|Cix9up+MK?$xnwa7E&78}^3 zm6}XQ0V&SFzyJxbB1uq~a+l=C7o`>#V9ypR44RC7D_J0E2$U6WG3Vu%LsAb@5vVY_#g>>0N{YoGI~5clfx?-Y zmt2&Zo0?a0O9UxM;G(jiK-2-Jf*Tw>*Eu9FaY)VxyU3w@l|%B5l+t{iSvs@zI#_!6 zZ}1CW=U2GMuW*4w0Z#zUf(8)w;IZ1nz>sLoz!1uSGXTYD7l7%EnoNFfMarODs0#8o zNBi?FNs)bspJEJhBVKF7l{f<&nK3r#3%l zR?h6a4woMP8^Yq(g;g#Jt6bnwxxp_22{}+M2S+sn0|Pq)0|O}PKZk)sE|?K}^z$(U zGhr_o`51zkv6qf~48bhM>?#bJtbSGeHi+0)$V{=V;#7c^W42X%3gFz82`R~JZ!y|w zGNYGT;EV%uH#A*w#K#w<78J$D-x5X`tOpa+00ovVB(MY(7KkhtUnstSbA{vvlkGMe zZ8qo~;5$)r-9O=?f5HX7#0!Z@7x$o5h$M(sesZ8sMH2KtVjyP zRR9s{AVLd7=z+=~(fIh{lEjkC~?OZScY( zexTxb&B2{j6!JfXwVFQUYyCORV1_n^17K4KC l12ZEd<6Q>zy9}~-83ezus4%85P7s= amount: + self.dotori_count -= amount + self.updated_at = datetime.now() + return self.dotori_count + return False + def __repr__(self): + return f"" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..0cad80d2b673390881093ed048414fb7b550a54f GIT binary patch literal 446 zcmezWkC%aq!Hpq@A(5e&A)CRL!Ir_8L65-@j6rf~a5-IuB8F6kVulii3a~nm8jxB8 z29P?08M+L?41o+j42}#r49N@`45tqi zCWtNJ45SLps>Te1=knVz7B2*Mcy_J;@9?VE;nm#R6;s K$Ty(y24Mh=w?4`M literal 0 HcmV?d00001 diff --git a/routes/__init__.py b/routes/__init__.py new file mode 100644 index 0000000..b787db0 --- /dev/null +++ b/routes/__init__.py @@ -0,0 +1,8 @@ +from flask_restx import Api + +from .dotori import dotori_ns +from .product import product_ns + +def add_namespaces(api): + api.add_namespace(dotori_ns, path='/api/dotory') + api.add_namespace(product_ns, path='/api/buy') \ No newline at end of file diff --git a/routes/__pycache__/__init__.cpython-313.pyc b/routes/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf29d985f29e1e1bf332dc9bd421006ba693e8d7 GIT binary patch literal 581 zcmey&%ge>Uz`#(pDL3OD0|Ucj5C?{tpp4IY3=9lY8G;#t8NC_27>gJc7=oFCnZ233 zn2VUfY!+`8FV-Sf1%_Z&DTX4pbT&=)mmtlWjJKE_3o>6aGB7Y`GT!1$$uG$-%8bt| z)?~cJRZx_lQkq;6pI4j=k_V{=VO9nP24)5ZhR-2jTSFOwkYzzC7#J9$VQymxW(;Ps zWKv+jp^gQrfgzX~qAs05lf|!!TR*WNQy=V{N=?RFECq=r8C4u$!KBhkP3Bv?i76@Z zd5O8H#RZAUsYM`16|q5l!JJr-SqyTM!Y$8atC-N@)S}`Tuh2;UP(Sw=m(=3ylKg@g z=lqn+y!4phU^fLL10&NIuvMAyxrup+>8UYA`K2YP#WC^mnR%Hd@$q^EmACj%EG#bK zVPIeYSy-&Wz`)SJaD#>YI*aH<7SSo03vw@jSSARetOZpUSVS+e7<~r$)=!iD7I#`s zVsUnSQEG8XMG+`8Z?QpK0QSi(c4*jxy#%&uB|{M}0|P@5HvUz`&4Tn48hc%)sy%#DQTpDC2Vy0|UcUhG2$ZMsEf$#v(>9rXnUU<|1YV zkQkFUix+DVs{%s|qY^_fa|~NBOE9Y?a}j$CdypX11SBe$Etp-OF_^=WDVS4=!4xV} z#F@^e$^8<<(`3HI>6BBNT2PdkS8|KJD7COOwYcOKdscCNUS?XQCgUw$m;93aqRimb zqO#27)LYC+rIl4I`iTXZnvA!&N{e#h3yM}^=&fqN~{Ws@>5EaOFUET zZm|UT2Zv}f-eS*9Ey>7FDNbet*$TxVFEcYRFnkVRWMG)e5DgV(UX>$49Vk<39E%Hpc#hO}FlwVXO1mP-V z7At@vIC36BJ1H;P{1_p+ZB2b`%(nDr(aA|UKYH@K9$XmDAQa}ly(oK`2h=qZH z;TA`FYDqjOecWPBPc10|MMM!OCU0>kl~%?>l*E$6TkK%fnJKq;p)&CWMW7VNUJP-~EpD&^h%v<=8x_FdmP@i#OlWax zQE`k{XrzCrpL>i;YH@Z+enE_LeoAIudQ5Pzn}U&nk!cJ>Z+vcIUSfJ`Oi_MmNosLS zQfZ}LL1mFJ0|Nt?0GV8Tn1O+zf#C_a&~e($@77eg@@+@0}Ct9 zXHa7D)8x9vnwFDToLvM;$>3N7N82s&Vo0to)`Nx&ln;qdj`;Yz#N5>Q_*+a#1-Dqi z!37SXl?+9)pwN;5CkLC{{FKt1RJ$S-1_lOD1}wH?U|{&b%*e=ipF#H`gYI1h!-uSV x9iGM@kd literal 0 HcmV?d00001 diff --git a/routes/__pycache__/cart.cpython-313.pyc b/routes/__pycache__/cart.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1445e1cf85653d949cd8efe081f6071cd4f9cbfe GIT binary patch literal 565 zcmey&%ge>Uz`*cZJ2zt&0|Ucj5C?`?p^VQF3=9lY8G;#t8NC_27>gLan2MOZn2VSd z7-ATe7=oE%SWKB9YKvH7Sc7;WY-BQ+IhaMCF__hoDVR-)!4xW0#GcNs$?+1z(`3HI z>6BBNT2PdkS8|KJD7COOwYcOKdscCNUS?Y5EtcfOqLL~u{ltPyeGs$w7PGr+h$iDL z_T1ExjQo`1WRNK^%)-FHz|6qF@L2}z@@PhwL@;A8lL4bCl&`{|$?OL*p}06PJ++G4 zIkBijp(ww!B(+$Ru?Xb-l?y=p z%uS7tzr~bPaElde4cN#cZUzPhu;wCAG~D8_$<0qG%}KQ@5@ujv0QtMvf`NhI12ZEd z<9!C*iwwFCS@}B3CRAKzRcK&(z{uP#(J0ZOvp{qKdxOLUMvae5jEwr9nHiWg!7Q-J E0Je06e*gdg literal 0 HcmV?d00001 diff --git a/routes/__pycache__/dotori.cpython-313.pyc b/routes/__pycache__/dotori.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..620dd9dee83a4589ae72076a55121ffb83683901 GIT binary patch literal 3359 zcmey&%ge>Uz`!thOKyfGD+9x05C?|Ypp4Hoj0_A@8G;#t8NC_27>gLan2MOZn2VSd zKw?bZEMBZdtO^VkgY%y#>{80T!R4`i%bC3X%0F;ScG?-nF$&?AA zq=++yEl3o?Mka$fOc^132?iyGU`{E9V73@0Q)Y;mDTHDu;>Mwy3q?1#6hkl%7Tr8J zbfenME5#7ZhebCp4&D4Hb_+-`1Pfx(&6h5uDf|-T4^8GMj~ zON)|IZ?UCirskv+Yck&Ab;&QuFUkx~Eh@_dNu+?dm8BvK3=FUPTi&)Uc)e_m!mBL} zuNSOPa18L&WW2?ll3JWxlvz-cnV)xyE3`PZ2x5dL(=E2r;?yF~lp=Np28JqLeVfd@ z5-W(1T{6fyFboZ9hR;q6pkxxmP{bI_P{b6>Si~H|62uKthM;5EU>*-)scGW%stVPs&a;sb@9 zLSBA}LRx-lUWz7b5h(lI;!jU4i3f#RJUA{gZ*fBC_`KpyUl8M* zpOTrE9upkwreI`XWEumtDK{}MF+DY=D8IBMwHPX>S5SG2IX$)H7TDR4DA!9*E#YNg zU??_bU|?uqcp|2JUCj8BnDGX;%VO3Y-1qpU?(m5A`*-@!aK4~uc!kI42EWvGezlAI zYM1#nE^ugk1_jMZ20u;CTO9H6d5O8H@$t8~;^TAkQ%Z9{Y@Yb|!qUVXs0@F6d|GBv zaY;^QUTR)`e0&k8xVXiWn^;twk(d)-o>`J{iwhh8x%nxnIYpqne@iqzzPKc@Br`ca zv81FZGYRCS`1m3T1_p*AaS#DY>frPPCO~PZSe}7_p^f1IE8lfi>5Ht=GrTUds()l+ zVb%Q1%)qAc8N>qXy~Ti%tU)mV^3mreaB?FeS+fLzf)Atz2?sL;Gsm!FEAx~Xz-1+) z0VAx8gC*EtHl%F98O&b9mCm8bc}u`EFS8^wF(XMY z3rjPLQd5$lg(KKSpdfk7(*F@Si$;Gh+w3A6%9(`VA&uJFoi-WF@!R~ zyrjaQ$>axio+c|Krr8S;D|7M_Q@{}m$t+@-a1SEq8BOLQAqED9TP!JwC5gA#!D%8h z1(qR-z=6P0kY8MKOB4|lkPy-X35$UewGJdv^GjUkSGdTp(7|#;NNl>sM2#61mxWY1 z*zfSmT<15w#BaR8{W8DJ1r8fSYLK!kK!RgIO%G zrCwH))XP@HmCmloaf{P2B?S^GFG0a~i#e|}H>60Ffq?;gDNj@yWeQ~?kVcsarO^ms zSoVXYQ460rlB?VfJYqEgTBsfJEX@TMsq^}rMvnVJiC_oY=b3tjz zEnc|4^$JQ$_6FA-X8Y}S*xEN#?G$O%C;FbWg+d!428YnJ7)lvh)9Rb(2W`bn=H2H6Fr{yFTXM@@f zB^5=WU?~D6zant#ix)%MfW>;yRsfU__CL4)E&?YNOOREdM0tx9+&}cSTO2l!D&4Ngg@J(q6hFo17#J8nFf%eT-e)kr$Y6Yz!SErE=!A?5I!+gPoEtbF z@QU@vcgD|%xxpvWpVyfOr9QGU>o9$0VCG|P;QGMDz{K4y-zYyp{xYND7bZ4F%?T2p z8Q2&>)ijgR2av!A0hk)0%Zwslm{=KYCscf9U}Xdqh)kj%Kms55U}_-duriuX-~g!s orB;wRtc<1zHDZ?;CB85*Gm1{I_{_k}DEgV1fl2ZsNB|tv0JW5c4gdfE literal 0 HcmV?d00001 diff --git a/routes/__pycache__/order.cpython-313.pyc b/routes/__pycache__/order.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..763c95782199b517ca3d9c5c502a2a29037edb2a GIT binary patch literal 570 zcmey&%ge>Uz`*cFJ2zt=0|Ucj5C?`?p^VQF3=9lY8G;#t8NC_27>gLan2MOZn2VSd z7-ATe7=oE%SWKB9YKvH7Sc7;WY-BQ+IhaMCF__hoDVR-)!4xW0#GcNs$?+1z(`3HI z>6BBNT2PdkS8|KJD7COOwYcOKdscCNUS?Y5E!O;^l+>asZvDi9OnorB_!hIfYltS} zE%w~hl8pS6;$)CHFwDZhz`)GF!0=fH?Dl9zm_#sRFp~kJDU`3mpvmk9GNHIQF+H`4 z#~);iLQ#HcNouhsV-Y9>Rx*4B>AmIVY!wq)oLW>I;}sg|AL{2GBR)Pa zF*h|n{uWbG!7Wy>MPMU~xEUB2z?zFdadC^oCO1E&G$+-rNSJ|v0p#^!3kC*;56p~= zjQ1IIFEZ#pWaaB9pTTjNRk4BT0V8v}M59E9?gG^X;tdiP7&SjKF)|u_W@cd00<*v- F0|0AbhlT(E literal 0 HcmV?d00001 diff --git a/routes/__pycache__/product.cpython-313.pyc b/routes/__pycache__/product.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea07c031a706185cfd516d6086af2e0e23770698 GIT binary patch literal 2154 zcmey&%ge>Uz`)?LF*ievm4V?ghy%kMP{wB&Mh1qd48aV+jNS}hj75xIOhrsy%tg!! zATcIy7BAK!Rt1I_MkR(|=3tg!R!gQLwivb`eyDyVDwr*pJ%%|*07(eSRALC`2YYMys@idular!0ZrWO|@Ca2!w2udx^FD*(=y~UQ6nVOSQ ztjTzb*CoFszbG>}wWusJIrSEEQfXzWAOi!#o94#1lR6Y$ZC&$v`4R=k08dTETihwB z#mPmP1tppJdAGQnN-Kj>3rkarOK!217N-_@ri5rR-r^`qEiBC}N=>=N4OUQGke^qa zx{~=8XJ&D5X>xLEad8nSes8g*fGn=8641BF%qy`fD9TSMO)l|Fu}cOy9ERDTjL$O| zKoK6pP{bI_P{b6>Si~H|62uLaMWSNZU_lhaf;GCCf|+ADU_pjM4NEX9EGmN8q!?fU zi%u7D2D2A&rE_Rr1bIx0|Ub?cBqeEPGDqUxW(p{n3LoiDoOEfHlF$94k2}v!8sl*Ur0t=Ts)=*ZMO^NCZ3`jb8Kx$F35<@66 z+>LC(tf9=IY;fHy3=E-c!R&g>Dh!~^2%-tPn*-(!1%`A6O-?^>nko`yU|^^cf+R+T z%wh#tT6~$pz`zhv1Pan3UXU6!&%EN&w6x6R%+$OR1xQL%$S+bTC@o6PNGwiONCQWe zCi^WeXu^!oE55~EkXV_MpO|usIX$)H7HeWseo;vgD23kQPAaX8hpN2ApPpJ04{}62 z*x*b}_FF8)sX1x4IH4*$Q*N=OB$g!JVh5|rOu5Aim5DDX0_8&XVn|N8#SK;fF{T(4 zg9;FE%Olw;CbT%Us5r(eG}1rR&ppN^wK%&ZzaYjrKP59SJtjEVO~J^($TS9`IX*Wr zFEKqerYOI(B(*pOYMov|(i{Nj>Z{7$8n(DbVZ5)fiwU?`rzz`)SJ@P&gxKETq!Geve=54v*M%9+`_gGBbiND4AX1F@GQ--NAcDNdCHz z_9Y?h74DaXoIBX>aSPp%Qok-`eo4xF2m56yhYs%tvWhpP6z^%8%+UVG&LYD1fq{jW z?*kiywGD#%g@=Jx9AUiIRUYrppoF!O!B3O>7Ds%1USe))eEco0`1suXl+qj!ny{8i62gPX7O8`BwP<{NaYY+;tI^ ziy|ruVs5bTbfop?b>%HcxyYyeftksK=`#b9DDwpd!4Dh^VhYzqRWFLFF37zhC_Y_o zqTCHWk^a2SJSg>%oyCmlGXskl^92T>4?GM^Jl7coFER>V5K_6!sQQITgwcm_g2ZPA Q5dE2%fl2KnSO^?;0KH)Dl>h($ literal 0 HcmV?d00001 diff --git a/routes/dotori.py b/routes/dotori.py new file mode 100644 index 0000000..0a71287 --- /dev/null +++ b/routes/dotori.py @@ -0,0 +1,40 @@ +from flask_restx import Namespace, Resource, fields +from services.dotori_service import DotoriService + +dotori_ns = Namespace('dotory', description='도토리 관련 API') + +user_model = dotori_ns.model('UserDotori', { + 'userId': fields.Integer, + 'dotory': fields.Integer, +}) + +@dotori_ns.route('/') +class UserDotori(Resource): + @dotori_ns.marshal_with(user_model) + def get(self, userId): + user_dotori = DotoriService.get_user_dotori(userId) + if not user_dotori: + dotori_ns.abort(404, 'User not found') + return user_dotori.to_response() + +@dotori_ns.route('') +class InitializeDotori(Resource): + @dotori_ns.expect(dotori_ns.model('Initialize', {'userId': fields.String(required=True)})) + def post(self): + data = dotori_ns.payload + user_id = data.get('userId') + return DotoriService.initialize_user_dotori(user_id) + +@dotori_ns.route('/') +class AddDotori(Resource): + @dotori_ns.expect(dotori_ns.model('AddDotori', {'num': fields.Integer(required=True)})) + def put(self, userId): + data = dotori_ns.payload + num = data.get('num') + return DotoriService.add_dotori(userId, num) + +@dotori_ns.route('/all') +class GetAllDotori(Resource): + def get(self): + users = DotoriService.get_all_users_dotori() + return users \ No newline at end of file diff --git a/routes/product.py b/routes/product.py new file mode 100644 index 0000000..d8f4a43 --- /dev/null +++ b/routes/product.py @@ -0,0 +1,37 @@ +from flask_restx import Namespace, Resource, fields +from services.dotori_service import DotoriService + +product_ns = Namespace('buy', description='상품 구매 API') + +buy_request_model = product_ns.model('BuyRequest', { + 'userId': fields.Integer(required=True), +}) + +buy_response_model = product_ns.model('BuyResponse', { + 'isSuccess': fields.Boolean, + 'userId': fields.Integer, + 'dotory': fields.Integer, +}) + +@product_ns.route('/') +class BuyProduct(Resource): + @product_ns.expect(buy_request_model) + @product_ns.response(200, 'Success', buy_response_model) + @product_ns.response(400, 'Failed') + def post(self, productId): + data = product_ns.payload + user_id = data.get('userId') + if not user_id: + product_ns.abort(400, 'userId is required') + + product_price = 100 # 가격이 얼마에요? + success = DotoriService.buy_product(user_id, product_price) + if success: + user_dotori = DotoriService.get_user_dotori(user_id) + return { + 'isSuccess': True, + 'userId': user_id, + 'dotory': user_dotori if user_dotori else 0 + } + else: + product_ns.abort(400, 'Insufficient dotory or purchase failed') \ No newline at end of file diff --git a/services/__pycache__/dotori_service.cpython-313.pyc b/services/__pycache__/dotori_service.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0141660840574c988a74490fcefe1f97d358e1 GIT binary patch literal 3719 zcmey&%ge>Uz`&rjF*l=?oq^#ohy%kcP{wB)1_p+y48aV+jNS}hj75wJAU2aXlNWOl zGnmcn&EmyU#G=3;!Jxzt%p%1Q%xcO6(Otxv&Zf!!62#GDyu}q-oLc0PUy@&xsmXYY zJGr!|C^fGnKCz%clkpZ)N>VaN9SpNV8J~N=_Qx<3F$OafF$FUgF~_h3GsUo)Fa~hC~}-oId-rd2Z|h53`;Pl6a(CR?qIGWo^)Lpp;dliy0lB2ESd z22Iu?kgIO77M7+KRo>!E%giZBEs9U7yv3T9SyWtdizfvfOYzD1rFkVQnZTNEaf5vb zktqhbUqRtkV6s&VC{~MOyh0=WL;c)iTvCg(OY#e1obyvM^U`C2gWVL242(=;Ao}8S z6Y~<&Q)7xDL01eDhVu0aDsSq(OmJY{tOA(7^CSOyRni+C?$7 z>tY5M#SC_cUl236Am(^o%>AO6`(-iD4(@y0VmE~4t_y2l6xP1LqkV&4_%kSwP~wb@ zfq?-OI-i{wK?$GMah8(Azz_{jGocK@Ou@{SOnHpapojuFjv<&Ol!1>Sm^G9!2%KHP zf^dS5!I;Gqs$YR2ng=Ek#0O&`=paD^8^#J{BwDvHOb>#Fr9uTzy2Ii+6$VWM^NKz`|XJB9`6=Gmuc(bMB)s78sXHHRgGqdIO;vOA^uOQ*q-80_IouTl$ zzvXS)g4fH|SSe_7fsBV1WF0F*o#w(i!<}{ZZRjO zq}*al&d<%wEGZITU|@hI*&>knx5P5@GD|WOb26(^QPP?UYFfjt3gm|3T4IwNztkNm zl@;L!%r8oLcX;375xgLxwxE1L<^_Gn1KQV}qAof`U2u%PAQW?jC-x2xU%ywUSHEAU z-wf+3JnB&XbspJ^JhE4K0PCT>tI21&+lrJ%I? zYU`TU%a_2@Y>_wv1H&&C1zkIZ5bOyRl0qdwF~*sanp~8co0?YwPO(Ljpu{Wmi$Srcpr8OrvfN3fmGRKnz9os8PLZUu*3syvFqH*7rB)e zV^~T-P}yFLFp; z;gG(;FAPb)Y>By`ItF{fZK6-Y)j%tO87&#}n4;meD7I1;Yhq(UB*$n_DgmdiU?y-P zXAWh;mhAXIr8`!cP)1z_EQuUTGDS(`_+1SuGQh4v5J)9BR(Gf{XtF|*KDfY!7s(25 zwoQ4pp+QFhocN0rKna)|TN#a%%B4Ul8x5)Wxb z+>$^|{sDOaQF28=#X3Aq!VJK#Tu+kVb8T~X_ z5Yc*zIWZ^a7JEs4d`f0=i6+x6R!~c=_!bM80@XgS;z|V6PD{+m0avfZu!vJajW}#- z^gvN)1c^ccsp|p?7X=iq3#eQaP`NCi*1>vH+u$<4;VRPwCewK)@=W7fX?l_0@B)Y7 z&rAG<#h~`~Vo7_Jl?;BGytg>wJJJxF!~NB=F>w4B7^>>`l+Az2#iB~)+T;;?~)vt5xj0|NsiC@Mku{R1;2Bja5L YmAeeGcNqk~GwCuKePYmMGy>ZS07T!~3IG5A literal 0 HcmV?d00001 diff --git a/services/dotori_service.py b/services/dotori_service.py new file mode 100644 index 0000000..6660c88 --- /dev/null +++ b/services/dotori_service.py @@ -0,0 +1,49 @@ +from models.dotori import UserDotori +from flask import current_app +from db import db +class DotoriService: + @staticmethod + def get_user_dotori(user_id: str): + user_dotori = UserDotori.query.filter_by(user_id=user_id).first() + if user_dotori: + return user_dotori.dotori_count + return None + + @staticmethod + def initialize_user_dotori(user_id: str): + user_dotori = UserDotori.query.filter_by(user_id=user_id).first() + if not user_dotori: + user_dotori = UserDotori(user_id=user_id, dotori_count=1000000) + print(f"초기화 완료, {user_id}님의 도토리: {user_dotori.dotori_count}") + db.session.add(user_dotori) + db.session.commit() + return user_dotori.dotori_count + + @staticmethod + def buy_product(user_id: str, product_price: int): + user_dotori = UserDotori.query.filter_by(user_id=user_id).first() + if not user_dotori: + return False + + if user_dotori.dotori_count < product_price: + return False + print(f"구매 완료, {user_id}님의 도토리: {user_dotori.dotori_count} -> {user_dotori.dotori_count - product_price}") + user_dotori.decrement(product_price) + db.session.commit() + return True + + @staticmethod + def add_dotori(user_id: str, amount: int): + user_dotori = UserDotori.query.filter_by(user_id=user_id).first() + if not user_dotori: + user_dotori = UserDotori(user_id=user_id) + db.session.add(user_dotori) + print(f"도토리 추가, {user_id}님의 도토리: {user_dotori.dotori_count} -> {user_dotori.dotori_count + amount}") + user_dotori.increment(amount) + db.session.commit() + return user_dotori.dotori_count + + @staticmethod + def get_all_users_dotori(): + users = UserDotori.query.all() + return [user.to_dict() for user in users]