From 265a75f3b39b4bff0b6e68694f0293af5247974d Mon Sep 17 00:00:00 2001 From: Laysho Date: Sat, 20 Sep 2025 13:03:58 +0800 Subject: [PATCH] feat: implemented python flask activity --- .gitignore | 1 + app.py | 26 +++++++++ controller/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 250 bytes .../library_controller.cpython-313.pyc | Bin 0 -> 3536 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 -> 276 bytes models/__pycache__/library.cpython-313.pyc | Bin 0 -> 1060 bytes models/library.py | 15 +++++ repositories/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 221 bytes .../library_repository.cpython-313.pyc | Bin 0 -> 2338 bytes repositories/library_repository.py | 37 ++++++++++++ requirements.txt | Bin 0 -> 1278 bytes service/__init__.py | 1 + service/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 210 bytes .../library_service.cpython-313.pyc | Bin 0 -> 1702 bytes service/library_service.py | 29 ++++++++++ 20 files changed, 169 insertions(+) create mode 100644 .gitignore 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..1d17dae --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv diff --git a/app.py b/app.py new file mode 100644 index 0000000..344946a --- /dev/null +++ b/app.py @@ -0,0 +1,26 @@ +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 + +# Initialize DB +db.init_app(app) + +# Create tables once when the app starts +@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) diff --git a/controller/__init__.py b/controller/__init__.py new file mode 100644 index 0000000..5c80529 --- /dev/null +++ b/controller/__init__.py @@ -0,0 +1 @@ +from .library_controller import LibraryListResource, LibraryResource \ No newline at end of file diff --git a/controller/__pycache__/__init__.cpython-313.pyc b/controller/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bc7fa959224408489b33cc2588d8a9a89febb5c GIT binary patch literal 250 zcmey&%ge<81ae~MGF*W4V-N=hn4pZ$B0$DehG2$ZMsEf$#v(>9rXnT zDNUwZ!akWvMTtd~KAFWOL8-<0rA5i9xA>ugFabYJ=37EJ5QXu{`FSNp`8heMMMca& zGm2P%#7c(GK$78>wX;=BXmM&$aZGVyUP)?r z^h$f~nS0N@bMHCd`OfU-?%fFj?OOXMb4O)D{(}$ICRLQp-+^+G7{uVl$S6lS9d&+; z9~Gz&>cW^fDp4ua#j)6^Ol6%klQc1;7GlJvxd9>Ciz?x$45P}n(fDjUlh{C$3>PR_ zo4IA0vq6`s{e0PG9;glD#TjbR^M+0TPz)#e{7f#|Hj-TBVN(a?BAF(XGYI7kjtU0f zLa1m6ASFYju~{h-3$)6P<3;9G-?;%!Ai3&JxFLE0PrrEq#6>a%GHO}As%`aYGEjMN zxJgbU&+?4#C5+d|6Za9~rn6O_ZY`;;c$$B*iI81H2YUxj-OnEaEqW@D3_r24468B% z#XSOf*7i)RR0?FzHS@)smk|Py*`-1t&A9Ga7KmYoC)ag7IDP8j=}Bf&Hq9)@v!_RF zcGh#}r++m*WQ>{PXNI#w+2^KnuH#X+RI=%GDe|_tHPkbIJ`muoL8^}5dSF69Q+BsH^BRkz^Z(b08%S@40IvVE!0IrI>s3>^z#%RAZ%Hf+1b)$ zk{hUC!r>?RY<#B$sYTI{albY)73LM%$;28Y#1W?8EK$ogRJE->yJt(UYE>*jUMW*r zb#zjwp2djw@J6B^FxCng=?Fu@p-Nxi3gl6tl@z$lu8BY_vKc3kyrNgKgP2wJ=3E-c z=WNETS^L7FGsf^lmmbb`>6Vk%BMaT4wvPE%q;|geI^2KbV>rX@{gaOU!n~dH?7VJM z>Qdd!<;oO{uJC~rjs$Yv_N-!wZQO)qnFK}m1`0y<_sn%71jlmJwmh5e#<}?E7jpKz zSA%Gn`$0OUGF9|q#Q%esrg2*1n>(uWE-EM*gktz4Yr4 z$U8?sETs~|`-P>p?%^ikY6A!Q)g}q#6*7^L1I08Q>zr+xLBcf8x%qMl^`vP&U$#n> z8PzlkMasNV(Xk!ZG%3&!p+`UjdrgyhmRHP~mgmvpOxd#;7-V2>6MiK0CdH%<1rj5} zSiM5N=6UJFEhQ;sIoeyDuTRAtFnup7211S*5|w9Ta3Qr4vlY_Z+f2K?l}x~jeQ;;S$I_0N}>ucmz^9R}tO-_;6P8jk#v z=#>8)q#(+41s4K)N4v8UgLcfhT zl_=u0AA&%Uio-C|7Ss@!^dN`|x6xJ{2n%zpJP+g)(Hd>TVI(w)iA~#490HM%wxQxM zjv_QDW(&hzkj*M|Cd`+;yAc9|xFh=u2qZG)E+V_WouT>{M!wWiA&VXNQ~irMKlPB` z_|V;~b^YhF)`_7cd4CUxrDS5bL0Hw%^t@fNp}5wCn_K}|Wb^&_it6MR>qO8(H`I_tABCr2-ww|0iFWRW zIrb+I2rfAU*PR8gE}WVUTy9-#T8u5u`K^!p+AluOus7qZE$go;XWEA=Un9`#tx=`Tpqf+-UYIsxHg958tRI~6~f#TO{ zC@`TJeqv#D6Q%aAlX0kSxArNu8i%G6nMAO=P_o!rlfu7}Lb*hd%>yYMi@tK;%O(7S zQVA5)WxK>84nU+uue|dZfpRh`-;dE#U;^|^7~bH9z;WCcB>e^1AIiNqV|%zPcd7Fx S!Tx4v3&_{!ZV~LmTm28)t;E6r literal 0 HcmV?d00001 diff --git a/controller/library_controller.py b/controller/library_controller.py new file mode 100644 index 0000000..b62bb04 --- /dev/null +++ b/controller/library_controller.py @@ -0,0 +1,53 @@ +from flask_restful import Resource +from flask import request +from service import LibraryService +from models import db + + +class LibraryListResource(Resource): + def get(self): + books = LibraryService.get_all() + return [book.to_dict() for book in books], 200 + + def post(self): + try: + data = request.get_json() + # Validate required fields + if 'isbn' not in data or 'title' not in data or 'author' not in data: + return {"message": "ISBN, title, and author are required"}, 400 + + book = LibraryService.create(data) + return book.to_dict(), 201 + + except Exception as e: + db.session.rollback() + return {"error": "Unexpected error occurred", "details": str(e)}, 500 + + +class LibraryResource(Resource): + def get(self, isbn): + book = LibraryService.get_by_id(isbn) + if not book: + return {"message": "Book not found"}, 404 + return book.to_dict(), 200 + + def put(self, isbn): + try: + data = request.get_json() + book = LibraryService.update(isbn, data) + if not book: + return {"message": "Book not found"}, 404 + return book.to_dict(), 200 + except Exception as e: + db.session.rollback() + return {"error": "Unexpected error occurred", "details": str(e)}, 500 + + def delete(self, isbn): + try: + book = LibraryService.delete(isbn) + if not book: + return {"message": "Book not found"}, 404 + return {"message": f"Book with ISBN {isbn} deleted"}, 200 + except Exception as e: + db.session.rollback() + return {"error": "Unexpected error occurred", "details": str(e)}, 500 \ No newline at end of file diff --git a/instance/test.db b/instance/test.db new file mode 100644 index 0000000000000000000000000000000000000000..852aa051ae6bca77369307fca5d575817460b07d GIT binary patch literal 12288 zcmeI$F-yZh6bJCTHmD7h>mU^A@*D~cSV<^?qp?I3)2gv5ol0t>2GazS6Li$kZ{`Q^ zy9h4kBo!Q_Zc_L^xa8eElHC2am(vqBlmT5O>C~6hVKv4%+aY3%Y56GUV-`G5)Y>f6 zd|qg5^JTRv-dRaBnP`gFc@Llt0SG_<0uX=z1Rwwb2tWV=5coHNr**zuZ#4Mxn)Js} z5QXE^Palh0sp~oRz@dS?>pD~{QcJId**KcEb{FMc{V0D;@--h7+ZtI# zqWbz3gche36~`1O=9Q$zxTF?m zm*f}3xcN8+d&m2DIt4ifMaJajr=;c-$Hd2H=4F<|$LkeT-r}$U3YO-i+7lWj dSO`dbU}j`wyvv~ekd?nVrh(}hgG>=9FaTH9MhgG{ 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..28dd2c90bdf0d9671a62ac823ed6bdeee2a119c2 GIT binary patch literal 1060 zcmbtS&r2IY6n^_FiJM(htcn#1R(fbIo~odfg4GJ~7bT;I$d+L@u4c(*V`pa%ITUg# ztrX%9B&8>hdh1_O@D>INLVNLMNxgT*U9}Z2rSI_Vn{VEJ@69*UHBB9Oe17t^@=*f# zE*4jzB}sRRCkKE4NeeJ95orX5U=)x%3`nu0qI&hi&39ahbE0gjdF_lVLtbL?x>LTX z0l04PgR=)<0g(_88A(JzGEpt9X#80o=cB;+-n)3DjEhD*kczZPnPmQ1A$6^gMj5Wq z^WO?O>KO)-MLIDyvw4H17d?mAq;V!3Vrf5FnS8avEy`{Yug14=)oq-;;^Z7BGePA0 zw&T0yc2CcU&5h#+1j9mzR$frh1_hFpYZDcUj7g zXr)ew7?O{phOWO6icv<`#LSen8oDI3LOYHHy|%m7860j`cdI|sYEC}~ zwMXyrA~=TSyvZ^c2X@WHnCTevW|1#)1LHT5?I$}qj5jQpw72VjHxg+-Y1v$ zk(#OdQ7vF8M2Qz{67kMRPQX0@_c^cuj6-TuuZ(TVtDK0sA;x4-6buOH6CmF9B?#Sc zg~L1O^gnDaoo3C}zo;kK@#bvD=xr6Y3p-BR+w%_P{o0XxVmxiW z?3lS$X}h#T+Ks)&Vc-7Sqv*t(XwF@znx@AMMX%+&${;?3wj}J1C-{3RmU$Mt^PC8a f#TAA_9L^OVNJ$c zf9dd-<#bv#!xDicX<2Wn>TOYyx(u8J3JgG zAkzykH`*E@zo8R~9vI#C!Pq4QQc&)bWrZorDpND$CYd1xHBAayPW3aHwytN5H|S(l z5nXZ1%wZj&R?8JX!PoE~Dcu@;c1ejar9hZkP?%QIv0^SrU0+YzV(Ft&kyFM?+-Z2U^cm%wUb9vD zeC1x@zP<9*r}=yNZ%Qm|)up^t^Ji-Jf}K09jxZm(jj9cmMf%+N?u2UyC%*yeDf!(R z+j+A6zzi4$ND}zJF*=yf!Be%*i7wxs{L;5_;9~oJv2nBTzyj|2G&{n^QwA zs`z}MQ~~96QdIJn%qB^`oF$|U-Lw|hkTX)go(-RvUM8YO&lSOtJxu8+IGXKQ`;7C z+pagO?Hbxcw*9E>)Pfbuwja8Tdo{N~8%owp(s{l-ss!K)xK3whTd#3hy4@1ob^RGDhF3iZR>ONaXqnS|<^(FgD+d z%?B~fNCh#lPU3P$%t-Amb_slfC9qD$WQj-+>#AV+eP9c#SzSb647A35K=rV%frf?o iu|KW5>_bQa9ukf>>qJu&{p?avS*}#i zyxE!EefjfyVZW@kwbiz;%6`~ep0T~L%ue`wY_IJV$h~c>vC?KX1Tvo?sIBbZ<8lbyj_lD)7yJNTKTpSixeQ}EowE9jO~#mIT1LmR#}cI%y5 z!>P%#5b|iy+=P`=Dm)RL`wDUKqpJ^8olH{^Li6^Gk0u@eue)9NsC@d(};Ilz!L= zp;utBWsmU0(N+w%tAeAL0Qr7&Uu6`??&i@)t&79TGUANomUWe{qV%4|5 literal 0 HcmV?d00001 diff --git a/service/__init__.py b/service/__init__.py new file mode 100644 index 0000000..f6bf3ff --- /dev/null +++ b/service/__init__.py @@ -0,0 +1 @@ +from .library_service import LibraryService \ No newline at end of file diff --git a/service/__pycache__/__init__.cpython-313.pyc b/service/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c44e7c34f985671e4580a483da04ca84cfa2d49f GIT binary patch literal 210 zcmey&%ge<81ZPFgWoQHG#~=<2FhLog1%QmH48aV+jNS}hj75wJ4Czdo%r6;%!kUb? z_k~%s{0p89oC^hFccSRxzPKiQ<^z#JrN! z7?;%I?2`O~7&jlsVDESzPp2TqpvV}g&Y1Z4%)HE!_;|g7%3B;Zx%nxjIjMF<96*CW U))#{qAD9^#8SgP@7qJ030Izp8zyJUM 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..2b93addb225011f53afcd9a4943c79f53ed4a5d3 GIT binary patch literal 1702 zcmb_cOK%iM5bmDWju)G;4UUb2l#K;~iD4BUj+6)`f}lvjjt@I>l!#SYvpbC$G2V5m zXOVp46y@rJB_DIdKO=u2vg`w>OnyQ)E@x}%rr1YV>>g%fRuO2h~v9T({ z_50;N9zHi1`;&~pvI?dDDJokmU;$rb_c-tx>BgdQ&jho^X4o7H%vly#3wQ%9uvTr~ zc}c3z^~6%#f)F+ua=okKvm1vwnog7Hcx#0Rto8U^cD5m}LuvC)jA? zlcnvTZ4KEKwCy3=McWy&M}i7eS6zQZpDu_55+28G`I3@8LCQq1epr~%f0~=s@(^1ClX#x54qPe0ZsHO@#schbr>QUNVZ+^3MJ6IG; z-`;85Zv5Cp2jbLB@&by&uCH(C%BoE1LjA#i`PU2F##ht?iYM$ZulCII_dI{!o8NWk zVHD9eM=@ALG0U)y$`*T9hAV8Lh`zvJ1VaW{RL~K8!5B(CLe#QT zJ@W?A*$G{z&Y&o0&+mEjPw(z~*LK}&Cy6`gm=XUT6(n9JwSuEc6~Nsnc9ZtN`rPdB z`(@)A)a_$yj;-*c1burMh>y0@I8CH>!e08Y3%;45FpWnrg8~7%D{r@@!pG7#v=xPE zsI6AF`$*B7wW1PE8)TSDJ$0-MIZVY;pP_idUOQ}j`ryp;wzGNb;Oxxy^yYU5Q|GoX zZ~pYEVvSdSwO&`*_{Yz@i+kS1-=g9EmMP*rMC?8K`vV_*$H)5X^wu#UOf1iRmUs@O z1s@@BBBwlt>NMQfOMBj>r`EoAW7oZLvakQwKsu33WGZ2jUO$>dn0ph^-1oz`5WTwV zUd@QYDfC$OPia?(PPit8&{ZMUx=}A7eN>2_dtp+XctSjgL8VFDk)19bt29jG_L{^Y zir_R}1!qZ|CqeZqxCxOviZD$fZuL^Bgvg%GNzjY{jejPn!74)W3p=nUUK!lJ(l?ni zc}Uu!gBoGiOYC}qRZ2h94kru0o2B2)GPa&!eY~Zf6QH-3eOr&h;IAG_l~2Ee#gK{0 tzlV$?mF$SOc5mh7`V#1uN_|mNC=N}|`3v^R3pV?Yb&l8nW+<|-e*p)@R{{V4 literal 0 HcmV?d00001 diff --git a/service/library_service.py b/service/library_service.py new file mode 100644 index 0000000..e29cb2e --- /dev/null +++ b/service/library_service.py @@ -0,0 +1,29 @@ +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