From 65bc14832b3c36af31991dbb9c788d10cb1c1d4c Mon Sep 17 00:00:00 2001 From: Beryl Paece Date: Sat, 20 Sep 2025 13:41:23 +0800 Subject: [PATCH] feat: implemented python flask activity --- FLASK_LIBRARY/app.py | 24 +++++++++ FLASK_LIBRARY/controller/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 242 bytes .../library_controller.cpython-313.pyc | Bin 0 -> 3530 bytes .../controller/library_controller.py | 49 ++++++++++++++++++ FLASK_LIBRARY/instance/test.db | Bin 0 -> 12288 bytes FLASK_LIBRARY/models/__init__.py | 5 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 268 bytes .../__pycache__/library.cpython-313.pyc | Bin 0 -> 1052 bytes FLASK_LIBRARY/models/library.py | 14 +++++ FLASK_LIBRARY/repositories/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 213 bytes .../library_repository.cpython-313.pyc | Bin 0 -> 2334 bytes .../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 -> 202 bytes .../library_service.cpython-313.pyc | Bin 0 -> 1698 bytes FLASK_LIBRARY/service/library_service.py | 28 ++++++++++ 19 files changed, 162 insertions(+) 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/test.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/__pycache__/__init__.cpython-313.pyc create mode 100644 FLASK_LIBRARY/repositories/__pycache__/library_repository.cpython-313.pyc 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/app.py b/FLASK_LIBRARY/app.py new file mode 100644 index 0000000..8870b74 --- /dev/null +++ b/FLASK_LIBRARY/app.py @@ -0,0 +1,24 @@ +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/FLASK_LIBRARY/controller/__init__.py b/FLASK_LIBRARY/controller/__init__.py new file mode 100644 index 0000000..5c80529 --- /dev/null +++ b/FLASK_LIBRARY/controller/__init__.py @@ -0,0 +1 @@ +from .library_controller import LibraryListResource, LibraryResource \ No newline at end of file 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..199c7285ac1bb424c388b7e1e1d7b1aad24cebdf GIT binary patch literal 242 zcmey&%ge<81kX*+X1D<9#~=<2FhLogMSzT{48aV+jNS}hj75xIOhrrz4Czdo%r6;% zQkqP+gncrTiV}+|eKLznf>Mj~ON)|IZ}CF~VFG@d%(sMcAPVD?^YcoI@^f-hi;9?m zW)!giiIohWfh5B%V`r}Nll_qv8yQ9EME46-$a3ZzoOV63vT{~t8 zf4$P4d*bxqEklK>KIr&-0p0$lvjy-lUqc`8+6>h)GOtoQ!dl(^2Qg z`7wbCp)QPzV-l4@T^x^%$yC-!J4q8$>L6xphRX=iUQ`K3Wf)bqjmGEVMq&d^3@%V| z4y#mY-T_^v&Wlxtd7!pTlxC?-&zlbYRVke03$yuX+emV?hfN)nOJs&n&LosKIVzZZ z2ce=VfRs#;#^xj=7HG8{CrZq#zjGr7YxDJ;a6|M0o__NJh)ZM|WYlteUEAu@BvX5E zxhYN~&+&{OB#hU{Q}+>4N$2W5-CELE@eKddHbQn09qe5=^)TN9TJ%&T20yv6466)* z;vRuK=XjP~E(fw#u?nTUX9$7FoN_UcW-FDmED*yEPp<2FaN^`6GgHi=Y$jVcS8`{b zoXDEv*2J07TsHU1nS90dXr)|s=uA2Cvb8lduy8&Q;B7&wiN6M50&qjv5Qx{vjn;!} zt-UL)y{oN#7p1>Fcw|)_`Z#lC_=DuT$=|kI&0JT97LWSsL%#CRe^%5XCc>)U?H>`F zdwc}qaEToJ9zHk0>yN^!LXrSNYdVC~6e8V5T{NX5oEby^PU8W>mczjBXlXLVWolS( z`6)gZ-(dic^>~{y?$<@8!+b(Jnb;$QxWY7?C2F~ry0+El_H5~Ot-dGZlQON+um|gYeD>RVLIgHtJ z&V?SF?bpNEe%*EpdSs#7)X_2TO4KQo-humX{0Yu*XaAJzyu9G#J*S{Mlvb!-$>*yS zjIQ#56pjRP!SU=;nQh#HWk!Ocdjkcb`U0!C5prXB>e!w`cjH|A^vii?!7ITe1|X0b zoDQA>1@Sm*=g$TL^Qa+G^j#npY|o~xsB%t-9ssva(T9P!P+?xs-VCHTvkPq4`ygH; zH~Dxx$KB96*0k;wt$S5Fbn(=>y7%(WR@JU6KVLkxdT8X+r?fkeJfhuM{TRx04&o|9~^)8_+oosaIJ*{{aTv@@+z4$X+Kg&h#S&#+ zx#T)-#j+^S51|i$2=-bQ^K7q_w`|X&rP-?IFfcG+ZWDea^d?nMLxEvo7^^qPS3EBr zyR9Uo97hN1^UW!^7pCt;!9c_@Q=;-*3@)VBV%8wx6s*o~r&pvg{B4%QeZP%_?@rr3 zSc9zqS1~!0hvXM9Ss|hCLC25m^&0xn|7n<0bxknP;m%H5gHWph2bv9 zXEj0-7OLLY5dwqwdiEO-NM*{`sO-jejvBsr>PsyZ^4L*7HN2SjQxE&C5C30z>sU5P zKHmdkDVZ2;5tjBH9*qmv1P=6TaS3E|H2w>2@LkaO-Le@nTb$xr;FI&HP%rO*DG^>0 zwnjO|poA@l^tPkrFr|02ZRJ>=MkWl~wsNchrs54uH801BotV0yhK%x3$(z^Dn4^>W z1w}77We3V@Q@F`BkVQ7%jIXFtZm~`TEp$TzS@Z-v1^afe?m)CN)&cek2n3fLg6r;* z*Az}|2d;E3wk^gM=l#ydeeH?g13R7elc#@RIYflNo*pD0#s|qKiR_T@+2L%zu++BN6N_mTh*{qVRvDSS?dz^FRv6qVF8|b_xHQ)B**S*(tM#0}yG^ zEAKu=pd611_+#`Wm;gN!hBvq=a2)pqNq<51hjQ;NQRQ;n<-S`4`&;P_knhajCfJ9! F`X8hK!mt1U literal 0 HcmV?d00001 diff --git a/FLASK_LIBRARY/controller/library_controller.py b/FLASK_LIBRARY/controller/library_controller.py new file mode 100644 index 0000000..c2d2021 --- /dev/null +++ b/FLASK_LIBRARY/controller/library_controller.py @@ -0,0 +1,49 @@ +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() + 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_isbn(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/FLASK_LIBRARY/instance/test.db b/FLASK_LIBRARY/instance/test.db new file mode 100644 index 0000000000000000000000000000000000000000..b2062bda449c6188bdb621c54f7937139c6b91fc GIT binary patch literal 12288 zcmeI#F-yZh6bJCTHmD7hbP$RZ;dLk^pvBNZM`H<8ja6e5I+X+?4aNl16Li$kZ|2AF zTL>=RX(~8K-K6k;;gWavNOJev-r1>_h?uVO;wBW-V-3bR+a+R*X>wHMm<5-KTAPKM z&kK!ppI7U~8><){W^{~~c`u+20SG_<0uX=z1Rwwb2tWV=5coHN$2MPXwp#pYO@vVz zr%6^&3mKHY-a_r^Q*4UB>s*+f;V-WBHlLihjx 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..d6297e31b697298f063c3ce0f940768f4733016a GIT binary patch literal 1052 zcmbtS%}X0W6o0cH`PgKQSQRT2tn`vgPR&6n1#2tBFG@xakuAe+vL=h0jh)>+INg%*l8OX|Hd?y9YLDSe0EzWL4D-+S|$8R)tOJbn~EH$EVM zZ(?y3YMcyad2$FCFj|5|M9~yXz%*cK60mHbvU2sq&9^8=IhE^5UOnT=kVj0aS=E~w zfa?a|IeQ2OP=tX>7*QEZR58?Y_RsPtp9ank-Nj?MC>rs=3RY(%n)+vj#I-^ar?^7; zzZEo`o&=h~8qL--`7BE=I~Fx*`%E~*l5V`x`D%?@l-Z_ElW&tPyM6YOlM9?od7!$ zL1(3((YrG{GrQ$pWxw)~9=!UboMwuh=l$$Zx3p8*wR+CJb0i%!kL}a!zU5(IM0oVRtma-&3*FlgOQ?R9Gyo&Y$3L ZE+d4#!0<06gS2;6xADGl0X)5w{|!rl+ra<; literal 0 HcmV?d00001 diff --git a/FLASK_LIBRARY/models/library.py b/FLASK_LIBRARY/models/library.py new file mode 100644 index 0000000..bc67710 --- /dev/null +++ b/FLASK_LIBRARY/models/library.py @@ -0,0 +1,14 @@ +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/FLASK_LIBRARY/repositories/__init__.py b/FLASK_LIBRARY/repositories/__init__.py new file mode 100644 index 0000000..9e068cd --- /dev/null +++ b/FLASK_LIBRARY/repositories/__init__.py @@ -0,0 +1 @@ +from .library_repository import LibraryRepository \ No newline at end of file diff --git a/FLASK_LIBRARY/repositories/__pycache__/__init__.cpython-313.pyc b/FLASK_LIBRARY/repositories/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95f0f624c84c9fc338c0a533403076d4ffe31aca GIT binary patch literal 213 zcmey&%ge<81kX*+W*7qL#~=<2FhLog1%QmH48aV+jNS}hj75wJ4Czdo%r6;%!kUb? z1bs4-iV}+|gHj9fi!)2|iz@vznQjT?Kt$t<;KD`BKn*JyJ_AXHTc*xdF`>n&Ma40W zDY=<>F>XGN!QSyco=!oIL6I?VO_{01G4b)4d6^~g@p=W7w>WHa^HWN5QtgU3fTn<4 UPz+*xU}j`wyvJZz#0KO50OOK4wg3PC literal 0 HcmV?d00001 diff --git a/FLASK_LIBRARY/repositories/__pycache__/library_repository.cpython-313.pyc b/FLASK_LIBRARY/repositories/__pycache__/library_repository.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f78dc8f23338b7852f9ddd0a6fd00a985ba2069b GIT binary patch literal 2334 zcmbtU-D?|15a0WfPLl15BgG$b>nOGwSD^$7)=MdAT|;Rd#}6k2Z6!EP(#5`7AI|P6 zpoc)7iv8rg7+eZ%Uh~JaB-qquF>RrRk~gI)^sRJe?@m@_$Ax+x=4NJR=Vs^k+wF~x z#tF#p`R_NrQ3&}Jolw-k=)Dcb9x0H5beF71R9ca#oFP+WjuhlHDJXf_&!oz_n$upQ zlaqOL)vZvQcDP)tRQ&{B!+(VI>hRekWkRI_p>jc@N?FB<`5=L6;41@u1blVCkAkn2 z^+mZ5Ns}+t{=OK*qXT*If=(0bv0R*w2ThsIR*Sh_i*{aOJOAnrPlLhU9Z-9u1lkuf zIA`eN*VG0*-wyl8l4sIdPN7(gYY*BE3`4Q&^=G7qiTs1*_sT`)P*z^5HQZ+T1Y+0u>5&D~|sm82{(^MUoHdWeJTzkzfQAsm7Ic$ID4vby=m! zFfT*LFg_yst#mA0;IpqePq41T4mJsD=uA&j2gc3k`ppYY^%! zd?&s;wlns`JJjDe@%VbhEWsLf#1ZY(9Km`n4eA9)Mp;oaPkOJa!F|A@|-QBmv(N z&P0fb3>y-2d?*0!07`O*QcPT5!CiV4a=7MtPJ{92hRtlxqllk}hCq`dDd{w*oJNyq zzlkahiYuE=hieb*dfQ?6YGhD+@<-ZRfP}-R&VuW&;GfwSpw1)ww)&HiJWfvjlAitU z*4MYbeP?H7d-=qec;X!yHx7&&Cs!u-)u;I%ujF27WM<({ox~EzkaHMu{!8!!{P>bw zkcv_tKf#3(GEInyw|Pj+KDMU|MJaq&0Naaq2FAF?|`-MVJMb)rVp~d#GQ3{dJ{C=(XGk*Db4QHyq32am#A7 zYVA7OBbN1`ZP$Yp!?NzXlzDZx=`>ro%z&nDwc&Uhtr|6;6iuO;0R<0%TlHubeQ~I3 zmgT2gNNu;$_8eweq5<)82-;EvK`6X?Y!lR1|TPa%=3U9`FpurRjJk1Yf- zMN0)Su)1-vBd(?P7kdOg!4g>ADN!OC#CkGVejnJvT2AE=7=u%1KA>vY*HFV;f8U?h e9r`Y$01pYno7Gh$N&1=0{-tK6)E@+tDE<$#KcRU5 literal 0 HcmV?d00001 diff --git a/FLASK_LIBRARY/repositories/library_repository.py b/FLASK_LIBRARY/repositories/library_repository.py new file mode 100644 index 0000000..ac27ebf --- /dev/null +++ b/FLASK_LIBRARY/repositories/library_repository.py @@ -0,0 +1,39 @@ +from models import Library, db + +class LibraryRepository: + @staticmethod + def find_all(): + return Library.query.all() + + @staticmethod + def find_by_isbn(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 \ No newline at end of file diff --git a/FLASK_LIBRARY/requirements.txt b/FLASK_LIBRARY/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..76e3ef55bc1abc767f150bd8028153eda0c4b1c1 GIT binary patch literal 584 zcmZ`$%TB{U5c3&{Poc`DP|AS=2RI-&K#@425SCC%lPC|V@bQ2>)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..bbbc55fcfe7a7d736cc77d58ee5799c4ab15b2ab GIT binary patch literal 202 zcmey&%ge<81kX*+W@rQH#~=<2FhLog1%QmH48aV+jNS}hj75wJ4Czdo%r6;%!kUb? z_k~%s{0p89oC^hFb>CRxzPKiQ*W?l-$g` z7&jlsVDESzPp2TqpvV}gj+prP%)HE!_;|g7%3B;Zx%nxjIjMF<96$p=))s>pAD9^# M8SgP@7qJ030N1HAiU0rr literal 0 HcmV?d00001 diff --git a/FLASK_LIBRARY/service/__pycache__/library_service.cpython-313.pyc b/FLASK_LIBRARY/service/__pycache__/library_service.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eef424395b1d1b770aa472717c2e55c164586be GIT binary patch literal 1698 zcmb_c&1)1(5bvI^ooo^(i6(|ca1Dx#x{F|fC?ezu!ZRU<9rAeMLNmM5iG!2f*gdP{ z=1Dx7L%^d)^M`nR5aPkm;OPnCExHfh)vB4^&6-3+unyH#)m7EM`k3jCjur{fr@4O~ zzBLH>7nL4aTIgN{VT%MLpbO+46|{`9v0&UYg;^%kWQGK0i3HXhWIz(us_i?UQS_-A zUyK_f6dN_Z-j;FN78_tJXk!zddZfciHv-ERsS`m1B8-3vvu*`OiOgwFVS^4&_H_qz zYd|l6ZV%`#=+1yX6cj{p)%Aze2@NFR;z``(pRwp8piD4!uVkPeXb6PVdT{#|0-fkV zI#0Igl5YqMRqjgMiddK=+oX%$>iV6V^<~M0tj|YlajSlJaXwgJi+}!6o3Guk!v$ig zCwb$T)~o9qs<6saOr)m1$6eKS8?wuBV9&@$ul(NgcRl}|cX`LXEJncEq`-QF(6Y*^ zAZ(GJRklp#bo6;5h9IO@-AGnlV}r%A(b}fU!c(GeS&RZ#!w62_tI{#R^&KXaCxL13 zm0hp$CVJ;x+i|ZQh3|l42LCS*0Dix;Wmr_~1Du9FO*{kZhS{PI`eUo%tPjx)S*8bN z`u37QJjzbvG~vn#JL$u=@XgFBPQ#U$1_lPql@HsJ;S=r~%8J4?R92(iekAeDvhIe{ z6g*71nmp8q+>8yAv%s(iQ+wl+FIP6t>`hF)e7afLJ9+w*yLtOd!5S;Ru>LEOv2*Xe z3%lNh*U+Sc8TSi>EC}ltX8bqpeZz-l>~z+l94ITVyo4wRiV|nRaHOI={;+ZxYlUl^F;!%2 ztsQj|lt&nQ+zAtX<1w}p3z;Tyi?`Z%Ez>ZKn`<0aC=w?il{kg$3^MGW#>QCg$ig%g zaif!R$yoMu4gxns;PPh-2P`9C&&i%W{>7m7m99ygiG7sz9gxsA+qcbXo749LX@Bg8 ze$=jJv0cbg%>m%sOTMi}MDLFtbD8hH1I^%x%)f>VBev`Sw{mag?Yb@ScZze7lfd>( VO6do3=>sYKZ%xzcR{|^x`v!7LR)GKj 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..d7c6d8e --- /dev/null +++ b/FLASK_LIBRARY/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_isbn(isbn): + return LibraryRepository.find_by_isbn(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