From 07a6d7069ff906ecf62b2634127300156e915711 Mon Sep 17 00:00:00 2001 From: "Juan M. Ley" Date: Fri, 13 Feb 2026 17:00:52 -0600 Subject: [PATCH] first commit --- README.md | 0 run.sh | 4 + script.sh | 34 ++++++ .../__pycache__/exceptions.cpython-314.pyc | Bin 0 -> 417 bytes src/application/exceptions.py | 2 + ...microservicio_a_repository.cpython-314.pyc | Bin 0 -> 2276 bytes ...microservicio_b_repository.cpython-314.pyc | Bin 0 -> 2276 bytes .../ports/microservicio_a_repository.py | 19 ++++ .../ports/microservicio_b_repository.py | 19 ++++ src/application/services/__init__.py | 4 + .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 418 bytes .../microservicio_a_service.cpython-314.pyc | Bin 0 -> 4974 bytes .../microservicio_b_service.cpython-314.pyc | Bin 0 -> 5020 bytes .../services/microservicio_a_service.py | 57 ++++++++++ .../services/microservicio_b_service.py | 56 ++++++++++ src/core/__pycache__/config.cpython-314.pyc | Bin 0 -> 1630 bytes src/core/config.py | 23 ++++ src/database.db | Bin 0 -> 45056 bytes src/domain/MicroservicioA.py | 8 ++ src/domain/MicroservicioB.py | 8 ++ .../MicroservicioA.cpython-314.pyc | Bin 0 -> 828 bytes .../MicroservicioB.cpython-314.pyc | Bin 0 -> 867 bytes .../__pycache__/db.cpython-314.pyc | Bin 0 -> 665 bytes ...oservicio_a_repository_sql.cpython-314.pyc | Bin 0 -> 6043 bytes ...oservicio_b_repository_sql.cpython-314.pyc | Bin 0 -> 6118 bytes .../__pycache__/models.cpython-314.pyc | Bin 0 -> 1322 bytes src/infrastructure/adapters/persistence/db.py | 16 +++ .../microservicio_a_repository_sql.py | 99 ++++++++++++++++++ .../microservicio_b_repository_sql.py | 99 ++++++++++++++++++ .../adapters/persistence/models.py | 19 ++++ .../__pycache__/app.cpython-314.pyc | Bin 0 -> 924 bytes .../__pycache__/microservices.cpython-314.pyc | Bin 0 -> 3786 bytes .../__pycache__/root.cpython-314.pyc | Bin 0 -> 730 bytes .../__pycache__/router.cpython-314.pyc | Bin 0 -> 630 bytes src/infrastructure/api/microservicio_a/app.py | 10 ++ .../api/microservicio_a/microservices.py | 79 ++++++++++++++ .../api/microservicio_a/root.py | 16 +++ .../api/microservicio_a/router.py | 17 +++ .../api/microservicio_b/__init__.py | 0 .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 181 bytes .../__pycache__/app.cpython-314.pyc | Bin 0 -> 924 bytes .../__pycache__/microservices.cpython-314.pyc | Bin 0 -> 3835 bytes .../__pycache__/root.cpython-314.pyc | Bin 0 -> 730 bytes .../__pycache__/router.cpython-314.pyc | Bin 0 -> 637 bytes src/infrastructure/api/microservicio_b/app.py | 10 ++ .../api/microservicio_b/microservices.py | 79 ++++++++++++++ .../api/microservicio_b/root.py | 16 +++ .../api/microservicio_b/router.py | 17 +++ src/main.py | 52 +++++++++ 49 files changed, 763 insertions(+) create mode 100644 README.md create mode 100755 run.sh create mode 100755 script.sh create mode 100644 src/application/__pycache__/exceptions.cpython-314.pyc create mode 100644 src/application/exceptions.py create mode 100644 src/application/ports/__pycache__/microservicio_a_repository.cpython-314.pyc create mode 100644 src/application/ports/__pycache__/microservicio_b_repository.cpython-314.pyc create mode 100644 src/application/ports/microservicio_a_repository.py create mode 100644 src/application/ports/microservicio_b_repository.py create mode 100644 src/application/services/__init__.py create mode 100644 src/application/services/__pycache__/__init__.cpython-314.pyc create mode 100644 src/application/services/__pycache__/microservicio_a_service.cpython-314.pyc create mode 100644 src/application/services/__pycache__/microservicio_b_service.cpython-314.pyc create mode 100644 src/application/services/microservicio_a_service.py create mode 100644 src/application/services/microservicio_b_service.py create mode 100644 src/core/__pycache__/config.cpython-314.pyc create mode 100644 src/core/config.py create mode 100644 src/database.db create mode 100644 src/domain/MicroservicioA.py create mode 100644 src/domain/MicroservicioB.py create mode 100644 src/domain/__pycache__/MicroservicioA.cpython-314.pyc create mode 100644 src/domain/__pycache__/MicroservicioB.cpython-314.pyc create mode 100644 src/infrastructure/adapters/persistence/__pycache__/db.cpython-314.pyc create mode 100644 src/infrastructure/adapters/persistence/__pycache__/microservicio_a_repository_sql.cpython-314.pyc create mode 100644 src/infrastructure/adapters/persistence/__pycache__/microservicio_b_repository_sql.cpython-314.pyc create mode 100644 src/infrastructure/adapters/persistence/__pycache__/models.cpython-314.pyc create mode 100644 src/infrastructure/adapters/persistence/db.py create mode 100644 src/infrastructure/adapters/persistence/microservicio_a_repository_sql.py create mode 100644 src/infrastructure/adapters/persistence/microservicio_b_repository_sql.py create mode 100644 src/infrastructure/adapters/persistence/models.py create mode 100644 src/infrastructure/api/microservicio_a/__pycache__/app.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_a/__pycache__/microservices.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_a/__pycache__/root.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_a/__pycache__/router.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_a/app.py create mode 100644 src/infrastructure/api/microservicio_a/microservices.py create mode 100644 src/infrastructure/api/microservicio_a/root.py create mode 100644 src/infrastructure/api/microservicio_a/router.py create mode 100644 src/infrastructure/api/microservicio_b/__init__.py create mode 100644 src/infrastructure/api/microservicio_b/__pycache__/__init__.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_b/__pycache__/app.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_b/__pycache__/microservices.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_b/__pycache__/root.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_b/__pycache__/router.cpython-314.pyc create mode 100644 src/infrastructure/api/microservicio_b/app.py create mode 100644 src/infrastructure/api/microservicio_b/microservices.py create mode 100644 src/infrastructure/api/microservicio_b/root.py create mode 100644 src/infrastructure/api/microservicio_b/router.py create mode 100644 src/main.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..adf9df2 --- /dev/null +++ b/run.sh @@ -0,0 +1,4 @@ +#!/bin/bash +source /home/rodo/Documents/examen-mss/netflix/bin/activate +cd /home/rodo/Documents/examen-mss/src/ +python3 main.py diff --git a/script.sh b/script.sh new file mode 100755 index 0000000..ba54fbe --- /dev/null +++ b/script.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +CURRENT_DIR=$(pwd) + +mkdir $CURRENT_DIR/src + +mkdir $CURRENT_DIR/src/{application,core,domain,infrastructure} + +mkdir $CURRENT_DIR/src/application/{ports,services} + +mkdir $CURRENT_DIR/src/infrastructure/{adapters,api} + +mkdir $CURRENT_DIR/src/infrastructure/adapters/persistence + +touch $CURRENT_DIR/src/main.py + +echo "Here goes all repositories, each repo will implement the object they need and defines all methods as abstracts" > $CURRENT_DIR/src/application/ports/here.txt +echo "Here we will use all repositores and will define as classes all functions we will implement as execute method" > $CURRENT_DIR/src/application/services/here.txt +echo "Here we will define all the configurations for the multiple api's we're going to use" > $CURRENT_DIR/src/core/here.txt +echo "Here we will define the entities that we will operate with, normally as dataclasses because we won't define methods here" > $CURRENT_DIR/src/domain/here.txt +echo "Here we will define all the database parts, db will define the connection and session, models will define what is going to be in the database and the sql repository will define all the methods that will be executed in the database, these are called by the api." > $CURRENT_DIR/src/infrastructure/adapters/persistence/here.txt +echo "Here we will define each api application in each directory, we can use router to make things easier and scallable" > $CURRENT_DIR/src/infrastructure/api/here.txt + +# == Architecture dependencies == # + +python3 -m venv $CURRENT_DIR/netflix + +source $CURRENT_DIR/netflix/bin/activate + +pip install uvicorn fastapi pydantic pydantic-settings sqlalchemy + +printf "#!/bin/bash \ncd $(pwd)/src/ \npython3 main.py\n" > $CURRENT_DIR/run.sh + +chmod +x $CURRENT_DIR/run.sh diff --git a/src/application/__pycache__/exceptions.cpython-314.pyc b/src/application/__pycache__/exceptions.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b818b44b60618f72f7c63bb2836e323c4db09ae0 GIT binary patch literal 417 zcmXv~Jx{|h5IrZY)D#M0CH`8R7{ejNum>@l!I|H3mc`x? zgg#$uoM&B7?-E$S3@8h%ch9UJGuvww)&8C2S{b2VBp27I7Rh`$Sx95eCrrbBH9*Xh zOdwW6#7xc0)ZtCU=Q2q%1U#ZtSqo5$^F+<{) literal 0 HcmV?d00001 diff --git a/src/application/exceptions.py b/src/application/exceptions.py new file mode 100644 index 0000000..215c767 --- /dev/null +++ b/src/application/exceptions.py @@ -0,0 +1,2 @@ +class MicroserviceAlreadyExists(Exception): + pass diff --git a/src/application/ports/__pycache__/microservicio_a_repository.cpython-314.pyc b/src/application/ports/__pycache__/microservicio_a_repository.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d496cd0d6eb8f23d55fdca4910c6b47b580f88c GIT binary patch literal 2276 zcmb_e%}?A$6n|rT7X!`i)*`)IoA!pIokf_3W$^6<@SRKK4@#t(e_oyVAt7!d(3AG5WBvGcn$guOx`|RZVRUXq z=a#xjqnoPeCjDtWwF7$EZ(!6j`L$|Xe$>g7(3w0Ak!PSEEen4X{$=K z18C#!hwv3U#OSu!*WfX{)p|zuxt*v$Qg)El`avd>K<6`@hjE}(TZEc(MRqrP`L=hM zC6OnycIJJNh211dweq5G0~GEgN_k3#UeM{pA`G<1Qm>OqG)P8M!UHZ}JHOUB&KsNu zX`1OkN1W%k#>KfdYF0;o)EvUA9=rrrYy3^{v}qm#+=q}{9xkE>32+B=t_MD>K%Z^( zDPTuM@qwJieG}yBs%)Z++rd$k-x%u*sfn@yK@a|Pr{!goD#@Tkm}J~V;k;yELfGy1 z(WqQSawN4-p))^$pE2xpgbBoD&d?+$1DVjJE(c|?v&X>lrR9d)n%Qb>GIQmZo+qX(iuwc2M zZns6MFJ^>SgG{L0-UT6Yi7vW{ za4`u~8)uNP{eMW1x9GCb=&?+b3_E6VZ0v;rHP@KP9aNciSw-QzcJVE07|+59W}AXA z$uK>PG_24U{#}>6ho=c;d7!lv`&}I=yz}zN-+(ZRW6p63n3+Qqd{&Gc)7u2}3B?g!eUAh2 z*V>hr7P2_7p+0v)(jRZX^MdX%GepuCw_5ew4)#My6q^w9`F55BB3-Lip(zJ*#IRW0 oV8*=ruwd|0N&l2kSZV>`#Ab~B4lBRG-RI6MYdlde03YVyKUiSSrvLx| literal 0 HcmV?d00001 diff --git a/src/application/ports/__pycache__/microservicio_b_repository.cpython-314.pyc b/src/application/ports/__pycache__/microservicio_b_repository.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba01d54621f6bc54de0fe4b6d32e25d76d2390a5 GIT binary patch literal 2276 zcmb_eOHUj}5U!q?T?SYdKfu^YEWpS}>%@#D`{08W#Uuwf1Sx~WC4$!M>>yg2$ELfN znA;vK<(RAe53*AJPNZn0D2a0Njc6m=$5i#qnjM9Oyjt3CYPza>s=j)_ht0Vez;*cD zw_?ZuexsMss+GdI>6%|# zgI4_&y|%2}e!BT--VEAG%OKQAq>r-BfaT54MJO{B$zu_UY%?ql7g*i|!|(AuKp*x& zGas~d;Ar~>WU%k-!9(V=C5T<$LcH>*Jg;k|4!uI1Q_o+j!x%_4|EZ?#^LeQqbJEh#(5YW*;iNucvN&cirRsv|vjBzriBg`Dp%-+!u?Pb#vefHl5)G2^l<+o}@0{Q0p5zVAgEY-_ zpd-%nyOZMF7&oh^MbNTj10Qk@p-heOTF%q%6@+Qh+(M}Gv+y$g;nsaa(wVzx zW!5<)$?K?*#B+Z^QsX|BB-xW#J5&DuM8JSS8 zoKa=EaHrMCUCvXSw>T=vTcUE;aL<9}1~-EYc{=IG4n&yg_iAfEbqd z2sRM%MV#*|A6VN9VM|k@U4#Xd8 z*WXyk;?Rcr!YN6={P&&LbdO1hq%ZEY>bV`XLrD~y5c9=OmINZ*s8*pV2Xn-*SlnR7 ny!)hJ@MB5;lu%e|3E|XcjQtF2Kf!}PoO#xGp list[MicroservicioA]: + ... + @abstractmethod + def viewById(self, msa_id: int): + ... + @abstractmethod + def remove(self, msa_id: int): + ... + @abstractmethod + def editById(self, msa_id: int, msa: MicroservicioA): + ... \ No newline at end of file diff --git a/src/application/ports/microservicio_b_repository.py b/src/application/ports/microservicio_b_repository.py new file mode 100644 index 0000000..3bdf4fb --- /dev/null +++ b/src/application/ports/microservicio_b_repository.py @@ -0,0 +1,19 @@ +from abc import ABC, abstractmethod +from domain.MicroservicioB import MicroservicioB + +class MicroservicioBRepository(ABC): + @abstractmethod + def save(self, msb: MicroservicioB): + ... + @abstractmethod + def viewAll(self) -> list[MicroservicioB]: + ... + @abstractmethod + def viewById(self, msb_id: int): + ... + @abstractmethod + def remove(self, msb_id: int): + ... + @abstractmethod + def editById(self, msb_id:int, msb: MicroservicioB): + ... \ No newline at end of file diff --git a/src/application/services/__init__.py b/src/application/services/__init__.py new file mode 100644 index 0000000..a2a12e4 --- /dev/null +++ b/src/application/services/__init__.py @@ -0,0 +1,4 @@ +from infrastructure.adapters.persistence.db import engine +from infrastructure.adapters.persistence.models import Base + +Base.metadata.create_all(bind=engine) \ No newline at end of file diff --git a/src/application/services/__pycache__/__init__.cpython-314.pyc b/src/application/services/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92616e1b8d706bb2aeb1af367173d3a1284ca139 GIT binary patch literal 418 zcma)&u}cFn6vkhAXDO9)?p8q*s(2Yi6bI?hE>b$U)g#TlYTzz+BstMdCr4KYck#c` zMIlfSoZN)|114<;!Nm;U_j`}zOY(Nsq9*wDbT1yAea?%egiD{DI=F!|7?M8ph#_sy zwSKJ^n4k@#V9@w|Y{7%ozr7I|276@DZ^JO$fX>R7FFVB6QJxElj>2Q6=ROuPJ?Yf# zmXH(0v{4l|mBN^%tTd=}TsjfjpyU{*V->h0yZxWdd68nKmH(h^HkBXY530g$G5`Po literal 0 HcmV?d00001 diff --git a/src/application/services/__pycache__/microservicio_a_service.cpython-314.pyc b/src/application/services/__pycache__/microservicio_a_service.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4a90d3ea18f290e3a9778635958fcd923a28ac2 GIT binary patch literal 4974 zcmd5=&2JM&6rcUDy$;FRaXv_zlsKd{Sfw!(DhQ_CM$`X{Zvd;M5a0kR`&g@6GHwHUtx>K#a6+XWqWqdGp@; zy*In>s2yzt+Hb!v+t*@*{ELII$w8;~J#-exG|_~!uL^$OIoqU; zYtcE|w4IZhRdHO~bLf0l@YUvLCfA75Ks{1B1!DuY^fmDWjd`A@EA$f9G(1hKj zsAwY4q$e{DYz{aw<3zNG7tIqdrbR)em@iKnbCxN<3-Q8+t4MIw(m+lK3-H!y@z@W9 z6o5NO&I^}ejY;7vk`qQqRlJAtzD!{g6sKiHKRV;klHvIsx^5N?*Dctlr|T{X?p^RF zbC;cxm7`9<$(?e{*^*WE+?;jQfX=%m*Uh=q%o&wR(KZdwcFH+!D9g>28qKB~dhlSh zGVizRx=}7Wp5a-#?swv*MjKfXSi9B(-)Hw4JRoLhUL449!ETh= z1?Vi0i=lByUbtA73;nwfXF&U=9Sw95*J4d0M}m2mg{fp2t;6}uaNiwjcJ)>mq)W4| zm%e1BjWn}g+Ah1EQ8umds_eJfZaAcQK51##PamU8^|52F&J}3{_E3 z(RI6QgD3osz&?D)Y%>fJ3*=6s|N2|E)5q2mV}B>c?xY4*2ESNKO{}y}Y;^bi6sIYW zY6_MpFmPYB13+2@izZ^oXc7w?2|`b%h+JQ(SailNTCN|p3${}-{FrGJ?SfGNFi5UP zvmynv650VI2qCr|nm}$62)@VN3ncJu7y7j8rgR@~)k${y^Dtxb4WQY=21$cE`b+3E zI(nK+rSg&{91Wx^fTfAL>%-}UOw`@I#mmc~$Nq(ey3 z_&}og7UnYW9t3YTLi>@^Eayuw-9^z1v@~~X%(`lsv!3O*Gp`0CW|X%<5}c|I-Z**d z>R(rGt5b{8hSI(qUy3iQOX|<=ZDn91ky>nHcBu+Xf$^$>p;87sLa4OqddVrw7O@W? z`*zkS22T>YK4VkYE81nN?C3gu0~O8y@p}O607cu>4bP+YCD6`AST^JX(<&Bq9hPK% zMVNfT-HHyONYL&s8sX88u!&6(@QSYN-)sZ7K1AO#t(mL|V)Yg}sdfxlO=&Xuv^0tN z--~E+kQyW4vZ&vdx2-EDi^X%U(G>Ieeirj-=(LJ?Opr7VLP26|5y<}Tt;L!WS0_$q zgkdk-8*rI{K#!M~qi8oSj#-oT0clJo%-McdlhQn!FkJ_6PCZ$`fVIGIO6@odv93%6 z4;pV1XxhixkziaA@?g@cFb;siT<6E;xQk$nk>W=XUM^RZ!-EH8szK2JAiW^Z!fSzS zB)hN0e~GUrhgXxsYsrzt$VQ@jv7Lw4evlidS)lYFPH70$_mGJMv(WaTDn@$l6CnIu zD7$^Ao`NS$p*rxiP<>`aS8%VN&Yvy3{Gja#mud=G=KR++WIG#F<^jvpZ4TI=Y7@+~ z4Cxqvt&q;Do1jStFmVMfC)TSR9RZ#nrIt5K%i~a?CA;jgl;66#eGJpEFuQ3WkMQIo zMxeR@`PIa*>bhC}!}}-m0b_BzH6{pD9WJGI0y@uwx4aP6uZoz5ZBWdlA?B31Aik;+ zuTi);ilxTI1;e_;ftReCJAfVA&H%^(?9|kW|f@(bC}*~t?1$lHGys)Z0)tJ6N$RQ z9CA$A?I9P`h@E|XKuF>_hruf=(9_Uw4XAODz>}(rm8}_2ldlv+kP9$Y=owVzN!X}? z!2-}Ql^+Amo>g_v^|>`Qvs2J~4oguactoS0AxVX-9b)6q3u8k$U9i1ZRFuM{n(%?8 z_qD}GXM@TdAxz!v5hBA*Fk))x$7dHMR)(Z4oUlwy@x0L*D)>Eg6fPIzjzL9;9DhK7 zVC{ihRb?Yyc2J?P1y%F;k9kumjT{X!Gt^E26dZwJirdBn; zGXKs$!N1r(qL)A%&oVC7zx$FP2zSZ(yX4@e92ejm0c5jJ5qcgFAe+4k@_;nKL7v# literal 0 HcmV?d00001 diff --git a/src/application/services/__pycache__/microservicio_b_service.cpython-314.pyc b/src/application/services/__pycache__/microservicio_b_service.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7484d3fe43e9f47b7729ce14f3b0d42a68c5f73c GIT binary patch literal 5020 zcmd5=&2JM&6rcUDy$*@(I3FZUN}Q$*Sfw$vR1iu(Ku|$dQnNt@sWhwgdP7#SchlKT zN_vW_N=+_Jdn&!r8@{!FMsG<&m1qU0p11|MA{_hP%&ucYFdr3&k@oG(+c!IJ-h03I zX7}wxM;n1QeRIVU6hi*NLD=M=Q~M4&i)4zZ!Z~tQ@Pr}ki|53%k|zz39x_Z+X)jUb zBO;&S$&42PUbN1OFkTFJN}U&Fyg2aM>bw}^?EzkUou{ZBBP5%+i?6Q=e&2b^ppI+O zdCRbzQ>r=ZxR&S8g{?LJI z6@jKanQ>rqz>ygzqDH)Efp{@B3M$2Xc~YM@4FO(=7dBi)f~%GRaza>yw@!)2z9*yv z+(B|dn1MAWg)d1?7$H^hF3S5dg-uYLmKFWzv_mVp=XYqDQPy3zWEq~OxhVL?qCc6N zaVlnxIwdD}+A-!TrtP^o^O_EwcPg%%bE%QjXJ^Znp?j8N=eVIvH&J_Aj1W_QEC^V zvq-Ll#vujaN?k7W?|z&C?P@z3=nAgIno5oY^JaugDI2ZB`OI+N9&UE^P8eh=bFP;u zni)OA?3b}@*VApooT$ovo8^W>idy>diwm>n8A=^W_rSO+`m$@5r`dqnd~}p1P*Bk{ z%eKH1en(&*K4i8T28l&-JK2Bz&0Cpc8_Ds%lH<421FM5ytf%v4N^_P z5(NhCt9B4bt6)(@3>j5ofg?fa$rO?6_f<>}A|bC|b@J3KnVv~2maUf@zjMZN0Th;A z{!}--IjXyUYT7hr^gMO0Srs+~03*2`&59IEPiO~_Ak5g7X%e|9Ah?!00wnN%7y7;H z4`~Z;fAZU!R%BehOSEm+V$gwIDz(edX^e&`aw%PqRN-hKJqv)#*W)9cPDs8U6Fabp(>_;nZQL{>P9}MXbk_7+5x-7XqtI(<)ABu8e(v_5cv}Upfh}B!@t=chQH6_*5?3ooL|K_ZQS@1lNN!7{%&SuUS< zi%kf@_cMfKpwkK=m`-UNgn~5MBBcGjJBu}?xlWwU2t#VPH{db@u^4_)8I5-1;+SJ; zACSh>!<_ARH7U(=57TuJ=hRaR3|I>cr__$a5UWr=c+hyuqiG*%M}qOJPymxwg$Y0w zW=20Y&s_v#j1)hDICHt8949;=(+!FSNa+Q67G8^FGu8b|{O9;aYIrR*yq+3aifksk zm)d!F9RRrrngvP^;gp6@eHWQXFdyw6s$!&PivZ#8LfPFz^)x(b3e|zfh3XUQzk+)` zwQ#QV;)Av)T&gK#ne$)OknLe;g8c#6gGNfYwwn93qg@P&_#KaY}oLH}k zbOd;Ql$ucV>LJfU!8< z8WRMn4wq6p0i9>TTR{j5*{oQAZBWdlA?B3%Aik;+FIKoY`W6ru7Yqv&2VSaf?f`ad zI|CpGuuG&@tYvE>ky%S*ZuG7v4nTFPS0ma2cpu`5Nbp6qU26mw=RR790}o{lxauu5 z)1wFP(dPzUR5dHk|2cX;ZLR3y3pIgmKWy!ltrN+*!W?o;+1()*)QG41R)LVj0}q2& zR-k8~-x^R8Ac5yv7b{ycpeA1`h#(hWtkAQl%%iYL1O^L0!&H6xNgCq|zZ zG@rv#6bT;D=x0dMA?qozarn8hp`0mM-b*S<;ZjZbz|#B5;-j-cWsVT0?(PVYVJ8?d zHT2_?ixMkC(hg2orlxq_XblzoFggmCi*d)GB1DegBS5hBz^$5KBVKk;p|Ay2^VyGi zm(nUZ8f0duodPI00xxA6L!X`a6f+2E#5tI6T@ MicroservicioA | None: + msa = self.repo.viewById(msa_id) + return msa + + +class Remove: + def __init__(self, repo: MicroservicioARepository): + if not isinstance(repo, MicroservicioARepository): + raise TypeError("MicroservicioARepository must be a class instance") + self.repo = repo + + def execute(self, msa_id:int): + msa = self.repo.remove(msa_id) + return msa + + +class EditById: + def __init__(self, repo: MicroservicioARepository): + if not isinstance(repo, MicroservicioARepository): + raise TypeError("MicroservicioARepository must be a class instance") + self.repo = repo + + def execute(self, msa_id: int, msa: MicroservicioA): + return self.repo.editById(msa_id=msa_id, msa=msa) + \ No newline at end of file diff --git a/src/application/services/microservicio_b_service.py b/src/application/services/microservicio_b_service.py new file mode 100644 index 0000000..8c3a089 --- /dev/null +++ b/src/application/services/microservicio_b_service.py @@ -0,0 +1,56 @@ +from application.ports.microservicio_b_repository import MicroservicioBRepository +from domain.MicroservicioB import MicroservicioB + +class Save: + def __init__(self, repo: MicroservicioBRepository): + if not isinstance(repo, MicroservicioBRepository): + raise TypeError("MicroservicioBRepository must be a class instance") + self.repo = repo + + def execute(self, metodoPagoPredeterminado: str, historialFacturas: str, fechaProximoPago: str): + msb = MicroservicioB(msb_id=0, metodoPagoPredeterminado=metodoPagoPredeterminado, historialFacturas=historialFacturas, fechaProximoPago=fechaProximoPago) + self.repo.save(msb) + return msb + + +class ViewAllMsb: + def __init__(self, repo: MicroservicioBRepository): + if not isinstance(repo, MicroservicioBRepository): + raise TypeError("MicroservicioBRepository must be a class instance") + self.repo = repo + + def execute(self): + msb_s = self.repo.viewAll() + return msb_s + + +class ViewById: + def __init__(self, repo: MicroservicioBRepository): + if not isinstance(repo, MicroservicioBRepository): + raise TypeError("MicroservicioBRepository must be a class instance") + self.repo = repo + + def execute(self, msb_id: int) -> MicroservicioB | None: + msb = self.repo.viewById(msb_id) + return msb + + +class Remove: + def __init__(self, repo: MicroservicioBRepository): + if not isinstance(repo, MicroservicioBRepository): + raise TypeError("MicroservicioBRepository must be a class instance") + self.repo = repo + + def execute(self, msb_id:int): + msb = self.repo.remove(msb_id) + return msb + + +class EditById: + def __init__(self, repo: MicroservicioBRepository): + if not isinstance(repo, MicroservicioBRepository): + raise TypeError("MicroservicioBRepository must be a class instance") + self.repo = repo + + def execute(self, msb_id: int, msb: MicroservicioB): + return self.repo.editById(msb_id=msb_id, msb=msb) diff --git a/src/core/__pycache__/config.cpython-314.pyc b/src/core/__pycache__/config.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd3247983ef9a6205761fbf4dcff7972ab93feb1 GIT binary patch literal 1630 zcmZWpOK%%h6u#pbKjKGX$8ns7Je*XDWFRq*N+76!q@k*zsbGqt3Y1)pXRebgP3F3H zt|Jn$7!@RtSnvy2u;>D|{Df{;))EVIr7kK~-PNQLEIG%IY6{nyZ@%x$oO93Pj$fHB zWC^U@`#)Cf#wzkeGjYRI<|?U>HDa4pVp|8s6?5dH ztOIL}Tp0&YNjrI&)KgDT*A1QDaYA;RDaC`M5Onf7XTIl--yYtc@9l$hVD|%}44bIL zp{2}uA|MxK*$Iejs?^@Oty9im9bY_y;XXokHwuV1#@t`fvtKnUrEA~#K(b#Huj&fR1 z$d=dAnTe<;blPKWr|T=7^H}Ig-ceix=jA=_N)a-7%3UsM+qLaan&-*aF?@FeGQQ@h z2S54ZNYu`1l69o;x~|I~{2J6eR&zz5Sin8Ow^s@IZ>*hRtonz6>&PR=6X+qCD^6J8 zIj~v4LI}FP$7?rvsGN1a13_E^HpL5<1s6{4;unCcMnv|>VdCv?2=TzWL_Rf+jRv`G zd_mq#*al_`+yI`4aWlrP7*ED{D#p`eo`5)+n0+e7voW5Fy`M)8vno8ndFzy9zHmHk z9g9%uDd-~g*(vjNelix?mA=k79Znspxbm4UjKnFEA#_NWMlv=rogJAvLc%DKx8klX z`hshV{?D~V(Y0=Bt0jc5%}_~g@<726NwtMMag;7l>iSL?dfZi%hFHvcq~B;9!|WPx z1Vm$3xLuf|3LET82gv407&b!bHe4YYK+xt#Tb(nVr_>1op&Z31)s@K!-in)X%HfXy z|9ngCkw5aqo>d)~#4sLb3q9-7APIDkA~Ul+YjKc9ktOB%o^@xCLs2BNm7ewLpoC&} z_+({JMlnaKi#=<1P(d+IN^=;XiehQ(vy5V8?6ZoZHuPx@)=;dEeEzx&;sO#RKa*Sa zIh~<2fTE$GETt##Mfk{})Vp2BA3vF)w9RFxd>*hsP$~=HE~gP@5U^-jL?|K5B9sy4 z5Gn}s2vvjy09}gptlbS<>?aHdTFYJPC?$ETt5^tTc=P%AT;}_f)(yD~F+%*XK9DOI zGc|!>`}aXX`y!h(xuLs=LDE>IR2lN_<`%p#6D^aCa3e);22F# zj9kYs!&sQU&RiWe{yn(~66*?U08dTBFdmVYACbjpR>^qjyRV)RxD7T)apC*(d--96 Fe*y3+vY`L~ literal 0 HcmV?d00001 diff --git a/src/core/config.py b/src/core/config.py new file mode 100644 index 0000000..f33c436 --- /dev/null +++ b/src/core/config.py @@ -0,0 +1,23 @@ +from pydantic_settings import BaseSettings +from pydantic import Field + +class Settings(BaseSettings): + reload: bool = True + host: str = "0.0.0.0" + log_level:str = "info" + + database_url: str = Field(default="sqlite:///./database.db", description="database") + + # API A + api_a_title: str = "Microservicio A API" + api_a_version:str= "1.0.0" + api_a_description:str = "Catálogo y reproducción de contenido" + api_a_port: int = 8001 + + # API B + api_b_title: str = "Microservicio B API" + api_b_version:str= "1.0.0" + api_b_description:str = "Encargado de recomendaciones y \"Mi Lista\"" + api_b_port: int = 8002 + +ConfSettings = Settings() \ No newline at end of file diff --git a/src/database.db b/src/database.db new file mode 100644 index 0000000000000000000000000000000000000000..e01dd62d2aed8163055a2af4f2b35179596a746a GIT binary patch literal 45056 zcmeI)&u`LT7{KweUmZn;mxU!B)^J)A^`PfPaiT6m#u!tVXz(3$t_fYWMKeu2;N8E) zf5nrD@vPaw)1oGt9V`@(($+13Ll0jPLgDTEJP)7uX~>%ia)wcT`a{DYLQgY2jh|OZw@BcIsQ| zh4R_`kOu+?AbtyK#7YC&Bu-7Y**bLS6}Q#VVhKbE?Zi%Oc)+KWj!yXDrq z8d2}QUOy0J+d4ALZq@$S%2{=eP7kjyaF*uG%h^@8taLgH?G%fbRV5kSDC&cJW$j+R(mg9! zpKmy@n!}^z%KH6$WmnxO?5Zn0cSUgTF%~ZzxHxO?z(6i z4dHKdF>}7;y}4o8dqbKt^}mZu)J#W=USwkW40CTzSXOUDYhO!voxB|E!j_j-gKO8x4Il(x06Knxb{~=I*9n${fe@XNRf~KmY**5I_I{ z1Q0*~0R#|0V0?kjP5tiv|8)FVL_h!m1Q0*~0R#|0009ILKmdVw3JmuDzvEdSRUv=? z0tg_000IagfB*srAb`O50)zek&+%gs0RaRMKmY**5I_I{1Q0*~0R-YH!2Um;>q1os zAb7ADQDx#w8X42q1s}0tg_0 P00IagfB*sr#7E#SizX@W literal 0 HcmV?d00001 diff --git a/src/domain/MicroservicioA.py b/src/domain/MicroservicioA.py new file mode 100644 index 0000000..dd5675f --- /dev/null +++ b/src/domain/MicroservicioA.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass + +@dataclass +class MicroservicioA: + msa_id: int + perfiles: str + idioma: str + calidad: str \ No newline at end of file diff --git a/src/domain/MicroservicioB.py b/src/domain/MicroservicioB.py new file mode 100644 index 0000000..027ad7b --- /dev/null +++ b/src/domain/MicroservicioB.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass + +@dataclass +class MicroservicioB: + msb_id: int + metodoPagoPredeterminado: str + historialFacturas: str + fechaProximoPago: str \ No newline at end of file diff --git a/src/domain/__pycache__/MicroservicioA.cpython-314.pyc b/src/domain/__pycache__/MicroservicioA.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e315b04dcb10ca7f1c2f4f6fae1b5a236e6185e7 GIT binary patch literal 828 zcmZ8f&1)1f6n~kS{pfCYx2x73R7w?u!H*HzgWw_x9{g&-5qgnsh?!X$n3>chD|*|N zVvpYa55)f{ASj-^b-M>W`ZBvMtAV`yUfwUiy!VnD?N$SDeEs}Me8lyqb52KP4yJby zjGzxOc><4#A?vV5R$&8TZw+F9%bW4G=5*u5!8HggznmWuyOc1)c*eBmb4Iz$Pr>vi zx(xOAz>pY>*Y}No5hU!wCW*-!WOWn7o~i7Dsm4Ak2e!Q}xRN?mZv_|fAtxx|rW*lH zALsNbnjRUUPT#wG2$10JWq3jMNdzy+E4b&y15ZubOj{w@0U!F#(*DJu$Tm`N$Mm;NIx23<$=CYnD- z@Bw}-cgD{q6(D3%h0eM0_N3-;9a<~6zvOTO+THQOM$;863y2D literal 0 HcmV?d00001 diff --git a/src/domain/__pycache__/MicroservicioB.cpython-314.pyc b/src/domain/__pycache__/MicroservicioB.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98645d7329bd91d75e9fc65561ac6d61bf9aac9b GIT binary patch literal 867 zcmZ8f&1)1f6n~kS-EOzvXl>mpr4@w5j}a^)SVTm`4=iQWi^nO-!Jd?KJv(w>8U#4`ugdk{DS9CPfk{42>Le= zbYTY)@)#ZwOO|1q%)<&K!2%@VS}@S94dpgSqD#=M{PMg>+<3|?;~6uC4;AGxjDr4E zqzv~Hzqck$EnJhEaHC$ zbN%%@H%Tcg3T2rUl)9z=1fxzrHFFEip9A;+KPG41KkZe3kX{v*R}Z6=-k2vfSX?@c z8ohB(>afr_jLsiVAn9Wye1?tYn5$7*V0T!rPHC>vPUbOo@}|SGp=XBDmej^(vJizr z_uNP?txm!5Y95DxjZ03MwOa0WtS|%R>6p04GD@37&-m{BC%C6)(Q5yDOH)2;3>iM_ z0QNzjIq_^XLpO2yJB86+ItV=LQ7QDvTy1^uio5zEQeVX^qd5u*A>Ux-JE{K;BGNbl OH2n~QiDOU81b+d_Bi*I| literal 0 HcmV?d00001 diff --git a/src/infrastructure/adapters/persistence/__pycache__/db.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/db.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7780850c3b3f3796ee051c58b6a130fb5e3b1c6 GIT binary patch literal 665 zcmZvaUuzRV5Wx3xn@e)Nrm6phmQt(_L7Jl=lz{a?MG~+gR|p7AkImjBIeNDnclX4; z1;2prJ}LO(H}GRLC^RgHh)=#*+7IBKN$HETFgr6l^J8Xr?^PFFWF+|bE`Dzz^ecBR z#F-mspNug^2Pm-GsAVZ@Ew>BpLd#Zm3oHE3x7)>*qntI=wboJBc~QNf4pf@ zq9Q^oC@2PwZ|zz>3QF6BS*0p>Z9^;vj#=exdmgQH@jALchbuRz+(C8sckb6My+{QR z1tG9O%%EP-o&+gl&Qfv+Lf0ao2@yoauOaLa38ut*%vpaAl#1CvYDd0GVg-7c4uKwq zlB5u-p@BwE^IXaq1FAwI2C{Bz+>2SHU6LtId78#bS8}_bWODetzMx%0BZ)z!MeL_P?#G)dVz8Q4a4up1ChUg_9CK4-ej1GL_4#Qw6`}K=ozOZ(fE-$|BTK| zKGM7Xkf-1a9&!H(r&$V2Ngv*r8Q5kjr7s2bW7Zc$Dv?o@3GhioMhb-VM@Gd`0i)nY zy~gNBmmj1&$`W`eZW_AzBuKtA>W^(%)_1h=12v8QS-COAwG+HL!K>4)=9m4Goz7&Z z^KGkheC6(kY_hz0ynk?Bv|VTHoVuvCGOa94m#$5#SIL#dSmf E3tQs0xBvhE literal 0 HcmV?d00001 diff --git a/src/infrastructure/adapters/persistence/__pycache__/microservicio_a_repository_sql.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/microservicio_a_repository_sql.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33060eeb3a47c8813fa78cb4ff622051f746489f GIT binary patch literal 6043 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 literal 0 HcmV?d00001 diff --git a/src/infrastructure/adapters/persistence/__pycache__/microservicio_b_repository_sql.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/microservicio_b_repository_sql.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb9da066086c8a165dc2712804613aa419f67bc4 GIT binary patch literal 6118 zcmdT|T})fa6`p&q|FOX&A&>-&fneeUOtOR~*`VEpY!a+C#Br!qZM?BA_9a}^_9b&K zS&&v;9x4@7sac*#)P3n&kt$W{Q~OYO(t%xo6It8PA+K-#KUIT(ieTpv?aEvApjgC? z{G^}>j26O{NvmdMv?Xktv}<-oTf>e?r{-j|E$o_X(wZ1;54$Hlnx~tzkscCtw3Ddw zefveh_&u#T>gprGrZ2G>P{SmaZ?#s-`B5bs05Z zZ0s%rA%a@oCmI(e8h_uZ3CD>7N@^#XB}PWLDBn)fj;H{&SFkHmV`Cf}0DLQ-3x(y*8k=QW9{!}CyqVx??S8qQRnUt%UfOXrnP zAEra|OS&VGkh8LuNa&{<>@{Rcp*^cjP%V=erv`rg){5m<_FZTarVVq4MQxB>KlF@o z%dq?V{Nsw7 z>_D({{X6Wf@?2wFq*AUZ4_u2mwEP9Gt=uxHD7gePW0~h;B!Z?;QzEG7niAtL7PZ_> zPJv$Qj>ApX6w?m7$#nfOZ8Za+IbHEv@piL+nvZmtbomS1I{E-^9en_|o<8_XMcF>$ zC-G);ZW~Drpw%3>@>Wx_{4MV`jz`K$lruFq$I0ZX&_!e}Cl^?{p|Y61AtK5|Rrk(H$vH7Xl|?zjhI}(PJtt9VK=q4;Tk|Vf$xo#R zFqAI&KajOKzcwdo{*{?;FYaMhad2eAk6s*M&X1rL}p*y6q-T&tvkQ>)RuIdFs5oGw1Hya{FE! zIrnVvz0D){p1JRBTT$X0)eSrN)Om7ZlzcXN;aWhb@>Zx9{NFtfRU>Z&9*Y}12|~qU zcrS{`(QQ-$1IdE#vZV3k@g%^(BWftZrP6oN6UfDh0@#Bs=8ard*A9W|>9MET=O>03 zZMdW&kUWf0VWsfY;xAcF&C%11o~{6$dMAIZ`OtL>RaI-bEV%zbO&fZ;*-Rs(M1NCwLUK8=0 zDzta5f4KHxAsEUBZ{~tG3%vvR-YdD@D}|mwzUNY|=hD8@>S^9_!H^vsyiM#**T26a zK&oh3e;6m@qn0W&#?Z;k7*DW~8Ao|EqwEKD-B!RvyY{jSFR z1`JXCP%&d}LSu&Nsk)7y-~8;4mgfUwjMX5_`oPlv`!-#+{CeRs#$BGQz(k#(Tfzh% z;~^HY@&I(*Nida*m%=UBbe%B%I`$8;M~XjC@riOKDllD|GR)t_%%2W{oMHU7Svd`{ zi=Cftot0_P4b{M4qZk@6OjKaN3=9r5?}?>ws&PVSO0h$qg{c4q-ec?bHT$|}&GX6J zrgtFk4duL{-!1K*6wmc=C;c`^sp!a=UAwJuZiis~^se#!wmG8< zgEcvJSN;#pnPru*f!Y!&nR&UVG8;W05MdfpQ%pE@!*!13dZj>6mFv}v!e*qD&6PXL zv&Bm}Y_ycQR_1y)rfD~f3pUjthyDP#hTFRYlx~A;3A4aHWaC-V(^z4^qnDwo&ZHpn zXB5b#dK<+ILxx$>FJXr72bPX)i>;jSU@rA!bj#gSom&B>UcG4Pdd=ME#OQ>VeCEAy zjjPU$FhnqPLHuusE;FdG&|;|yEdn?#Yei_moYaUfbOgx50eB0f)Iq2i0FN^OVvV5% zzZ*W|`=_bDO+O#Iv%{DMDsk;*DelFw`xEdP|HDB>hzZ{gGJr}xQZKm@vX~FBazLOF zvbb|oqJ%Y*M@US_mcrHnC~ke)@oH_Dh$H*5;^_ggoa6zV3E6=4%@ zl%-qipWR&h#Ad0>~>BO z=&ZsEm--G=uYLh%^cBxp&+gmc!D<^{t@hu5%i=cP8239M#b$Z-{z*(twpoI*--+Jw z>#{p!Q%(h2^k(&8T1+SBq|8zXUfL+S$ttF_m^5A*+EPkJl(V7gS5Ri3`k**JpO%xb zM z+^EwH!oq^_1mYMo4*D$`g)Y>-dJd{>f#bNBr1vEWz9i>gk~=TS+w5;_&+;C}#kps_ LZ+=Y}#U}d?PF7@J literal 0 HcmV?d00001 diff --git a/src/infrastructure/adapters/persistence/__pycache__/models.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96a9e56fd61b444845544077c171bdaed6b8922f GIT binary patch literal 1322 zcmbVL&u+V|j-H~?BhN@^t&x_ctX4^tT4hyk*~)G?%2_nA(wf`yl($Ic$W;=S z7f5JtdbcpAS;`->4zlhU_FU*)BMtvAv!&r^_q#kP(oB16nc`a8?t_A zBkP>9=T2C&_aj^RBzrz|)zs)3+FzG!J&$>!r&AF@E;&3Gk;qy5bxEJ!0g*D;r$6z1 z?T9SqdrhR>A``m>hiNSOHF?~qYM;`KrJPb-p)}3oA~E(9rMm@7P9hg5?Fx`85gE^N z3|A>ttdsCj9L)W|M$m3585J>@VQPPeLsukRYFES}Pnq^2mWY_edX7@5m=Y0X3Y*?3 z6ql633?4hehv+B4cAoM8@;DDx^QcI9rewhPu+;3ERLVd?6o{+~Oe!cMRR9lI%ytw9 z8Q^=Rkcwv!5AaGnk;^;#V5Bz$Q>k1*cuC&YulLs9&nz5x{q|vfFmu1xd{?`4FyD9H zveR5cQ7{l#lek!9b>b1Up#~>Y*YZ$j5BMXZeY&9yn%_ac2387Ddh^svcb0U4d5}ymZu_Pajs{!vFkYq zmNc0e36uI_mq*)d1M)qQ4v)ZPliIv{)V?o`wK#?<8u9_ccr;5l`wNHhuh$1lKVbXO zn?H1ZX%CjZ|INNK>CT;X2X=jw-ei8jyvF+6GJ%-3!l7<_P-r{M)%<>+-Kn list[MicroservicioA]: + models = self.db.query(MsaModel).all() + + return [ + MicroservicioA( + msa_id=model.msa_id, + perfiles=model.perfiles, + idioma=model.idioma, + calidad=model.calidad + ) for model in models + ] + + def viewById(self, msa_id: int) -> MicroservicioA | None: + model = self.db.query(MsaModel).filter(MsaModel.msa_id == msa_id).first() + + if not model: + return None + + return MicroservicioA( + msa_id=model.msa_id, + perfiles=model.perfiles, + idioma=model.idioma, + calidad=model.calidad + ) + + def remove(self, msa_id: int): + model = self.db.query(MsaModel).filter(MsaModel.msa_id == msa_id).first() + + if not model: + return False + + try: + self.db.delete(model) + self.db.commit() + return True + except IntegrityError: + self.db.rollback() + raise MicroserviceAlreadyExists("There's already one registry with that data.") + + def editById(self, msa_id: int, msa: MicroservicioA) -> MicroservicioA | None: + model = self.db.query(MsaModel).filter(MsaModel.msa_id == msa_id).first() + + if not model: + return None + + try: + model.perfiles = msa.perfiles + model.idioma = msa.idioma + model.calidad = msa.calidad + + self.db.commit() + self.db.refresh(model) + + return MicroservicioA( + msa_id=model.msa_id, + perfiles=model.perfiles, + idioma=model.idioma, + calidad=model.calidad + ) + except IntegrityError: + self.db.rollback() + raise MicroserviceAlreadyExists("There's already one registry with that data.") \ No newline at end of file diff --git a/src/infrastructure/adapters/persistence/microservicio_b_repository_sql.py b/src/infrastructure/adapters/persistence/microservicio_b_repository_sql.py new file mode 100644 index 0000000..845f9e1 --- /dev/null +++ b/src/infrastructure/adapters/persistence/microservicio_b_repository_sql.py @@ -0,0 +1,99 @@ +from sqlalchemy.orm import Session +from sqlalchemy.exc import IntegrityError +from domain.MicroservicioB import MicroservicioB +from application.ports.microservicio_b_repository import MicroservicioBRepository +from infrastructure.adapters.persistence.db import SessionLocal +from infrastructure.adapters.persistence.models import MsbModel +from application.exceptions import MicroserviceAlreadyExists + +class SqlMicroservicioBRepository(MicroservicioBRepository): + def __init__(self): + self.db: Session = SessionLocal() + + def save(self, msb: MicroservicioB): + model = MsbModel( + metodoPagoPredeterminado=msb.metodoPagoPredeterminado, + historialFacturas=msb.historialFacturas, + fechaProximoPago=msb.fechaProximoPago + ) + + self.db.add(model) + + try: + self.db.commit() + except IntegrityError: + self.db.rollback() + raise MicroserviceAlreadyExists("There's already one registry with that data.") + + + self.db.refresh(model) + + return MicroservicioB( + msb_id = model.msb_id, + metodoPagoPredeterminado=model.metodoPagoPredeterminado, + historialFacturas=model.historialFacturas, + fechaProximoPago=model.fechaProximoPago + ) + + def viewAll(self) -> list[MicroservicioB]: + models = self.db.query(MsbModel).all() + + return [ + MicroservicioB( + msb_id=model.msb_id, + metodoPagoPredeterminado=model.metodoPagoPredeterminado, + historialFacturas=model.historialFacturas, + fechaProximoPago=model.fechaProximoPago + ) for model in models + ] + + def viewById(self, msb_id: int) -> MicroservicioB | None: + model = self.db.query(MsbModel).filter(MsbModel.msb_id == msb_id).first() + + if not model: + return None + + return MicroservicioB( + msb_id=model.msb_id, + metodoPagoPredeterminado=model.metodoPagoPredeterminado, + historialFacturas=model.historialFacturas, + fechaProximoPago=model.fechaProximoPago + ) + + def remove(self, msb_id: int): + model = self.db.query(MsbModel).filter(MsbModel.msb_id == msb_id).first() + + if not model: + return False + + try: + self.db.delete(model) + self.db.commit() + return True + except IntegrityError: + self.db.rollback() + raise MicroserviceAlreadyExists("There's already one registry with that data.") + + def editById(self, msb_id: int, msb: MicroservicioB) -> MicroservicioB | None: + model = self.db.query(MsbModel).filter(MsbModel.msb_id == msb_id).first() + + if not model: + return None + + try: + model.metodoPagoPredeterminado = msb.metodoPagoPredeterminado + model.historialFacturas = msb.historialFacturas + model.fechaProximoPago = msb.fechaProximoPago + + self.db.commit() + self.db.refresh(model) + + return MicroservicioB( + msb_id=model.msb_id, + metodoPagoPredeterminado=model.metodoPagoPredeterminado, + historialFacturas=model.historialFacturas, + fechaProximoPago=model.fechaProximoPago + ) + except IntegrityError: + self.db.rollback() + raise MicroserviceAlreadyExists("There's already one registry with that data.") diff --git a/src/infrastructure/adapters/persistence/models.py b/src/infrastructure/adapters/persistence/models.py new file mode 100644 index 0000000..117680d --- /dev/null +++ b/src/infrastructure/adapters/persistence/models.py @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Integer, String, Float, DateTime +from infrastructure.adapters.persistence.db import Base + +class MsaModel(Base): + __tablename__ = "microservicioa" + + msa_id = Column(Integer, primary_key=True, index=True) + perfiles = Column(String, unique=False, index=True) + idioma = Column(String, unique=True, index=True) + calidad = Column(String, unique=True, index=True) + + +class MsbModel(Base): + __tablename__ = "microserviciob" + + msb_id = Column(Integer, primary_key=True, index=True) + metodoPagoPredeterminado = Column(String, unique=False, index=True) + historialFacturas = Column(String, unique=False, index=True) + fechaProximoPago = Column(String, unique=False, index=True) \ No newline at end of file diff --git a/src/infrastructure/api/microservicio_a/__pycache__/app.cpython-314.pyc b/src/infrastructure/api/microservicio_a/__pycache__/app.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee8f31bf99c013de759c2d1ea8361be9a03c324a GIT binary patch literal 924 zcmZ8f&1(}u6n~T5O+vo32u+D45iP=2%=QpeFchSsiJ-(4JcTaHX3{PsJ7IP<=xq<) zz4Yio=&65BK!_~K$y0BY2)+7dw~H|k=FRWDH}7-aqe{5|NayEY-3bBsC54nSH(>Py zK?uiSk}h^BtU5dt5rp*h9w0w(w=#`_WtDl#Qvu*?<`@nG=kuCwzl`vJpHU`@Z3G$8fzN z$69&dU?6JP6W18K4re~)Q`d2sWutD=oP3T-mSuY$6Skn1#Y>n%!{gsU7Q!`Xp7!fK&@mIxaihG0dsc7%(K5xu@aQTFT7Ir>&(!U+=?}I3vsek=@G|2hjH3;a8uorq$U0T#c1Nw=Eh<)*UFCzynr}-QhmNXW`kfv5BV;pl*5fz VvWSgrLDJZTxg&mx?2njI6|$$G;&@{ty%kKnU(FC z-Whk>trlEBB4{641l97;2c+HA5{U=2;t$wJ`~gS~QZ*`~2wwW;(nyQgmp$i>#~*1M z1?|gT$>*NAXU@HM&hLErNFp93F!*1una_p^`3@g~A$OSj1xiShoF_V6AbIN2yyQyL z_$)2RdBs)oAvcs)T{W+{T0ZQCg-l+E@XA6gKjaQglh^1zGT+(OjlULO+#4L$ zoAuBjoT72cR`rL);8MDkShw+PM*|c&x zvn|JTEq)oqi9wl1vt=}R$LK@_9-+T~3P_U_$a(4McL=G#+7x+}zD{*o1c^U%sgIX? zd{%~!Q|?OemKU}eUoor9@l>;7S~bJd%0|_!7)<8!d&}9^ts2X6 zt72t;W0e~a&a#GWW^4T)T{8NgnKNf!_J&F& zqh7aM!)2usABV#t@N>|kn&jUkLZkPP+#GG=^tZB@K7TF8hN5VhGc;9fBbJNH|4ik=@_IM~Y#G+O zqYKwfSlS_61mGeMgDU{`5m3=bKt&$`6+KP+p}M;XQ1MB)Cjx_>Ab{a%=nSgWLEw(kX-PBB4iGTYiyrfvUC>wl_%g;PxW_OgN$L; z-3;ZUuB1hW|Eui`>BFgtV#TA&Yei2@10 zwWWfz0@t1*MRYnbbcje@?!{+8f{#2m-D z9@k|47_K7rp30fisJae*NH_En0)I5yZ!ZH5d=7*&@N<3z1U(?NG4VueV!oAlvib6z z_}I15d!>&Gt@wfFOLw&RTW|OwcWd-WFWlNuGL&qd=~)r(F2>J>l^*~-eh|oZP-a2? zAe86+AED$K{1$~{g4+TWKZ>6*fX%K7t1>?=cF=ho-a&-A=!|WQA8(C6(Mp{7pV7fP z2_Me`vxAC`Xo{iB#U8Kp_^bleJtP9t_rk$~kdgQy(D$pwHj#>s=o|)uk($Iv1#dfa#q_x&rY`_ckb+w7(QU~gRYWUR87{`|_pe~B#ir5TN5=ivJ#UizVhB>b?w{o;bvjvqrJ$_#!N6nRKB zL9t0NXg{&gblmw#c;giOoGU=KCY!dRVMU+%_@#fXY$VRF%C|-)|1$ml^e5`|>DI{8 zt7GQzb41O zjU@k^ZmM^v_HO!Wdi7k3j%-TMDc_fglx!o{P7x{m?w+fAR$q8~`d%O#*&=(TMJG2U nsLQChyNz6X4=V1xx_9+Ti>AB6sXig@>T5zS5Sl+oL00%L=sCDJ literal 0 HcmV?d00001 diff --git a/src/infrastructure/api/microservicio_a/__pycache__/root.cpython-314.pyc b/src/infrastructure/api/microservicio_a/__pycache__/root.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a19eadd40f61948a18dc3278c92428d91b204dc1 GIT binary patch literal 730 zcmZ8e&ubGw7@gVQDVu0wL8(exJS|lRwBDprG++*iVTwJa%Cea>3)$T;Gb`3p#Dh`~ zO;5c>Jc$2|;3bR*6}@;l@VG`-p85|%w%XA;g0JUc8sAbK*mOP_*+o_~?#F zP0+k^0*u6<7PYBEU1CCZPq|4Lb>oyN~5{{?05+R7-5sA|d4~67;By-M4*pEpPM?3?^7jYD4&qFZCeY^B}>D|LO%YTdlcBUpW%6~OG Gar*~U?Vaub literal 0 HcmV?d00001 diff --git a/src/infrastructure/api/microservicio_a/__pycache__/router.cpython-314.pyc b/src/infrastructure/api/microservicio_a/__pycache__/router.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa3f284c4d66301793467d2ef6a06e6d50618687 GIT binary patch literal 630 zcma)4Jxc>Y5S`7PmoH;tAR?%!SV$1>ECd@B1PjwhIBa7$E*m}YvSD^l)GB2_!5?Ae zztPHLA)r{<1r%#{H9;d5ZZZ4jO5DZC>t zL7K>z*e|DKvgvW*wFA_{$+e)>L>0iu7ZFlhCF~Kgy7$wk98FEjF>Fxe^{)j)j%;0Ma|4MIo{=6Z0@gUVC7csbLt9>IEm(mj-7b284( n#hIDA^lU!~Wa FastAPI: + app = FastAPI(title=ConfSettings.api_a_title, + version=ConfSettings.api_a_version, + description=ConfSettings.api_a_description) + app.include_router(router) + return app diff --git a/src/infrastructure/api/microservicio_a/microservices.py b/src/infrastructure/api/microservicio_a/microservices.py new file mode 100644 index 0000000..af360e2 --- /dev/null +++ b/src/infrastructure/api/microservicio_a/microservices.py @@ -0,0 +1,79 @@ +from fastapi import APIRouter, HTTPException +from application.services.microservicio_a_service import Save, ViewAllMsa, ViewById, Remove, EditById +from infrastructure.adapters.persistence.microservicio_a_repository_sql import SqlMicroservicioARepository +from domain.MicroservicioA import MicroservicioA + +router = APIRouter() + +@router.post("/") +def create_msa(perfiles: str, idioma: str, calidad: str): + service = Save(SqlMicroservicioARepository()) + + try: + return service.execute(perfiles, idioma, calidad) + except Exception as e: + raise HTTPException( + status_code=400, + detail=str(e) + ) + +@router.get("/") +def view_all_msa(): + service = ViewAllMsa(SqlMicroservicioARepository()) + + try: + return service.execute() + except Exception as e: + raise HTTPException( + status_code=500, + detail=str(e) + ) + +@router.get("/{msa_id}") +def view_msa_by_id(msa_id: int): + service = ViewById(SqlMicroservicioARepository()) + + result = service.execute(msa_id) + + if result is None: + raise HTTPException( + status_code=404, + detail="Microservice not found" + ) + + return result + +@router.delete("/{msa_id}") +def delete_msa_by_id(msa_id: int): + service = Remove(SqlMicroservicioARepository()) + + result = service.execute(msa_id) + + if result is None: + raise HTTPException( + status_code=404, + detail="Microservice not found" + ) + + return result + +@router.put("/{msa_id}") +def edit_msa_by_id(msa_id: int, perfiles: str, idioma: str, calidad: str): + service = EditById(SqlMicroservicioARepository()) + + try: + msa = MicroservicioA(msa_id=msa_id, perfiles=perfiles, idioma=idioma, calidad=calidad) + result = service.execute(msa_id=msa_id, msa=msa) + except Exception as e: + raise HTTPException( + status_code=500, + detail=str(e) + ) + + if result is None: + raise HTTPException( + status_code=404, + detail="Microservice not found" + ) + + return result diff --git a/src/infrastructure/api/microservicio_a/root.py b/src/infrastructure/api/microservicio_a/root.py new file mode 100644 index 0000000..a84bc57 --- /dev/null +++ b/src/infrastructure/api/microservicio_a/root.py @@ -0,0 +1,16 @@ +from fastapi import APIRouter +import platform + +router = APIRouter() + +@router.get("/") +def root(): + uname = platform.uname() + return { + "machine": { + "OS": f"{uname.system} {uname.release}", + "Arch": uname.machine + }, + "Status": "Running", + "Docs": "/docs" + } diff --git a/src/infrastructure/api/microservicio_a/router.py b/src/infrastructure/api/microservicio_a/router.py new file mode 100644 index 0000000..a87a049 --- /dev/null +++ b/src/infrastructure/api/microservicio_a/router.py @@ -0,0 +1,17 @@ +from fastapi import APIRouter +from infrastructure.api.microservicio_a.microservices import router as orders_router +from infrastructure.api.microservicio_a.root import router as root_router + +router = APIRouter() + +router.include_router( + orders_router, + prefix="/microservicio_a", + tags=["microservicio a"] +) + +router.include_router( + root_router, + prefix='', + tags=["root"] +) diff --git a/src/infrastructure/api/microservicio_b/__init__.py b/src/infrastructure/api/microservicio_b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/infrastructure/api/microservicio_b/__pycache__/__init__.cpython-314.pyc b/src/infrastructure/api/microservicio_b/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f0ffdfade9995151de51c42d8b32b09315ea4cd GIT binary patch literal 181 zcmdPq_I|p@<2{{|u766{Me$pPQ;* zl%JBX?~$7kkcmc+;F6;$5hu*uC&Da}c>D`Ev&0dhn!i1CS;k&&^88OQ!BCKjCV~9XE>V(%3aJ4@<@`oRXnRbWFdTjBjxF5fIjMW;T<_89nwWhLN>un z%7yg7U{p-F&!w}BJz#v)6M>9-H+o~AvJtg8>ofZWb0;I}i@>HIdk7wlg1`>AYkU5H zW37DRVjybw#-2U$T+RZ@r=IIE=NNV4+W1qHcbuN@Gtm>&ad;k6=y-x#$U?XRo!s~> z+1ac3TA>MNp`qW8Qfy=(|_f#Bo{B?J@tTf8GoXTONnwL-!kNX*d5Ei+uulf1T z{%mJ|QNBMf*JtJWqVix~Y0N5(Ke}Qbgol?I(6e)Gd!}ulO@C;WpJp+9%?s%N)-obv zfWMBV#a%?E%Q&sMxT)Sr(vtQ6V$|?yZDTQNYvsoUoAtLg z)qV5uK3uvwNpx+JR7QI`QPA1zNeAhGj(@WMhS(FH4)op-gg1nS-Vg_!gM(*#yx!Lt z0iE!W&N%2C+Eyn5I?*AWgg!b;(y{xfmX_Q=c5y+s8V=)bIJdO4_{!B1t2?GuOZ!~q zoNXvOf7QY7K$gs?%nG!m@<8-0|kI+9n0i;Rt5{R? zt*d5LsDQz;?QpoLD;BRBj*W)ybC)xhtSZZJI63n(tJJ8nnqz0!RRfqKRol+kyp%C( zD{!d88+ba)7sT8vpL>^$U%xJPAHq|l)Xf~c(cmZC`6)0>Qs}yw6nal}qq`fGbva4$@}dtEwyb5E zm*zWqvt))85G=7&Ql3VD>Pi946-y_DP?uj)x~J>(IKl!8pp@#$NyVflc}d zn_%FYq) zU+_*eapUdx-oBkWe*5QzR`mRB|M~CkhQ>FE;tSr5B=1Zm?~WyIUjFcfO`jYMwuu}F z{--U2@OvBI_EGF0`AaApmj9l}`sH=M57-jy_f`+ETd=i5zz6_F9tT(#+9!ZTp8ytp z0$B7U9R%zCCV<7Kz)pk)V?jW}lgL3hkO4p>jM+%qVWev zZXFXBo`8K}5M0H=h!qCaf!SeD&^&!yNaRTu+`5#PR>16OQox`SONX4)<$i|dCHOey z?EOCh(%&ZrDmR;f8a1oX8x_aK59uXeMBtBZ zyKoI~;Bz3HfuH?jAQ%COjmhU)lk=^}^UYW9g~x9c-z$ESZ-w_aPv6tRfB3zZa(BiK z_0z2#BqQXO~2)-4``r|3#uJE;wH1`R??9*Rx3-9#A7sRIH1JUnp%e)c;+ww9Z= zqG3;;{`7PkPNXkOn}kF!N~`jn*wn|V4^p40H&dqooLi~~KYSDL_yU57IPG*Ej zu;ZgtRwL_LD0@U+k0-KE%j-}3fIpj_bhQwGcc>ggJ_&?x?Vat^-GKcR&GqAAWtcNv+W2JHBdc)xe(Hapc<;`pU z6IH9+sIZ^#pMnUByS)aaEmKOrB!|Bw?4N{vL4NZEIr>!~{(iEl-lN*P$?M70b1fR% zlwfRrC=)5(My{P8lK|LOj*egi;|i|0Mw@KIOj>waV`R literal 0 HcmV?d00001 diff --git a/src/infrastructure/api/microservicio_b/__pycache__/root.cpython-314.pyc b/src/infrastructure/api/microservicio_b/__pycache__/root.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fec5bdad485c6a4a1c3f14dad5d3abad022a2dc GIT binary patch literal 730 zcmZ8e&ubGw7@gVQDVu0wL8(exJS|lRv`48F4cJ3sm|{<6C@u1X0 z(^IeUr2aR8moOq!^x`d=f52~QlR)3$``$Ni=FQukwNh~b0otDq;|+|^Pd!Xwo{`B8 zkUn~fDBePku*A!n8(W4ncJV4&KiekFU9(Y`9-enI6!ok$pMr;YEIWt!*Rvl(|qY&C@ha_muT8i^MCN zw4epH@_OA+wlkh6J5R%eDM#!J$r9yq)@7k!T;~cfFF_Of->s-R>0}8bJZohH-13B_ zQV{kMj;FU0A&B4+iPJU@h2(i8bIwTEi%AkkJOjrUaTI6Io`XRqZ};|Q2***>sL>_^2on9cyio4Y7Xkd)nWBx?L%#N|4ZfW$gd2l$F-x{*ftjz z#vUq^2f@fI4cu|j^_?+tZD#_8C~%b9hCmR6>j&gTD9Yid&#cTn_CLXA#4l;JtX1z` zlC|sNjt8G?mHhmgqa5Oj$k=%AO7rCXTjI@Ut#$joe*CyzlvxBiCu zZ|c-CAQYXt2}b8;Oi80db9nQ6AHUyw^O%izECTX0?{A$u1n{Pu$uY)Ycq2g%PQXGX zC?bw>3I|GoqQ>Mc5$YyQ*Rd&Km|i%xL#p*|VkWRs&j*Cjrnu>JgwAWH zOn}fSA^b2O62WGT@mkxVYB;gww3<`~sAqGJ;(|;RX2h!XX&*DHE84 FastAPI: + app = FastAPI(title=ConfSettings.api_b_title, + version=ConfSettings.api_b_version, + description=ConfSettings.api_b_description) + app.include_router(router) + return app diff --git a/src/infrastructure/api/microservicio_b/microservices.py b/src/infrastructure/api/microservicio_b/microservices.py new file mode 100644 index 0000000..0a9fa85 --- /dev/null +++ b/src/infrastructure/api/microservicio_b/microservices.py @@ -0,0 +1,79 @@ +from fastapi import APIRouter, HTTPException +from application.services.microservicio_b_service import Save, ViewAllMsb, ViewById, Remove, EditById +from infrastructure.adapters.persistence.microservicio_b_repository_sql import SqlMicroservicioBRepository +from domain.MicroservicioB import MicroservicioB + +router = APIRouter() + +@router.post("/") +def create_msb(metodoPagoPredeterminado: str, historialFacturas: str, fechaProximoPago: str): + service = Save(SqlMicroservicioBRepository()) + + try: + return service.execute(metodoPagoPredeterminado, historialFacturas, fechaProximoPago) + except Exception as e: + raise HTTPException( + status_code=400, + detail=str(e) + ) + +@router.get("/") +def view_all_msb(): + service = ViewAllMsb(SqlMicroservicioBRepository()) + + try: + return service.execute() + except Exception as e: + raise HTTPException( + status_code=500, + detail=str(e) + ) + +@router.get("/{msb_id}") +def view_msb_by_id(msb_id: int): + service = ViewById(SqlMicroservicioBRepository()) + + result = service.execute(msb_id) + + if result is None: + raise HTTPException( + status_code=404, + detail="Microservice not found" + ) + + return result + +@router.delete("/{msb_id}") +def delete_msb_by_id(msb_id: int): + service = Remove(SqlMicroservicioBRepository()) + + result = service.execute(msb_id) + + if result is None: + raise HTTPException( + status_code=404, + detail="Microservice not found" + ) + + return result + +@router.put("/{msb_id}") +def edit_msb_by_id(msb_id: int, metodoPagoPredeterminado: str, historialFacturas: str, fechaProximoPago: str): + service = EditById(SqlMicroservicioBRepository()) + + try: + msb = MicroservicioB(msb_id=msb_id, metodoPagoPredeterminado=metodoPagoPredeterminado, historialFacturas=historialFacturas, fechaProximoPago=fechaProximoPago) + result = service.execute(msb_id=msb_id, msb=msb) + except Exception as e: + raise HTTPException( + status_code=500, + detail=str(e) + ) + + if result is None: + raise HTTPException( + status_code=404, + detail="Microservice not found" + ) + + return result diff --git a/src/infrastructure/api/microservicio_b/root.py b/src/infrastructure/api/microservicio_b/root.py new file mode 100644 index 0000000..a84bc57 --- /dev/null +++ b/src/infrastructure/api/microservicio_b/root.py @@ -0,0 +1,16 @@ +from fastapi import APIRouter +import platform + +router = APIRouter() + +@router.get("/") +def root(): + uname = platform.uname() + return { + "machine": { + "OS": f"{uname.system} {uname.release}", + "Arch": uname.machine + }, + "Status": "Running", + "Docs": "/docs" + } diff --git a/src/infrastructure/api/microservicio_b/router.py b/src/infrastructure/api/microservicio_b/router.py new file mode 100644 index 0000000..713cd44 --- /dev/null +++ b/src/infrastructure/api/microservicio_b/router.py @@ -0,0 +1,17 @@ +from fastapi import APIRouter +from infrastructure.api.microservicio_b.microservices import router as microservices_router +from infrastructure.api.microservicio_b.root import router as root_router + +router = APIRouter() + +router.include_router( + microservices_router, + prefix="/microservicio_b", + tags=["microservicio b"] +) + +router.include_router( + root_router, + prefix='', + tags=["root"] +) diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..de8502d --- /dev/null +++ b/src/main.py @@ -0,0 +1,52 @@ +from infrastructure.api.microservicio_a.app import create_app as create_msa_app +from infrastructure.api.microservicio_b.app import create_app as create_msb_app +from core.config import ConfSettings +import threading +import uvicorn + +def run_msa_api(): + """Ejecuta la API de usuarios en puerto 8000""" + app_msa_app = create_msa_app() + uvicorn.run( + app_msa_app, + host=ConfSettings.host, + port=ConfSettings.api_a_port, + reload=False, + log_level=ConfSettings.log_level, + ) + +def run_msb_api(): + """Ejecuta la API del microservicio B""" + app_msb_app = create_msb_app() + uvicorn.run( + app_msb_app, + host=ConfSettings.host, + port=ConfSettings.api_b_port, + reload=False, + log_level=ConfSettings.log_level, + ) + +def run(): + """Inicia ambas APIs en threads separados""" + print("Iniciando microservicios...") + + msa_thread = threading.Thread(target=run_msa_api, daemon=True, name="Microservice-A-API") + msb_thread = threading.Thread(target=run_msb_api, daemon=True, name="Microservice-B-API") + + msa_thread.start() + msb_thread.start() + + print("API del microservicio A ejecutándose en http://0.0.0.0:" + str(ConfSettings.api_a_port)) + print("API del microservicio B ejecutándose en http://0.0.0.0:" + str(ConfSettings.api_b_port)) + print("\nDocumentación disponible en:") + print(" - Microservicio A: http://localhost:" + str(ConfSettings.api_a_port) + "/docs") + print(" - Microservicio B: http://localhost:" + str(ConfSettings.api_b_port) + "/docs") + + try: + msa_thread.join() + msb_thread.join() + except KeyboardInterrupt: + print("\n\nAteniendo señal de salida...") + +if __name__ == "__main__": + run() \ No newline at end of file