From 91759a650db6232998c62a4fcfacf4a8371b3042 Mon Sep 17 00:00:00 2001 From: DynnG Date: Sat, 20 Sep 2025 15:35:49 +0800 Subject: [PATCH] feat: Implemented CRUD in Flask --- flask_library/.gitignore | 1 + flask_library/app.py | 27 ++++++++ flask_library/controller/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 264 bytes .../library_controller.cpython-313.pyc | Bin 0 -> 3568 bytes .../controller/library_controller.py | 50 +++++++++++++++ flask_library/instance/library.db | Bin 0 -> 12288 bytes flask_library/models/__init__.py | 5 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 290 bytes .../__pycache__/library.cpython-313.pyc | Bin 0 -> 1074 bytes flask_library/models/library.py | 15 +++++ flask_library/repositories/__init__.py | 1 + .../repositories/library_repository.py | 39 ++++++++++++ flask_library/requirements.txt | Bin 0 -> 584 bytes flask_library/service/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 224 bytes .../library_service.cpython-313.pyc | Bin 0 -> 3285 bytes flask_library/service/library_service.py | 58 ++++++++++++++++++ 18 files changed, 198 insertions(+) create mode 100644 flask_library/.gitignore create mode 100644 flask_library/app.py create mode 100644 flask_library/controller/__init__.py create mode 100644 flask_library/controller/__pycache__/__init__.cpython-313.pyc create mode 100644 flask_library/controller/__pycache__/library_controller.cpython-313.pyc create mode 100644 flask_library/controller/library_controller.py create mode 100644 flask_library/instance/library.db create mode 100644 flask_library/models/__init__.py create mode 100644 flask_library/models/__pycache__/__init__.cpython-313.pyc create mode 100644 flask_library/models/__pycache__/library.cpython-313.pyc create mode 100644 flask_library/models/library.py create mode 100644 flask_library/repositories/__init__.py create mode 100644 flask_library/repositories/library_repository.py create mode 100644 flask_library/requirements.txt create mode 100644 flask_library/service/__init__.py create mode 100644 flask_library/service/__pycache__/__init__.cpython-313.pyc create mode 100644 flask_library/service/__pycache__/library_service.cpython-313.pyc create mode 100644 flask_library/service/library_service.py diff --git a/flask_library/.gitignore b/flask_library/.gitignore new file mode 100644 index 0000000..b694934 --- /dev/null +++ b/flask_library/.gitignore @@ -0,0 +1 @@ +.venv \ No newline at end of file diff --git a/flask_library/app.py b/flask_library/app.py new file mode 100644 index 0000000..c8059ec --- /dev/null +++ b/flask_library/app.py @@ -0,0 +1,27 @@ +from flask import Flask +from flask_restful import Api +from models import db +from controller import LibraryListResource, LibraryResource + +app = Flask(__name__) +api = Api(app) + +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///library.db' +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + + +db.init_app(app) + +@app.before_request +def create_tables(): + db.create_all() + +api.add_resource(LibraryListResource, '/api/library') +api.add_resource(LibraryResource, '/api/library/') + +# Create all database tables at startup + + +# Run the app +if __name__ == "__main__": + app.run(debug=True) \ No newline at end of file diff --git a/flask_library/controller/__init__.py b/flask_library/controller/__init__.py new file mode 100644 index 0000000..de230b2 --- /dev/null +++ b/flask_library/controller/__init__.py @@ -0,0 +1 @@ +from .library_controller import LibraryListResource, LibraryResource diff --git a/flask_library/controller/__pycache__/__init__.cpython-313.pyc b/flask_library/controller/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48eced6915c80f6b67633e39031b7df0da17620e GIT binary patch literal 264 zcmey&%ge<81Wb8nGu(jmV-N=hn4pZ$B0$DehG2$ZMsEf$#v(>9rXnT zDNUwZ!akWvMTtd~KAFWOL8-<0rA5i9xA>ugFabYJ=37EJ5QXu{`FSNp`8heMMMca& zGm2P%#7c(GK$78>r?XW|XmM&$ag2LvQDRO?WnPSbUaCt`W?5>COMY@`ZfaghaZFlH zVsUmn)Vvskc`@jbCW!3D`HjmEpP_K?kt zduO&Zp+Y4O$Q2K5MMEQ=@`BXxQa=JuIPhQ|kR~?BW|S5rc))K_ok$Q~IA?y=PP$E7 z;7a@5Gxu-qJ?FdMncY2bAVZ*Bb^fq4A`v?N|8uYSe(pN0#WCOOc5QuSWIa)tLCVtpe!MH|BgfbeT ztj17IV>=1uH4aeFc$!)i3aLPe7ddaaUh?uC@CYd=n3xcgnDsayJn zNsU_NvR%4ho72>K#Vk!b<@zPl_S{mnX1EviTIBIk*|9z9)M_Rz#ZCHN)6nwefP*~* zxh7s5f({AZ?2ZDwPVTfF-D>OGXzSZ->t7N6{M5*%Jo=0A8)NTg-_HKD_2&3(d35!J zFQ4?KlmFU~M_nFf{j6hxZytvUh|V=~^m9Z)gIGKRvnp8vB#!MA*j!{AX!Dvd!e}Y< z`aEtREJf&fwB*SgGafUl~NtMN1E{T4oFw*9Di=<|et`xUMo)@>Q;jRGC7{Y`|OYf*lB+ z<<-m}Wz@YThX&#$({+tS^GfgY+SKfT8ukvThFwvk5voB=6|bd5&5HFFoPX!{u!jd7 zbGG^FvRU@bifU5oP}M1y>l6mvWCI~=3B-!&8CK2Rxd+n<8H(-=BqZ>6UB{02oGMe( z@Jx!%2-0U?Et|`p1)UgxKy+bu@DxbM#|5K&G2mQ}7I-RSH(xP4gQCj<#thj5lvgR- zIOtn;TrW7>jHK9uQE=Y@c%9s3GwC98N9o*BdN!1vP373i^k3yCuYYS(?!NKu)#=S+ z6Tf_JeR}is3)_dg{hsIj+|2s3e(r+bcH!?z_mcTc~4`X^^@ zobZ)CKil`uJM!UO!s7bb);DL~nAys9-OhIXG26X;Wa4+)`oZ76bXz&UUiOt2|CD|4 z-**KZ`oPV@#;y)b=E(cU0oHPvsSa+fdvL0qyVc5oeXCsnyh&yYVj$_dZCo;SJ;><# zC8tuap`F$Bm+M9??vZu9YEjp#S+;3Ax=xWsv>zaNQrBJ2@T{_KcpkMD>YnMsfGX684b8|{dI$jt>&5~dxfjFHNK47NQA|5==qUgY zQ~Ai2e0)Pb{vN+653cYZ%F1^85x;BLS4LKQd}Z9vj&IA#o3Fj`+K+#5-Sy?XFXh9) zJmkAZTFb+hKbM@cpC*srd15?{lFiL=pXg`qvBDYpxruP{|C4YE`-GEk2xkg}6NEYz zPJWUPg%j$1!YM@&r>Mg8Bm#z+egWZ&2wecNwow%u!Ze+#FM~KmvPSVbhk{0X(CS4v z22c?8u>$W%NDX=%EEiWnHH+npTdsQ_X9zT^IQWMEC}h&dgzV0Kg&JF#{!qzyUCDvYDY}vCDYhN-J=TQg4vM(7+z^QbDQ_Yic z=21>vkwZQCp5-m6n1|IXl3FoqCM4IUbQ5EeMPojhUs0aiQ=N!f=!OQf=oxql4n3l| zL($4lL7)4503??flI!7w*OX4}M{abjwy&mEm;A1;`O4RS1L}0v&z}7+li^W#|JD33 z`FVPnyq}pI<$g6dIl!&;F<`C@2!LU>nk`5a_e%#51`&o3!c_MRT6j`AjDXoK%31iW zK);*-YP*XQFuU4XKexR$KXcl=l6=NA%&N9pu#1!g!=C>*x|ix!-%+m#zv@o9 zt&WvWl6!q}zbAQ>luZenvbUs0KmY;|fB*y_009U<00Izz00bbg<@2lSsfs|qpMkjtGWN$L$H4zIr9tuMpiLx1CGxomZr^EIj009U<00Izz c00bZa0SG_<0ucDKKwdAc=#1`Z8J*>8G}p_C};o<7EId! literal 0 HcmV?d00001 diff --git a/flask_library/models/__pycache__/library.cpython-313.pyc b/flask_library/models/__pycache__/library.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..076081d8a7f663ef5fcb72b47303d1905c9b29cf GIT binary patch literal 1074 zcmbtSzfaph6n_4d1jiK#1JdCL(g`l43#of zElcmUcQKjs?!v_$bq~G(Tso1~v(dXErh2dfPW%`gVypZ*8O0szsjdhk>!~nn4pM zXEnT5-F5>b2@9KTnhsmI?$kn>OSV%;2>v*O`wTj8GB(*O@09!FcYA9)YyF9-UUR4U zGcAv(XCM!$16Bk_u$cUjF>4mN+}ALE6Pa$3$ziTAQ@@>Y4<>N&g4fw<=# z+Q-_%&eOi0>sGg_+oadtZ6A#8y*rGK^*1oeZ}ZG3E;19LCre*-Im)2O-m({)LuBUcC1Jzq|S>b{EH{7M{Qf}<6 YRQfZ)_PYALrC!lhr28tlmJ8SY1}=J1>Hq)$ literal 0 HcmV?d00001 diff --git a/flask_library/service/__init__.py b/flask_library/service/__init__.py new file mode 100644 index 0000000..f6bf3ff --- /dev/null +++ b/flask_library/service/__init__.py @@ -0,0 +1 @@ +from .library_service import LibraryService \ No newline at end of file diff --git a/flask_library/service/__pycache__/__init__.cpython-313.pyc b/flask_library/service/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..925c5a30fbf4d235a44f8c0ebbc198e7a511570a GIT binary patch literal 224 zcmey&%ge<81j+elGqi#9V-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9i2>VNJ$c zd_I{;MTtd~!Kp=MnaQbsnoPI&b09+T#SpO~W}woQ44;7{!!0*wtC&!rL~)FJYEfcN zN@ZS*e_pCfQD#|cj7xrUX>Mv>NpVbCPGWI(Jk*>Rs5vq5@tJvywYgA+n5RafSy@P zJ|J<5>=XE4;an09x%iTQk_coJtd^BTN-o@%EK+V!s(KzC54J(Es6%a4b#+g5eO1-l z>g>!Apih^7zWKgJ$e*Z$qy|FkGzjY?Px8`Laz$d&6`9FdGDOBmULGNNWk&WrnX;&w z+H+J)nWsN@7MRVJxm;c-`3^o;0;TmM2&Pz-ws(9i|;J`G{m6)CaU5)8! z(6yMZgPtn3P0RW82>C{h&dGpXkNLGner4TZ`E};oS=VBR*~zCAT>!RD=7IZ^3z8G+_?v@NCn*eef^152n+n6jxOS&OA%lutsce!KZsFH1 zepoEHl)1&vD6=c&#-tb&t$0BGQ19p%6WenWEyL$JTk$qxhw~VpJ`WWkimA91#)&_?&tWVa7 z48O$;U|hf9)XF02!9>*If{wnu;jWSdQb?Fsfz-z!{2!zWWF|Oof`}Lcv{*YF$Q4N3 zro>gpU8uR}m-S=Lh|m_6EvL+f_lsIAb-;$!Ah1NbAN6k;laKXDKjClpIt;(hhJnT7 zZ^MG{!yih7AFXub#&?k+R$MLHp1mjcX)uf2H$i~hM;9rO9NH6aRur9x5T?yCo z>IX_qn#XDuluL!u?r#q3EkT7Sf-HH>ZbUypVNYjCL7E_@HpfQ5gKM7SRVYu{4ew^1 znToKoaadv#z|53rel~;#jF_ig>bg$727{nn=BZM>T6H{AW}~>MF4XI{T%0o5pwv<& zMs1JsV+ovmb3b^xUjY*(w%v2=;n3R9#^hGd=yvbG!_#Z0H)gkb$G7_iAD&-3zj1l1 z@6?O5+MQWZUuH;K`~A#n=6=^|*8}gV{?3k`LH(IN{6rsqsvqAr`c`0K!r6OJM`Q)+ z_dqyW#{mj(hEMxWR;;iD#ZVwY$C|20EIS3RY!cZNFjHdq)Wxe_b?qg}`x1#n<4N?y zU64jU4R4Z`_+x-2DAMvT2uDjxO)kh7I#L;$Y7q)9cStJw$Ym(E21IjvdOj-q>*L`| z9-Rdq*I*pXN5y@8yr9lt)IeEs4HDQ6zw6^A|dmh6+@KA_>CvemJ4#IX22y*2XUFO=7U1?Ak-`XsaKZjF|+c1`1Z4Tdz z1>t@TY`^)tqW)&|L1X+ea^if^96@l-!~@Z=KzHReo% z>y}lstJJc1#b-@AT|5Nu}WkEshJTU&1n4_(=7r&fjdae zA>p15Y%Lii@jQqN%$X`rL1Jme_3J|oua>wo*FW;}e}R1hE>PCQ#s79qMUtf7$%%i| MS*ibT0!$qKA4a+-*Z=?k literal 0 HcmV?d00001 diff --git a/flask_library/service/library_service.py b/flask_library/service/library_service.py new file mode 100644 index 0000000..bb48cec --- /dev/null +++ b/flask_library/service/library_service.py @@ -0,0 +1,58 @@ +from models import Library, db + +class LibraryService: + @staticmethod + def get_all(): + return Library.query.all() + + @staticmethod + def find_all(): + return Library.query.all() + + @staticmethod + def find_by_id(isbn): + return Library.query.get(isbn) + + @staticmethod + def get_by_id(isbn): + return Library.query.get(isbn) + + @staticmethod + def create(data: dict): + book = Library( + isbn=data.get('isbn'), + title=data.get('title'), + author=data.get('author') + ) + db.session.add(book) + db.session.commit() + return book + + @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