From 940296d471d90c54fa47ba37899297e41b8cdbc7 Mon Sep 17 00:00:00 2001 From: Kenneth Reniel Viovicente <151752526+kennethviov@users.noreply.github.com> Date: Sat, 20 Sep 2025 13:50:10 +0800 Subject: [PATCH] python-flask api --- flask_library/.gitignore | Bin 0 -> 16 bytes flask_library/app.py | 22 ++++++++ flask_library/controller/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 275 bytes .../library_controller.cpython-313.pyc | Bin 0 -> 3562 bytes .../controller/library_controller.py | 50 ++++++++++++++++++ flask_library/instance/test.db | Bin 0 -> 12288 bytes flask_library/models/__init__.py | 5 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 301 bytes .../__pycache__/library.cpython-313.pyc | Bin 0 -> 1085 bytes flask_library/models/library.py | 14 +++++ flask_library/repositories/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 246 bytes .../library_repository.cpython-313.pyc | Bin 0 -> 2363 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 -> 235 bytes .../library_service.cpython-313.pyc | Bin 0 -> 1700 bytes flask_library/service/library_service.py | 27 ++++++++++ 20 files changed, 160 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/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/.gitignore b/flask_library/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2837996efa0e3cf694ce0062de55efcb4d9f982b GIT binary patch literal 16 WcmezWPmiIDA(bHyNb)jpF#rHDTm%9D literal 0 HcmV?d00001 diff --git a/flask_library/app.py b/flask_library/app.py new file mode 100644 index 0000000..cbc7ac5 --- /dev/null +++ b/flask_library/app.py @@ -0,0 +1,22 @@ +from flask import Flask +from flask_restful import Api +from models import db +from controller import LibraryResource, LibraryListResource + +app = Flask(__name__) +api = Api(app) + +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() + +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..f2a5c6e7433097af0997166e10ffa16d65b7ae55 GIT binary patch literal 275 zcmey&%ge<81P^V`Ww-$8#~=<2FhLogMSzT{48aV+jNS}hj75xIOhrrz4Czdo%r6;% zQkqP+gncrTiV}+|eKLznf>Mj~ON)|IZ}CF~VFG@d%(sMcAPVD?^YcoI@^f-hi;9?m zW)!giiIohWfh5DN5NE5H(Bjmh;uy!|)S?)d{N&Qy)Vz}7n1afZjQl((rJI(MSe&h! zSdbY5X2nB|jzJh56Ca2KczG$)vkyWXbH&S#oR#R12ZEd<9!B~ L3k)tr>_9#M5&%%a literal 0 HcmV?d00001 diff --git a/flask_library/controller/__pycache__/library_controller.cpython-313.pyc b/flask_library/controller/__pycache__/library_controller.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a524b6a3a070719216194cd0c8ba426b8cdda3d GIT binary patch literal 3562 zcmb_fUrZdw8K3=kyLUcwB#V7OW#4jO%r$_GfY?rHS_qaBoD%ESw3R^JE_Zvd^?8@f z?4_|~RgoVmqCO;1OJnuPFO}lHgvTaN#qERh60M;XWaUJW+K2LH1zT#}hxYq+_YO=h zPSSRy`^~pA-^|X;_nY6hw{!4dia`1I*oTV+nUKHYL%m3`vGZdvR)|h??i`uoD5s&# zpW~+lDulLhPMngc6x!ms#FR{BjkJ?I(WOqJC+4_OA)1RSVXF+S%AVHbLb8zBMwbE? zC`F68HCnR3mZ|k}&0-#yEic;h)TEbni@suqoqTz|6ipi;7eDN1V62ciLOGpKUgxNw z^PPl>x&SEYB26qvg+!pnGrnjuul~;M1dJ`!XTk~b6ma!BR{&PXEMQcMeBIiu^JFxB zaJU&xCEw>6e}XVxCC@)eh?_6g&vbW4W5jv>du@aqAR72Pu<8-M2dwC+LJIu!_H7td z5Gc+O$P1QdnAK_^d#+KoOI|?;L}pbhfi&;B7g->N6|P*%`SSrE0Q^1Ll%F7g|O&I`g@b>v+_yR$*w|Wb8H#E?o`;SWb{_ za-f6I0mLF~2;enxxAo{|Ywvn%??!9ivh>kYCpR)fzZ<I^sifPj^4=(tq%K{ zr+ww=f39bSm$m^*QAYTrysw0dGJ#k&(D&*Tjj#Rk9f$2cB*}M}- zp6ykwAYs;k3N(-}S&W$r)|H+Y^oi+yE$r>rOsA|x9-2ul4KJomt+M?l?0@?MSi{4P z8OM5c$trnPS+gj0spghSH408QdD;#hfn2sc)2_1Z`!J}GqIkH0f=vDibDfCTi4wI; z&!PvhFM0OWlC|X7(22(%$PCs7Pl1ALoHt7s1A%$8AW}TJKrEY{Nn6q6tdKjveU0J? z2I7*-yr8`qMX~1q_^=g#*T_9SmAt^+RXaD;?sc_$Lp`=U`Dy0R^$Q!Bt{XpCo!mHf z`uES@p4=Eazt!I5cfa6gr*1#zXJ7JLU;3NcwW;>4t9|dZZK#9GlUr)`?XkDUe);T; zVPEa_)4l(=n`z%6JkFnPd1LDJsm*lmPCEDJbk|nynLn}HLw|hbjymn1*L_w0OIrWe zJqdjuvOKKpTK{;Kyn7sAEt{I?5Z1Z|CfbBsEgaal+9bf6WV#>+ieWhBCCe~^lwn+Q z%e5-nX~THAW>({#jA2x4%Dk%WSdMEL6y%A}UVz|`VKC41?2=)69<}Fdp2fhS5BhfC zN5bQz3R(yl7ly(5Ir)s|rBe@-1JVVK4%YjdOEkXeaS{zeozNvJFC<_?nK)<-kw!9= z_R25H9R7By;k;ia(vRL++!>ZKY(?jE9`3$?cNOmQW8_*F(Wf9yhtz)9G6AZqIj*Nw z+?rF~{uMBsBB|%Y}n6^ ztd{)j8Nc<+|5vt7ji<@`PXMf?Qxh%1+TnqTq;N~%z`m7~0GreC@34ihLdUOmnc-rK zGh7RNkq!&>=vXGEVI$ z)s;*rC_lBmMGf!;8Dx9JeC)wTQy^4sJI z@@{H;NO*5xykA)B<-lC)mjJ_jHC<3>0bD7rnm&clj}RuiGic#f=>P(%Q)bl_J+oBI0_;?Bby2O!! z%xqOzqyk8_=#`HyBT&Yo1pX|Y02dHw!f>_s1diiACi#y^M~H{+i>=%R?t0&Sg7y8L OPQW)89}uj=UHu1xw9n)K 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..3524342 --- /dev/null +++ b/flask_library/controller/library_controller.py @@ -0,0 +1,50 @@ +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 {"message": "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 {"message": "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 {"message": "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..55e73bb935733f68f24cd55349c86a2d1959a4b7 GIT binary patch literal 12288 zcmeI$%SyvQ6b9f)8ZQl$aUm4x!ci!sV5MmhTpCM6F|8V_(p5=ptb;MZT)-}M>Erko zzJPBc2yUE|U~wT`D)JwgIWswv+qauJJ+XM=v8yn;brRMhOGJ{$4r7FnLf%B0gd}<; zA7?3>&x!)sd|EEicOug&p;h`a>ju;z009U<00Izz00bZa0SG_<0>38kuqG{(D;4Q+ zC2?He^SK*2(Kt_X+cu4!$$G}FWwQJt)6^o5-GH4Nc6;BjHN911-J>4so>|rgQ;P{t zeDABe-S}R0(&Rdfek>o`2OY!ivqQ7bwCpuCwN{ts%SJ^aJQ#ZS@trSr^#k#ka55j{ zpEc0)LAJMF%sfk?$@H1fSJ5FL009U<00Izz00bZa0SG_<0ucBk0_(Cuw^o}SCr-SG z2P2k_M?4)fy`dXEzx0^PQ%zE6tFBMi?DiR{z|5Agnoz)0Rad= g00Izz00bZa0SG_<0uX?}{}GrgP^l>^1zOZU0cEab00000 literal 0 HcmV?d00001 diff --git a/flask_library/models/__init__.py b/flask_library/models/__init__.py new file mode 100644 index 0000000..2b42497 --- /dev/null +++ b/flask_library/models/__init__.py @@ -0,0 +1,5 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + +from .library import Library \ No newline at end of file diff --git a/flask_library/models/__pycache__/__init__.cpython-313.pyc b/flask_library/models/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..899aeddb5ad0396b2d73925c5365c9da10aaa5da GIT binary patch literal 301 zcmey&%ge<81R6HyGGc)AV-N=hn4pZ$T0q8BhG2$ZMsEf$#v(=qh8RXA22-eX5mPWz zFtaza7fTU~0z*2BChJR(j3(nPuHZl)$DHJh)ZEIKj1VDqpUkA9#G*<+P1aiiX*r3- z+404NIf)QOMa)1&x0q6rZn5V;lohc8MOHF=29gZ70-UX4LW@(2iens;Q;T9;@{>z* zQ}arSV+txuGV=4FlrGp*-Nb^-7>M~$qhfONQ&Mw^W8&j8^D;}~cZNoRKtITUg# ztv$pKBt3f6TmO=Rw=hr;+KV?!>b-Bws;zh_eTUz?_nSBGz4^`b3_}OBr*mH`pCo|q zBDgXwa(c7q8~_0#y?`Z&NfR&zlR)HgAc`p!)T;wGYfkC=OxaSi+8I`ctiAh8WeE7ZODp7w+z`k9*s!T$|K0iE5`~~9lzvpEpP(Y<}oV_ zDs{%hkT{O&+wP_>Mw#HR=4Z_{-)6q~tZXxLpU6^?2RsuAH60O2?B_p3Xu;|5SSP=m?~dH>tnaRON5?zW z-RjS{I;fw6n$&xk1jn$FHF$zj&#Kv!a-C9a7P`VuQ~EZv+-N65>88W{z;!&^tK+so zX&}_@?=zt>kImQJu;%d?37F$;G4TOeM!=wedm?9qQa`W)r%bH?vr1uL`;@X#kuV}) zNPzhCmmuE7UqyHi-QfqV<R^`yYgtjc??oaUd oR6H@)SLX>65{tL>#}LjHNs_+7;4e8X=^sk%%E!tDpnF;VH=gC{2><{9 literal 0 HcmV?d00001 diff --git a/flask_library/models/library.py b/flask_library/models/library.py new file mode 100644 index 0000000..b153110 --- /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..e6d8c60e778112261d20a78c2a55d1e04ad046d6 GIT binary patch literal 246 zcmey&%ge<81j#n%G7N$AV-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9i2>VNJ$c zf2KczG$)vkyGXbs4T#URE9W=2NFdkls}Y(NeGJwHbr 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..d7524c4868cc48dce229cef062c472187deffa88 GIT binary patch literal 2363 zcmbtV&1)M+6rcT)*7C>3k>U?IO%&UWtIz}r_N9c-;vS0I_#h!Dm0-J)#`e~$kIbwB zIv8>)_MtczgL`Rn%|8S`GTw{Oj%KxnjuqUmgLnm$!kk$kjb=lJ!`y1 zC##D1mu{IktS!`Pxe_D<8upRW_29EdN`xtS!qmLNw33c1E`a=$eV0fz_^n&Y2AA?u7_@uA_Pu6Xm}_pmYQvTyedgfz zqA|poUjy}o{9#S(ZtZLxS(#T>=D?bLY0k1y7^x_rBEjRx{(J()|LISGEQRaM6E*~k zggs)&MWL-zKdT7c<>flZybK$|ctX}&Zrg5ETz|)DIaZWjR8+G7KwJKtjMy=+`?vxvi&HnD_+<8pJ z#M!=Jd<2%_3!tDQW@0z7lh_^G8GGs~ z!4eYrzrna%pXzEs#digz3Mj9Wf|9$SH%apO93d^Jrny)|&Pe%cE_!=!l`1vePMo%z?G z&LjM`{)?47PEP)ozVXwYAMX74;m*qT@`*L^)IYLr9ay(cu1xOh&z63^l6_;4nT0=1 zGBk_~IfoJFzXC5{<4bZuDJVVsBo~UvG$}c}%>$C_VS74IP@*>lu)TOTK4=5dhpiG} z8y~>-6haZJQjhvHfKm;hL=-t*mJl|E_w78)g1I*_eHqk6n1z=$fMS3C(7gHX>&lSO ztJx7@+IHQkQQH;?+paaLEf4Jx+kVt?yl}*_?KPKi-*fA<-oRlFG<7RA3O}AIvtTKf zLNx;l9s;-Gvw8I8p|06>kZvQj-EzyP+_q%_^5u}UWe9>)c=z}wsPD+JG5$tXjJd8x zVplt8bz)#)Y@ruh2xFR&3S(e(5^_euNbN6n34FpKusTz6iFg?6s$d0mUPUBsXb s)Z+o5dQ{gy!NR;Bbn5~82vUHDgyYTXXo{lzN^bn6&nv071e9F-A6!hXDF6Tf 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..aa695fc --- /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_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 \ 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..0f0c29d65ec4e4c34326a7c32486d4206e68e87d GIT binary patch literal 235 zcmey&%ge<81UqfcWoQHG#~=<2FhLog1%QmH48aV+jNS}hj75wJ4Czdo%r6;%!kUb? z_k~%s{0p89oC^hFgKoRxzPKiQ*W?oFj8xFw{1p@cbD#2 zqP^u5<%kcKIOd4|09XD2vg`v^E1clM&9FqdrfQ~Vyp6K*A!-zERrP>m=zLOtMCFYVQt#J z^Bz^7s+phSrijE~o%gyjPP<|N&XRVvFsNAiIvM@~o*fbrK?5R;fC@9T0;57!b)>Mt zhLj`Q0oxk0OJLh$wi`GVA|`^8C~vy{ggUL$2V6XfTl_szJpsi8=kRg{<$+F2$a(>C zeE@XJS#YK3h+v;!ePAbFRAbr^F z=&iPqMDkHB>cwHEu_Uiw2saUIsBNb0dT*dgn>@u#YW{O#b?vtyy_^B@8+qqdUwi(( z=O1{>d+xHB1aFIiC>CPRsMkT+A>X3jAglWJd8ja4Dd?9o`pp50+q+a*v21oEMpnfX zNHu}bvQxGA70}rUJ}1wB(6E>Hz2)b34!o;-?$wjP9SF>T{|pKMACYRnM1L@6+O={-V21zXx=HR?fVF zD91>N@4#__QGRD0W5>FBao@Z6+&b{C@444ccJ==nN2kpbo^mmZ*^lQ?EPV}V9-EQM zf&PVGO#!sF=hiZy;uKt7^G_+4u}-wb8B=A(wz}&4`flAin!TNxnwL$orAy$5jgyrzy`|(h~LSf zJ@dh!_T`~ToY^DPjvUa?cWvamrhU#R4z#0b9k()yTlw3ec0JFC$<};ZO^V{59&?!w yy94ZbBJ=UjKw*uJfhzZAUY}b6f34UEIS1m%q?EoPm)?-dKh^@Re