From e5d5c63763031e3bf3da7678b427f54a90684145 Mon Sep 17 00:00:00 2001 From: jon ander Date: Fri, 9 May 2025 19:23:04 +0200 Subject: [PATCH] Refactor user registration and update handling; modify UserController for putUser endpoint and enhance application properties --- .../GestionInventario/SecurityConfig.java | 2 +- .../controllers/UserController.java | 115 ++++++------------ .../repos/GenericEntityService.java | 11 -- .../services/UserService.java | 40 +++--- src/main/resources/application.properties | 4 +- src/main/resources/db/Modelo_Inventario.mwb | Bin 18224 -> 18267 bytes src/main/resources/templates/userPage.html | 8 +- 7 files changed, 60 insertions(+), 120 deletions(-) delete mode 100644 src/main/java/com/ieslamar/GestionInventario/repos/GenericEntityService.java diff --git a/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java b/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java index 6bec279..e32bcd3 100644 --- a/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java +++ b/src/main/java/com/ieslamar/GestionInventario/SecurityConfig.java @@ -25,7 +25,7 @@ public class SecurityConfig { .requestMatchers("/css/**", "/js/**", "/images/**").permitAll() // Permitir acceso a CSS, JS e imágenes .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasAnyRole("USER", "ADMIN") - .requestMatchers("/management", "/user_management","/user_list","/departamento_list","/userPage").hasRole("ADMIN") + .requestMatchers("/management", "/user_management","/user_list","/departamento_list","/userPage","/putUser").hasRole("ADMIN") .requestMatchers("/", "/login").permitAll() .anyRequest().authenticated() ) diff --git a/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java b/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java index 31f7ad8..334b4d8 100644 --- a/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java +++ b/src/main/java/com/ieslamar/GestionInventario/controllers/UserController.java @@ -27,11 +27,11 @@ import java.util.*; public class UserController { @Autowired private ApplicationContext context; + private static final Logger logger = LoggerFactory.getLogger(UserController.class); private final UserService userService; private final DepartamentoService departamentoService; private final CategoriaService categoriaService; - private static final Logger logger = LoggerFactory.getLogger(UserController.class); private final BotonManager botonManager; public UserController(UserService userService, DepartamentoService departamentoService, CategoriaService categoriaService, BotonManager botonManager) { this.userService = userService; @@ -110,14 +110,44 @@ public class UserController { return "userPage"; } - // POST: Registrar nuevo usuario - @PostMapping("/register") - public String registerUser(@RequestParam String username, + @PostMapping("/putUser") + public String putUser(@RequestParam String nombre, @RequestParam String password, @RequestParam String role, @RequestParam String mail, @RequestParam(required = false) Integer iddepartamento, @RequestParam(required = false) Long id) { + + logger.info("entra en putUser"); + if(id == null) + return registerUser(nombre,password,role,mail,iddepartamento); + return updateUser(id,nombre,password,role,mail,iddepartamento); + + } + + private String updateUser(Long id,String nombre,String password,String role,String mail, Integer iddepartamento){ + logger.info(" entra en updateUser jjknnjn"); + Departamento departamento = null; + User user = new User(); + if (iddepartamento != null) { + departamento = departamentoService.getDepartamentoById(iddepartamento); + } + user.setNombre(nombre); + user.setPassword(password); + Role userRole; + try { + userRole = Role.valueOf(role.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new RuntimeException("Rol no válido: " + role); + } + user.setRole(userRole); + user.setMail(mail); + user.setDepartamento(departamento); + userService.updateUser(id,user); + return "redirect:/user_list"; + } + private String registerUser(String nombre,String password,String role,String mail, Integer iddepartamento) { + logger.info("entra en registerUser"); Departamento departamento = null; if (iddepartamento != null) { departamento = departamentoService.getDepartamentoById(iddepartamento); @@ -128,20 +158,10 @@ public class UserController { } catch (IllegalArgumentException e) { throw new RuntimeException("Rol no válido: " + role); } - if (id != null) { - User Old = userService.getUserById(id); - Old.setNombre(username); - if(password != null) - Old.setPassword(password); - Old.setRole(Role.valueOf(role)); - Old.setMail(mail); - Old.setDepartamento(departamento); - userService.saveUser(Old); - } else { - userService.registerUser(username, password, userRole.toString(), mail, departamento); - } - return "redirect:/user_list"; // redirige a lista o página deseada + userService.registerUser(nombre, password, userRole.toString(), mail, departamento); + return "redirect:/user_list"; } + @PostMapping("/delete_user") public String deleteUser(@RequestParam("id") Long id) { User user = userService.getUserById(id); @@ -230,68 +250,7 @@ public class UserController { return "list"; } - - //GENERICO-------------------------------------------------------------------------------------------------------- - /** - @GetMapping("/list/{tabla}") - public String tablaList(Model model, @PathVariable String entity) { - String serviceName = entity.toLowerCase() + "Service"; - Object serviceBean = context.getBean(serviceName); - - return ""; - } - - - @GetMapping("/list/{entity}") - public String entityList(Model model, @PathVariable String entity) { - //construye el nombre del servicio de la entidad - String serviceName = entity.toLowerCase() + "Service"; - try { - //busca el servicio de la entidad - Object serviceBean = context.getBean(serviceName); - //si el Bean es una instancia de GenericEntityService - if (serviceBean instanceof GenericEntityService genericService) { - //genericService es un Servicio de los que hay, eso trae todas las instancias, entities sería por ejemplo user,categoria,etc - List entities = genericService.findAll(); - - List> items = entities.stream().map(e -> - Map.of( - "id", getId(e), - "values", genericService.getRowValues(e) - ) - ).toList(); - - model.addAttribute("title", "Gestión de " + entity); - model.addAttribute("headers", genericService.getHeaders()); - model.addAttribute("items", items); - model.addAttribute("actionsUrl", Map.of( - "edit", "", - "delete", "" // puedes personalizar por entidad - )); - model.addAttribute("backUrl", "/Inventario/home"); - model.addAttribute("addUrl", "/Inventario/"); - - return "list"; - } else { - throw new IllegalArgumentException("No es un GenericEntityService válido"); - } - - } catch (Exception e) { - model.addAttribute("error", "No se pudo cargar la entidad: " + entity); - return "error"; - } - } - - private Object getId(Object entity) { - try { - Method method = entity.getClass().getMethod("getId"); - return method.invoke(entity); - } catch (Exception e) { - return null; - } - } - **/ } diff --git a/src/main/java/com/ieslamar/GestionInventario/repos/GenericEntityService.java b/src/main/java/com/ieslamar/GestionInventario/repos/GenericEntityService.java deleted file mode 100644 index 27d0a80..0000000 --- a/src/main/java/com/ieslamar/GestionInventario/repos/GenericEntityService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ieslamar.GestionInventario.repos; - -import com.ieslamar.GestionInventario.entities.User; - -import java.util.List; - -public interface GenericEntityService { - List findAll(); - List getHeaders(); - List getRowValues(T entity); -} diff --git a/src/main/java/com/ieslamar/GestionInventario/services/UserService.java b/src/main/java/com/ieslamar/GestionInventario/services/UserService.java index 58faaf8..d467267 100644 --- a/src/main/java/com/ieslamar/GestionInventario/services/UserService.java +++ b/src/main/java/com/ieslamar/GestionInventario/services/UserService.java @@ -3,7 +3,6 @@ package com.ieslamar.GestionInventario.services; import com.ieslamar.GestionInventario.entities.Departamento; import com.ieslamar.GestionInventario.entities.Role; import com.ieslamar.GestionInventario.entities.User; -import com.ieslamar.GestionInventario.repos.GenericEntityService; import com.ieslamar.GestionInventario.repos.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; @@ -11,9 +10,10 @@ import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Objects; @Service -public class UserService implements GenericEntityService { +public class UserService { @Autowired public UserRepository userRepository; private final PasswordEncoder passwordEncoder; @@ -44,28 +44,18 @@ public class UserService implements GenericEntityService { return userRepository.findAll(); } - @Override - public List findAll() { - return userRepository.findAll(); - } - - @Override - public List getHeaders() { - return List.of("ID", "Nombre", "Rol", "Email", "Departamento"); - } - - @Override - public List getRowValues(User user) { - return List.of( - user.getId(), - user.getNombre(), - user.getRole(), - user.getMail(), - user.getDepartamento() != null ? user.getDepartamento().getNombre() : " " - ); - } - - public void saveUser(User user) { - userRepository.save(user); + public void updateUser(Long id, User user){ + User original = userRepository.findById(id).orElse(null); + if(!original.getNombre().equals(user.getNombre())) + original.setNombre(user.getNombre()); + if(!original.getMail().equals(user.getMail())) + original.setMail(user.getMail()); + if(user.getPassword()!= null) + original.setPassword(passwordEncoder.encode(user.getPassword())); + if(!original.getRole().equals(user.getRole())) + original.setRole(user.getRole()); + if(!Objects.equals(original.getDepartamento(), user.getDepartamento())) + original.setDepartamento(user.getDepartamento()); + userRepository.save(original); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 47fdebf..ff1b66b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,6 +14,6 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Configuración de JPA e Hibernate spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-auto=validate - - +spring.jpa.show-sql=true +org.hibernate.SQL=DEBUG diff --git a/src/main/resources/db/Modelo_Inventario.mwb b/src/main/resources/db/Modelo_Inventario.mwb index 18be9713840bd6f026abdc8acffe0bcfe6bca1b7..36f9a692bab556a844180353a0941200d8bd3b74 100644 GIT binary patch delta 15455 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 delta 15407 zcmZwuWmp|e&^C%L+zIaP5Ik7W1;O1yaED+E2_9q??(Xgu+@0VW2$10J!QJifyzjTK zea_i?tb4krYv#vvRo_*2Ek(oBM8g283UKgvAXpGGNF^g$H{Nlpa!m*XYL|rvVSzv( za|bh5h=siiJH*|T-2-BG>|^ar`mt%}_Vztq_B)YF)AimiO&2d%+o+Oqec$AAqn|3_ zcxmwqyZO7DMdYVH-^C}I%M}kVGjTJ!NPUU3-lNAsS#}03d!6LG{!W=X+m7?q2bz^8 zUgK_eIg~9g_w)IYw(RgYe7kBdrVU<)BND`4IXJpZHnFsZ;bc(|@wn0OOvtdRa?LX} z`mcaBl0%gQ)m1RWYbJ z)isPW@v;R%VqFhOzln1NOZHn{b%`YRW*_OS-a^;52T59JQ^gklg|WP;efrQj>10Tp(oD}wra z^X*OOg1w}PndWl|F}}ggMYG)lSB~N9gVlYJ;-e?0ufZeZmrDU%prPggh&aDR+8R6j zsoStQP%ie`@PyV3_y`aI%RCjnX%oQDuC9lk-&^xfUv{K#asZZJMltK{Vjb4qHGGJ_ zPMs(KlI@%|%PmvPige%GMMw(7W2q{s*6VuX@aV)_ziDT8^J4L6V6nN`B3-PZJ#$Z! zh^!+Yj7qfEngTD2`f(lTangyTE$@BsoM129^r3TDQZMFxzDy~ot_LuU76k$}={oI$ z-2JU^$Q;wP!A|R7XJ$};uSZ{v8gjKmP`^%&>V!k_UgN?kWKqDarQ)^Mo^oey#DWO@ z(x^CLV8*?~-D`hBe~H^0)+Ud)q}E+}!Bxm|jAQD{3Pil<)&(%LzfX_66y~IXq4po_ z*(8b$Ra@tpq1z06_p1U>BFcWh*mo!XiLZ-HLHA#@d%}P>XV>kwVs~~CkB@q~k`OPp zwzX87V`IqGFYA}zQdemF7-es!#4COS!obpD$dxFKY=Fq@7B_{CsIYC7p&hrzE9{S$R zC%*CTm)_sgf3LAF44C>-Q*uUL%rf+uXw{^h7EiEW4)fJ*=s46Y94s!3lU&EYHWZ$Z z5$q1^K}2|3o)0@mO10s(pVtU439F5FF!z-%?XrhPE@=UyrJLorfAQ0j?p_MP3l$z? zTVv{#p7ZY%1|J_i?i!UDEB+n)vweN4)l*QNGiAD-yO>kQ+hGUT{_J{+wh2ZglZYKxOC%^3JSL zS5DU5vnn>D0!2g?wu^Nm))qPJYf7T8=`kF8loZ#V8B{lIC^58S$$1-!Xw`J;$pcp2 zhdmJ-^^N3e5H=r(YhyrYU~QFSofZoi;dA%!-3WlhQFbxSR5klE?NV`+tYDQE<9mZ` z{ebtyce0Pes47+ie%oG|Lpv#=&Kz zeM)49j~a)FR3%Y}xooQqS&>`UM;i@yQ~XIAl(+Nl$Lt42UJkE2HUj@Jb{*<>Fd=XO z7hlp1_5vIbsQrGGUyH(4!xu*ydH=UaxZ-+DE8%u7ZM%)>%?TtoT z1m4pajb?uB@s&0P%T88U#jvGj?0bP_6{Lc4lb2W$Rt|!O^?~x?oa&Xm20%330O%r) z;`oh}QfqQ}@9q4}(2e)Qzd1g~v5V%V(srQ8C>-AIpf?Jm91V(S4H5VP9^eDnV8f)V z!uW5BtIN;`FJ{3~DS}#XL3jc%#xgLf4<{fhOIB)Q$!?W}hSbi-;O=rezDMD-CQzUS z8#y5vcV%nPEDS3xgStP$Wayw4wp}1C87(ai*$D<_ghs^FM@UT*I3zNBF2)@Z9|-)q zuzv2G_8@RC_FA~&P`&oF59B=U$7sBssJtGALjRa0YDJUxjeBH99wzn3Kch+u@RA}Nbmh2 zfYxMYZTU+`C2snE%q>NO+E75b00NjD>cLgw6OTpdV=BDw>^OLCF1)fz?zyoHbi!10 zWEKG?&Sb1+J1wfQ$n0v85>zPEP*lh!;|UC{c>FwTkjbLR@uojkeV{+NRF6W!oxxCaioXn*g^f=f1j6GMHy`0MKJ?&SRN6Sb-30@e}|hplk*c;wa%;Np7!ne7AV zpCG=RxeP=pp5jD3KS$@=dv<@5?ci2M$}hsvkj-5G6c zv6|9$mTrpo+~-UWl{B})@||Wua&ho~5zrbE&)?5!BKpx=HYJ5UobmcP+&iodX*`!T zwuJNjP_E3nY>$Zf8lfYam9=7KSo*QP+^hw=T9-dojg)x#o%dXBN^>_#RTTR^G#5u& zG8T+$it2-m(U1oZII`D*C(!JkzY9)^$;kgOe3iN;Ov2z`jPvjz;$6VZEv z?7jXaT^oA?Xz{vAeqxDT;x1^a3}|duj3bV$iSfb3`vk=yhSG?GM(GK0WK>N;M({*5 z49vshD7j_OVO2|Id2mJo&hCY&n@xn|K6+&J4^Y7A9{!7u58 z$Ie3D>A@LQpLz~aVp15tlVrlp6Lyo(k+jI+wH|ZAmd!vm|AK735Z8{@tIcAyN99hH zbhNDl@YWB1u!08bgXB?Q^({Jqm~x(!17hKUf5dpHUl}7HI?bf1A2--I zFPr%xPWJ=G9Zy#^No%j$am#~Boi32Rl&#n$LDrj=m#$Jj-nHe%T73E0hFYB4WpA(j z%>4Ge=`Zis+3K=Mkc35FK!5Ben<)vl7?ihX2P^#i5IIZ)@5z$!U2IpyGQM8wY#^=z zJDqm(wx&A}wPbg`wZT`4u`D*lOiL->!=vI)?Rb!q#tgp zIuW-lb+U@7zSwg@OnYNEB535Q4P%CIzaA{(!cxYR8WTYcc2_^CDyWUR@g3#8c_oZ9WCDZrI<$|d>fd^J$FSMsN} z1gV3jP)x->sGC_C!$?(L%iTAQK;G}51dGuccCN`+X*98Er2OhaNp;ZQO8g=J1!+j3 z(jgt9o2X3;Iq4XB%{An$F-EWF0fSq=K?xrHNpw)jFbo}oqe{+Ne)xGV$JrPI1cF-~ z@S`T=DHm0D{piSbvB`rBs%by`vRrD3!sQ>Nc3eQ1%0Fe>3-=8zE90*sPEugo)0L|b zJ;iK`7__a;Tve9jo%~BUFcBeY<-~A>bZ~#)YxQ>y0OF>pmj2eG3E4(SpCNfl9`j1V zE_I*2`^wGm?YC1R;g}M4B-V-pvnVJ`res7_7>@orhjFNMv4Mf)`owLTjBVxbKaow3 za#o_3=dXJ^@-l0#y!~?-G2_&=!Be05hXOQfA!=Q2My8Fit|}F?IJPwHJy0SUn8r+) zATp#?ZNH)>WWff9T3uPHqGeDiRZQV81Y>O~s9GesQzXm5VY$ioM)z7^QN68!a9g7EN2$h%pNrXfyW>&N&_vUVHd_cOk*32R3FR zbFVV$j9?GXATn~9u1WYv-}SmPPcMb(yPZHI%{T*)$6eB)7V!A#o}UgOkq zOA$yNo%2ts9&3fQK^ilXB)HagV3K#zdPhUJ!-cF(+cBc&Llb91-?s$z!^s<}v}G&? zGEL>Qj)pA;NGJdmMx9!^_sQl1@fGvQr9Ke}74x-Y;ZuTjroRxMCF@Mfwdy)Y!jrJO zWT#C@lckr0Y9OAq>N;FQbR4_b`@tRBWvqU59J8Ht-|{tZJijCiTgcO>$ZdbNR?BGJ zYF8n4$YgBCmBXhN2^{>^-N^_=l!Z#d!-zM!iwo>K$;JaLq7a?6X`v z!dOnVuzeGYxEdc1StuA#lCoq=1xVc3@-8$643JKQ;@YEvN(e}EiHf1}zx{&a;YNbo z3C#Kfgnso_Cc1I8sEfz2))5GlD;+s}g__4LB9eQup^6$?sypuVAbx40+OEA_KIZ-) zitwd)eKZkhf41{ymK$BMS7AM=ac!y0@8qPXN{sy~AEB>iNsMBp+Kk$&Mf zR+wW7D4*L43=A7>v|NF)Hy^g=PmbQYB=jI5ZY>F=GmtoI~z|39>BSeJm^ouIB&u-+@d_|Qak~#LI;C=y7fI;2C%N! z0%O@B2L;on+6XoSv6=)cP0YiIqn`!r5YpbX67w(}LRukJeHpn-5f$xJ{g+s42Mp(V zRPM$%^^)}u&O96*^^a8Xa9PPHGkgV~Q;{47!Zb7NrkCoplND>yo7Q0kH0(D1*{vzo z2Gy7JqD&j=k(lNY@wlo83Yhf%aM8qvd zBAK*XZb)!nySduz_|!@fU?4vvfgC`iUHd*96q;qZR3t>ZPS>u&(xEewADYe8CcjO! zfJx!9=*Gp2=xaXDGCETOy^L}Q!lAkxr%a)-5*5LUY7Ki5UMyZkJL90K4vtw_uA8H* zDJu>mS2DM465Zf8qn)*C_yG1NXH#)ayzi^q{6 z<0TWpGi1rIFnx0L@5Ah+mbZu!L=9QJKS^|!b@VWH6iB~9A`CE`jqq6_VAZPi)IYPL zc2?EKTT(ZlMpFj@>EFYl$4y#8^4!>a%#b$J(%@sr4cO$fwIav^hAw+{VC*v3E$?02 z_^k38KItgPG`SuW(Xpq_quas+QG)`o;QBqQ(VR>w)CUUK{izj@LJbf;CCjfD!}TA? zdiZvxM-aI^wjyX(nBBB+;{3?1*~1BiMhI(>K_#U@6Ue~Ugb*sT64AoI^IuK;nsOp$ z)!yO2xX)Y{HiG*@U(+jo+_H%^spHoCnA+-<*~b49jAV=-Q5jD(#9LSlwyq#HTMmgm ztM$5*J=vw9^FGp+>c$I9KdXIkGP@#+uqKE*deA^CiTbQWLBm&k02M03Bnmt-bOkHm z2jU1Cr%C|O1FVH;HB74TDCtGB;{NOi0xrzTTSJ&U<_HZK1ga!vWa6P|*;8_}>+*c7 zj@x{xqUbaC&keFA`BK$g;ueh(;xNOGWTwdj6JMt8Q3(r6MuWkMEV>O{R#WV@;Tu#d z)Sr(ilf~>v<4bESW9>S!HS+;x^XU9|V~=Y(wy;e6OI{`@QX8QK+X;WHBPOCmAQmgxzd*nx z62&W6Cn#|<8i8uFS8&2?97-?&OW$&#W!=M5B^JZABJ?Xc{QW%fuW)We>u5A9bgaG6Axi^l!M z7rcQ8W2zGwIdU78nWmK1?Kc(aS4T%DUKpx)sVYZF zUHSkdR8sjgGkp>RfS~+2z^-gP(7>`VxJ-Cx~tGI}r<@j}fWA`vN14HkD`5GGHhMMl8UHMMsHk>05367LCIqCu(C zZ=#^+4=|ZgA5yrkhi|kX8t+Z2ZwIQ;{0WkJwcN`9|j0$nEpea zwJ;jOsf&f~{+Jq&X?lx5LAAju)xmH$55l8b&6aiXI+^7WAL$r!noLe;LMIU+5bChX z?`1~~7N{NSr-%s=SsnbtfT+VMiw-f3%`%JKK{{vGHZQZ9?-Q;hFffnn{V-%6=um+W z#S>_1T(}9Q_GgZWrC?QLy)f1>N85OOw2Wix|H(*@roBB?GrZ(+E=iL@cM%<~NfSp- z9k(-drYvBdW_%j39A=)EK!%eBKs)2Q#Wngf)ZloUh&VBH@-!uxufjf2u!h)C3t60! z)p>rG*^GT_zzFFW36aJ7<{1z9Bj>iqWWG2?CCaM zUWXaHPiZwQGn;F0Ou81WD*RAh?r&)E=ROzoQ3%kn!`)p?Tn^IB-E?qR+`NeB@wneN zdH?fug!W=629!Mi13VE{|1aDrnl%70w?v(Z zFjO0)3XG$o95pXk#2KL266s{loxMM#_!pgL`RAsph|luGzzbt=yknS(LpF(2F(dVC zYpkb*YIf_qKkdOSx&Eh#o-!>((m_n)!!+b*zas~eor5;6-Tv=^9&vX|`!9hkjtSeS z7mvd^fmdl>2Vctl4f8fvzxp)5h#e#IhT%(NVeeSA%xI+)XFoa^l}b?j=xgx-ItHQ? z+jIGaZG47S{=EFlhacw`@>MELl?rImYw%!rWs>G1{H zWP%r2qaNWAoJbYMPm9-c;)V}HL*|L#OLt(cO35Y_b)&L|E^5J3nrElE=ds~|A>;#} zO4*S!k>ebubzYPp1YJVN@I}b+1Oo6N{%|j1{2FLfz4gf+vI=uF0r+ z#KJUs0;RFE_VG|X?DOQaHS^T&{Y4FH!t&CUv3WXp+IIJ-^7(fG1RxAY?Z(QD4+P~! z!fN6Y3<>gfQ`2Xu4RS|fY83ala}P`)D>u?nz!%VDMX?gdcHzX}j3RAgsHoQ>vHqFt zkUr?rIFcW~OEgVUKT=oo`D$j%Lj^?u}LE9Q!^AD=(y`EX|Tw z_2pU+JfC0{wkw@XuTC!fmsJ+F)VCSchULK@e*i1ZQ+mfjXW?`mT?v||fyMePXcbI1 z#9UStp+fGJ!3P*9vY zvOiNks25m=8PEoO{(Fqd<6#>>5IY|jx6&tTuDGPFbq)$e+h*uB*3{XbdgvTc^VAAjy5sNl~NaG$hGFODy|y( z(i3$tad9>LAJ}pJqTspAp&UdJPZ%7|weJaYI`9I}Xk_q5f3U4NRN~hlHWN`}Obr># z2hXX9nC1TVWwdUu*tqt#hXc}P3O)6|OhNJf{%$bDiLidUq&3FUwtDOkTk=BHnMe#x zMb_6^6~iQSsBTUgd?w=)>ZmR*{4{WZ;q+V!_kTaB`7@RaSfa@V7czmed} zl=MtlqjR|1`FRt;{lc-Rh)t2a#piYigb8>8HPc9>ZcxCKL?LO0g<32l=4LX6KMI`e zbZyN3uhU*5G1YPsX5Y$=D@GGW;)k$HXKmmE?RNDWG33@D~( zxXIwqhfrms@OUTjIjDP%Db@*C0I;KNzDl8=DHU@(lt6Gncl0jFmL;GY=R*dt-h|Q8 z**w0+y{%QVV)ff}#gU-`4Hl9djCDQ?vj=erN#`>5#sZbKY`WrLd#1ud;1QOj{P?JO zBUQ;ZLPmxig(D6j6tIqkrIjZQ&gzVQO|voSqxq|Reog9O&=9ssEt|o&M!Lyl_(i_P ztyK6$PGwlgaU}#(FSn9U17K}b@d;JLUR0L9|91M(Ow|us6eV!XsjBP+O+_I>{Pl7B zKe+UUmW(0)p{0bf|AUr{emcFJMtRaKk8DgXCiWzZP=85=7&MY)>;j#^elKx~aSt+`=TTMw*y{Bv? zDZ1#6Q25FLE~4qP{czc{9Ih2T>@b{%!Ls1~;GL=27u)tg$ujR5S{7>YT&Wc%YBd&s zBPsS@Hh@mDBR5^-Z`eycl4}xgJ~>*U9gn{FjDy358Yt?=YGsBIktLhS^}eM$?$nyW z(+-~->}(2B3w$4vyB*9BR*$)vhl%p8JuF1EM^iH2%p)~imJAt(!K8i#IfJ;<)}%h? zMtzH>_;3@JQo7i?4;9sRv__!6OOg^#1u;Z7css!%{ZSrm(Hyb zM-XJ_V(EzIysrV>*+A6hOPO1Ahgy^o=fJXRKrQ5teEDh)5M{nr#-wD+UAt)8+ zj-*GhDk`F;3t!}p1Rrt!PZJ(bnm?tKf@T=zY?Hy zgj-4@ht;kw@#KyxNQs8J4VzC#KICJNl3O)Sw!(~AI|;+4HEM>UNy1DYgI*Qkqa?m5 z=^WjH+?_dcFX^xVc$gYoiw4fa!dBOi70FlhO6_G7A`)fR=^e1&q$w8o9ICXD;97I8 zq_C0T;6@_asz9f>ksySUBZ*0=eFxCFbf9e{V4(%DVL}gSY;uwJK4kajaS#)#*A3TW z*0W;t04|5%GhszitUcb#7F}f>iCb(UT7QoBEg#aC+3jU?kOHZK4q6 z5#QnQC2|k7@I18iG9{fz6VW$neUL#>RTKn^@ORJW`US;Ov%2JF7IBVZ2CIEf=#>&A zktTLTEl@N`oatlY$UgVu4d~*vo%ny4~H}meFYN zAWd_7|H9!&q-A{2NbRDWf9EJZ49a(JYz`Y{3W!Arh_ z3(Zvk~bR$%0q#1Iah8y1d^e}9!keh3OqJ7QSEz`f&X zt^kw $AGLXXKqOUrPV9}F4&r-pa+bhY$gN;hu-|x7=+(a#Ia+`}qo0eNspgOGh zLv4d-y@ZGhJw=G z#&l(^mbxkP=F6XPxnTbNnD7txH{!F895Ccu?_@{Q4A2!#TVs#Dnvv$3n;V;fYmxc!u zZ9>!6q51xB@JVL`h}N~tjDKn|Z6rRaO@~XEirtKqe?xZ}gPWc4!_I8Vhx^m@T{Sb| zUKnTwmImNULS7x*+46BKAm^>GyGqR=2)=Sbuv*kWnt*9P{AcNF4=9y+W7RT zLTLpH0utMWb#7B4Xc+ePY6^@uD=T4(BCS!_ldY(%@te49>J(Y+L!OfO-#9;a-b_3m34Eac5;*iD%Ao=#sYjx~-4 zW}l{P#%W#rhkpmo5R*ty-6=NgHXr6NB;6}16tJz#HFbHHQ4MWPr!cNerf}e2C0*?Z zr81MM`>OI^2Go3G7Gv5$`m7ac#n1Rp?gC1}D0W2mb(VxBj1cyW%FZc042l{Jo6qGQ zZ^llh^0A)0UowrewjfouLiqq&P9#4W_}*{sA_@_gEz8XMB-xvY-JTGsUFe>T{ircR zFv4EALB!VTY#1z8QZC12{j|%WFDAZ>N2%#X3j>2*v0rb zYyY$%Qy;o;dK4oR{=2RuesVtNBk-7~*OSQa@nGtTR z7WJ#flhI`ZVu}PaB$|6xfE3u zww}MG?@=yYNNOY3&r+P5MRfT!@)pPpWZI9U5s>|)SLh_R$8ZsFu)f$f`mJX>$8>mo zF{`M=SYWqIA-_c+^TW!CC7%FtP5^1VicFwjAp`XA*oZ%M@M;`Bl=s%5U9LMNefAYP zZ)NM>Ne&k}^%<5~@EMz%GxYf|aoHUTABc=v>W(hk&vce*)4P>}*u-wWc|MSCGM*fD z%CHvE-X9~zIxz}wUuDN?#>=HCtx)2(@fTK}6G;~l&7Ufqxu=poW}70;P=yomJYw3* zvKBxy(EGjm$Vqgw#wN60a)Hqu&1>Jiw7>qxIMrx(EhhQP+T6gOWM6Xk3idU$1}tU; z{Me4zy07zW{0%TJ1lZKPwVT-D+WFs~(d&E%&~Ip>Hia{G%6)#!1U}pX!2Rj<=I$x6 zUKUIC;_D&s=h~lJGRQ77>U68t^5^u=mqox0JT=QXx42PR#BgjTL(zzd=GKZ};Cg7_ z*wx3j$GB!{*!8!eUEkil^(gxr2Gw6_1a^^JeJe1=w{G}PP~%`~`N;EM%}9ZYr-aC1 z>f|sINl-<;y6Nf=C( zZaW0f>u6JlgQnpLT_+q>q3YFs1T-L8xu=3$x`Mj}f z`+=W_n8+y?xH9OyS9f5KnqQyfu{r<;WH;%hI{=Z4f8Z}S77+&#G|<*hz#_f$Cb`J! zHyTnprV6adB@H&l+;bE9X!_2J1)-8nQ3bev6dmwe9`u70@?)mtu zmp}B*tBxciy0PCOQf(BBp^d^IFvIrfVZ+lUx*W^itegTJz;p3#n^3AjK-X(~GvI=P zr!c-uizvkrgN#@5AJ22bXxHds)ij$?-;R*5+~S!>pU^&*ptDt5Y-~ph%7d9w9fRyV zSHnkY(P!edyNN}{Dt)|QoA8m10^mL78eb+U9%Nfw%-z*1u{ch*rR94#NocaEcKmet zq@Y)yE2Z(C@^606hPn5`Zoy!-5T)|O5()irn(noJ1Y$(C?bNcEWrCC5D%*7Dy>Vi* z-N{kDR6u1^vsy;6u2+Axr)_qf)tp^+RMleB++v^MZi1Sq!}z12(jx7Lb0FG#pia+r z`Rvfb_QQ4YUU(bM`~91yjule@%7%qFg@DT2UDppwN7I+$wiVyGiFbAMjz@;IB}-b`mJI&5xyS#8UR=Dm$& z*;#@t5-#3M&JnvNoph`yEjl`{yyW+;uj3=AgON)Amr(r1C*B4Gb@6@wRa26v7RQcc zj0o$MmERU8{H~7}F@H(Tat-tE%ELL{v3i+a<=YLJU2*0o<>@gFQ1ttqus?L^z5IA~ zanLunkeh;G)F$rsaa@|e1gG5LmVd3ut4ql(B|8=wT`iZyBaACIoH@5<7fdyVMF7)! zHmrle&=SI&x8n^MIS8bQ7`EBjYGkqiJBhkyPmNgHp%kMd~1aJR31rE-t7 z0}^pi)=A}Q@E_v)NeGdIsftT2%|61Re#Gpkg;juHyO8?pQF;bX<*rfgmfTx#QG|aT z-g9lEnU34)*J>f5t2xo>q5R6T^zn2Y|!% zDfa<{Nl8!RT(o7c^2T{AXU(ml6cOjg%Tcs~BO8nEQKDY`Q;qt5a=OeviwR8IPgs8fTi3laLo1j}Og_fK47qQLTw`mu;#$dI;k{0q zKahv2!sfz*Rbar_UyY5${joekKV_rjw(uE(^;GiTC1%qkf&MYS9azS2Ahm*qZ=rrP zmAo$<=-?1zKPSa@aEq}YBWRHejSMg@KkNi?~?hYW}(b+4d) zN72j-_|PCl zLK?$%5fF=(1d12VjWEiMYBjZ*)22qJ=J#lL?XZ7-nRBv26ogWO2$aI(3%_w$!P5)B zP0Zc}t`3|2;gwL?reu|T5odx+C1p1cq%m>-e&bw^EPs};z9+X1$Oy8~VZ%DohQpkS za7ubXYw*aJts_xTe6wMFvrUiVn$|E$eQBO(#}Sa`ZJQ5Jx9H($u)d01`@^>#9yj~? z;txq_DXz$&ev%cq;t`f&M{w{44=G0s)PB=C_1kjWr0zXTZWyI#>Lke4;OqTxRCuRtWCR)_eHEw@ z!B+36wpsB4Nf5DIOJh6OZeUtKs?w;xm~mOzg0m5jMWmPvVe=rhj_5&mF){UO1VK8L zkyPd)-SFyT)E0=niF?ogXmOC~vA*X6P`gkc{j0;4m!AKHhlFZQ z%G~~$8iEMsVkpQx>#4hou$HRSNaX0MepI;?GcY!%^fN*$ab}#Hzd>P9Os0N5wZw#6 zSO-uY@cB;a>f!OU=l*U1^nxrbbqt zSHZgJeG$D+-mTO^8tG+u)&TeW!)toJ3G8vN&P&1~qwfyf`jLYlUUyhXZ_zLqHC^)o z_bB%YO*g^-Ctz|cLp#)fbF?@B*ss=wLCo?WFSwC2mf0ou7_0}!HQ+K0te;>@0&)c`Bd`%;@IUKoOcAK zAGK{AqwCITNZ**cjja3Xvk5DV zrcUdro@Z@m%b7Z=*GSN5Uy$A#qYrqa^chRe2?+Z!!%h+p%wrF2k}Qkq5k|M|_7d-s zJ8z)Rx^LX+w4SlS4zypd7hMF#BdvuXG3tk5p>_(`IObWXOI9)wue9v26AdHhg$23~ z1kfVpV55Zm9u45Y?YylIQQy_4Z$0&Carj+k?_aX&Z+~cM>}0H zs**g}jqqELU#@D7*pnNhR@its-2B4ibda>X-RxDMCt@J%dPi9Ge*!I1!x@%fw6A_R z`kv(t#t-*xj_mEy-D$wTWV962BBI3UkW_`n(C64QZko7}fYZJJ=fhfh0yxBo%+7WC zSaD{o(nc6G%Z8@kvjOh*XhGPsm27wj7SH64_Z7l-m7_PlvL0zqC)>TZbus?%n93gO zisqY%J$E)_Qr-WD8lPQ>He|3QBVK4mLAJ3-ky-wAr{@%~-aguAt(Oefz1Vy_+k_2U zFYO1>Fh>Z#$4EpM#nk`A>>R03kaMiVfMYz z4$!4pkuM24uPT%5es^hcvsqGifLLyS@v<^2H!3FwV4q6xsM?se2XKFw5{eDQ-%6p|qfsB3U`|Kv?0qx@0zx(R~ zMaG2t(KG46nu(kg6B7K-@A)w039}`eO@ZT3E2E9`&#l}4Sj}Q5d@38f$CZo{hQGwY1$}rVQ*+*5nhf&wgH?&)wN_%>aw& zWxlo%lsCtUX`ee)hvme_SO}j)+|1DXG#2LmIN-DXb7k=A`}{?VLx|E4jWGG&Ga_K< zCgkwEIu%jw%lCVHw@7hZ?Rp+!^y6h>?g#&qEjMu`rI48Z!+CE3t?hu(s^ad#0sSiX zV9vw6R1?tzW&QQmeDBoU9Hrh*#l4ctmh}Chrsddjrzel!5s3>kLh%O{u=-t7vhy9f$mu#*j$e#D%Xn?4)V|>+z0hA> z(OwQE2@yS<92QJnISjs{T{&L3K(@i+Vf_=*mHT7ec68;AVBp7*!l*+E`cG<+>XN~@ z8R(qFWJ2&#`mmKoAy?F=V-y`8YLL%X1ob@vIpfN!Y{B;rIxUbwk)xR4@>XEl*<)qW zu3>UwZ(;0qVdr*E7cyAcH@Rvm7$xT7T+5JZpN{Ra68VqK@^WO@;<94dyC(k}alm2W zYK!fhnC)j`)=X^5vSFzrnoW#>B3Uo0Cx|($8l_I)9m*Ee5rKXyljbJYdhPN2(TDz z5RsVr?ah-gE>8B?(w{~v=i|#2=hOw$m%MqGry=vqDE{lw@2*$;_j?IDnD+a65kYU- zB8np-2st=a3YbI1dULSvQ3if*($;w>5Yqaeuz&EF-a?Jj!=1sGKO;8BHw<0F2_pj| zPoI3h`P4SVsW=I;0tB6bMGm@odW9`toWkGv3ha6aCYE!}u34tsTZ`s!h%CE4fVcgl zb)PR! z@-6$8^DX`Mzm4@R{Z>hjUA`ta5VHaF!kH*qmxH#b#PKtTL& RAl%zt_EvHv;K|7Re*opp0Q~>} diff --git a/src/main/resources/templates/userPage.html b/src/main/resources/templates/userPage.html index 23299fa..e3e5837 100644 --- a/src/main/resources/templates/userPage.html +++ b/src/main/resources/templates/userPage.html @@ -7,8 +7,9 @@

Registro

-
+ +
@@ -31,11 +32,12 @@
-