From 178e8185a75e79a289cd4489505b574c1db8259f Mon Sep 17 00:00:00 2001 From: darylxslr Date: Sat, 20 Sep 2025 13:20:44 +0800 Subject: [PATCH] feat: implemented python-flask-api --- .gitignore | 1 + .vscode/settings.json | 3 + app.py | 25 +++++++++ controller/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 278 bytes .../library_controller.cpython-313.pyc | Bin 0 -> 3564 bytes controller/library_controller.py | 53 ++++++++++++++++++ instance/test.db | Bin 0 -> 12288 bytes models/__init__.py | 5 ++ models/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 304 bytes models/__pycache__/library.cpython-313.pyc | Bin 0 -> 1086 bytes models/library.py | 15 +++++ repositories/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 249 bytes .../library_repository.cpython-313.pyc | Bin 0 -> 2366 bytes repositories/library_repository.py | 37 ++++++++++++ requirements.txt | Bin 0 -> 774 bytes service/__init__.py | 1 + service/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 238 bytes .../library_service.cpython-313.pyc | Bin 0 -> 1728 bytes service/library_service.py | 28 +++++++++ 21 files changed, 170 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 app.py create mode 100644 controller/__init__.py create mode 100644 controller/__pycache__/__init__.cpython-313.pyc create mode 100644 controller/__pycache__/library_controller.cpython-313.pyc create mode 100644 controller/library_controller.py create mode 100644 instance/test.db create mode 100644 models/__init__.py create mode 100644 models/__pycache__/__init__.cpython-313.pyc create mode 100644 models/__pycache__/library.cpython-313.pyc create mode 100644 models/library.py create mode 100644 repositories/__init__.py create mode 100644 repositories/__pycache__/__init__.cpython-313.pyc create mode 100644 repositories/__pycache__/library_repository.cpython-313.pyc create mode 100644 repositories/library_repository.py create mode 100644 requirements.txt create mode 100644 service/__init__.py create mode 100644 service/__pycache__/__init__.cpython-313.pyc create mode 100644 service/__pycache__/library_service.cpython-313.pyc create mode 100644 service/library_service.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b694934 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7e68766 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python-envs.pythonProjects": [] +} \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..96377df --- /dev/null +++ b/app.py @@ -0,0 +1,25 @@ +from flask import Flask +from flask_restful import Api +from models import db +from controller import LibraryResource, LibraryListResource + +app = Flask(__name__) +api = Api(app) + +# DB Configuration +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + +db.init_app(app) + +@app.before_request +def create_tables(): + db.create_all() + +# Library routes +api.add_resource(LibraryListResource, '/api/library') +api.add_resource(LibraryResource, '/api/library/') + + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/controller/__init__.py b/controller/__init__.py new file mode 100644 index 0000000..de230b2 --- /dev/null +++ b/controller/__init__.py @@ -0,0 +1 @@ +from .library_controller import LibraryListResource, LibraryResource diff --git a/controller/__pycache__/__init__.cpython-313.pyc b/controller/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c42927d973cc2b54f6a70bacce1a9b1c49cfac3e GIT binary patch literal 278 zcmey&%ge<81QSipWw-(9#~=<2FhLogMSzT{48aV+jNS}hj75xIOhrrz4Czdo%r6;% zQkqP+gncrTiV}+|eKLznf>Mj~ON)|IZ}CF~VFG@d%(sMcAPVD?^YcoI@^f-hi;9?m zW)!giiIohWfh5DNaA&KS(Bjmh;+TlUVxWo`|GZR}qRg_?7?;%I?2`O~n1CREcOOT; zn1IL-4}ZUyg36MN{5;*XoW$a6-Nb^-7=-CD@$s2?nI-Y@dIgoYIBatBQ%ZAE?TR>o b_JG`8%nc+yFf%eT-e+*Rz~EBE4&(y>G1yP< literal 0 HcmV?d00001 diff --git a/controller/__pycache__/library_controller.cpython-313.pyc b/controller/__pycache__/library_controller.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5f352e067a70c19867aee2afbdcadb6d53d7729 GIT binary patch literal 3564 zcmbtXO>7&-6`uVgmo%-Fv$82GwY8#bS*-PA!BVWGP8!KF>c}qTaHBMZ2y9m5Qrenc zGBe9Gc7h_!p-_-R5+rVno_r|~_Yxi3o+`Ho^-`>*7E%^Y5TH3!HzTrv)V=h*U6PVz z#`zn7Z{E(lnSDF&d*2&w?%o|I(Cp!V%pZ*s@^5^oH>svdz?nUKbGzz2gw$a#JEFIrKlQiec zS&NmcG;e_(rPfPTi@Bh-oU>=CNiXRZec28s`NC{I+%}Y4?O{^`+jrvLm>J3PPieS0(!rB8N?Mb12Sw`zOHTcDKb)f zaJXqsCC~GWA0&)d$(ct8DW|gaGu>L!SaF{JX&WKChz9l!csSZ~;0GH5@jAKHdT_0^XQj1gwY7Ia`uOOvRb}W8BiDvM zNW7c)ZOiqMo66AQaZh>7lOOxZ!N3g1pAb{eU z9syklbrW?_myU6I1YslRWkaO~kS|6Pj>b~f)0bY*}1O7T8TODCcI8^J4T#-B} zbdn;M-j(r1o6S1DmY>%1=oBYw1Cxu#uW8+Tw?I!^I; zeHr2W3s!bQbVu^kGF^-A#<|$(SMpZHwP6wi;71vF2T#6?c$_u!7kq)aG%Zp*J6|lA zu1Q-_<*WcbkN_IRGxWtunYn&@Gmzp8MuEK#;&pPH-xbSpx73a`wR=VFUR4h-Onj#7 zz53j$(sk`;ixaDdNB?+cd1CeC`StcLulpGEA5+v$Ndv6Z%@8Cxt8d>ndtmyqHF!Y=->3^J%4@v zrh0BU@2SuJEAj0AZcAu-kEOt|H~PksAKXOt-2NigEY)-!jA-}NinGdfuzYWR=*)%@Vs>5uAGpv938CBH>c?yn0^>d16fCO ziALul@Igu~W(}f#6jtZAQ!r8;{x(a&zF$Yw_or?Ol41jvSAL@eEl0s+fvbR8Zq zhNDrW>feoI`U5mQ0RqTWIk2W2Sy7IBD6T5~3*x7Wy54rc>m2mdV~gFMI^rcp))n>b z*WP^XtzTVbo|5w9R1lc^&aP49QsDBpqEr6s=<$U|Mru)VglXX`&slgVaR%qyggC|T zMV!($;uIUi83E!1qOK9AI3@(Wl*5SAVF&_6Dh|R-J5WPl(t{vs+(tWbASl|A zY6ZwCq&3=w!$@cp6PtFUI0PasZ9~Oj97SkQ%oc{bAe+_bOsG`d2N42;xFh>D2qZH3 z0V2D#ouP&oCO%b@0gD~?lEaI6FZsCF`uKyab?dvc)`_tM`STtSONsb+i?Fn>e>^7K z5IE3p#3Yc-(fA+uf^UMxZHrbKv2&>F=UgA%kXGTe@q#f09` zwiV;(4Dw*mwiRO;FcoWHs(CSv@5Iz)CE$}^+U~rDby&MBYXz%hL2+#gw`dJyq0Lw0 zE3A`StP?^DkD-Aq`XoI0`*v{dK)7>1%&}KNAh@Cdxb81_P2tpb;9BQm+hSyK-s}9a zr#}4`V5iew;`Eo_4OW<7Z=?pv?_-1Hqxjg6@TdNQJG~ts-8G}p_D4+mM CDp1k@ literal 0 HcmV?d00001 diff --git a/models/__pycache__/library.cpython-313.pyc b/models/__pycache__/library.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ab01e1675409a4972dd5f063e23883cc4132315 GIT binary patch literal 1086 zcmbtS&rcIU6n^`wE!$mcPzd4$iI*nQlbAq^i2>097Se&lk~Ndvvd~Sp+d8u~>A|EY zqrH?LA@#@+ZvG`E+?q*DNc6%DQ@K0S7Er>)_zvH``R48S-h4A1)6{{7^YCk-Apv|B zi;K|uNoR&9`+xvRi?AROX&gpj0+2igNU@}>dhx^6cS`ByMA=f4+9_9tq{QS6Cx2A~ zaM|DoXZOJZA|W6$l8Az2qFP$k__Ms1PXOl!Z{m?MB^vQSD$=H968mR`$fZIQ#kj)2 ze=F!{U<^nc>BQKICk+-|@*HB5+Np4eMg9KDCC=i@wpuw96B7C7v~8f5wRdT>_0&Vi`C;nI+lQXW83&KxOB^{5jtE%ZX)Wf8j? z7RrQ(A^A8eb^T2$Mj2<>*%@n%x`bMZK7F27iMma$fH zt1p)`R;9+Jg2_$aro~CS;#sBghU-(SZ$zq6W6`jTH@tkv5`C{yeL_4{dY?lbPVS7h z(mUz)@ZHw>&U$-ftX148{*0;#{S4Fry~B&(2r@~N#V`)+l8Z6ZG3L#xzQ_%X-&SqE zzmvdt(<3zWy}%91d^?Uq;dghNbZ;s$TlTA^fJIP9ykLun7f2EUZV9-}fem9!Lp${H z*baG>Qw?2;F&PmB!vcl`h*#eQp-Wdee1P`Qz53!w+-y!arnj@L+-~kO*?aRvJ&sS+ z=i0_#Gu=pUJ1uY5JCOHEhwicQsQ$cdCYrfMZkx1fyS0O%z4wRJWAkx+{#?~Gz1L9m z$|O|=y+dfPgxS3b{+^1(p7gwVN`%4Ua_K0CGewf5Z;<$<8j}9eX%;>e&Vi?0`QHkw B=-vPT literal 0 HcmV?d00001 diff --git a/models/library.py b/models/library.py new file mode 100644 index 0000000..272d1de --- /dev/null +++ b/models/library.py @@ -0,0 +1,15 @@ +from .import db + +class Library(db.Model): + _tablename_ = 'library' + + isbn = db.Column(db.String(13), primary_key=True) + title = db.Column(db.String(80), nullable=False) + author = db.Column(db.String(80), nullable=False,) + + def to_dict(self): + return{ + "isbn": self.isbn, + "title": self.title, + "author": self.author + } \ No newline at end of file diff --git a/repositories/__init__.py b/repositories/__init__.py new file mode 100644 index 0000000..107ba1e --- /dev/null +++ b/repositories/__init__.py @@ -0,0 +1 @@ +from .library_repository import LibraryRepository diff --git a/repositories/__pycache__/__init__.cpython-313.pyc b/repositories/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..087df2cfe20f5db58b5df7e6f49a099b6571ba49 GIT binary patch literal 249 zcmey&%ge<81n*7HWf%kL#~=<2FhLog1%QmH48aV+jNS}hj75wJ4Czdo%r6;%!kUb? z1bs4-iV}+|gHj9fi!)2|iz@vznQjT?Kt$t<;KD`BKn*JyJ_AXHTanIIF`>n&Ma3}@ ziN!goMKS()sV+sCWvMYPsm0kP`2{fnLH_POj(#x#ks%)belZ1=B^mj7x@kFy#o4-v z1(`8$gELc$W8&j8^D;}~d6JjDCJPdi7Gx%;$yG8%@^Xsgm8=|OGG$fGXm8NT z$Rd8h{Okf)LN|zr4U+wba;A^Hn zC+A}+^1a%bmwI|RlN3W?Q8`+#amTB%<{K>MM16P~47Trp+9AuJ1IdNw zjC}m&v~Dl3qdI2D3u!TnYmP@cbT(6 z&AXJZd$qdxFt_y8{Vx~Ihu?m4Z)wr2H@&r5_121O^YvSH-7#5o42N>l4f<_$g3a6Y zrqEZMYT1HaMe5YqZ%1PYHNOJtDf!bF-F~w5)GK|84ZuiA0u>3K$ZydX zVEmsJ6-YK*Z-%f0EE2YfAsvOXO1+FEREHO<9P`p_5aUU|-eS{o%HrC;oW>v3A)AkZ z>N(Hzkv-$aEB(efCwdCAE_R~ye^Dk5Tl7donKUVos3R&vSVWvt&YfBns8cSBSgBU2 zIDU7Ewc2`jcT{d~P%(PCFBtEKrT8o;=!l-&PHrW)2e$^FdHedcqrgAV$6xE?`})M8 zF}&I5cSxvZ+p|mEw2#3OKJxFuxLBX6azVzY1*Hrquabh4JEu3p-AZha8BSQM%yNo^YC5PVAF5+u8w>^&`ejXY=nhZ(F#zAE?HjMTMs8XPWvQC>q+pygR<@lfq;dVHug`OAc>ykK{Vo9uE|x z=uH7^&!3GCT90&LD@EAGd$2u*P{hjAr5+8SlmjRcMUIyxgpJ{SI}5X5?j)wqgE|kh z6PI&$W?%pCMC8PEWk~47Oux`At7=!MWr?I^Rchsii*~|)I#pV& z;V=i9I;9GQe@vMfuoN3XH31490;lA$8T9=_U9qen-9lgdhTh7OHr-Z8>~agORtzkR&30n5VNB6R!WdYsq(38}jqJ{~34FpKuv(-3 z60tDWmca_@z!DZSs)#`wsLKOD)u^tXf`$Hh(5*Y{Q%C_G5{@^krAU(WJDL1josvf0 J5m5f({{Z-Ft@Z!_ literal 0 HcmV?d00001 diff --git a/repositories/library_repository.py b/repositories/library_repository.py new file mode 100644 index 0000000..79cb38e --- /dev/null +++ b/repositories/library_repository.py @@ -0,0 +1,37 @@ +from models import Library, db + +class LibraryRepository: + @staticmethod + def find_all(): + return Library.query.all() + + @staticmethod + def find_by_id(isbn): + return Library.query.get(isbn) + + @staticmethod + def save(book): + db.session.add(book) + db.session.commit() + return book + + @staticmethod + def update(isbn, data: dict): + book = Library.query.get(isbn) + if not book: + return None + for key, value in data.items(): + if hasattr(book, key): + setattr(book, key, value) + + db.session.commit() + return book + + @staticmethod + def delete(isbn): + book = Library.query.get(isbn) + if not book: + return None + db.session.delete(book) + db.session.commit() + return book diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..1805b1eb0fa2b3251bb38a5de2ef395f695a8ffb GIT binary patch literal 774 zcmZ`%O;5s55S+7#KLt|?A|5<=(1VeKV&c&}Dz*sHrXLFYcy(r1Y9letqhV)uc6R!{ zJ_A;m;|((`kl=z(A16E`{+{9(M+jIGtB_;NYDCOg5g9stW6h|uAahBzveh{^j#LuE z6XNO~vp(oxInkVbflh)kq&(yqnff*HKo8!nPPvT#U_DIeAvK+vJ~T-h;zkGDdt70P z2fU!6y11I@+K22Z?r@7sG81H$*w%XXUOWZOp7U9gH%HwvVk!^K!GhHa&z5RRPRYF+ zRy1EM9iM(sLy6Pd8SWUu;E?fMp05^Yd$!@vza3vslg=cc4fPR=az6&>gJ zFg<1V`(+Dk={Y01Mvu;O{?mri5@mTPNXb%o}zzo&Gj4~E#)P4d^fxuN^JktT=yINuWlRw literal 0 HcmV?d00001 diff --git a/service/__init__.py b/service/__init__.py new file mode 100644 index 0000000..dd29aff --- /dev/null +++ b/service/__init__.py @@ -0,0 +1 @@ +from .library_service import LibraryService diff --git a/service/__pycache__/__init__.cpython-313.pyc b/service/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e168973e4104f9146d882a0f8c9f886e7b22039 GIT binary patch literal 238 zcmey&%ge<81Q!j@W#|Iw#~=<2FhLog1%QmH48aV+jNS}hj75wJ4Czdo%r6;%!kUb? z_k~%s{0p89oC^hFc-dRxzPKiQ<@u#NwRP zq8R_YRF|U6veX!t)Z*-t{DPQ(Ab)osN57bW$Pf>IznFr`l8pR3-L#y<;%wc-g3K7G xsWI{KnR%Hd@$q^EmA5!-a`RJ4b5iY!IDnRboK_5Cd|+l|WW2|qUBm|D002MCLD~QS literal 0 HcmV?d00001 diff --git a/service/__pycache__/library_service.cpython-313.pyc b/service/__pycache__/library_service.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9caddd71429574146be7bd9d9c5eca3e036460f GIT binary patch literal 1728 zcmb_c%}?A$6rb_enhnH|1lXcV-J(RPLs%sQDz%C#RYhu*q)UWDl?tmP?|L8>W_LT| zMcP|WRj(Y7IQAI+nHIqzXr!FlOKzlFsn@<|d(8%rqDq~^oA-Y6-pucP*!{7wGJ&=5 z>2EK7*9iFojlnWn6MJ|>T-pjFhh$J!%Z=v7i7v&7S9h-WOp4Y-7{X}Z=M zR9&hjo_koe29v%(N(ZoiHzl>6Qy^q@K({~$ zRANBsCOM#WR}&bj?2V`uvLKERNFTk``d6R(Ymy7;KM!Qgg}>6`%Ocw0{xX+aNxS1e zU0wP5$(MEi>G#jRS*iP-Uh<;dn%{^6xiuejA|Ha0uODZ{Ww~AJ^i*k+C-|6}dN;RP zj+?+hPJsA{{OMF*Iqs3;9y@b~_M8|6v`Ik>7Sd0%uYs~h-k1FvS<0ht5-|cHg9?<> z3N(5w3J<6>MBmcxiw4H=vjiUSr^DhnMstyTvoZjS5rn9B!My-?e><$H>-Iitft^W!qw!tGGs6oOD=-I8cdyB zpWe52AD-N(>`(80douaK{wKRXye%2yUAh_;cQ8r_(V4E|h%8YHd!)}cFC}Tf%gE&8N z7~6=1Oya1;TWvg+NsvU%Z4M(8imPyyxPjtB6j;BU8)KOx3z9@cjc&pvW9icw37imt z!=DOluna-`Ois*+w;DC?_H|-iJ4Nl(0u8Z+0$a#2tMCKubUgQ4Ec_OW*jkG9;g(uP z0N<{=rWzH4|9!+|Hv1M7gU2%a8d8o}vNPVwewdZ(3xPjd?2DWPajH{FUz0np$;>}S Mh1UKeAkwgZ0Y7eGOaK4? literal 0 HcmV?d00001 diff --git a/service/library_service.py b/service/library_service.py new file mode 100644 index 0000000..f6bc385 --- /dev/null +++ b/service/library_service.py @@ -0,0 +1,28 @@ +from repositories import LibraryRepository +from models import Library + +class LibraryService: + @staticmethod + def get_all(): + return LibraryRepository.find_all() + + @staticmethod + def get_by_id(isbn): + return LibraryRepository.find_by_id(isbn) + + @staticmethod + def create(data): + book = Library( + isbn = data['isbn'], + title = data['title'], + author = data['author'] + ) + return LibraryRepository.save(book) + + @staticmethod + def update(isbn, data): + return LibraryRepository.update(isbn, data) + + @staticmethod + def delete(isbn): + return LibraryRepository.delete(isbn) \ No newline at end of file