From 2c391d8e4a6c64ee2330aff5809ceafac709b518 Mon Sep 17 00:00:00 2001 From: "Juan M. Ley" Date: Thu, 12 Feb 2026 17:39:59 -0600 Subject: [PATCH] Crud completo --- .env/pyvenv.cfg | 2 +- enable-venv.sh | 0 src/__pycache__/main.cpython-314.pyc | Bin 775 -> 789 bytes .../__pycache__/exceptions.cpython-314.pyc | Bin 422 -> 436 bytes .../user_repository.cpython-314.pyc | Bin 1559 -> 2212 bytes src/application/ports/user_repository.py | 6 +++ .../__pycache__/user_services.cpython-314.pyc | Bin 3231 -> 5310 bytes src/application/services/user_services.py | 23 +++++++++- src/core/__pycache__/config.cpython-314.pyc | Bin 1668 -> 1682 bytes src/domain/__pycache__/users.cpython-314.pyc | Bin 806 -> 820 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 446 -> 460 bytes .../__pycache__/db.cpython-314.pyc | Bin 723 -> 737 bytes .../__pycache__/models.cpython-314.pyc | Bin 831 -> 845 bytes .../user_repository_sql.cpython-314.pyc | Bin 3770 -> 5831 bytes .../persistence/user_repository_sql.py | 40 +++++++++++++++++- .../api/users/__pycache__/app.cpython-314.pyc | Bin 911 -> 925 bytes .../users/__pycache__/root.cpython-314.pyc | Bin 733 -> 747 bytes .../users/__pycache__/router.cpython-314.pyc | Bin 583 -> 597 bytes .../users/__pycache__/users.cpython-314.pyc | Bin 2283 -> 3587 bytes src/infrastructure/api/users/users.py | 28 ++++++++++-- src/users.db | Bin 24576 -> 24576 bytes 21 files changed, 93 insertions(+), 6 deletions(-) mode change 100644 => 100755 enable-venv.sh diff --git a/.env/pyvenv.cfg b/.env/pyvenv.cfg index d676224..8b8effe 100644 --- a/.env/pyvenv.cfg +++ b/.env/pyvenv.cfg @@ -2,4 +2,4 @@ home = /usr/sbin include-system-site-packages = false version = 3.14.2 executable = /usr/bin/python3.14 -command = /usr/sbin/python -m venv /mnt/c/Users/Rodo Machenike/py/Microservices/.env +command = /usr/sbin/python3 -m venv /home/rodo/Documents/microservices/FastAPI---Microservices/.env diff --git a/enable-venv.sh b/enable-venv.sh old mode 100644 new mode 100755 diff --git a/src/__pycache__/main.cpython-314.pyc b/src/__pycache__/main.cpython-314.pyc index b3693bf18b5e4e64d824cb641d04359ae49f3e3e..575ca770a944007dbd1e59b352e5c6402c18df75 100644 GIT binary patch delta 72 zcmZo?o65$m&Bx2d00hpTdp2?(VbpWe&&bbB)i26V$=7$uPcF?(%_}L^&&^CO$}dhW aD$7hxE!KBSEG}^j@YL1S-Tao0(jcUz}Q0 YmYJMdtnZdsT;dqusjI6ynUirY01Isw9{>OV delta 56 zcmdnOyo{M!n~#@^0SLq{wN2!{r{JZZn^&TrtRGsOT2!nbl%JBX;G3A7k(!s8ovL3@ KsXtkqaV`M9LVG>+d)nosmlqk{b z()s$-vbIPDs9V!WHVoH5)(*-`xI*Joi$$9GLyNib&|D;8+_kz$HX)kmUfy%of+BMu zC3cv^F>l-8kk7!nPrarD6gr20Ls4JuA(U zF53#Y9|o|S|CW;Cui9d2_&~+|VvAAQ*5fMkbcs3&{z{FaK?jNuM`RV~lKn4)Owm_| z4gZa(?vpn{b?aH;jQ^9RTpyhvjk>3b5v6q%GT1{s0=+*zCn;?$yI{h<7mdH06C~DnE(I) diff --git a/src/application/ports/user_repository.py b/src/application/ports/user_repository.py index 173423e..4adf654 100644 --- a/src/application/ports/user_repository.py +++ b/src/application/ports/user_repository.py @@ -10,4 +10,10 @@ class UserRepository(ABC): ... @abstractmethod def viewById(self, user_id:int): + ... + @abstractmethod + def removeUser(self, user_id:int): + ... + @abstractmethod + def editUser(self, user_id:int, user:User): ... \ No newline at end of file diff --git a/src/application/services/__pycache__/user_services.cpython-314.pyc b/src/application/services/__pycache__/user_services.cpython-314.pyc index 1c5f6ab84cbe4d22fee847121e4c22a3826698d1..653bbd00d54cb6f4176c11f6e62ea258cc0a82b1 100644 GIT binary patch delta 1256 zcmZuwO=uHA6rS15CfhV-)uw8!+JtCo)N~sSh>HJK+loO}Z72$*BqPSQiOz1sD%k45 z9}uOEpk8V`){B29FMA2$nke51i-^vY;UPirHI602@0vHWQTKNI5k_r#)YAfaLyWbpFe5D?XADPrUcGHU1Uk5-9`zPb78* z`%v4DME1BuS}M|Mc_eCpisjwlgQ!_EHE6zX9?`4d14m+c1Oa)^fD+nq5k-(v9_BsZ zZ-QZ`0cJ&zLe5jJ1XANFDk1f3lbl{kU8G*;-yVI_FT-3VYH)haFfAxRuUX)XkP~wX zCE3N-9)r`)~?7l&i$rP15J2brMd-(%bvzzoz3<+;pJgCIX?iG5rj1W zwih6dHeW)aKNw)Heq_xkff4fAXt;miDf?h_f^O!t6rC`lm6rELTUDoRC>(zlUqMKU zLwZv~3Kf!a1%kVoM4eCrT|TKTo)ukz<^CM(WA*k#N>?Byv*!W{envU%~u#-a4>34-ph3iNVafqV)oNypUfoUrMQxzNC;?h m5g(Aa#bJ}1pHiBWYFFe9=IiV1)p$(I)i( diff --git a/src/application/services/user_services.py b/src/application/services/user_services.py index 338d828..be58631 100644 --- a/src/application/services/user_services.py +++ b/src/application/services/user_services.py @@ -30,4 +30,25 @@ class ViewUserById: def execute(self, user_id: int) -> User | None: user = self.repo.viewById(user_id) - return user \ No newline at end of file + return user + +class RemoveUserById: + def __init__(self, repo:UserRepository): + if not isinstance(repo, UserRepository): + raise TypeError("repo must implement UserRepository") + self.repo = repo + + def execute(self, user_id:int) -> User: + user = self.repo.removeUser(user_id) + return {"Result": f"User {user_id} deleted succesfully"} + +class EditUserById: + def __init__(self, repo:UserRepository): + if not isinstance(repo, UserRepository): + raise TypeError("repo must implement UserRepository") + self.repo = repo + + def execute(self, user_id:int, name:str, email:str, phone:str) -> User | None: + user = User(user_id=user_id, name=name, email=email, phone=phone) + return self.repo.editUser(user_id, user) + \ No newline at end of file diff --git a/src/core/__pycache__/config.cpython-314.pyc b/src/core/__pycache__/config.cpython-314.pyc index 6c3e40fa2f6dfd815e6e30351d751d742b9e7f47..88c0388524b056a13f1c6c1503057a75f0c5a49e 100644 GIT binary patch delta 74 zcmZqSoy5zl&Bx2d00hpTdoovTD5z``O0AK+a_5c6? delta 60 zcmbQl+rrDM&Bx2d00hmj-~54T5i0V^na^&&?~*Pu34DPAw|d56Vx;SMW_t&PdJ6%udxW MsMOy)pK&T90L}FgvH$=8 diff --git a/src/infrastructure/adapters/persistence/__pycache__/__init__.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/__init__.cpython-314.pyc index 8475cf81e89bdf3422046e0f221787a91e39717d..523173f4bf4973eadd3f93604793cb08975fea1c 100644 GIT binary patch delta 71 zcmdnTe1@4@n~#@^0SKHw_iW@AWz@^l&&bbB)i26V$=7$uPcF?(%_}L^&&^CO$}dhW ZD$7hxE!KBSEG}^j@YL1So$SC^2LS)S7S#X% delta 57 zcmX@ZypNe%n~#@^0SH*nv~A=TWmHJe&&?~*Pu34DPAw|d56Vx;SMW_t&PdJ6%udxW LsMMeA$5;mdv|teR diff --git a/src/infrastructure/adapters/persistence/__pycache__/db.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/db.cpython-314.pyc index 55c050a828527f073ed7abbaa70943962c4591b5..c3ef8b56f76bfc0f78627287f7d27d3746c086a0 100644 GIT binary patch delta 71 zcmcc2`jC}dn~#@^0SKHw_iW_;#Hg2{pOK%Ns$Z0!lCSTQpIn-onpaY+pPQLnlwX`$ ZRF;{XTCDGuSX|;5;Hj&tJ6V=#8vr=O7w`Z8 delta 57 zcmaFJdYP45n~#@^0SE$E+Bb54VpNFI&&?~*Pu34DPAw|d56Vx;SMW_t&PdJ6%udxW LsMMdV&9n^w%7zh? diff --git a/src/infrastructure/adapters/persistence/__pycache__/models.cpython-314.pyc b/src/infrastructure/adapters/persistence/__pycache__/models.cpython-314.pyc index 0d134eef5fdfce123fbaa4ee93bed1ec6332120d..138ba89f2226b19527b1b3f7682f8654ab0a036d 100644 GIT binary patch delta 72 zcmdnbc9xA>n~#@^0SKHw_iW^T%&3>6pOK%Ns$Z0!lCSTQpIn-onpaY+pPQLnlwX`$ aRF;{XTCDGuSX|;5;Hj&tyP1#4kP!ewB^OKp delta 58 zcmX@hwx5k#n~#@^0SK1eYTL;Dm{B24KR2&LKUqJtIJKx)KPW#XU%@vqIU_YMGdoqk Mpi+Oc43i-v00jdQ8vp_B754dnt18# zCL&w{oEi~SRdZ;9C{cxklw)Nf0k^gX4qRFhfw78IA^reEq9)`5GrKkk1u=*3JkR^? zo0&Hse-rz5z<1Q=l>i%yyQ|tCp1Zy-2u+%V#oiz=g%UUc3t|w=2?dF%Vu}TiDV2cf zDaa|1@zM`rb#N(rMW4r6qF40nm|k9($5qqF&TD0&8<;F=Wo%^6&Kl9vj*YDGzd36(8o zB;wXJSH<^k+}pw~0t6PgzycRFuC6mK|)NJ)A5+00`UH>AF;d5qewd zp$Vs-?jxCgCIw+9Rh`jD0j7WoW|a14Zcuq1fG9|SDY_vApr5;zXS&<@f@28U@fE0n z5flR&%%HPV?+uR5R;#+HR`47)vAV$8qE;5LYU(O}S2IkldRZm-5+=CHnl+g5Jaawr z5-V%p=4BQ&+;$<7Vm~GbzYXc-!XJ_hGcnlhKsv1we)fh$@Vvf=i)`CQbn@C94+{7l z-Ox;(EDauHU+15GOvmMs<({U~EtX(iR&JbIId>zsl3P2uB_|L4-jbs~`Gb3pJ7YV* zabW#Xjy{s3TXOtySL$K!)c0M*hjOv$;*NboW*giKojjv}`^xcAh|0WQt)77n7V~p& zp8|kB5&N=}@NHOdzR1^GBa0YyF2Xx*w!5V>{r=GE4;Bf6gR zHG#|P+uME=w3V_aV0 z@*0=Z^iMelPtlw=9c%)ROZq)5yGn33%2|ABF<4vjicp$hZjQduPgi{j|1^XcuKAt< IE3lCK3)*Et9{>OV delta 292 zcmX@EyGxc&n~#@^0SE%`w`Gd5Z{!nVWQ>`t$Qa5~!V$($!WqP=%%I6Nc@|@yLbiTx zUWtCPerR!OQL%ndeoDTAZ(?#rYF=h`s(wMG{$?|#0A|Lj$?dF*85K5bvz=yQl%M>a zLy=KovLvSxqv~cGPIg9a1)yC;nn1!&bF&}UG)8ZEAX}5Ghz}&L10pzq#4Wb8%$$gn^;} DPSHP3 diff --git a/src/infrastructure/adapters/persistence/user_repository_sql.py b/src/infrastructure/adapters/persistence/user_repository_sql.py index d659514..61bc1c9 100644 --- a/src/infrastructure/adapters/persistence/user_repository_sql.py +++ b/src/infrastructure/adapters/persistence/user_repository_sql.py @@ -58,4 +58,42 @@ class SqlUserRepository(UserRepository): name = model.name, email = model.email, phone = model.phone - ) \ No newline at end of file + ) + + def removeUser(self, user_id): + model = self.db.query(UserModel).filter(UserModel.user_id == user_id).first() + + if not model: + return False + + try: + self.db.delete(model) + self.db.commit() + return True + except IntegrityError: + self.db.rollback() + raise UserAlreadyExists("Cannot delete user due to existing references.") + + def editUser(self, user_id: int, user: User) -> User | None: + model = self.db.query(UserModel).filter(UserModel.user_id == user_id).first() + + if not model: + return None + + try: + model.name = user.name + model.email = user.email + model.phone = user.phone + + self.db.commit() + self.db.refresh(model) + + return User( + user_id=model.user_id, + name=model.name, + email=model.email, + phone=model.phone + ) + except IntegrityError: + self.db.rollback() + raise UserAlreadyExists("A user with the same phone number or name does already exist.") \ No newline at end of file diff --git a/src/infrastructure/api/users/__pycache__/app.cpython-314.pyc b/src/infrastructure/api/users/__pycache__/app.cpython-314.pyc index a351659b293ef2ec4213c6f0e39ae30868183e0b..e0b647319b6d48a37123a20adee9fad99362b9bd 100644 GIT binary patch delta 71 zcmeBYpUcjz&Bx2d00hpTdnR%}(Tmg1$j?pHFUn8J*LTTJF3nBND=F5`%}g%JFHS8g Z%S=u!)^|%RE^!R-)YaA9%+J`s1OOWl7Z3md delta 57 zcmbQs-p|gh&Bx2d00i5Z+b42AQ3%k_%`4GQ)(=*~7svnr delta 57 zcmcc0a-4-*n~#@^0SH3xwr%9DU{na!&&?~*Pu34DPAw|d56Vx;SMW_t&PdJ6%udxW LsMMdlk#PwC*Xa^T diff --git a/src/infrastructure/api/users/__pycache__/users.cpython-314.pyc b/src/infrastructure/api/users/__pycache__/users.cpython-314.pyc index 36f244cff9efc74c82419206e4309b7ccd6c87df..97eae4fc43c72f00429ec459258b0b09efc09ea0 100644 GIT binary patch delta 1542 zcmZ`(TW=dh6rS0O*Ky)a>?C#)$F-9*7w5L2YN?OnJH?8}dQ|E7OhH zCa)<)=4lT(h^{ca@O-%ZWvYB9sy5GuXM4)`GHOJChlUyjFj#(=j5o!J8IF@e%Z^(c zs7655se`I{k1A%i^pQ-2M`xbVhw<_?&3fC) zl{||z!j35@q98IVYew9HBEr9tyIR`-)*5rnTJ)@i62xZv?r+E)wDb2(3Pv5Eo&mQ2 zdSGal;JO+c>_(Ub;YuLVX(r<6E4KC4!eXHyBDt)WpHbfohKy?%c!7VXPEAxKrh`XK z6QAsSh1O(y*~?JYiqYUq(kp_oc7Uv%4+qjT#?J&kxm;0Z>|0>)j*btOUUt0nC8xBU z7bG(Z)6l`^hzM_8ky$@tq+1Ix%Pkc=SBA~NHsxkPS&(_->VlnTqx_h5T8V)TUsoqj zu>I&i0OFYxL1(~p@d9h)FA}8vk5Sxp#ln#N2NzA!M_2~qC@cuef0(ji46%n=BySb0 zt*k8gJv7tbvsv=ST`#n`P;FyuvAS`}KJu7iw@FGli2!#JCF?^2L-LucvasA8{ z%Qt;uSwAb3K6M3Lwg)CvP`}03rQs1JLFSZMbz8f;o~P&gOmcY3wWyjh|5}N!1}-#g z+nDs#fGHi`y6_ch%EiF3fK6?3L{1W$W)#SbsFuCAWod}8(+C*usnqr077xv6|L1#2 zR2~~aE72`@odFo>o%*w&gd&2Ig1qFGgo3!PEtMCL&aytR z9%tP#`a|PjqSfe5a7c0J1h(5KOG|~chPo7FF7Nql#DgeI%pC=mWbY(GtRUDnB*xZ* zfIaN?hQq`kd?#=%1EIs zKBR405$}wbgB=AorL}`sIP}PptFgm~+jpaJ*iUjh8t77V9Q!D%3d^!81JBaH;_;Bj zDqdFqg)StalR$SSmoiS67K@j7>b8sbZ?aZ4^3Z6dksnKp`I4h>mS z?=cQdWY9u*OF+txmSSAojr!vu+kkbf$uGtc!Y`FlIwxy$;(a2X@bm53)z7qYsF-x& Nk4luq-;yOhe*qd^nH&HB diff --git a/src/infrastructure/api/users/users.py b/src/infrastructure/api/users/users.py index 463a353..f21c0d2 100644 --- a/src/infrastructure/api/users/users.py +++ b/src/infrastructure/api/users/users.py @@ -1,5 +1,5 @@ from fastapi import APIRouter, HTTPException -from application.services.user_services import CreateUser, ViewUsers, ViewUserById +from application.services.user_services import CreateUser, ViewUsers, ViewUserById, RemoveUserById, EditUserById from infrastructure.adapters.persistence.user_repository_sql import SqlUserRepository from application.exceptions import UserAlreadyExists @@ -30,7 +30,7 @@ def view_all_users(): status_code=500, detail=e) -@router.get("/{id}") +@router.get("/{user_id}") def view_user_by_id(user_id: int): service = ViewUserById(SqlUserRepository()) @@ -41,4 +41,26 @@ def view_user_by_id(user_id: int): status_code=404, detail="User not found") - return result \ No newline at end of file + return result + +@router.delete("/{user_id}") +def delete_user_by_id(user_id: int): + service = RemoveUserById(SqlUserRepository()) + + result = service.execute(user_id) + + if result is None: + raise HTTPException( + status_code=404, + detail="User not found") + +@router.put("/{user_id}") +def edit_user_by_id(user_id: int, name:str, email:str, phone:str): + service = EditUserById(SqlUserRepository()) + + try: + result = service.execute(user_id=user_id, name=name, email=email, phone=phone) + except Exception as e: + raise HTTPException( + status_code=500, + detail=e) \ No newline at end of file diff --git a/src/users.db b/src/users.db index fdae28b045c83ceaf184a1d78820b4dedf17fa9a..c120b74fceeaa854aed95dc0db7161537233d18d 100644 GIT binary patch delta 120 zcmZoTz}Rqrae_1>??f4AM&6AHOZYh$1Q;0jFY#~QEU565e_{YX4;KRvfCT^Wf5Q}f T!+!%)@IC(`$QRMM)r*fOZYjM_%}1~-{RlASx{g(f21lCD}$)MvR7$hUKSAR z<)l_Rl;$NSXXxctSegNWk)aU~sW7rKNNXxOrzU6SWF{s9DTnmj#LOJMZ#LUde36ZKeZsKeI9; Ok{6hGnH4z^ZUq36)kyUK