From 7b8bb925d2c9392577d588c47ddb254449117a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Mon, 8 May 2023 23:53:53 -0500 Subject: [PATCH 01/26] Agregado rest necesario para Lista Equipos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se agregaron los servicios rest necesarios para poder realizar la pestaña de Lista equipos en angular. --- .idea/sqldialects.xml | 6 +++ pom.xml | 5 +++ .../java/com/example/demo/domain/Equipo.java | 2 +- .../com/example/demo/domain/Invitacion.java | 6 +-- .../com/example/demo/domain/Solicitud.java | 6 +-- .../java/com/example/demo/domain/Usuario.java | 4 +- .../java/com/example/demo/dto/CountDTO.java | 36 ---------------- .../java/com/example/demo/dto/EquipoDTO.java | 12 ++++++ .../com/example/demo/dto/EquipoListDTO.java | 21 ---------- .../java/com/example/demo/dto/MessageDTO.java | 26 ------------ .../java/com/example/demo/dto/UsuarioDTO.java | 11 +++++ .../demo/repository/EquipoRepository.java | 14 +++++++ .../example/demo/rest/EquipoController.java | 13 ++++-- .../demo/rest/SolicitudController.java | 21 ++++++++++ .../example/demo/rest/UsuarioController.java | 41 +++++++++++++++++++ .../example/demo/service/EquipoService.java | 17 ++------ .../demo/service/SolicitudService.java | 32 +++++++++++++++ .../example/demo/service/UsuarioService.java | 3 ++ .../com/example/demo/util/ConverterDTO.java | 41 +++++++++++++++++++ 19 files changed, 208 insertions(+), 109 deletions(-) create mode 100644 .idea/sqldialects.xml delete mode 100644 src/main/java/com/example/demo/dto/CountDTO.java create mode 100644 src/main/java/com/example/demo/dto/EquipoDTO.java delete mode 100644 src/main/java/com/example/demo/dto/EquipoListDTO.java delete mode 100644 src/main/java/com/example/demo/dto/MessageDTO.java create mode 100644 src/main/java/com/example/demo/dto/UsuarioDTO.java create mode 100644 src/main/java/com/example/demo/rest/SolicitudController.java create mode 100644 src/main/java/com/example/demo/rest/UsuarioController.java create mode 100644 src/main/java/com/example/demo/service/SolicitudService.java create mode 100644 src/main/java/com/example/demo/util/ConverterDTO.java diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..95ce846 --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f49e51e..6901bcb 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,11 @@ 17 + + org.modelmapper + modelmapper + 2.3.8 + org.springframework.boot spring-boot-starter-data-jpa diff --git a/src/main/java/com/example/demo/domain/Equipo.java b/src/main/java/com/example/demo/domain/Equipo.java index 7aa2f72..ff94cd0 100644 --- a/src/main/java/com/example/demo/domain/Equipo.java +++ b/src/main/java/com/example/demo/domain/Equipo.java @@ -22,7 +22,7 @@ public class Equipo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private int id; + private long id; private String nombreEquipo; private String siglas; private boolean eliminado= Boolean.FALSE; diff --git a/src/main/java/com/example/demo/domain/Invitacion.java b/src/main/java/com/example/demo/domain/Invitacion.java index 316990b..cdd7659 100644 --- a/src/main/java/com/example/demo/domain/Invitacion.java +++ b/src/main/java/com/example/demo/domain/Invitacion.java @@ -6,7 +6,7 @@ @Data @Entity -@Table(name ="invitacion", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "team_id"})}) +@Table(name ="invitacion", uniqueConstraints = {@UniqueConstraint(columnNames = {"id_usuario", "id_equipo"})}) public class Invitacion { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -15,10 +15,10 @@ public class Invitacion { @ManyToOne() - @JoinColumn(name="user_id",nullable=false,referencedColumnName="id") + @JoinColumn(name="id_usuario",nullable=false,referencedColumnName="id") Usuario usuario; @ManyToOne() - @JoinColumn(name="team_id") + @JoinColumn(name="id_equipo") Equipo equipo; } diff --git a/src/main/java/com/example/demo/domain/Solicitud.java b/src/main/java/com/example/demo/domain/Solicitud.java index 02a4054..70b3bba 100644 --- a/src/main/java/com/example/demo/domain/Solicitud.java +++ b/src/main/java/com/example/demo/domain/Solicitud.java @@ -7,7 +7,7 @@ @Data @Entity -@Table(name ="solicitud", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "team_id"})}) +@Table(name ="solicitud", uniqueConstraints = {@UniqueConstraint(columnNames = {"id_usuario", "id_equipo"})}) public class Solicitud { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -15,10 +15,10 @@ public class Solicitud { Boolean aceptada; @ManyToOne - @JoinColumn(name="user_id",nullable = false,referencedColumnName="id") + @JoinColumn(name="id_usuario",nullable = false,referencedColumnName="id") Usuario usuario; @ManyToOne() - @JoinColumn(name = "team_id") + @JoinColumn(name = "id_equipo") Equipo equipo; } diff --git a/src/main/java/com/example/demo/domain/Usuario.java b/src/main/java/com/example/demo/domain/Usuario.java index 5b241c4..32c8872 100644 --- a/src/main/java/com/example/demo/domain/Usuario.java +++ b/src/main/java/com/example/demo/domain/Usuario.java @@ -24,8 +24,8 @@ public Usuario(String username, String email, String password) { @ManyToMany(cascade = CascadeType.REMOVE) @JoinTable( name = "jugadores_en_equipo", - joinColumns = @JoinColumn(name = "usuario_id"), - inverseJoinColumns = @JoinColumn(name = "equipo_id") + joinColumns = @JoinColumn(name = "id_usuario"), + inverseJoinColumns = @JoinColumn(name = "id_equipo") ) private Set equipos_participe; diff --git a/src/main/java/com/example/demo/dto/CountDTO.java b/src/main/java/com/example/demo/dto/CountDTO.java deleted file mode 100644 index dcbba8a..0000000 --- a/src/main/java/com/example/demo/dto/CountDTO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.example.demo.dto; - -/** - * Data transfer Object - */ -public class CountDTO { - - private Long count; - private String message; - - public CountDTO() { - } - - public CountDTO(Long count) { - this.count = count; - } - - public Long getCount() { - return count; - } - - public void setCount(Long count) { - this.count = count; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - - -} diff --git a/src/main/java/com/example/demo/dto/EquipoDTO.java b/src/main/java/com/example/demo/dto/EquipoDTO.java new file mode 100644 index 0000000..606b8ed --- /dev/null +++ b/src/main/java/com/example/demo/dto/EquipoDTO.java @@ -0,0 +1,12 @@ +package com.example.demo.dto; + +import lombok.Data; + +@Data +public class EquipoDTO { + private long id; + private String nombreEquipo; + private String siglas; + private boolean eliminado; + +} diff --git a/src/main/java/com/example/demo/dto/EquipoListDTO.java b/src/main/java/com/example/demo/dto/EquipoListDTO.java deleted file mode 100644 index 8894ec2..0000000 --- a/src/main/java/com/example/demo/dto/EquipoListDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.demo.dto; - -import com.example.demo.domain.Equipo; - -import java.util.List; - -public class EquipoListDTO { - - private List equipos; - - public EquipoListDTO() {} - - public List getCars() { - return equipos; - } - - public void setCars(List cars) { - this.equipos = cars; - } - -} diff --git a/src/main/java/com/example/demo/dto/MessageDTO.java b/src/main/java/com/example/demo/dto/MessageDTO.java deleted file mode 100644 index f5d1d03..0000000 --- a/src/main/java/com/example/demo/dto/MessageDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.demo.dto; - -public class MessageDTO { - - private String message; - - public MessageDTO() { - - } - - public MessageDTO(String message) { - this.message = message; - } - - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - - -} diff --git a/src/main/java/com/example/demo/dto/UsuarioDTO.java b/src/main/java/com/example/demo/dto/UsuarioDTO.java new file mode 100644 index 0000000..f962929 --- /dev/null +++ b/src/main/java/com/example/demo/dto/UsuarioDTO.java @@ -0,0 +1,11 @@ +package com.example.demo.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +@Data +@NoArgsConstructor +public class UsuarioDTO { + private long id; + private String username; + private String email; +} diff --git a/src/main/java/com/example/demo/repository/EquipoRepository.java b/src/main/java/com/example/demo/repository/EquipoRepository.java index 98307a8..f8d2c26 100644 --- a/src/main/java/com/example/demo/repository/EquipoRepository.java +++ b/src/main/java/com/example/demo/repository/EquipoRepository.java @@ -3,6 +3,20 @@ import com.example.demo.domain.Equipo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface EquipoRepository extends JpaRepository { + @Query(value = "SELECT e.* " + + "FROM Equipo e " + + "WHERE e.eliminado = false " + + "AND NOT EXISTS ( " + + " SELECT 1 " + + " FROM jugadores_en_equipo je " + + " WHERE je.id_equipo = e.id " + + " AND je.id_usuario = :idUsuario " + + ")", nativeQuery = true) + List buscarEquiposDisponibles(@Param("idUsuario") Long idUsuario); } diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index 20c85e2..993f05f 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -2,8 +2,10 @@ import com.example.demo.domain.Equipo; +import com.example.demo.dto.EquipoDTO; import com.example.demo.repository.EquipoRepository; import com.example.demo.service.EquipoService; +import com.example.demo.util.ConverterDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -20,18 +22,23 @@ public class EquipoController { EquipoRepository equipoRepository; @Autowired EquipoService equipoService; + @Autowired + private ConverterDTO converterDTO; + //Obtener todos los equipos @GetMapping("/equipos") public List findAll() { return equipoRepository.findAll(); } @GetMapping("/equipos/{id}") - public ResponseEntity obtenerEquipo(@PathVariable Long id) { + public ResponseEntity obtenerEquipo(@PathVariable Long id) { Equipo equipo = equipoService.findById(id); if (equipo == null) { return ResponseEntity.notFound().build(); } - System.out.println(equipo.getSolicitudes_de_jugadores().toString()); - return ResponseEntity.ok(equipo); + EquipoDTO equipoDTO = converterDTO.toDto(equipo); + return ResponseEntity.ok(equipoDTO); } + + } diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java new file mode 100644 index 0000000..73605df --- /dev/null +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -0,0 +1,21 @@ +package com.example.demo.rest; + +import com.example.demo.service.SolicitudService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +public class SolicitudController { + @Autowired + SolicitudService solicitudService; + @PostMapping("/solicitudes") + public ResponseEntity crearSolicitud(@RequestParam Long idUsuario, @RequestParam Long idEquipo) { + solicitudService.crearSolicitud(idUsuario, idEquipo); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/example/demo/rest/UsuarioController.java b/src/main/java/com/example/demo/rest/UsuarioController.java new file mode 100644 index 0000000..3c41c43 --- /dev/null +++ b/src/main/java/com/example/demo/rest/UsuarioController.java @@ -0,0 +1,41 @@ +package com.example.demo.rest; + +import com.example.demo.domain.Equipo; +import com.example.demo.domain.Usuario; +import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.UsuarioDTO; +import com.example.demo.service.EquipoService; +import com.example.demo.service.UsuarioService; +import com.example.demo.util.ConverterDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api") +public class UsuarioController { + @Autowired + UsuarioService usuarioService; + @Autowired + EquipoService equipoService; + @Autowired + private ConverterDTO converterDTO; + @GetMapping("/usuarios") + public List findAll() { + List usuarios = (List) usuarioService.findAll(); + List usuariosDTO = converterDTO.toDtoListUsuarios(usuarios); + return usuariosDTO; + } + //Obtener todos los equipos los cuales el usuario no pertenece + //Lista equipos -> Presentacion lista de equipos + @GetMapping("/usuarios/{id}/equipos_disponibles") + public List obtenerEquiposDisponibles(@PathVariable Long id) { + List equipos = equipoService.buscarEquiposDisponibles(id); + List equipoDTO = converterDTO.toDtoListEquipos(equipos); + return equipoDTO; + } +} diff --git a/src/main/java/com/example/demo/service/EquipoService.java b/src/main/java/com/example/demo/service/EquipoService.java index 52b4eaf..0f79d80 100644 --- a/src/main/java/com/example/demo/service/EquipoService.java +++ b/src/main/java/com/example/demo/service/EquipoService.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @Service @@ -15,18 +16,6 @@ public class EquipoService { @Autowired private EquipoRepository equipoRepository; - public Equipo create(Equipo equipo) { - return equipoRepository.save(equipo); - } - - public void remove(Long id){ - Optional equipoOptional = equipoRepository.findById(id); - if (equipoOptional.isPresent()) { - Equipo equipo = equipoOptional.get(); - equipo.setEliminado(true); // establecer el valor de "eliminado" a false - equipoRepository.save(equipo); // guardar el objeto actualizado en la base de datos - } - } public Iterable findAll(){ return equipoRepository.findAll(); } @@ -37,7 +26,7 @@ public Equipo findById(Long id) { public Equipo save(Equipo equipo) { return equipoRepository.save(equipo); } - public void agregarInvitacion(Invitacion invitacion){ - + public List buscarEquiposDisponibles(Long idUsuario){ + return equipoRepository.buscarEquiposDisponibles(idUsuario); } } diff --git a/src/main/java/com/example/demo/service/SolicitudService.java b/src/main/java/com/example/demo/service/SolicitudService.java new file mode 100644 index 0000000..7a23398 --- /dev/null +++ b/src/main/java/com/example/demo/service/SolicitudService.java @@ -0,0 +1,32 @@ +package com.example.demo.service; + +import com.example.demo.domain.Equipo; +import com.example.demo.domain.Solicitud; +import com.example.demo.domain.Usuario; +import com.example.demo.repository.SolicitudRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityNotFoundException; + +@Service +public class SolicitudService { + @Autowired + SolicitudRepository solicitudRepository; + @Autowired + UsuarioService usuarioService; + @Autowired + EquipoService equipoService; + + public void crearSolicitud(Long idUsuario, Long idEquipo) { + Usuario usuario = usuarioService.findById(idUsuario); + Equipo equipo = equipoService.findById(idEquipo); + + Solicitud solicitud = new Solicitud(); + solicitud.setUsuario(usuario); + solicitud.setEquipo(equipo); + solicitud.setAceptada(null); + + solicitudRepository.save(solicitud); + } +} diff --git a/src/main/java/com/example/demo/service/UsuarioService.java b/src/main/java/com/example/demo/service/UsuarioService.java index 2510e24..ff9233d 100644 --- a/src/main/java/com/example/demo/service/UsuarioService.java +++ b/src/main/java/com/example/demo/service/UsuarioService.java @@ -19,4 +19,7 @@ public Usuario findById(Long id) { public Usuario save(Usuario usuario) { return usuarioRepository.save(usuario); } + public Iterable findAll(){ + return usuarioRepository.findAll(); + } } diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java new file mode 100644 index 0000000..3fdd797 --- /dev/null +++ b/src/main/java/com/example/demo/util/ConverterDTO.java @@ -0,0 +1,41 @@ +package com.example.demo.util; + +import com.example.demo.domain.Equipo; +import com.example.demo.domain.Usuario; +import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.UsuarioDTO; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + + +@Component +public class ConverterDTO { + public ConverterDTO(){ + modelMapper = new ModelMapper(); + } + private ModelMapper modelMapper; + + public EquipoDTO toDto(Equipo equipo){ + EquipoDTO equipoDTO = modelMapper.map(equipo, EquipoDTO.class); + return equipoDTO; + } + public UsuarioDTO toDto(Usuario usuario){ + UsuarioDTO usuarioDTO = modelMapper.map(usuario, UsuarioDTO.class); + return usuarioDTO; + } + public List toDtoListUsuarios(List usuarios) { + List usuariosDTO = usuarios.stream() + .map(usuario -> modelMapper.map(usuario, UsuarioDTO.class)) + .collect(Collectors.toList()); + return usuariosDTO; + } + public List toDtoListEquipos(List equipos) { + List equiposDTO = equipos.stream() + .map(equipo -> modelMapper.map(equipo, EquipoDTO.class)) + .collect(Collectors.toList()); + return equiposDTO; + } +} From 7e2603dcb6d3246a84b6c3e0068167205ea56a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Tue, 9 May 2023 00:46:23 -0500 Subject: [PATCH 02/26] =?UTF-8?q?Pesta=C3=B1a=20mis=20invitaciones=20-=20F?= =?UTF-8?q?alta=20aceptar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/dto/EquipoDTO.java | 2 ++ .../java/com/example/demo/dto/InvitacionDTO.java | 12 ++++++++++++ .../demo/repository/InvitacionRepository.java | 5 ++++- .../demo/repository/SolicitudRepository.java | 2 ++ .../example/demo/rest/InvitacionController.java | 16 +++++++++++----- .../example/demo/rest/SolicitudController.java | 14 ++++++++++++-- .../example/demo/service/InvitacionService.java | 9 ++++----- .../java/com/example/demo/util/ConverterDTO.java | 8 ++++++++ 8 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/example/demo/dto/InvitacionDTO.java diff --git a/src/main/java/com/example/demo/dto/EquipoDTO.java b/src/main/java/com/example/demo/dto/EquipoDTO.java index 606b8ed..27d6445 100644 --- a/src/main/java/com/example/demo/dto/EquipoDTO.java +++ b/src/main/java/com/example/demo/dto/EquipoDTO.java @@ -1,8 +1,10 @@ package com.example.demo.dto; import lombok.Data; +import lombok.Setter; @Data +@Setter public class EquipoDTO { private long id; private String nombreEquipo; diff --git a/src/main/java/com/example/demo/dto/InvitacionDTO.java b/src/main/java/com/example/demo/dto/InvitacionDTO.java new file mode 100644 index 0000000..f5440cb --- /dev/null +++ b/src/main/java/com/example/demo/dto/InvitacionDTO.java @@ -0,0 +1,12 @@ +package com.example.demo.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class InvitacionDTO { + private long id; + //private UsuarioDTO usuario; + private EquipoDTO equipo; +} diff --git a/src/main/java/com/example/demo/repository/InvitacionRepository.java b/src/main/java/com/example/demo/repository/InvitacionRepository.java index aa65d1a..95a693e 100644 --- a/src/main/java/com/example/demo/repository/InvitacionRepository.java +++ b/src/main/java/com/example/demo/repository/InvitacionRepository.java @@ -1,8 +1,11 @@ package com.example.demo.repository; import com.example.demo.domain.Invitacion; +import com.example.demo.domain.Solicitud; import org.springframework.data.jpa.repository.JpaRepository; -public interface InvitacionRepository extends JpaRepository{ +import java.util.List; +public interface InvitacionRepository extends JpaRepository{ + List findByUsuarioId(Long idUsuario); } diff --git a/src/main/java/com/example/demo/repository/SolicitudRepository.java b/src/main/java/com/example/demo/repository/SolicitudRepository.java index d5498b2..3d293cd 100644 --- a/src/main/java/com/example/demo/repository/SolicitudRepository.java +++ b/src/main/java/com/example/demo/repository/SolicitudRepository.java @@ -3,6 +3,8 @@ import com.example.demo.domain.Solicitud; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface SolicitudRepository extends JpaRepository{ } diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index 3a37224..41f9395 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -2,7 +2,9 @@ import com.example.demo.domain.Invitacion; +import com.example.demo.dto.InvitacionDTO; import com.example.demo.service.InvitacionService; +import com.example.demo.util.ConverterDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -10,18 +12,22 @@ import java.util.List; @RestController -@RequestMapping("/invitacion") +@RequestMapping("/api") public class InvitacionController { @Autowired private InvitacionService invitacionService; + @Autowired + private ConverterDTO converterDTO; + /* @PostMapping("/agregar/{equipoId}/{usuarioId}") public void crearInvitacion(@PathVariable Long equipoId, @PathVariable Long usuarioId) { invitacionService.crearInvitacion(equipoId, usuarioId); - } - @GetMapping("/invitaciones") - public ResponseEntity> obtenerTodasLasInvitaciones() { - List invitaciones = (List) invitacionService.findAll(); + }*/ + @GetMapping("/invitaciones/{idUsuario}") + public ResponseEntity> obtenerTodasLasInvitaciones(@PathVariable Long idUsuario) { + List invitaciones = converterDTO.toDtoListInvitaciones(invitacionService.obtenerInvitacionesPorIdUsuario(idUsuario)); return ResponseEntity.ok().body(invitaciones); } + } diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index 73605df..a7302cb 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -1,7 +1,9 @@ package com.example.demo.rest; +import com.example.demo.security.payload.MessageResponse; import com.example.demo.service.SolicitudService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,9 +15,17 @@ public class SolicitudController { @Autowired SolicitudService solicitudService; + + //Crear solicitud + //Lista solicitudes -> Boton enviar solicitud @PostMapping("/solicitudes") public ResponseEntity crearSolicitud(@RequestParam Long idUsuario, @RequestParam Long idEquipo) { - solicitudService.crearSolicitud(idUsuario, idEquipo); - return ResponseEntity.ok().build(); + try { + solicitudService.crearSolicitud(idUsuario, idEquipo); + return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Error al enviar solicitud")); + } } + } diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java index 8a3f291..a787c2d 100644 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ b/src/main/java/com/example/demo/service/InvitacionService.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class InvitacionService { @Autowired @@ -28,11 +30,8 @@ public void crearInvitacion(Long equipoId, Long usuarioId) { invitacionRepository.save(invitacion); } - public Invitacion save(Invitacion invitacion){ - return invitacionRepository.save(invitacion); - } - public Iterable findAll(){ - return invitacionRepository.findAll(); + public List obtenerInvitacionesPorIdUsuario(long idUsuario){ + return invitacionRepository.findByUsuarioId(idUsuario); } diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java index 3fdd797..7b29763 100644 --- a/src/main/java/com/example/demo/util/ConverterDTO.java +++ b/src/main/java/com/example/demo/util/ConverterDTO.java @@ -1,8 +1,10 @@ package com.example.demo.util; import com.example.demo.domain.Equipo; +import com.example.demo.domain.Invitacion; import com.example.demo.domain.Usuario; import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.InvitacionDTO; import com.example.demo.dto.UsuarioDTO; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Component; @@ -38,4 +40,10 @@ public List toDtoListEquipos(List equipos) { .collect(Collectors.toList()); return equiposDTO; } + public List toDtoListInvitaciones(List invitaciones){ + List invitacionesDTO = invitaciones.stream() + .map(invitacion -> modelMapper.map(invitacion, InvitacionDTO.class)) + .collect(Collectors.toList()); + return invitacionesDTO; + } } From 3bceda86df0c6788d483974dd21994f0916c4e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Tue, 9 May 2023 22:40:18 -0500 Subject: [PATCH 03/26] Agregados algunos servicios rest extra --- .../java/com/example/demo/dto/EquipoDTO.java | 2 +- .../com/example/demo/dto/SolicitudDTO.java | 12 +++++++++ .../demo/repository/SolicitudRepository.java | 2 ++ .../demo/rest/InvitacionController.java | 24 ++++++++++------- .../demo/rest/SolicitudController.java | 26 ++++++++++++++----- .../demo/service/InvitacionService.java | 9 +++++++ .../demo/service/SolicitudService.java | 5 ++++ .../com/example/demo/util/ConverterDTO.java | 12 +++++++++ 8 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/demo/dto/SolicitudDTO.java diff --git a/src/main/java/com/example/demo/dto/EquipoDTO.java b/src/main/java/com/example/demo/dto/EquipoDTO.java index 27d6445..b413101 100644 --- a/src/main/java/com/example/demo/dto/EquipoDTO.java +++ b/src/main/java/com/example/demo/dto/EquipoDTO.java @@ -9,6 +9,6 @@ public class EquipoDTO { private long id; private String nombreEquipo; private String siglas; - private boolean eliminado; + //private boolean eliminado; } diff --git a/src/main/java/com/example/demo/dto/SolicitudDTO.java b/src/main/java/com/example/demo/dto/SolicitudDTO.java new file mode 100644 index 0000000..27faa84 --- /dev/null +++ b/src/main/java/com/example/demo/dto/SolicitudDTO.java @@ -0,0 +1,12 @@ +package com.example.demo.dto; + +import com.example.demo.domain.Usuario; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class SolicitudDTO { + private long id; + private UsuarioDTO usuario; +} diff --git a/src/main/java/com/example/demo/repository/SolicitudRepository.java b/src/main/java/com/example/demo/repository/SolicitudRepository.java index 3d293cd..48d314b 100644 --- a/src/main/java/com/example/demo/repository/SolicitudRepository.java +++ b/src/main/java/com/example/demo/repository/SolicitudRepository.java @@ -1,5 +1,6 @@ package com.example.demo.repository; +import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,4 +8,5 @@ public interface SolicitudRepository extends JpaRepository{ + List findByUsuarioId(long idUsuario); } diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index 41f9395..bd68bd4 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -12,22 +12,28 @@ import java.util.List; @RestController -@RequestMapping("/api") +@RequestMapping("/invitaciones") public class InvitacionController { @Autowired private InvitacionService invitacionService; @Autowired private ConverterDTO converterDTO; - - /* - @PostMapping("/agregar/{equipoId}/{usuarioId}") - public void crearInvitacion(@PathVariable Long equipoId, @PathVariable Long usuarioId) { - invitacionService.crearInvitacion(equipoId, usuarioId); - }*/ - @GetMapping("/invitaciones/{idUsuario}") + //Obtener todas las invitaciones de un usuario + //Mis invitaciones -> Presentacion lista invitaciones + @GetMapping("/get/{idUsuario}") public ResponseEntity> obtenerTodasLasInvitaciones(@PathVariable Long idUsuario) { List invitaciones = converterDTO.toDtoListInvitaciones(invitacionService.obtenerInvitacionesPorIdUsuario(idUsuario)); return ResponseEntity.ok().body(invitaciones); } - + //Rechazar invitacion + //Mis invitaciones -> Boton rechazar + @PutMapping("/deny/{idInvitacion}") + public ResponseEntity rechazarInvitacion(@PathVariable Long idInvitacion){ + try{ + invitacionService.rechazarInvitacion(idInvitacion); + return ResponseEntity.ok().body("Invitacion rechazada"); + }catch (Exception e){ + return ResponseEntity.badRequest().body("Error al rechazar invitacion"); + } + } } diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index a7302cb..8742f39 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -1,31 +1,43 @@ package com.example.demo.rest; +import com.example.demo.domain.Solicitud; +import com.example.demo.dto.InvitacionDTO; +import com.example.demo.dto.SolicitudDTO; import com.example.demo.security.payload.MessageResponse; import com.example.demo.service.SolicitudService; +import com.example.demo.util.ConverterDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController -@RequestMapping("/api") +@RequestMapping("/solicitudes") public class SolicitudController { @Autowired SolicitudService solicitudService; + @Autowired + private ConverterDTO converterDTO; //Crear solicitud //Lista solicitudes -> Boton enviar solicitud - @PostMapping("/solicitudes") + @PostMapping("/add") public ResponseEntity crearSolicitud(@RequestParam Long idUsuario, @RequestParam Long idEquipo) { try { solicitudService.crearSolicitud(idUsuario, idEquipo); return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Error al enviar solicitud")); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ya hay una solicitud registrada para este equipo")); } } + //Mostrar todas las solicitudes + //Equipos -> Invitaciones pendientes + @GetMapping("/get/{idUsuario}") + public ResponseEntity> obtenerSolicitudesPorIdUsuario(@PathVariable Long idUsuario) { + List solicitudes = converterDTO.toDtoListSolicitudes(solicitudService.obtenerSolcitudesPorIdUsuario(idUsuario)); + return ResponseEntity.ok().body(solicitudes); + } } diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java index a787c2d..126d858 100644 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ b/src/main/java/com/example/demo/service/InvitacionService.java @@ -34,6 +34,15 @@ public List obtenerInvitacionesPorIdUsuario(long idUsuario){ return invitacionRepository.findByUsuarioId(idUsuario); } + public void rechazarInvitacion(Long idInvitacion) { + Invitacion invitacion = invitacionRepository.findById(idInvitacion).orElse(null); + if (invitacion != null) { + invitacion.setAceptada(Boolean.FALSE); + invitacionRepository.save(invitacion); + } + } + + } diff --git a/src/main/java/com/example/demo/service/SolicitudService.java b/src/main/java/com/example/demo/service/SolicitudService.java index 7a23398..6756f9c 100644 --- a/src/main/java/com/example/demo/service/SolicitudService.java +++ b/src/main/java/com/example/demo/service/SolicitudService.java @@ -1,6 +1,7 @@ package com.example.demo.service; import com.example.demo.domain.Equipo; +import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; import com.example.demo.repository.SolicitudRepository; @@ -8,6 +9,7 @@ import org.springframework.stereotype.Service; import javax.persistence.EntityNotFoundException; +import java.util.List; @Service public class SolicitudService { @@ -29,4 +31,7 @@ public void crearSolicitud(Long idUsuario, Long idEquipo) { solicitudRepository.save(solicitud); } + public List obtenerSolcitudesPorIdUsuario(long idUsuario){ + return solicitudRepository.findByUsuarioId(idUsuario); + } } diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java index 7b29763..45b58e7 100644 --- a/src/main/java/com/example/demo/util/ConverterDTO.java +++ b/src/main/java/com/example/demo/util/ConverterDTO.java @@ -2,9 +2,11 @@ import com.example.demo.domain.Equipo; import com.example.demo.domain.Invitacion; +import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; import com.example.demo.dto.EquipoDTO; import com.example.demo.dto.InvitacionDTO; +import com.example.demo.dto.SolicitudDTO; import com.example.demo.dto.UsuarioDTO; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Component; @@ -28,6 +30,10 @@ public UsuarioDTO toDto(Usuario usuario){ UsuarioDTO usuarioDTO = modelMapper.map(usuario, UsuarioDTO.class); return usuarioDTO; } + public SolicitudDTO toDto(Solicitud solicitud){ + SolicitudDTO solicitudDTO = modelMapper.map(solicitud, SolicitudDTO.class); + return solicitudDTO; + } public List toDtoListUsuarios(List usuarios) { List usuariosDTO = usuarios.stream() .map(usuario -> modelMapper.map(usuario, UsuarioDTO.class)) @@ -46,4 +52,10 @@ public List toDtoListInvitaciones(List invitaciones){ .collect(Collectors.toList()); return invitacionesDTO; } + public List toDtoListSolicitudes(List solicitudes){ + List solicitudesDTO = solicitudes.stream() + .map(solicitud -> modelMapper.map(solicitud, SolicitudDTO.class)) + .collect(Collectors.toList()); + return solicitudesDTO; + } } From f56abfaf25f1c5f3d6d66936af062932e39ca6fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Tue, 9 May 2023 22:42:09 -0500 Subject: [PATCH 04/26] Dummy --- src/main/java/com/example/demo/rest/SolicitudController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index 8742f39..daba4bf 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -33,7 +33,7 @@ public ResponseEntity crearSolicitud(@RequestParam Long idUsuario, @RequestPa } } //Mostrar todas las solicitudes - //Equipos -> Invitaciones pendientes + //Equipos -> Solicitudes pendientes @GetMapping("/get/{idUsuario}") public ResponseEntity> obtenerSolicitudesPorIdUsuario(@PathVariable Long idUsuario) { List solicitudes = converterDTO.toDtoListSolicitudes(solicitudService.obtenerSolcitudesPorIdUsuario(idUsuario)); From d27ca22abe6617bc75430a0e72a122246fe72b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 02:09:54 -0500 Subject: [PATCH 05/26] BugFixAuth --- .../com/example/demo/rest/AuthController.java | 26 ++++++++++++++++--- .../example/demo/service/UsuarioService.java | 4 +++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/demo/rest/AuthController.java b/src/main/java/com/example/demo/rest/AuthController.java index f92de25..98374c1 100644 --- a/src/main/java/com/example/demo/rest/AuthController.java +++ b/src/main/java/com/example/demo/rest/AuthController.java @@ -1,12 +1,16 @@ package com.example.demo.rest; import com.example.demo.domain.Usuario; +import com.example.demo.dto.UsuarioDTO; import com.example.demo.repository.UsuarioRepository; import com.example.demo.security.jwt.JwtTokenUtil; import com.example.demo.security.payload.JwtResponse; import com.example.demo.security.payload.LoginRequest; import com.example.demo.security.payload.MessageResponse; import com.example.demo.security.payload.RegisterRequest; +import com.example.demo.service.UsuarioService; +import com.example.demo.util.ConverterDTO; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -18,6 +22,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; + /** * Controlador para llevar a cabo la autenticación utilizando JWT * @@ -32,22 +39,28 @@ public class AuthController { private final AuthenticationManager authManager; + @Autowired private final UsuarioRepository userRepository; + + @Autowired + private final UsuarioService usuarioService; private final PasswordEncoder encoder; private final JwtTokenUtil jwtTokenUtil; public AuthController(AuthenticationManager authManager, UsuarioRepository usuarioRepository, PasswordEncoder encoder, + UsuarioService usuarioService, JwtTokenUtil jwtTokenUtil){ this.authManager = authManager; this.userRepository = usuarioRepository; this.encoder = encoder; this.jwtTokenUtil = jwtTokenUtil; + this.usuarioService = usuarioService; } @PostMapping("/login") - public ResponseEntity login(@RequestBody LoginRequest loginRequest){ + public ResponseEntity> login(@RequestBody LoginRequest loginRequest) { Authentication authentication = authManager.authenticate( new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); @@ -55,11 +68,16 @@ public ResponseEntity login(@RequestBody LoginRequest loginRequest) SecurityContextHolder.getContext().setAuthentication(authentication); String jwt = jwtTokenUtil.generateJwtToken(authentication); - // UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + Usuario user = usuarioService.findByUsername(loginRequest.getUsername()); - return ResponseEntity.ok(new JwtResponse(jwt)); - } + ConverterDTO converterDTO = new ConverterDTO(); + UsuarioDTO usuarioDTO = converterDTO.toDto(user); + Map response = new HashMap<>(); + response.put("user", usuarioDTO); + response.put("token", jwt); + return ResponseEntity.ok(response); + } @PostMapping("/register") public ResponseEntity register(@RequestBody RegisterRequest signUpRequest) { diff --git a/src/main/java/com/example/demo/service/UsuarioService.java b/src/main/java/com/example/demo/service/UsuarioService.java index ff9233d..9d6e8ef 100644 --- a/src/main/java/com/example/demo/service/UsuarioService.java +++ b/src/main/java/com/example/demo/service/UsuarioService.java @@ -22,4 +22,8 @@ public Usuario save(Usuario usuario) { public Iterable findAll(){ return usuarioRepository.findAll(); } + + public Usuario findByUsername(String username) { + return usuarioRepository.findByUsername(username).orElseThrow(() -> new NoSuchElementException("Usuario no encontrado")); + } } From 48acae92b174233520acade30612e807e966a8f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 02:31:50 -0500 Subject: [PATCH 06/26] Eliminar invitacion --- .../java/com/example/demo/rest/InvitacionController.java | 3 ++- .../java/com/example/demo/service/InvitacionService.java | 6 +----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index bd68bd4..25f38d8 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -27,7 +27,7 @@ public ResponseEntity> obtenerTodasLasInvitaciones(@PathVari } //Rechazar invitacion //Mis invitaciones -> Boton rechazar - @PutMapping("/deny/{idInvitacion}") + @DeleteMapping("/deny/{idInvitacion}") public ResponseEntity rechazarInvitacion(@PathVariable Long idInvitacion){ try{ invitacionService.rechazarInvitacion(idInvitacion); @@ -36,4 +36,5 @@ public ResponseEntity rechazarInvitacion(@PathVariable Long idInvitacion){ return ResponseEntity.badRequest().body("Error al rechazar invitacion"); } } + } diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java index 126d858..e81cd3c 100644 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ b/src/main/java/com/example/demo/service/InvitacionService.java @@ -35,11 +35,7 @@ public List obtenerInvitacionesPorIdUsuario(long idUsuario){ } public void rechazarInvitacion(Long idInvitacion) { - Invitacion invitacion = invitacionRepository.findById(idInvitacion).orElse(null); - if (invitacion != null) { - invitacion.setAceptada(Boolean.FALSE); - invitacionRepository.save(invitacion); - } + invitacionRepository.deleteById(idInvitacion); } From af4b9f207365a7062a7e4e5102084b6fbc823300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 03:04:31 -0500 Subject: [PATCH 07/26] POR FIN FUNCIONA ACEPTAR INVITACION --- src/main/java/com/example/demo/domain/Equipo.java | 7 ++----- src/main/java/com/example/demo/domain/Usuario.java | 3 ++- .../java/com/example/demo/dto/InvitacionDTO.java | 2 +- .../com/example/demo/rest/InvitacionController.java | 9 +++++++++ .../com/example/demo/service/InvitacionService.java | 9 ++++++++- .../com/example/demo/service/UsuarioService.java | 12 ++++++++++++ 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Equipo.java b/src/main/java/com/example/demo/domain/Equipo.java index ff94cd0..425291f 100644 --- a/src/main/java/com/example/demo/domain/Equipo.java +++ b/src/main/java/com/example/demo/domain/Equipo.java @@ -3,17 +3,14 @@ import java.util.HashSet; import java.util.Set; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; +import lombok.*; import org.hibernate.annotations.SQLDelete; -import lombok.Singular; import org.hibernate.annotations.Where; import javax.persistence.*; -@Data +@Getter @Builder @AllArgsConstructor @Entity diff --git a/src/main/java/com/example/demo/domain/Usuario.java b/src/main/java/com/example/demo/domain/Usuario.java index 32c8872..9b33d10 100644 --- a/src/main/java/com/example/demo/domain/Usuario.java +++ b/src/main/java/com/example/demo/domain/Usuario.java @@ -2,11 +2,12 @@ import java.util.Set; import lombok.Data; +import lombok.Getter; import javax.persistence.*; -@Data +@Getter @Entity @Table(name = "usuario") public class Usuario { diff --git a/src/main/java/com/example/demo/dto/InvitacionDTO.java b/src/main/java/com/example/demo/dto/InvitacionDTO.java index f5440cb..0781aa4 100644 --- a/src/main/java/com/example/demo/dto/InvitacionDTO.java +++ b/src/main/java/com/example/demo/dto/InvitacionDTO.java @@ -7,6 +7,6 @@ @NoArgsConstructor public class InvitacionDTO { private long id; - //private UsuarioDTO usuario; + private UsuarioDTO usuario; private EquipoDTO equipo; } diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index 25f38d8..8c5a97f 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -36,5 +36,14 @@ public ResponseEntity rechazarInvitacion(@PathVariable Long idInvitacion){ return ResponseEntity.badRequest().body("Error al rechazar invitacion"); } } + @PutMapping("/accept") + public ResponseEntity aceptarInvitacion(@RequestBody InvitacionDTO invitacion){ + try{ + invitacionService.aceptarInvitacion(invitacion); + return ResponseEntity.ok().body("Invitacion aceptada"); + }catch (Exception e){ + return ResponseEntity.badRequest().body("Error al aceptar invitacion"); + } + } } diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java index e81cd3c..8635acd 100644 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ b/src/main/java/com/example/demo/service/InvitacionService.java @@ -3,6 +3,9 @@ import com.example.demo.domain.Equipo; import com.example.demo.domain.Invitacion; import com.example.demo.domain.Usuario; +import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.InvitacionDTO; +import com.example.demo.dto.UsuarioDTO; import com.example.demo.repository.InvitacionRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,6 +42,10 @@ public void rechazarInvitacion(Long idInvitacion) { } + public void aceptarInvitacion(InvitacionDTO invitacion) { - + UsuarioDTO usuario = invitacion.getUsuario(); + EquipoDTO equipo = invitacion.getEquipo(); + usuarioService.agregarUsuarioEquipo(usuario, equipo); + } } diff --git a/src/main/java/com/example/demo/service/UsuarioService.java b/src/main/java/com/example/demo/service/UsuarioService.java index 9d6e8ef..a4e8ee3 100644 --- a/src/main/java/com/example/demo/service/UsuarioService.java +++ b/src/main/java/com/example/demo/service/UsuarioService.java @@ -1,6 +1,9 @@ package com.example.demo.service; +import com.example.demo.domain.Equipo; import com.example.demo.domain.Usuario; +import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.UsuarioDTO; import com.example.demo.repository.UsuarioRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,6 +15,9 @@ public class UsuarioService { @Autowired UsuarioRepository usuarioRepository; + @Autowired + EquipoService equipoService; + public Usuario findById(Long id) { return usuarioRepository.findById(id).orElseThrow(() -> new NoSuchElementException("Usuario no encontrado")); } @@ -26,4 +32,10 @@ public Iterable findAll(){ public Usuario findByUsername(String username) { return usuarioRepository.findByUsername(username).orElseThrow(() -> new NoSuchElementException("Usuario no encontrado")); } + public void agregarUsuarioEquipo(UsuarioDTO usuarioDTO, EquipoDTO equipoDTO) { + Usuario usuario = findById(usuarioDTO.getId()); + Equipo equipo = equipoService.findById(equipoDTO.getId()); + usuario.getEquipos_participe().add(equipo); + usuarioRepository.save(usuario); + } } From 370e36da9bc6eac2baedc221fddf3612ea38b6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 03:07:16 -0500 Subject: [PATCH 08/26] =?UTF-8?q?Peque=C3=B1os=20ajustes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/domain/Invitacion.java | 2 -- src/main/java/com/example/demo/domain/Solicitud.java | 1 - src/main/java/com/example/demo/service/InvitacionService.java | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Invitacion.java b/src/main/java/com/example/demo/domain/Invitacion.java index cdd7659..615b04a 100644 --- a/src/main/java/com/example/demo/domain/Invitacion.java +++ b/src/main/java/com/example/demo/domain/Invitacion.java @@ -11,8 +11,6 @@ public class Invitacion { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; - Boolean aceptada; - @ManyToOne() @JoinColumn(name="id_usuario",nullable=false,referencedColumnName="id") diff --git a/src/main/java/com/example/demo/domain/Solicitud.java b/src/main/java/com/example/demo/domain/Solicitud.java index 70b3bba..d11f598 100644 --- a/src/main/java/com/example/demo/domain/Solicitud.java +++ b/src/main/java/com/example/demo/domain/Solicitud.java @@ -12,7 +12,6 @@ public class Solicitud { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; - Boolean aceptada; @ManyToOne @JoinColumn(name="id_usuario",nullable = false,referencedColumnName="id") diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java index 8635acd..cba5ee6 100644 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ b/src/main/java/com/example/demo/service/InvitacionService.java @@ -47,5 +47,6 @@ public void aceptarInvitacion(InvitacionDTO invitacion) { UsuarioDTO usuario = invitacion.getUsuario(); EquipoDTO equipo = invitacion.getEquipo(); usuarioService.agregarUsuarioEquipo(usuario, equipo); + invitacionRepository.deleteById(invitacion.getId()); } } From 31fbe7e5071d5e11c9ff3fd856cbe9053488655c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 03:11:37 -0500 Subject: [PATCH 09/26] Ajuste --- src/main/java/com/example/demo/service/SolicitudService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/service/SolicitudService.java b/src/main/java/com/example/demo/service/SolicitudService.java index 6756f9c..28c7e5b 100644 --- a/src/main/java/com/example/demo/service/SolicitudService.java +++ b/src/main/java/com/example/demo/service/SolicitudService.java @@ -27,7 +27,7 @@ public void crearSolicitud(Long idUsuario, Long idEquipo) { Solicitud solicitud = new Solicitud(); solicitud.setUsuario(usuario); solicitud.setEquipo(equipo); - solicitud.setAceptada(null); + solicitudRepository.save(solicitud); } From 9d129d46dbc4d5b1991ebbd86eac22c88859d1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 11:00:46 -0500 Subject: [PATCH 10/26] Eliminar equipo funcionando --- .../java/com/example/demo/domain/Equipo.java | 3 +- .../example/demo/rest/EquipoController.java | 31 +++++++------- .../example/demo/rest/UsuarioController.java | 16 +------ .../example/demo/service/EquipoService.java | 42 +++++++++++++++++++ .../demo/service/InvitacionService.java | 4 ++ .../demo/service/SolicitudService.java | 4 ++ 6 files changed, 70 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Equipo.java b/src/main/java/com/example/demo/domain/Equipo.java index 425291f..c4373dd 100644 --- a/src/main/java/com/example/demo/domain/Equipo.java +++ b/src/main/java/com/example/demo/domain/Equipo.java @@ -22,9 +22,8 @@ public class Equipo { private long id; private String nombreEquipo; private String siglas; - private boolean eliminado= Boolean.FALSE; - @ManyToMany(mappedBy = "equipos_participe", cascade = CascadeType.REMOVE) + @ManyToMany(mappedBy = "equipos_participe", cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST }) private Set jugadores_en_equipo; @OneToMany(mappedBy = "equipo", cascade = CascadeType.REMOVE) diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index 993f05f..0d17c1b 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -7,16 +7,14 @@ import com.example.demo.service.EquipoService; import com.example.demo.util.ConverterDTO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @RestController -@RequestMapping("/api") +@RequestMapping("/equipos") public class EquipoController { @Autowired EquipoRepository equipoRepository; @@ -25,20 +23,25 @@ public class EquipoController { @Autowired private ConverterDTO converterDTO; //Obtener todos los equipos - @GetMapping("/equipos") - public List findAll() { - return equipoRepository.findAll(); - } - @GetMapping("/equipos/{id}") - public ResponseEntity obtenerEquipo(@PathVariable Long id) { - Equipo equipo = equipoService.findById(id); + @GetMapping("/{idEquipo}") + public ResponseEntity obtenerEquipo(@PathVariable Long idEquipo) { + Equipo equipo = equipoService.findById(idEquipo); if (equipo == null) { return ResponseEntity.notFound().build(); } EquipoDTO equipoDTO = converterDTO.toDto(equipo); return ResponseEntity.ok(equipoDTO); } - - + //Traer equipos en los que no hace parte el usuario + @GetMapping("/{idUsuario}/equipos_disponibles") + public List obtenerEquiposDisponibles(@PathVariable Long idUsuario) { + List equipos = equipoService.buscarEquiposDisponibles(idUsuario); + List equipoDTO = converterDTO.toDtoListEquipos(equipos); + return equipoDTO; + } + @DeleteMapping("/delete/{idEquipo}") + public ResponseEntity eliminarEquipo(@PathVariable Long idEquipo) { + return equipoService.delete(idEquipo); + } } diff --git a/src/main/java/com/example/demo/rest/UsuarioController.java b/src/main/java/com/example/demo/rest/UsuarioController.java index 3c41c43..aa08434 100644 --- a/src/main/java/com/example/demo/rest/UsuarioController.java +++ b/src/main/java/com/example/demo/rest/UsuarioController.java @@ -24,18 +24,6 @@ public class UsuarioController { EquipoService equipoService; @Autowired private ConverterDTO converterDTO; - @GetMapping("/usuarios") - public List findAll() { - List usuarios = (List) usuarioService.findAll(); - List usuariosDTO = converterDTO.toDtoListUsuarios(usuarios); - return usuariosDTO; - } - //Obtener todos los equipos los cuales el usuario no pertenece - //Lista equipos -> Presentacion lista de equipos - @GetMapping("/usuarios/{id}/equipos_disponibles") - public List obtenerEquiposDisponibles(@PathVariable Long id) { - List equipos = equipoService.buscarEquiposDisponibles(id); - List equipoDTO = converterDTO.toDtoListEquipos(equipos); - return equipoDTO; - } + + } diff --git a/src/main/java/com/example/demo/service/EquipoService.java b/src/main/java/com/example/demo/service/EquipoService.java index 0f79d80..d51bb8c 100644 --- a/src/main/java/com/example/demo/service/EquipoService.java +++ b/src/main/java/com/example/demo/service/EquipoService.java @@ -3,11 +3,18 @@ import com.example.demo.domain.Equipo; import com.example.demo.domain.Invitacion; +import com.example.demo.domain.Solicitud; +import com.example.demo.domain.Usuario; import com.example.demo.repository.EquipoRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import javax.persistence.EntityManager; +import javax.persistence.PreRemove; import java.util.List; +import java.util.NoSuchElementException; import java.util.Optional; @Service @@ -15,6 +22,13 @@ public class EquipoService { @Autowired private EquipoRepository equipoRepository; + @Autowired + private SolicitudService solicitudesService; + + @Autowired + private InvitacionService invitacionService; + + private EntityManager entityManager; public Iterable findAll(){ return equipoRepository.findAll(); @@ -29,4 +43,32 @@ public Equipo save(Equipo equipo) { public List buscarEquiposDisponibles(Long idUsuario){ return equipoRepository.buscarEquiposDisponibles(idUsuario); } + + public ResponseEntity delete(Long idEquipo) { + try { + Equipo equipo = findById(idEquipo); + for (Invitacion invitacion: equipo.getInvitaciones_a_jugadores()) { + invitacionService.delete(invitacion.getId()); + } + equipo.getInvitaciones_a_jugadores().clear(); + + for(Solicitud solicitud: equipo.getSolicitudes_de_jugadores()){ + solicitudesService.delete(solicitud.getId()); + } + equipo.getSolicitudes_de_jugadores().clear(); + + for(Usuario usuario : equipo.getJugadores_en_equipo()){ + usuario.getEquipos_participe().remove(equipo); + } + equipoRepository.delete(equipo); + + return ResponseEntity.ok("El equipo con ID " + idEquipo + " fue eliminado exitosamente."); + } catch (NoSuchElementException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No se encontró el equipo con ID " + idEquipo + "."); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Ocurrió un error al eliminar el equipo con ID " + idEquipo + "."); + } + + } + } diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java index cba5ee6..07a2faf 100644 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ b/src/main/java/com/example/demo/service/InvitacionService.java @@ -49,4 +49,8 @@ public void aceptarInvitacion(InvitacionDTO invitacion) { usuarioService.agregarUsuarioEquipo(usuario, equipo); invitacionRepository.deleteById(invitacion.getId()); } + + public void delete(Long id) { + invitacionRepository.deleteById(id); + } } diff --git a/src/main/java/com/example/demo/service/SolicitudService.java b/src/main/java/com/example/demo/service/SolicitudService.java index 28c7e5b..9b842b4 100644 --- a/src/main/java/com/example/demo/service/SolicitudService.java +++ b/src/main/java/com/example/demo/service/SolicitudService.java @@ -34,4 +34,8 @@ public void crearSolicitud(Long idUsuario, Long idEquipo) { public List obtenerSolcitudesPorIdUsuario(long idUsuario){ return solicitudRepository.findByUsuarioId(idUsuario); } + + public void delete(Long id) { + solicitudRepository.deleteById(id); + } } From e5f0c1214c26dc85456dd5c34f24107f61e2355f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 11:19:47 -0500 Subject: [PATCH 11/26] Obtener equipos que participa como jugador --- .../java/com/example/demo/dto/SolicitudDTO.java | 3 +++ .../com/example/demo/rest/EquipoController.java | 9 ++++++++- .../example/demo/rest/SolicitudController.java | 4 ++-- .../com/example/demo/service/EquipoService.java | 17 +++++++++++++---- .../com/example/demo/util/ConverterDTO.java | 8 ++++++++ 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/demo/dto/SolicitudDTO.java b/src/main/java/com/example/demo/dto/SolicitudDTO.java index 27faa84..070cd35 100644 --- a/src/main/java/com/example/demo/dto/SolicitudDTO.java +++ b/src/main/java/com/example/demo/dto/SolicitudDTO.java @@ -1,5 +1,6 @@ package com.example.demo.dto; +import com.example.demo.domain.Equipo; import com.example.demo.domain.Usuario; import lombok.Data; import lombok.NoArgsConstructor; @@ -9,4 +10,6 @@ public class SolicitudDTO { private long id; private UsuarioDTO usuario; + + private EquipoDTO equipo; } diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index 0d17c1b..311aaf2 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Set; @RestController @RequestMapping("/equipos") @@ -39,8 +40,14 @@ public List obtenerEquiposDisponibles(@PathVariable Long idUsuario) { List equipoDTO = converterDTO.toDtoListEquipos(equipos); return equipoDTO; } + @GetMapping("/{idUsuario}/equipos_participe") + public List obtenerEquiposParticipe(@PathVariable Long idUsuario) { + Set equipos = equipoService.buscarEquiposParticipe(idUsuario); + List equipoDTO = converterDTO.toDtoSetEquipos(equipos); + return equipoDTO; + } @DeleteMapping("/delete/{idEquipo}") - public ResponseEntity eliminarEquipo(@PathVariable Long idEquipo) { + public ResponseEntity eliminarEquipo(@PathVariable Long idEquipo) { return equipoService.delete(idEquipo); } diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index daba4bf..acde9d0 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -23,8 +23,8 @@ public class SolicitudController { //Crear solicitud //Lista solicitudes -> Boton enviar solicitud - @PostMapping("/add") - public ResponseEntity crearSolicitud(@RequestParam Long idUsuario, @RequestParam Long idEquipo) { + @PostMapping("/add/{idUsuario}/{idEquipo}") + public ResponseEntity crearSolicitud(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { try { solicitudService.crearSolicitud(idUsuario, idEquipo); return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); diff --git a/src/main/java/com/example/demo/service/EquipoService.java b/src/main/java/com/example/demo/service/EquipoService.java index d51bb8c..5e64439 100644 --- a/src/main/java/com/example/demo/service/EquipoService.java +++ b/src/main/java/com/example/demo/service/EquipoService.java @@ -6,6 +6,7 @@ import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; import com.example.demo.repository.EquipoRepository; +import com.example.demo.security.payload.MessageResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -16,6 +17,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; +import java.util.Set; @Service public class EquipoService { @@ -27,6 +29,8 @@ public class EquipoService { @Autowired private InvitacionService invitacionService; + @Autowired + private UsuarioService usuarioService; private EntityManager entityManager; @@ -44,7 +48,7 @@ public List buscarEquiposDisponibles(Long idUsuario){ return equipoRepository.buscarEquiposDisponibles(idUsuario); } - public ResponseEntity delete(Long idEquipo) { + public ResponseEntity delete(Long idEquipo) { try { Equipo equipo = findById(idEquipo); for (Invitacion invitacion: equipo.getInvitaciones_a_jugadores()) { @@ -62,13 +66,18 @@ public ResponseEntity delete(Long idEquipo) { } equipoRepository.delete(equipo); - return ResponseEntity.ok("El equipo con ID " + idEquipo + " fue eliminado exitosamente."); + return ResponseEntity.ok(new MessageResponse("El equipo con ID " + idEquipo + " fue eliminado exitosamente.")); } catch (NoSuchElementException e) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No se encontró el equipo con ID " + idEquipo + "."); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new MessageResponse("No se encontró el equipo con ID " + idEquipo + ".")); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Ocurrió un error al eliminar el equipo con ID " + idEquipo + "."); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ocurrió un error al eliminar el equipo con ID " + idEquipo + ".")); } } + public Set buscarEquiposParticipe(Long idUsuario) { + Usuario usuario = usuarioService.findById(idUsuario); + return usuario.getEquipos_participe(); + + } } diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java index 45b58e7..2649e87 100644 --- a/src/main/java/com/example/demo/util/ConverterDTO.java +++ b/src/main/java/com/example/demo/util/ConverterDTO.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Component; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @@ -58,4 +59,11 @@ public List toDtoListSolicitudes(List solicitudes){ .collect(Collectors.toList()); return solicitudesDTO; } + + public List toDtoSetEquipos(Set equipos) { + List equiposDTO = equipos.stream() + .map(equipo -> modelMapper.map(equipo, EquipoDTO.class)) + .collect(Collectors.toList()); + return equiposDTO; + } } From f10f557150964b7545f25424ebedcb855d46297e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 12:15:39 -0500 Subject: [PATCH 12/26] Ajuste traer todos los equipos Ya no se utiliza soft delete --- .../example/demo/repository/EquipoRepository.java | 13 +++---------- .../com/example/demo/rest/EquipoController.java | 1 + 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/demo/repository/EquipoRepository.java b/src/main/java/com/example/demo/repository/EquipoRepository.java index f8d2c26..d719254 100644 --- a/src/main/java/com/example/demo/repository/EquipoRepository.java +++ b/src/main/java/com/example/demo/repository/EquipoRepository.java @@ -9,14 +9,7 @@ import java.util.List; public interface EquipoRepository extends JpaRepository { - @Query(value = "SELECT e.* " + - "FROM Equipo e " + - "WHERE e.eliminado = false " + - "AND NOT EXISTS ( " + - " SELECT 1 " + - " FROM jugadores_en_equipo je " + - " WHERE je.id_equipo = e.id " + - " AND je.id_usuario = :idUsuario " + - ")", nativeQuery = true) - List buscarEquiposDisponibles(@Param("idUsuario") Long idUsuario); + @Query("SELECT e FROM Equipo e WHERE NOT EXISTS " + + "(SELECT 1 FROM Usuario u JOIN u.equipos_participe ep WHERE ep.id = e.id AND u.id = :userId)") + List buscarEquiposDisponibles(@Param("userId") Long userId); } diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index 311aaf2..c69d398 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -34,6 +34,7 @@ public ResponseEntity obtenerEquipo(@PathVariable Long idEquipo) { return ResponseEntity.ok(equipoDTO); } //Traer equipos en los que no hace parte el usuario + // Lista equipos -> Presentacion @GetMapping("/{idUsuario}/equipos_disponibles") public List obtenerEquiposDisponibles(@PathVariable Long idUsuario) { List equipos = equipoService.buscarEquiposDisponibles(idUsuario); From 0d880cc187accf153c25cf2cb3d6fcf18f2d0683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 12:26:17 -0500 Subject: [PATCH 13/26] Ajuste ruta crear solicitud --- src/main/java/com/example/demo/rest/SolicitudController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index acde9d0..d4b4985 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -23,8 +23,8 @@ public class SolicitudController { //Crear solicitud //Lista solicitudes -> Boton enviar solicitud - @PostMapping("/add/{idUsuario}/{idEquipo}") - public ResponseEntity crearSolicitud(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { + @PostMapping("/add") + public ResponseEntity crearSolicitud(@RequestBody Long idUsuario, @RequestBody Long idEquipo) { try { solicitudService.crearSolicitud(idUsuario, idEquipo); return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); From 19182a7157a98beca0963d7fe3b168091cb6399b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 13:22:09 -0500 Subject: [PATCH 14/26] Controller solicitud completado --- .../demo/repository/SolicitudRepository.java | 2 ++ .../demo/rest/SolicitudController.java | 33 ++++++++++++++++--- .../demo/service/SolicitudService.java | 19 +++++++++-- .../example/demo/service/UsuarioService.java | 3 ++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/demo/repository/SolicitudRepository.java b/src/main/java/com/example/demo/repository/SolicitudRepository.java index 48d314b..1479c50 100644 --- a/src/main/java/com/example/demo/repository/SolicitudRepository.java +++ b/src/main/java/com/example/demo/repository/SolicitudRepository.java @@ -9,4 +9,6 @@ public interface SolicitudRepository extends JpaRepository{ List findByUsuarioId(long idUsuario); + + List findByEquipoId(long idEquipo); } diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index d4b4985..56dda4c 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -1,10 +1,12 @@ package com.example.demo.rest; import com.example.demo.domain.Solicitud; -import com.example.demo.dto.InvitacionDTO; import com.example.demo.dto.SolicitudDTO; +import com.example.demo.dto.SolicitudDTO; +import com.example.demo.dto.UsuarioDTO; import com.example.demo.security.payload.MessageResponse; import com.example.demo.service.SolicitudService; +import com.example.demo.service.UsuarioService; import com.example.demo.util.ConverterDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -18,6 +20,9 @@ public class SolicitudController { @Autowired SolicitudService solicitudService; + + @Autowired + UsuarioService usuarioService; @Autowired private ConverterDTO converterDTO; @@ -34,10 +39,28 @@ public ResponseEntity crearSolicitud(@RequestBody Long idUsuario, @RequestBod } //Mostrar todas las solicitudes //Equipos -> Solicitudes pendientes - @GetMapping("/get/{idUsuario}") - public ResponseEntity> obtenerSolicitudesPorIdUsuario(@PathVariable Long idUsuario) { - List solicitudes = converterDTO.toDtoListSolicitudes(solicitudService.obtenerSolcitudesPorIdUsuario(idUsuario)); - return ResponseEntity.ok().body(solicitudes); + @GetMapping("/get/{idEquipo}") + public ResponseEntity> obtenerTodasLasSolicitudes(@PathVariable Long idEquipo) { + List solicitudes = converterDTO.toDtoListSolicitudes(solicitudService.obtenerSolcitudesPorIdEquipo(idEquipo)); + return ResponseEntity.ok().body(solicitudes); + } + @DeleteMapping("/deny/{idSolicitud}") + public ResponseEntity rechazarSolicitud(@PathVariable Long idSolicitud){ + try{ + solicitudService.rechazarSolicitud(idSolicitud); + return ResponseEntity.ok().body("Solicitud rechazada"); + }catch (Exception e){ + return ResponseEntity.badRequest().body("Error al rechazar Solicitud"); + } + } + @PutMapping("/accept") + public ResponseEntity aceptarSolicitud(@RequestBody SolicitudDTO solicitud){ + try{ + solicitudService.aceptarSolicitud(solicitud); + return ResponseEntity.ok().body("Solicitud aceptada"); + }catch (Exception e){ + return ResponseEntity.badRequest().body("Error al aceptar Solicitud"); + } } } diff --git a/src/main/java/com/example/demo/service/SolicitudService.java b/src/main/java/com/example/demo/service/SolicitudService.java index 9b842b4..a5bdb87 100644 --- a/src/main/java/com/example/demo/service/SolicitudService.java +++ b/src/main/java/com/example/demo/service/SolicitudService.java @@ -1,9 +1,11 @@ package com.example.demo.service; import com.example.demo.domain.Equipo; -import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; +import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.SolicitudDTO; +import com.example.demo.dto.UsuarioDTO; import com.example.demo.repository.SolicitudRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,11 +33,22 @@ public void crearSolicitud(Long idUsuario, Long idEquipo) { solicitudRepository.save(solicitud); } - public List obtenerSolcitudesPorIdUsuario(long idUsuario){ - return solicitudRepository.findByUsuarioId(idUsuario); + public List obtenerSolcitudesPorIdEquipo(long idEquipo){ + return solicitudRepository.findByEquipoId(idEquipo); } public void delete(Long id) { solicitudRepository.deleteById(id); } + + public void rechazarSolicitud(Long idSolicitud) { + solicitudRepository.deleteById(idSolicitud); + } + + public void aceptarSolicitud(SolicitudDTO solicitud) { + UsuarioDTO usuario = solicitud.getUsuario(); + EquipoDTO equipo = solicitud.getEquipo(); + usuarioService.agregarUsuarioEquipo(usuario, equipo); + solicitudRepository.deleteById(solicitud.getId()); + } } diff --git a/src/main/java/com/example/demo/service/UsuarioService.java b/src/main/java/com/example/demo/service/UsuarioService.java index a4e8ee3..c0b4826 100644 --- a/src/main/java/com/example/demo/service/UsuarioService.java +++ b/src/main/java/com/example/demo/service/UsuarioService.java @@ -1,6 +1,7 @@ package com.example.demo.service; import com.example.demo.domain.Equipo; +import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; import com.example.demo.dto.EquipoDTO; import com.example.demo.dto.UsuarioDTO; @@ -8,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.NoSuchElementException; @Service @@ -38,4 +40,5 @@ public void agregarUsuarioEquipo(UsuarioDTO usuarioDTO, EquipoDTO equipoDTO) { usuario.getEquipos_participe().add(equipo); usuarioRepository.save(usuario); } + } From e167228b97d8f17fcd98580969f7a87996083afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Sat, 13 May 2023 14:03:13 -0500 Subject: [PATCH 15/26] Crear equipo --- src/main/java/com/example/demo/domain/Equipo.java | 1 + src/main/java/com/example/demo/dto/EquipoDTO.java | 2 -- src/main/java/com/example/demo/rest/EquipoController.java | 8 ++++++++ .../java/com/example/demo/rest/SolicitudController.java | 2 ++ src/main/java/com/example/demo/util/ConverterDTO.java | 8 ++++++++ 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/demo/domain/Equipo.java b/src/main/java/com/example/demo/domain/Equipo.java index c4373dd..35e45bc 100644 --- a/src/main/java/com/example/demo/domain/Equipo.java +++ b/src/main/java/com/example/demo/domain/Equipo.java @@ -11,6 +11,7 @@ import javax.persistence.*; @Getter +@Setter @Builder @AllArgsConstructor @Entity diff --git a/src/main/java/com/example/demo/dto/EquipoDTO.java b/src/main/java/com/example/demo/dto/EquipoDTO.java index b413101..f092c3b 100644 --- a/src/main/java/com/example/demo/dto/EquipoDTO.java +++ b/src/main/java/com/example/demo/dto/EquipoDTO.java @@ -9,6 +9,4 @@ public class EquipoDTO { private long id; private String nombreEquipo; private String siglas; - //private boolean eliminado; - } diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index c69d398..b5b9c12 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -24,6 +24,14 @@ public class EquipoController { @Autowired private ConverterDTO converterDTO; //Obtener todos los equipos + @PostMapping("/create") + public ResponseEntity crearEquipo(@RequestBody EquipoDTO equipoDTO) { + System.out.println(equipoDTO); + Equipo equipo = converterDTO.toEntity(equipoDTO); + equipo = equipoService.save(equipo); + equipoDTO = converterDTO.toDto(equipo); + return ResponseEntity.status(HttpStatus.CREATED).body(equipoDTO); + } @GetMapping("/{idEquipo}") public ResponseEntity obtenerEquipo(@PathVariable Long idEquipo) { Equipo equipo = equipoService.findById(idEquipo); diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index 56dda4c..2772c37 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -44,6 +44,7 @@ public ResponseEntity> obtenerTodasLasSolicitudes(@PathVariab List solicitudes = converterDTO.toDtoListSolicitudes(solicitudService.obtenerSolcitudesPorIdEquipo(idEquipo)); return ResponseEntity.ok().body(solicitudes); } + //Equipos -> Solicitudes pendientes -> Boton eliminar @DeleteMapping("/deny/{idSolicitud}") public ResponseEntity rechazarSolicitud(@PathVariable Long idSolicitud){ try{ @@ -53,6 +54,7 @@ public ResponseEntity rechazarSolicitud(@PathVariable Long idSolicitud){ return ResponseEntity.badRequest().body("Error al rechazar Solicitud"); } } + //Equipos -> Solicitudes pendientes -> Boton aceptar @PutMapping("/accept") public ResponseEntity aceptarSolicitud(@RequestBody SolicitudDTO solicitud){ try{ diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java index 2649e87..5110998 100644 --- a/src/main/java/com/example/demo/util/ConverterDTO.java +++ b/src/main/java/com/example/demo/util/ConverterDTO.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Component; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -66,4 +67,11 @@ public List toDtoSetEquipos(Set equipos) { .collect(Collectors.toList()); return equiposDTO; } + public Equipo toEntity(EquipoDTO equipoDTO) { + Equipo equipo = new Equipo(); + equipo.setNombreEquipo(Objects.requireNonNullElse(equipoDTO.getNombreEquipo(), "default")); + equipo.setSiglas(Objects.requireNonNullElse(equipoDTO.getSiglas(), "def")); + return equipo; + } + } From 5a382aa51e714bb2e8071689c4f6c9c5cb0f6777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Mon, 15 May 2023 12:29:24 -0500 Subject: [PATCH 16/26] Update application.properties --- src/main/resources/application.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 80b6144..c8e3173 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/equiposdb -spring.datasource.username=admin -spring.datasource.password=admin +spring.datasource.url=jdbc:mysql://us-cdbr-east-06.cleardb.net:3306/heroku_99681a45f12dfac +spring.datasource.username=b1ceb54e686081 +spring.datasource.password=63f2f7fd spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto = update @@ -11,4 +11,4 @@ spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE app.jwt.secret=openb -app.jwt.expiration-ms=86400000 \ No newline at end of file +app.jwt.expiration-ms=86400000 From 04f1b99662777372ef1eea9555f83c23c567867a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Mon, 15 May 2023 13:01:48 -0500 Subject: [PATCH 17/26] Update InvitacionController.java --- .../com/example/demo/rest/InvitacionController.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index 8c5a97f..3f333bf 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -3,9 +3,11 @@ import com.example.demo.domain.Invitacion; import com.example.demo.dto.InvitacionDTO; +import com.example.demo.security.payload.MessageResponse; import com.example.demo.service.InvitacionService; import com.example.demo.util.ConverterDTO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -45,5 +47,13 @@ public ResponseEntity aceptarInvitacion(@RequestBody InvitacionDTO invitacion return ResponseEntity.badRequest().body("Error al aceptar invitacion"); } } - + @PostMapping("/add") + public ResponseEntity crearSolicitud(@RequestBody Long idUsuario, @RequestBody Long idEquipo) { + try { + invitacionService.crearInvitacion(idEquipo , idUsuario); + return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ya hay una solicitud registrada para este equipo")); + } + } } From bf9d078feebfffc7ad66da6ac3e458ce1ce71312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Mon, 15 May 2023 13:35:25 -0500 Subject: [PATCH 18/26] Crear invitacion y solicitudes --- .../java/com/example/demo/rest/InvitacionController.java | 8 ++++---- .../java/com/example/demo/rest/SolicitudController.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index 3f333bf..ad9d93b 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -47,13 +47,13 @@ public ResponseEntity aceptarInvitacion(@RequestBody InvitacionDTO invitacion return ResponseEntity.badRequest().body("Error al aceptar invitacion"); } } - @PostMapping("/add") - public ResponseEntity crearSolicitud(@RequestBody Long idUsuario, @RequestBody Long idEquipo) { + @PostMapping("/add/user={idUsuario}/equipo={idEquipo}") + public ResponseEntity crearSolicitud(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { try { invitacionService.crearInvitacion(idEquipo , idUsuario); - return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); + return ResponseEntity.ok(new MessageResponse("Invitacion enviada con exito")); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ya hay una solicitud registrada para este equipo")); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ya hay una invitacion registrada para este equipo")); } } } diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java index 2772c37..f0897ec 100644 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ b/src/main/java/com/example/demo/rest/SolicitudController.java @@ -28,8 +28,8 @@ public class SolicitudController { //Crear solicitud //Lista solicitudes -> Boton enviar solicitud - @PostMapping("/add") - public ResponseEntity crearSolicitud(@RequestBody Long idUsuario, @RequestBody Long idEquipo) { + @PostMapping("/add/user={idUsuario}/equipo={idEquipo}") + public ResponseEntity crearSolicitud(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { try { solicitudService.crearSolicitud(idUsuario, idEquipo); return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); From b3d7549e6cc07b282ff699f9b76350b8023be7cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Tue, 16 May 2023 00:28:15 -0500 Subject: [PATCH 19/26] Arreglado crear equipo Cuando se creaba el equipo no se agregaba al propio usuario en la lista de jugadores de ese equipo. Ahora si se agrega --- .../java/com/example/demo/domain/Equipo.java | 2 + .../example/demo/rest/EquipoController.java | 6 +- .../example/demo/service/EquipoService.java | 4 +- .../demo/controller/EquipoControllerTest.java | 65 +++++++++++++++++++ 4 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/example/demo/controller/EquipoControllerTest.java diff --git a/src/main/java/com/example/demo/domain/Equipo.java b/src/main/java/com/example/demo/domain/Equipo.java index 35e45bc..4977415 100644 --- a/src/main/java/com/example/demo/domain/Equipo.java +++ b/src/main/java/com/example/demo/domain/Equipo.java @@ -34,6 +34,8 @@ public class Equipo { private Set invitaciones_a_jugadores; public Equipo() { this.jugadores_en_equipo = new HashSet<>(); + this.solicitudes_de_jugadores = new HashSet<>(); + this.invitaciones_a_jugadores = new HashSet<>(); } } diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index b5b9c12..85dab47 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -24,11 +24,11 @@ public class EquipoController { @Autowired private ConverterDTO converterDTO; //Obtener todos los equipos - @PostMapping("/create") - public ResponseEntity crearEquipo(@RequestBody EquipoDTO equipoDTO) { + @PostMapping("/create/{idUsuario}") + public ResponseEntity crearEquipo(@RequestBody EquipoDTO equipoDTO,@PathVariable Long idUsuario) { System.out.println(equipoDTO); Equipo equipo = converterDTO.toEntity(equipoDTO); - equipo = equipoService.save(equipo); + equipo = equipoService.save(equipo,idUsuario); equipoDTO = converterDTO.toDto(equipo); return ResponseEntity.status(HttpStatus.CREATED).body(equipoDTO); } diff --git a/src/main/java/com/example/demo/service/EquipoService.java b/src/main/java/com/example/demo/service/EquipoService.java index 5e64439..b3686af 100644 --- a/src/main/java/com/example/demo/service/EquipoService.java +++ b/src/main/java/com/example/demo/service/EquipoService.java @@ -41,7 +41,9 @@ public Equipo findById(Long id) { Optional equipoOptional = equipoRepository.findById(id); return equipoOptional.orElseThrow(() -> new RuntimeException("Equipo no encontrado")); } - public Equipo save(Equipo equipo) { + public Equipo save(Equipo equipo,Long idUsuario) { + Usuario usuario = usuarioService.findById(idUsuario); + usuario.getEquipos_participe().add(equipo); return equipoRepository.save(equipo); } public List buscarEquiposDisponibles(Long idUsuario){ diff --git a/src/test/java/com/example/demo/controller/EquipoControllerTest.java b/src/test/java/com/example/demo/controller/EquipoControllerTest.java new file mode 100644 index 0000000..7513d95 --- /dev/null +++ b/src/test/java/com/example/demo/controller/EquipoControllerTest.java @@ -0,0 +1,65 @@ +package com.example.demo.controller; + +import com.example.demo.domain.Equipo; +import com.example.demo.domain.Invitacion; +import com.example.demo.domain.Solicitud; +import com.example.demo.dto.EquipoDTO; +import com.example.demo.dto.UsuarioDTO; +import com.example.demo.rest.EquipoController; +import com.example.demo.service.EquipoService; +import com.example.demo.util.ConverterDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.HashSet; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +@SpringBootTest +@AutoConfigureMockMvc(addFilters = false) +public class EquipoControllerTest { + + @Mock + private EquipoService equipoService; + + @InjectMocks + private EquipoController equipoController; + @Autowired + private MockMvc mockMvc; + @Autowired + private ConverterDTO converterDTO = new ConverterDTO(); + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void testEliminarEquipo() throws Exception { + mockMvc.perform(delete("/equipos/delete/{idEquipo}", 12L)) + .andExpect(status().isOk()); + } + @Test + public void testAgregarEquipo() throws Exception { + mockMvc.perform(post("/equipos/create") + .contentType("application/json") + .content("{\"nombreEquipo\":\"Equipo 1\",\"siglas\":\"EQ1\"}")) + .andExpect(status().isCreated()); + } + +} + From 77e2de80f835e885086df6f14c36f49c61e631a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Tue, 16 May 2023 01:41:00 -0500 Subject: [PATCH 20/26] Tests agregados --- .../demo/rest/InvitacionController.java | 2 +- .../demo/controller/AuthControllerTest.java | 60 +++++++++++++++++++ .../demo/controller/EquipoControllerTest.java | 21 ++----- .../controller/InvitacionControllerTest.java | 47 +++++++++++++++ .../controller/SolicitudControllerTest.java | 59 ++++++++++++++++++ 5 files changed, 171 insertions(+), 18 deletions(-) create mode 100644 src/test/java/com/example/demo/controller/AuthControllerTest.java create mode 100644 src/test/java/com/example/demo/controller/InvitacionControllerTest.java create mode 100644 src/test/java/com/example/demo/controller/SolicitudControllerTest.java diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java index ad9d93b..9aeace6 100644 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ b/src/main/java/com/example/demo/rest/InvitacionController.java @@ -48,7 +48,7 @@ public ResponseEntity aceptarInvitacion(@RequestBody InvitacionDTO invitacion } } @PostMapping("/add/user={idUsuario}/equipo={idEquipo}") - public ResponseEntity crearSolicitud(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { + public ResponseEntity crearInvitacion(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { try { invitacionService.crearInvitacion(idEquipo , idUsuario); return ResponseEntity.ok(new MessageResponse("Invitacion enviada con exito")); diff --git a/src/test/java/com/example/demo/controller/AuthControllerTest.java b/src/test/java/com/example/demo/controller/AuthControllerTest.java new file mode 100644 index 0000000..244e9d9 --- /dev/null +++ b/src/test/java/com/example/demo/controller/AuthControllerTest.java @@ -0,0 +1,60 @@ +package com.example.demo.controller; + +import com.example.demo.domain.Usuario; +import com.example.demo.rest.AuthController; +import com.example.demo.security.jwt.JwtTokenUtil; +import com.example.demo.security.payload.LoginRequest; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import static org.mockito.Mockito.when; + + +@SpringBootTest +@AutoConfigureMockMvc(addFilters = false) +public class AuthControllerTest { + @Autowired + private MockMvc mockMvc; + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + } + @Autowired + private AuthController authController; + @Autowired + private ObjectMapper objectMapper; + @MockBean + private JwtTokenUtil jwtTokenUtil; + @MockBean + private AuthenticationManager authManager; + @Test + public void testLogin() throws Exception { + String jwtToken = "jwtToken"; + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername("prueba"); + loginRequest.setPassword("prueba"); + Authentication authentication = authManager.authenticate( + new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); + + when(jwtTokenUtil.generateJwtToken(authentication)).thenReturn(jwtToken); + mockMvc.perform(MockMvcRequestBuilders.post("/api/auth/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(loginRequest))) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.user").exists()) + .andExpect(MockMvcResultMatchers.jsonPath("$.token").value(jwtToken)); + } +} diff --git a/src/test/java/com/example/demo/controller/EquipoControllerTest.java b/src/test/java/com/example/demo/controller/EquipoControllerTest.java index 7513d95..8e820ec 100644 --- a/src/test/java/com/example/demo/controller/EquipoControllerTest.java +++ b/src/test/java/com/example/demo/controller/EquipoControllerTest.java @@ -16,33 +16,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.test.web.servlet.MockMvc; -import java.util.HashSet; -import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc(addFilters = false) public class EquipoControllerTest { - - @Mock - private EquipoService equipoService; - - @InjectMocks - private EquipoController equipoController; @Autowired private MockMvc mockMvc; - @Autowired - private ConverterDTO converterDTO = new ConverterDTO(); - @BeforeEach public void setUp() { MockitoAnnotations.openMocks(this); @@ -60,6 +44,9 @@ public void testAgregarEquipo() throws Exception { .content("{\"nombreEquipo\":\"Equipo 1\",\"siglas\":\"EQ1\"}")) .andExpect(status().isCreated()); } - + @Test + public void testEliminarEquipoBadRequest() throws Exception { + mockMvc.perform(delete("/equipos/delete")).andExpect(status().isMethodNotAllowed()); + } } diff --git a/src/test/java/com/example/demo/controller/InvitacionControllerTest.java b/src/test/java/com/example/demo/controller/InvitacionControllerTest.java new file mode 100644 index 0000000..5bd0036 --- /dev/null +++ b/src/test/java/com/example/demo/controller/InvitacionControllerTest.java @@ -0,0 +1,47 @@ +package com.example.demo.controller; + +import com.example.demo.service.InvitacionService; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import static org.mockito.Mockito.doNothing; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc(addFilters = false) +public class InvitacionControllerTest { + @Autowired + private MockMvc mockMvc; + @Mock + private InvitacionService invitacionService; + @Test + public void testCrearInvitacionBadRequest() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.post("/invitaciones/add/user=1/equipo=f") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); + } + @Test + public void testCrearInvitacion() throws Exception { + // Datos de prueba + Long idUsuario = 1L; + Long idEquipo = 2L; + + // Simular la creación exitosa de una invitación + doNothing().when(invitacionService).crearInvitacion(idEquipo, idUsuario); + + // Realizar la solicitud HTTP POST a la ruta del controlador + mockMvc.perform(MockMvcRequestBuilders.post("/invitaciones/add/user={idUsuario}/equipo={idEquipo}", idUsuario, idEquipo) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Invitacion enviada con exito")); + } + +} diff --git a/src/test/java/com/example/demo/controller/SolicitudControllerTest.java b/src/test/java/com/example/demo/controller/SolicitudControllerTest.java new file mode 100644 index 0000000..299614a --- /dev/null +++ b/src/test/java/com/example/demo/controller/SolicitudControllerTest.java @@ -0,0 +1,59 @@ +package com.example.demo.controller; + +import com.example.demo.security.payload.MessageResponse; +import com.example.demo.service.SolicitudService; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; + +@SpringBootTest +@AutoConfigureMockMvc(addFilters = false) +public class SolicitudControllerTest { + @Autowired + private MockMvc mockMvc; + @Mock + private SolicitudService solicitudService; + @Test + public void testCrearSolicitud() throws Exception { + // Datos de prueba + Long idUsuario = 1L; + Long idEquipo = 2L; + + // Simular la creación exitosa de una invitación + doNothing().when(solicitudService).crearSolicitud(idUsuario, idEquipo); + + // Realizar la solicitud HTTP POST a la ruta del controlador + mockMvc.perform(MockMvcRequestBuilders.post("/solicitudes/add/user={idUsuario}/equipo={idEquipo}", idUsuario, idEquipo) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Solicitud enviada con exito")); + } + @Test + public void testCrearSolicitud_SolicitudExistente() throws Exception { + // Datos de prueba + Long idUsuario = 1L; + Long idEquipo = 2L; + + // Simular una excepción cuando ya hay una solicitud registrada para el equipo + MessageResponse badResponse = new MessageResponse("Ya hay una solicitud registrada para este equipo"); + + + // Realizar la solicitud HTTP POST a la ruta del controlador + mockMvc.perform(MockMvcRequestBuilders.post("/solicitudes/add/user={idUsuario}/equipo={idEquipo}", idUsuario, idEquipo) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.status().isInternalServerError()) + .andExpect(MockMvcResultMatchers.jsonPath("$.message") + .value("Ya hay una solicitud registrada para este equipo")); + } + +} From c96d9b3f676b5ce83ed5f3893213b2e4d7a7e79a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= <66533728+paez49@users.noreply.github.com> Date: Tue, 16 May 2023 12:04:33 -0500 Subject: [PATCH 21/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 60e3b81..b7b6736 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BackendWeb * David Sánchez -* Orlando Prada +* Orlando Figueroa * Andrés Omaña Link wiki: From f617a7a529435e4886e8b2effbec85312a0b1b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20P=C3=A1ez?= Date: Wed, 24 May 2023 20:56:42 -0500 Subject: [PATCH 22/26] Pruebas JPA recuperadas --- .../java/com/example/demo/domain/Usuario.java | 3 +- .../example/demo/jpa/DeleteEquipoTest.java | 38 +++++++ .../demo/jpa/InvitacionSolicitudTest.java | 97 +++++++++++++++++ .../example/demo/jpa/UsuarioEquiposTest.java | 102 ++++++++++++++++++ 4 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/example/demo/jpa/DeleteEquipoTest.java create mode 100644 src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java create mode 100644 src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java diff --git a/src/main/java/com/example/demo/domain/Usuario.java b/src/main/java/com/example/demo/domain/Usuario.java index 9b33d10..4669c64 100644 --- a/src/main/java/com/example/demo/domain/Usuario.java +++ b/src/main/java/com/example/demo/domain/Usuario.java @@ -3,10 +3,11 @@ import java.util.Set; import lombok.Data; import lombok.Getter; +import lombok.Setter; import javax.persistence.*; - +@Setter @Getter @Entity @Table(name = "usuario") diff --git a/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java b/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java new file mode 100644 index 0000000..8d6ffa6 --- /dev/null +++ b/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java @@ -0,0 +1,38 @@ +package com.example.demo.jpa; + +import com.example.demo.domain.Equipo; +import com.example.demo.repository.EquipoRepository; +import com.example.demo.service.EquipoService; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +//@Transactional +@SpringBootTest + +public class DeleteEquipoTest { + @Autowired + private EquipoRepository equipoRepository; + @Autowired + private EquipoService equipoService; + + @Test + @Transactional + public void testDeleteByIdLogic() { + // Elimina el equipo con deleteByIdLogic + equipoService.delete(1L); + + // Verifica si el equipo fue eliminado correctamente + Optional equipoAux = equipoRepository.findById(1L); + Assertions.assertTrue(equipoAux.isEmpty(), "El equipo se borró con exito"); + //Assertions.assertTrue(equipoAux.get().isEliminado(), "La eliminación lógica se realizó correctamente"); + } +} diff --git a/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java b/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java new file mode 100644 index 0000000..3ed1028 --- /dev/null +++ b/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java @@ -0,0 +1,97 @@ +package com.example.demo.jpa; + + +import com.example.demo.domain.Equipo; +import com.example.demo.domain.Invitacion; +import com.example.demo.domain.Solicitud; +import com.example.demo.domain.Usuario; +import com.example.demo.repository.EquipoRepository; +import com.example.demo.repository.InvitacionRepository; +import com.example.demo.repository.SolicitudRepository; +import com.example.demo.repository.UsuarioRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.DataIntegrityViolationException; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; + +@SpringBootTest +public class InvitacionSolicitudTest { + + @Autowired + UsuarioRepository userRepository; + @Autowired + EquipoRepository equipoRepository; + @Autowired + SolicitudRepository solicitudRepository; + @Autowired + InvitacionRepository invitacionRepository; + + + @Test + public void testCrearSolicitud() { + + //Confirmar que tanto el jugador como el equipo existen en la base de datos + Usuario usuario = userRepository.findById((long) 1).get(); + Equipo equipo = equipoRepository.findById((long) 1).get(); + + // Crear una nueva solicitud + Solicitud solicitud = new Solicitud(); + solicitud.setUsuario(usuario); + solicitud.setEquipo(equipo); + solicitudRepository.save(solicitud); + + // Verificar que la solicitud se haya creado correctamente + assertNotNull(solicitud.getId()); + System.out.println(solicitud.getId()); + } + @Test + public void testSolicitudExistente(){ + Usuario usuario = userRepository.findById((long) 1).get(); + Equipo equipo = equipoRepository.findById((long) 1).get(); +// Intentar crear otra invitación con los mismos detalles + Solicitud otraSolicitud = new Solicitud(); + otraSolicitud.setUsuario(usuario); + otraSolicitud.setEquipo(equipo); + try { + solicitudRepository.save(otraSolicitud); + fail("Se esperaba una excepción de tipo DataIntegrityViolationException"); + } catch (DataIntegrityViolationException ex) { + // La excepción fue lanzada, lo que indica que la prueba pasó correctamente + } + } + @Test + public void testCrearInvitacion() { + + //Confirmar que tanto el jugador como el equipo existen en la base de datos + Usuario usuario = userRepository.findById((long) 1).get(); + Equipo equipo = equipoRepository.findById((long) 1).get(); + + // Crear una nueva invitación + Invitacion invitacion = new Invitacion(); + invitacion.setUsuario(usuario); + invitacion.setEquipo(equipo); + invitacionRepository.save(invitacion); + + // Verificar que la invitación se haya creado correctamente + assertNotNull(invitacion.getId()); + System.out.println(invitacion.getId()); + } + @Test + public void testInvitacionExistente(){ + Usuario usuario = userRepository.findById((long) 1).get(); + Equipo equipo = equipoRepository.findById((long) 1).get(); +// Intentar crear otra invitación con los mismos detalles + Invitacion otraInvitacion = new Invitacion(); + otraInvitacion.setUsuario(usuario); + otraInvitacion.setEquipo(equipo); + try { + invitacionRepository.save(otraInvitacion); + fail("Se esperaba una excepción de tipo DataIntegrityViolationException"); + } catch (DataIntegrityViolationException ex) { + // La excepción fue lanzada, lo que indica que la prueba pasó correctamente + } + } +} diff --git a/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java b/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java new file mode 100644 index 0000000..f5e56c8 --- /dev/null +++ b/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java @@ -0,0 +1,102 @@ +package com.example.demo.jpa; + + +import com.example.demo.domain.Equipo; +import com.example.demo.domain.Usuario; +import com.example.demo.repository.EquipoRepository; +import com.example.demo.repository.UsuarioRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Iterator; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +public class UsuarioEquiposTest { + @Autowired + UsuarioRepository usuarioRepository; + + @Autowired + EquipoRepository equipoRepository; + + @Test + public void testCrearUsuarios(){ + try { + Iterator usuarios = usuarioRepository.findAll().iterator(); + int cantidad = 0; + while( usuarios.hasNext() ) { + usuarios.next(); + cantidad ++; + } + + Usuario user = new Usuario(); + + user.setUsername("Juan"); + user.setEmail("Juan@Paez.es"); + user.setPassword("test"); + usuarioRepository.save(user); + + + user = new Usuario(); + user.setUsername("Juan"); + user.setEmail("Juan@Sanchez.es"); + user.setPassword("test123"); + usuarioRepository.save(user); + + + int nuevaCantidad = 0; + usuarios = usuarioRepository.findAll().iterator(); + while( usuarios.hasNext() ) { + usuarios.next(); + nuevaCantidad ++; + } + + assertTrue(cantidad + 2 == nuevaCantidad, "Si se agregarón los usuarios"); + }catch (Exception e){ + e.printStackTrace(); + assertTrue(false,"Error"); + } + + + + } + @Test + public void testCrearEquipos(){ + try { + Iterator equipos = equipoRepository.findAll().iterator(); + int cantidad = 0; + while( equipos.hasNext() ) { + equipos.next(); + cantidad ++; + } + Equipo equipo = new Equipo(); + equipo.setNombreEquipo("Eskere FC"); + equipo.setSiglas("EFC"); + equipoRepository.save(equipo); + + equipo = new Equipo(); + equipo.setNombreEquipo("Hola FC"); + equipo.setSiglas("HFC"); + equipoRepository.save(equipo); + + + int nuevaCantidad = 0; + + equipos = equipoRepository.findAll().iterator(); + while( equipos.hasNext() ) { + equipos.next(); + nuevaCantidad ++; + } + + assertTrue(cantidad + 2 == nuevaCantidad, "Si se agregarón los equipos"); + }catch (Exception e){ + e.printStackTrace(); + assertTrue(false,"Error"); + } + + + + } +} From 6d2544fde7d67d1217bfdddc0468c7b28840e2b5 Mon Sep 17 00:00:00 2001 From: noUsoGitHub <89752129+noUsoGitHub@users.noreply.github.com> Date: Thu, 25 May 2023 17:45:58 -0500 Subject: [PATCH 23/26] soloporsiacaso --- .../java/com/example/demo/domain/Equipo.java | 41 ------- .../com/example/demo/domain/Invitacion.java | 22 ---- .../java/com/example/demo/domain/Libro.java | 31 +++++ .../com/example/demo/domain/Solicitud.java | 23 ---- .../java/com/example/demo/domain/Usuario.java | 44 ------- .../com/example/demo/dto/InvitacionDTO.java | 12 -- .../com/example/demo/dto/SolicitudDTO.java | 15 --- .../java/com/example/demo/dto/UsuarioDTO.java | 11 -- .../demo/repository/EquipoRepository.java | 6 +- .../demo/repository/InvitacionRepository.java | 11 -- .../demo/repository/SolicitudRepository.java | 14 --- .../demo/repository/UsuarioRepository.java | 14 --- .../com/example/demo/rest/AuthController.java | 107 ------------------ .../example/demo/rest/EquipoController.java | 10 +- .../demo/rest/InvitacionController.java | 59 ---------- .../demo/rest/SolicitudController.java | 68 ----------- .../example/demo/rest/UsuarioController.java | 29 ----- .../example/demo/service/EquipoService.java | 16 +-- .../demo/service/InvitacionService.java | 56 --------- .../demo/service/SolicitudService.java | 54 --------- .../example/demo/service/UsuarioService.java | 44 ------- .../com/example/demo/util/ConverterDTO.java | 12 +- .../demo/controller/EquipoControllerTest.java | 2 +- .../controller/InvitacionControllerTest.java | 47 -------- .../controller/SolicitudControllerTest.java | 59 ---------- .../example/demo/jpa/DeleteEquipoTest.java | 4 +- .../demo/jpa/InvitacionSolicitudTest.java | 10 +- .../example/demo/jpa/UsuarioEquiposTest.java | 8 +- target/classes/application.properties | 8 +- 29 files changed, 69 insertions(+), 768 deletions(-) delete mode 100644 src/main/java/com/example/demo/domain/Equipo.java delete mode 100644 src/main/java/com/example/demo/domain/Invitacion.java create mode 100644 src/main/java/com/example/demo/domain/Libro.java delete mode 100644 src/main/java/com/example/demo/domain/Solicitud.java delete mode 100644 src/main/java/com/example/demo/domain/Usuario.java delete mode 100644 src/main/java/com/example/demo/dto/InvitacionDTO.java delete mode 100644 src/main/java/com/example/demo/dto/SolicitudDTO.java delete mode 100644 src/main/java/com/example/demo/dto/UsuarioDTO.java delete mode 100644 src/main/java/com/example/demo/repository/InvitacionRepository.java delete mode 100644 src/main/java/com/example/demo/repository/SolicitudRepository.java delete mode 100644 src/main/java/com/example/demo/repository/UsuarioRepository.java delete mode 100644 src/main/java/com/example/demo/rest/AuthController.java delete mode 100644 src/main/java/com/example/demo/rest/InvitacionController.java delete mode 100644 src/main/java/com/example/demo/rest/SolicitudController.java delete mode 100644 src/main/java/com/example/demo/rest/UsuarioController.java delete mode 100644 src/main/java/com/example/demo/service/InvitacionService.java delete mode 100644 src/main/java/com/example/demo/service/SolicitudService.java delete mode 100644 src/main/java/com/example/demo/service/UsuarioService.java delete mode 100644 src/test/java/com/example/demo/controller/InvitacionControllerTest.java delete mode 100644 src/test/java/com/example/demo/controller/SolicitudControllerTest.java diff --git a/src/main/java/com/example/demo/domain/Equipo.java b/src/main/java/com/example/demo/domain/Equipo.java deleted file mode 100644 index 4977415..0000000 --- a/src/main/java/com/example/demo/domain/Equipo.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.demo.domain; - -import java.util.HashSet; -import java.util.Set; - -import lombok.*; -import org.hibernate.annotations.SQLDelete; - -import org.hibernate.annotations.Where; - -import javax.persistence.*; - -@Getter -@Setter -@Builder -@AllArgsConstructor -@Entity -@Table(name = "equipo") -public class Equipo { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - private String nombreEquipo; - private String siglas; - - @ManyToMany(mappedBy = "equipos_participe", cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST }) - private Set jugadores_en_equipo; - - @OneToMany(mappedBy = "equipo", cascade = CascadeType.REMOVE) - private Set solicitudes_de_jugadores; - - @OneToMany(mappedBy = "equipo", cascade = CascadeType.REMOVE) - private Set invitaciones_a_jugadores; - public Equipo() { - this.jugadores_en_equipo = new HashSet<>(); - this.solicitudes_de_jugadores = new HashSet<>(); - this.invitaciones_a_jugadores = new HashSet<>(); - } - -} diff --git a/src/main/java/com/example/demo/domain/Invitacion.java b/src/main/java/com/example/demo/domain/Invitacion.java deleted file mode 100644 index 615b04a..0000000 --- a/src/main/java/com/example/demo/domain/Invitacion.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.demo.domain; - -import lombok.Data; - -import javax.persistence.*; - -@Data -@Entity -@Table(name ="invitacion", uniqueConstraints = {@UniqueConstraint(columnNames = {"id_usuario", "id_equipo"})}) -public class Invitacion { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - Long id; - - @ManyToOne() - @JoinColumn(name="id_usuario",nullable=false,referencedColumnName="id") - Usuario usuario; - - @ManyToOne() - @JoinColumn(name="id_equipo") - Equipo equipo; -} diff --git a/src/main/java/com/example/demo/domain/Libro.java b/src/main/java/com/example/demo/domain/Libro.java new file mode 100644 index 0000000..8c9179c --- /dev/null +++ b/src/main/java/com/example/demo/domain/Libro.java @@ -0,0 +1,31 @@ +package com.example.demo.domain; + +import java.util.HashSet; +import java.util.Set; + +import lombok.*; +import org.hibernate.annotations.SQLDelete; + +import org.hibernate.annotations.Where; + +import javax.persistence.*; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@Entity +@Table(name = "libro") +public class Libro { + + private String titulo; + private String referencia; + private String autor; + private String precio; + private String ubicacion; + + public Libro() { + + } + +} diff --git a/src/main/java/com/example/demo/domain/Solicitud.java b/src/main/java/com/example/demo/domain/Solicitud.java deleted file mode 100644 index d11f598..0000000 --- a/src/main/java/com/example/demo/domain/Solicitud.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.demo.domain; - - -import lombok.Data; - -import javax.persistence.*; - -@Data -@Entity -@Table(name ="solicitud", uniqueConstraints = {@UniqueConstraint(columnNames = {"id_usuario", "id_equipo"})}) -public class Solicitud { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - Long id; - - @ManyToOne - @JoinColumn(name="id_usuario",nullable = false,referencedColumnName="id") - Usuario usuario; - - @ManyToOne() - @JoinColumn(name = "id_equipo") - Equipo equipo; -} diff --git a/src/main/java/com/example/demo/domain/Usuario.java b/src/main/java/com/example/demo/domain/Usuario.java deleted file mode 100644 index 4669c64..0000000 --- a/src/main/java/com/example/demo/domain/Usuario.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.demo.domain; - -import java.util.Set; -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -import javax.persistence.*; - -@Setter -@Getter -@Entity -@Table(name = "usuario") -public class Usuario { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - private String username; - private String email; - private String password; - public Usuario(String username, String email, String password) { - this.username = username; - this.email = email; - this.password = password; - } - @ManyToMany(cascade = CascadeType.REMOVE) - @JoinTable( - name = "jugadores_en_equipo", - joinColumns = @JoinColumn(name = "id_usuario"), - inverseJoinColumns = @JoinColumn(name = "id_equipo") - ) - private Set equipos_participe; - - @OneToMany(mappedBy = "usuario",cascade= CascadeType.REMOVE) - private Set invitaciones_de_equipos; - - @OneToMany(mappedBy = "usuario",cascade = CascadeType.REMOVE) - private Set solicitudes_a_equipos; - - public Usuario() { - - } -} - diff --git a/src/main/java/com/example/demo/dto/InvitacionDTO.java b/src/main/java/com/example/demo/dto/InvitacionDTO.java deleted file mode 100644 index 0781aa4..0000000 --- a/src/main/java/com/example/demo/dto/InvitacionDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.demo.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class InvitacionDTO { - private long id; - private UsuarioDTO usuario; - private EquipoDTO equipo; -} diff --git a/src/main/java/com/example/demo/dto/SolicitudDTO.java b/src/main/java/com/example/demo/dto/SolicitudDTO.java deleted file mode 100644 index 070cd35..0000000 --- a/src/main/java/com/example/demo/dto/SolicitudDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.demo.dto; - -import com.example.demo.domain.Equipo; -import com.example.demo.domain.Usuario; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class SolicitudDTO { - private long id; - private UsuarioDTO usuario; - - private EquipoDTO equipo; -} diff --git a/src/main/java/com/example/demo/dto/UsuarioDTO.java b/src/main/java/com/example/demo/dto/UsuarioDTO.java deleted file mode 100644 index f962929..0000000 --- a/src/main/java/com/example/demo/dto/UsuarioDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.demo.dto; - -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor -public class UsuarioDTO { - private long id; - private String username; - private String email; -} diff --git a/src/main/java/com/example/demo/repository/EquipoRepository.java b/src/main/java/com/example/demo/repository/EquipoRepository.java index d719254..af06028 100644 --- a/src/main/java/com/example/demo/repository/EquipoRepository.java +++ b/src/main/java/com/example/demo/repository/EquipoRepository.java @@ -1,15 +1,15 @@ package com.example.demo.repository; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; -public interface EquipoRepository extends JpaRepository { +public interface EquipoRepository extends JpaRepository { @Query("SELECT e FROM Equipo e WHERE NOT EXISTS " + "(SELECT 1 FROM Usuario u JOIN u.equipos_participe ep WHERE ep.id = e.id AND u.id = :userId)") - List buscarEquiposDisponibles(@Param("userId") Long userId); + List buscarEquiposDisponibles(@Param("userId") Long userId); } diff --git a/src/main/java/com/example/demo/repository/InvitacionRepository.java b/src/main/java/com/example/demo/repository/InvitacionRepository.java deleted file mode 100644 index 95a693e..0000000 --- a/src/main/java/com/example/demo/repository/InvitacionRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.demo.repository; - -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Solicitud; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface InvitacionRepository extends JpaRepository{ - List findByUsuarioId(Long idUsuario); -} diff --git a/src/main/java/com/example/demo/repository/SolicitudRepository.java b/src/main/java/com/example/demo/repository/SolicitudRepository.java deleted file mode 100644 index 1479c50..0000000 --- a/src/main/java/com/example/demo/repository/SolicitudRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.demo.repository; - -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Solicitud; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface SolicitudRepository extends JpaRepository{ - - List findByUsuarioId(long idUsuario); - - List findByEquipoId(long idEquipo); -} diff --git a/src/main/java/com/example/demo/repository/UsuarioRepository.java b/src/main/java/com/example/demo/repository/UsuarioRepository.java deleted file mode 100644 index 1446115..0000000 --- a/src/main/java/com/example/demo/repository/UsuarioRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.demo.repository; - -import com.example.demo.domain.Usuario; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.Optional; - -public interface UsuarioRepository extends JpaRepository{ - Optional findByUsername(String username); - - Boolean existsByUsername(String username); - - Boolean existsByEmail(String email); -} diff --git a/src/main/java/com/example/demo/rest/AuthController.java b/src/main/java/com/example/demo/rest/AuthController.java deleted file mode 100644 index 98374c1..0000000 --- a/src/main/java/com/example/demo/rest/AuthController.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.example.demo.rest; - -import com.example.demo.domain.Usuario; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.repository.UsuarioRepository; -import com.example.demo.security.jwt.JwtTokenUtil; -import com.example.demo.security.payload.JwtResponse; -import com.example.demo.security.payload.LoginRequest; -import com.example.demo.security.payload.MessageResponse; -import com.example.demo.security.payload.RegisterRequest; -import com.example.demo.service.UsuarioService; -import com.example.demo.util.ConverterDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.Map; - -/** - * Controlador para llevar a cabo la autenticación utilizando JWT - * - * Se utiliza AuthenticationManager para autenticar las credenciales que son el - * usuario y password que llegan por POST en el cuerpo de la petición - * - * Si las credenciales son válidas se genera un token JWT como respuesta - */ -// @CrossOrigin(origins = "http://localhost:8081") -@RestController -@RequestMapping("/api/auth") -public class AuthController { - - private final AuthenticationManager authManager; - @Autowired - private final UsuarioRepository userRepository; - - @Autowired - private final UsuarioService usuarioService; - private final PasswordEncoder encoder; - private final JwtTokenUtil jwtTokenUtil; - - public AuthController(AuthenticationManager authManager, - UsuarioRepository usuarioRepository, - PasswordEncoder encoder, - UsuarioService usuarioService, - JwtTokenUtil jwtTokenUtil){ - this.authManager = authManager; - this.userRepository = usuarioRepository; - this.encoder = encoder; - this.jwtTokenUtil = jwtTokenUtil; - this.usuarioService = usuarioService; - } - - @PostMapping("/login") - public ResponseEntity> login(@RequestBody LoginRequest loginRequest) { - - Authentication authentication = authManager.authenticate( - new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); - - SecurityContextHolder.getContext().setAuthentication(authentication); - String jwt = jwtTokenUtil.generateJwtToken(authentication); - - Usuario user = usuarioService.findByUsername(loginRequest.getUsername()); - - ConverterDTO converterDTO = new ConverterDTO(); - UsuarioDTO usuarioDTO = converterDTO.toDto(user); - Map response = new HashMap<>(); - response.put("user", usuarioDTO); - response.put("token", jwt); - - return ResponseEntity.ok(response); - } - @PostMapping("/register") - public ResponseEntity register(@RequestBody RegisterRequest signUpRequest) { - - // Check 1: username - if (userRepository.existsByUsername(signUpRequest.getUsername())) { - return ResponseEntity - .badRequest() - .body(new MessageResponse("Error: Username is already taken!")); - } - - // Check 2: email - if (userRepository.existsByEmail(signUpRequest.getEmail())) { - return ResponseEntity - .badRequest() - .body(new MessageResponse("Error: Email is already in use!")); - } - - // Create new user's account - Usuario user = new Usuario(signUpRequest.getUsername(), - signUpRequest.getEmail(), - encoder.encode(signUpRequest.getPassword())); - - userRepository.save(user); - - return ResponseEntity.ok(new MessageResponse("User registered successfully!")); - } -} diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java index 85dab47..5f2eba7 100644 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ b/src/main/java/com/example/demo/rest/EquipoController.java @@ -1,7 +1,7 @@ package com.example.demo.rest; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.dto.EquipoDTO; import com.example.demo.repository.EquipoRepository; import com.example.demo.service.EquipoService; @@ -27,14 +27,14 @@ public class EquipoController { @PostMapping("/create/{idUsuario}") public ResponseEntity crearEquipo(@RequestBody EquipoDTO equipoDTO,@PathVariable Long idUsuario) { System.out.println(equipoDTO); - Equipo equipo = converterDTO.toEntity(equipoDTO); + Libro equipo = converterDTO.toEntity(equipoDTO); equipo = equipoService.save(equipo,idUsuario); equipoDTO = converterDTO.toDto(equipo); return ResponseEntity.status(HttpStatus.CREATED).body(equipoDTO); } @GetMapping("/{idEquipo}") public ResponseEntity obtenerEquipo(@PathVariable Long idEquipo) { - Equipo equipo = equipoService.findById(idEquipo); + Libro equipo = equipoService.findById(idEquipo); if (equipo == null) { return ResponseEntity.notFound().build(); } @@ -45,13 +45,13 @@ public ResponseEntity obtenerEquipo(@PathVariable Long idEquipo) { // Lista equipos -> Presentacion @GetMapping("/{idUsuario}/equipos_disponibles") public List obtenerEquiposDisponibles(@PathVariable Long idUsuario) { - List equipos = equipoService.buscarEquiposDisponibles(idUsuario); + List equipos = equipoService.buscarEquiposDisponibles(idUsuario); List equipoDTO = converterDTO.toDtoListEquipos(equipos); return equipoDTO; } @GetMapping("/{idUsuario}/equipos_participe") public List obtenerEquiposParticipe(@PathVariable Long idUsuario) { - Set equipos = equipoService.buscarEquiposParticipe(idUsuario); + Set equipos = equipoService.buscarEquiposParticipe(idUsuario); List equipoDTO = converterDTO.toDtoSetEquipos(equipos); return equipoDTO; } diff --git a/src/main/java/com/example/demo/rest/InvitacionController.java b/src/main/java/com/example/demo/rest/InvitacionController.java deleted file mode 100644 index 9aeace6..0000000 --- a/src/main/java/com/example/demo/rest/InvitacionController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.demo.rest; - - -import com.example.demo.domain.Invitacion; -import com.example.demo.dto.InvitacionDTO; -import com.example.demo.security.payload.MessageResponse; -import com.example.demo.service.InvitacionService; -import com.example.demo.util.ConverterDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/invitaciones") -public class InvitacionController { - @Autowired - private InvitacionService invitacionService; - @Autowired - private ConverterDTO converterDTO; - //Obtener todas las invitaciones de un usuario - //Mis invitaciones -> Presentacion lista invitaciones - @GetMapping("/get/{idUsuario}") - public ResponseEntity> obtenerTodasLasInvitaciones(@PathVariable Long idUsuario) { - List invitaciones = converterDTO.toDtoListInvitaciones(invitacionService.obtenerInvitacionesPorIdUsuario(idUsuario)); - return ResponseEntity.ok().body(invitaciones); - } - //Rechazar invitacion - //Mis invitaciones -> Boton rechazar - @DeleteMapping("/deny/{idInvitacion}") - public ResponseEntity rechazarInvitacion(@PathVariable Long idInvitacion){ - try{ - invitacionService.rechazarInvitacion(idInvitacion); - return ResponseEntity.ok().body("Invitacion rechazada"); - }catch (Exception e){ - return ResponseEntity.badRequest().body("Error al rechazar invitacion"); - } - } - @PutMapping("/accept") - public ResponseEntity aceptarInvitacion(@RequestBody InvitacionDTO invitacion){ - try{ - invitacionService.aceptarInvitacion(invitacion); - return ResponseEntity.ok().body("Invitacion aceptada"); - }catch (Exception e){ - return ResponseEntity.badRequest().body("Error al aceptar invitacion"); - } - } - @PostMapping("/add/user={idUsuario}/equipo={idEquipo}") - public ResponseEntity crearInvitacion(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { - try { - invitacionService.crearInvitacion(idEquipo , idUsuario); - return ResponseEntity.ok(new MessageResponse("Invitacion enviada con exito")); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ya hay una invitacion registrada para este equipo")); - } - } -} diff --git a/src/main/java/com/example/demo/rest/SolicitudController.java b/src/main/java/com/example/demo/rest/SolicitudController.java deleted file mode 100644 index f0897ec..0000000 --- a/src/main/java/com/example/demo/rest/SolicitudController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.example.demo.rest; - -import com.example.demo.domain.Solicitud; -import com.example.demo.dto.SolicitudDTO; -import com.example.demo.dto.SolicitudDTO; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.security.payload.MessageResponse; -import com.example.demo.service.SolicitudService; -import com.example.demo.service.UsuarioService; -import com.example.demo.util.ConverterDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/solicitudes") -public class SolicitudController { - @Autowired - SolicitudService solicitudService; - - @Autowired - UsuarioService usuarioService; - @Autowired - private ConverterDTO converterDTO; - - //Crear solicitud - //Lista solicitudes -> Boton enviar solicitud - @PostMapping("/add/user={idUsuario}/equipo={idEquipo}") - public ResponseEntity crearSolicitud(@PathVariable Long idUsuario, @PathVariable Long idEquipo) { - try { - solicitudService.crearSolicitud(idUsuario, idEquipo); - return ResponseEntity.ok(new MessageResponse("Solicitud enviada con exito")); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ya hay una solicitud registrada para este equipo")); - } - } - //Mostrar todas las solicitudes - //Equipos -> Solicitudes pendientes - @GetMapping("/get/{idEquipo}") - public ResponseEntity> obtenerTodasLasSolicitudes(@PathVariable Long idEquipo) { - List solicitudes = converterDTO.toDtoListSolicitudes(solicitudService.obtenerSolcitudesPorIdEquipo(idEquipo)); - return ResponseEntity.ok().body(solicitudes); - } - //Equipos -> Solicitudes pendientes -> Boton eliminar - @DeleteMapping("/deny/{idSolicitud}") - public ResponseEntity rechazarSolicitud(@PathVariable Long idSolicitud){ - try{ - solicitudService.rechazarSolicitud(idSolicitud); - return ResponseEntity.ok().body("Solicitud rechazada"); - }catch (Exception e){ - return ResponseEntity.badRequest().body("Error al rechazar Solicitud"); - } - } - //Equipos -> Solicitudes pendientes -> Boton aceptar - @PutMapping("/accept") - public ResponseEntity aceptarSolicitud(@RequestBody SolicitudDTO solicitud){ - try{ - solicitudService.aceptarSolicitud(solicitud); - return ResponseEntity.ok().body("Solicitud aceptada"); - }catch (Exception e){ - return ResponseEntity.badRequest().body("Error al aceptar Solicitud"); - } - } - -} diff --git a/src/main/java/com/example/demo/rest/UsuarioController.java b/src/main/java/com/example/demo/rest/UsuarioController.java deleted file mode 100644 index aa08434..0000000 --- a/src/main/java/com/example/demo/rest/UsuarioController.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.demo.rest; - -import com.example.demo.domain.Equipo; -import com.example.demo.domain.Usuario; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.service.EquipoService; -import com.example.demo.service.UsuarioService; -import com.example.demo.util.ConverterDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequestMapping("/api") -public class UsuarioController { - @Autowired - UsuarioService usuarioService; - @Autowired - EquipoService equipoService; - @Autowired - private ConverterDTO converterDTO; - - -} diff --git a/src/main/java/com/example/demo/service/EquipoService.java b/src/main/java/com/example/demo/service/EquipoService.java index b3686af..fabeed4 100644 --- a/src/main/java/com/example/demo/service/EquipoService.java +++ b/src/main/java/com/example/demo/service/EquipoService.java @@ -1,7 +1,7 @@ package com.example.demo.service; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; @@ -34,25 +34,25 @@ public class EquipoService { private EntityManager entityManager; - public Iterable findAll(){ + public Iterable findAll(){ return equipoRepository.findAll(); } - public Equipo findById(Long id) { - Optional equipoOptional = equipoRepository.findById(id); + public Libro findById(Long id) { + Optional equipoOptional = equipoRepository.findById(id); return equipoOptional.orElseThrow(() -> new RuntimeException("Equipo no encontrado")); } - public Equipo save(Equipo equipo,Long idUsuario) { + public Libro save(Libro equipo,Long idUsuario) { Usuario usuario = usuarioService.findById(idUsuario); usuario.getEquipos_participe().add(equipo); return equipoRepository.save(equipo); } - public List buscarEquiposDisponibles(Long idUsuario){ + public List buscarEquiposDisponibles(Long idUsuario){ return equipoRepository.buscarEquiposDisponibles(idUsuario); } public ResponseEntity delete(Long idEquipo) { try { - Equipo equipo = findById(idEquipo); + Libro equipo = findById(idEquipo); for (Invitacion invitacion: equipo.getInvitaciones_a_jugadores()) { invitacionService.delete(invitacion.getId()); } @@ -77,7 +77,7 @@ public ResponseEntity delete(Long idEquipo) { } - public Set buscarEquiposParticipe(Long idUsuario) { + public Set buscarEquiposParticipe(Long idUsuario) { Usuario usuario = usuarioService.findById(idUsuario); return usuario.getEquipos_participe(); diff --git a/src/main/java/com/example/demo/service/InvitacionService.java b/src/main/java/com/example/demo/service/InvitacionService.java deleted file mode 100644 index 07a2faf..0000000 --- a/src/main/java/com/example/demo/service/InvitacionService.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.example.demo.service; - -import com.example.demo.domain.Equipo; -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Usuario; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.dto.InvitacionDTO; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.repository.InvitacionRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class InvitacionService { - @Autowired - InvitacionRepository invitacionRepository; - - @Autowired - EquipoService equipoService; - - @Autowired - UsuarioService usuarioService; - - public void crearInvitacion(Long equipoId, Long usuarioId) { - Equipo equipo = equipoService.findById(equipoId); - Usuario usuario = usuarioService.findById(usuarioId); - - Invitacion invitacion = new Invitacion(); - invitacion.setEquipo(equipo); - invitacion.setUsuario(usuario); - - invitacionRepository.save(invitacion); - } - public List obtenerInvitacionesPorIdUsuario(long idUsuario){ - return invitacionRepository.findByUsuarioId(idUsuario); - } - - public void rechazarInvitacion(Long idInvitacion) { - invitacionRepository.deleteById(idInvitacion); - } - - - public void aceptarInvitacion(InvitacionDTO invitacion) { - - UsuarioDTO usuario = invitacion.getUsuario(); - EquipoDTO equipo = invitacion.getEquipo(); - usuarioService.agregarUsuarioEquipo(usuario, equipo); - invitacionRepository.deleteById(invitacion.getId()); - } - - public void delete(Long id) { - invitacionRepository.deleteById(id); - } -} diff --git a/src/main/java/com/example/demo/service/SolicitudService.java b/src/main/java/com/example/demo/service/SolicitudService.java deleted file mode 100644 index a5bdb87..0000000 --- a/src/main/java/com/example/demo/service/SolicitudService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.example.demo.service; - -import com.example.demo.domain.Equipo; -import com.example.demo.domain.Solicitud; -import com.example.demo.domain.Usuario; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.dto.SolicitudDTO; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.repository.SolicitudRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.persistence.EntityNotFoundException; -import java.util.List; - -@Service -public class SolicitudService { - @Autowired - SolicitudRepository solicitudRepository; - @Autowired - UsuarioService usuarioService; - @Autowired - EquipoService equipoService; - - public void crearSolicitud(Long idUsuario, Long idEquipo) { - Usuario usuario = usuarioService.findById(idUsuario); - Equipo equipo = equipoService.findById(idEquipo); - - Solicitud solicitud = new Solicitud(); - solicitud.setUsuario(usuario); - solicitud.setEquipo(equipo); - - - solicitudRepository.save(solicitud); - } - public List obtenerSolcitudesPorIdEquipo(long idEquipo){ - return solicitudRepository.findByEquipoId(idEquipo); - } - - public void delete(Long id) { - solicitudRepository.deleteById(id); - } - - public void rechazarSolicitud(Long idSolicitud) { - solicitudRepository.deleteById(idSolicitud); - } - - public void aceptarSolicitud(SolicitudDTO solicitud) { - UsuarioDTO usuario = solicitud.getUsuario(); - EquipoDTO equipo = solicitud.getEquipo(); - usuarioService.agregarUsuarioEquipo(usuario, equipo); - solicitudRepository.deleteById(solicitud.getId()); - } -} diff --git a/src/main/java/com/example/demo/service/UsuarioService.java b/src/main/java/com/example/demo/service/UsuarioService.java deleted file mode 100644 index c0b4826..0000000 --- a/src/main/java/com/example/demo/service/UsuarioService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.demo.service; - -import com.example.demo.domain.Equipo; -import com.example.demo.domain.Solicitud; -import com.example.demo.domain.Usuario; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.repository.UsuarioRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.NoSuchElementException; - -@Service -public class UsuarioService { - @Autowired - UsuarioRepository usuarioRepository; - - @Autowired - EquipoService equipoService; - - public Usuario findById(Long id) { - return usuarioRepository.findById(id).orElseThrow(() -> new NoSuchElementException("Usuario no encontrado")); - } - - public Usuario save(Usuario usuario) { - return usuarioRepository.save(usuario); - } - public Iterable findAll(){ - return usuarioRepository.findAll(); - } - - public Usuario findByUsername(String username) { - return usuarioRepository.findByUsername(username).orElseThrow(() -> new NoSuchElementException("Usuario no encontrado")); - } - public void agregarUsuarioEquipo(UsuarioDTO usuarioDTO, EquipoDTO equipoDTO) { - Usuario usuario = findById(usuarioDTO.getId()); - Equipo equipo = equipoService.findById(equipoDTO.getId()); - usuario.getEquipos_participe().add(equipo); - usuarioRepository.save(usuario); - } - -} diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java index 5110998..b08a618 100644 --- a/src/main/java/com/example/demo/util/ConverterDTO.java +++ b/src/main/java/com/example/demo/util/ConverterDTO.java @@ -1,6 +1,6 @@ package com.example.demo.util; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; @@ -24,7 +24,7 @@ public ConverterDTO(){ } private ModelMapper modelMapper; - public EquipoDTO toDto(Equipo equipo){ + public EquipoDTO toDto(Libro equipo){ EquipoDTO equipoDTO = modelMapper.map(equipo, EquipoDTO.class); return equipoDTO; } @@ -42,7 +42,7 @@ public List toDtoListUsuarios(List usuarios) { .collect(Collectors.toList()); return usuariosDTO; } - public List toDtoListEquipos(List equipos) { + public List toDtoListEquipos(List equipos) { List equiposDTO = equipos.stream() .map(equipo -> modelMapper.map(equipo, EquipoDTO.class)) .collect(Collectors.toList()); @@ -61,14 +61,14 @@ public List toDtoListSolicitudes(List solicitudes){ return solicitudesDTO; } - public List toDtoSetEquipos(Set equipos) { + public List toDtoSetEquipos(Set equipos) { List equiposDTO = equipos.stream() .map(equipo -> modelMapper.map(equipo, EquipoDTO.class)) .collect(Collectors.toList()); return equiposDTO; } - public Equipo toEntity(EquipoDTO equipoDTO) { - Equipo equipo = new Equipo(); + public Libro toEntity(EquipoDTO equipoDTO) { + Libro equipo = new Libro(); equipo.setNombreEquipo(Objects.requireNonNullElse(equipoDTO.getNombreEquipo(), "default")); equipo.setSiglas(Objects.requireNonNullElse(equipoDTO.getSiglas(), "def")); return equipo; diff --git a/src/test/java/com/example/demo/controller/EquipoControllerTest.java b/src/test/java/com/example/demo/controller/EquipoControllerTest.java index 8e820ec..4f65e3f 100644 --- a/src/test/java/com/example/demo/controller/EquipoControllerTest.java +++ b/src/test/java/com/example/demo/controller/EquipoControllerTest.java @@ -1,6 +1,6 @@ package com.example.demo.controller; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import com.example.demo.dto.EquipoDTO; diff --git a/src/test/java/com/example/demo/controller/InvitacionControllerTest.java b/src/test/java/com/example/demo/controller/InvitacionControllerTest.java deleted file mode 100644 index 5bd0036..0000000 --- a/src/test/java/com/example/demo/controller/InvitacionControllerTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.demo.controller; - -import com.example.demo.service.InvitacionService; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; - -import static org.mockito.Mockito.doNothing; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@SpringBootTest -@AutoConfigureMockMvc(addFilters = false) -public class InvitacionControllerTest { - @Autowired - private MockMvc mockMvc; - @Mock - private InvitacionService invitacionService; - @Test - public void testCrearInvitacionBadRequest() throws Exception { - mockMvc.perform(MockMvcRequestBuilders.post("/invitaciones/add/user=1/equipo=f") - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()); - } - @Test - public void testCrearInvitacion() throws Exception { - // Datos de prueba - Long idUsuario = 1L; - Long idEquipo = 2L; - - // Simular la creación exitosa de una invitación - doNothing().when(invitacionService).crearInvitacion(idEquipo, idUsuario); - - // Realizar la solicitud HTTP POST a la ruta del controlador - mockMvc.perform(MockMvcRequestBuilders.post("/invitaciones/add/user={idUsuario}/equipo={idEquipo}", idUsuario, idEquipo) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Invitacion enviada con exito")); - } - -} diff --git a/src/test/java/com/example/demo/controller/SolicitudControllerTest.java b/src/test/java/com/example/demo/controller/SolicitudControllerTest.java deleted file mode 100644 index 299614a..0000000 --- a/src/test/java/com/example/demo/controller/SolicitudControllerTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.demo.controller; - -import com.example.demo.security.payload.MessageResponse; -import com.example.demo.service.SolicitudService; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; - -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; - -@SpringBootTest -@AutoConfigureMockMvc(addFilters = false) -public class SolicitudControllerTest { - @Autowired - private MockMvc mockMvc; - @Mock - private SolicitudService solicitudService; - @Test - public void testCrearSolicitud() throws Exception { - // Datos de prueba - Long idUsuario = 1L; - Long idEquipo = 2L; - - // Simular la creación exitosa de una invitación - doNothing().when(solicitudService).crearSolicitud(idUsuario, idEquipo); - - // Realizar la solicitud HTTP POST a la ruta del controlador - mockMvc.perform(MockMvcRequestBuilders.post("/solicitudes/add/user={idUsuario}/equipo={idEquipo}", idUsuario, idEquipo) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Solicitud enviada con exito")); - } - @Test - public void testCrearSolicitud_SolicitudExistente() throws Exception { - // Datos de prueba - Long idUsuario = 1L; - Long idEquipo = 2L; - - // Simular una excepción cuando ya hay una solicitud registrada para el equipo - MessageResponse badResponse = new MessageResponse("Ya hay una solicitud registrada para este equipo"); - - - // Realizar la solicitud HTTP POST a la ruta del controlador - mockMvc.perform(MockMvcRequestBuilders.post("/solicitudes/add/user={idUsuario}/equipo={idEquipo}", idUsuario, idEquipo) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isInternalServerError()) - .andExpect(MockMvcResultMatchers.jsonPath("$.message") - .value("Ya hay una solicitud registrada para este equipo")); - } - -} diff --git a/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java b/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java index 8d6ffa6..994c440 100644 --- a/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java +++ b/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java @@ -1,6 +1,6 @@ package com.example.demo.jpa; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.repository.EquipoRepository; import com.example.demo.service.EquipoService; import org.junit.jupiter.api.Assertions; @@ -31,7 +31,7 @@ public void testDeleteByIdLogic() { equipoService.delete(1L); // Verifica si el equipo fue eliminado correctamente - Optional equipoAux = equipoRepository.findById(1L); + Optional equipoAux = equipoRepository.findById(1L); Assertions.assertTrue(equipoAux.isEmpty(), "El equipo se borró con exito"); //Assertions.assertTrue(equipoAux.get().isEliminado(), "La eliminación lógica se realizó correctamente"); } diff --git a/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java b/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java index 3ed1028..3c00710 100644 --- a/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java +++ b/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java @@ -1,7 +1,7 @@ package com.example.demo.jpa; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.domain.Invitacion; import com.example.demo.domain.Solicitud; import com.example.demo.domain.Usuario; @@ -35,7 +35,7 @@ public void testCrearSolicitud() { //Confirmar que tanto el jugador como el equipo existen en la base de datos Usuario usuario = userRepository.findById((long) 1).get(); - Equipo equipo = equipoRepository.findById((long) 1).get(); + Libro equipo = equipoRepository.findById((long) 1).get(); // Crear una nueva solicitud Solicitud solicitud = new Solicitud(); @@ -50,7 +50,7 @@ public void testCrearSolicitud() { @Test public void testSolicitudExistente(){ Usuario usuario = userRepository.findById((long) 1).get(); - Equipo equipo = equipoRepository.findById((long) 1).get(); + Libro equipo = equipoRepository.findById((long) 1).get(); // Intentar crear otra invitación con los mismos detalles Solicitud otraSolicitud = new Solicitud(); otraSolicitud.setUsuario(usuario); @@ -67,7 +67,7 @@ public void testCrearInvitacion() { //Confirmar que tanto el jugador como el equipo existen en la base de datos Usuario usuario = userRepository.findById((long) 1).get(); - Equipo equipo = equipoRepository.findById((long) 1).get(); + Libro equipo = equipoRepository.findById((long) 1).get(); // Crear una nueva invitación Invitacion invitacion = new Invitacion(); @@ -82,7 +82,7 @@ public void testCrearInvitacion() { @Test public void testInvitacionExistente(){ Usuario usuario = userRepository.findById((long) 1).get(); - Equipo equipo = equipoRepository.findById((long) 1).get(); + Libro equipo = equipoRepository.findById((long) 1).get(); // Intentar crear otra invitación con los mismos detalles Invitacion otraInvitacion = new Invitacion(); otraInvitacion.setUsuario(usuario); diff --git a/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java b/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java index f5e56c8..0f65c61 100644 --- a/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java +++ b/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java @@ -1,7 +1,7 @@ package com.example.demo.jpa; -import com.example.demo.domain.Equipo; +import com.example.demo.domain.Libro; import com.example.demo.domain.Usuario; import com.example.demo.repository.EquipoRepository; import com.example.demo.repository.UsuarioRepository; @@ -65,18 +65,18 @@ public void testCrearUsuarios(){ @Test public void testCrearEquipos(){ try { - Iterator equipos = equipoRepository.findAll().iterator(); + Iterator equipos = equipoRepository.findAll().iterator(); int cantidad = 0; while( equipos.hasNext() ) { equipos.next(); cantidad ++; } - Equipo equipo = new Equipo(); + Libro equipo = new Libro(); equipo.setNombreEquipo("Eskere FC"); equipo.setSiglas("EFC"); equipoRepository.save(equipo); - equipo = new Equipo(); + equipo = new Libro(); equipo.setNombreEquipo("Hola FC"); equipo.setSiglas("HFC"); equipoRepository.save(equipo); diff --git a/target/classes/application.properties b/target/classes/application.properties index 80b6144..c8e3173 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -1,6 +1,6 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/equiposdb -spring.datasource.username=admin -spring.datasource.password=admin +spring.datasource.url=jdbc:mysql://us-cdbr-east-06.cleardb.net:3306/heroku_99681a45f12dfac +spring.datasource.username=b1ceb54e686081 +spring.datasource.password=63f2f7fd spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto = update @@ -11,4 +11,4 @@ spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE app.jwt.secret=openb -app.jwt.expiration-ms=86400000 \ No newline at end of file +app.jwt.expiration-ms=86400000 From 042301af0e51336aa96f9bce0dfcaa2c910c203f Mon Sep 17 00:00:00 2001 From: Santiago Andres Leal Omana <89752129+noUsoGitHub@users.noreply.github.com> Date: Thu, 25 May 2023 17:47:06 -0500 Subject: [PATCH 24/26] Update README.md --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index b7b6736..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,7 +1 @@ -# BackendWeb -* David Sánchez -* Orlando Figueroa -* Andrés Omaña -Link wiki: -https://replit.com/@JuanPaez49/WikiProyectoWeb?s=app From 778a9a37140b9006aec57a85b5d85a690f5192e3 Mon Sep 17 00:00:00 2001 From: noUsoGitHub <89752129+noUsoGitHub@users.noreply.github.com> Date: Thu, 25 May 2023 20:17:23 -0500 Subject: [PATCH 25/26] Commit final --- .gitignore | 141 +++-------- .idea/.gitignore | 8 - .idea/compiler.xml | 8 +- .idea/dataSources.xml | 12 - .idea/misc.xml | 4 +- .idea/sqldialects.xml | 6 - .idea/uiDesigner.xml | 124 ---------- .idea/vcs.xml | 7 - .mvn/wrapper/MavenWrapperDownloader.java | 117 --------- .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .mvn/wrapper/maven-wrapper.properties | 4 +- README.md | 7 - mvnw | 224 +++++++++--------- mvnw.cmd | 57 +++-- pom.xml | 62 ++--- ...pringBootApp.java => DemoApplication.java} | 5 +- .../java/com/example/demo/domain/Libro.java | 35 +-- .../java/com/example/demo/dto/EquipoDTO.java | 12 - .../demo/repository/EquipoRepository.java | 15 -- .../demo/repository/libroRepository.java | 7 + .../example/demo/rest/EquipoController.java | 63 ----- .../example/demo/rest/libroController.java | 26 ++ .../demo/security/config/SecurityConfig.java | 93 -------- .../demo/security/jwt/JwtAuthEntryPoint.java | 30 --- .../demo/security/jwt/JwtRequestFilter.java | 85 ------- .../demo/security/jwt/JwtTokenUtil.java | 62 ----- .../demo/security/payload/JwtResponse.java | 22 -- .../demo/security/payload/LoginRequest.java | 26 -- .../security/payload/MessageResponse.java | 18 -- .../security/payload/RegisterRequest.java | 32 --- .../service/UserDetailsServiceImpl.java | 33 --- .../example/demo/service/EquipoService.java | 85 ------- .../example/demo/services/libroService.java | 21 ++ .../com/example/demo/util/ConverterDTO.java | 77 ------ src/main/resources/application.properties | 12 +- ...ppTests.java => DemoApplicationTests.java} | 2 +- .../demo/controller/AuthControllerTest.java | 60 ----- .../demo/controller/EquipoControllerTest.java | 52 ---- .../example/demo/jpa/DeleteEquipoTest.java | 38 --- .../demo/jpa/InvitacionSolicitudTest.java | 97 -------- .../example/demo/jpa/UsuarioEquiposTest.java | 102 -------- system.properties | 1 - target/classes/application.properties | 12 +- 43 files changed, 285 insertions(+), 1619 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/sqldialects.xml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar delete mode 100644 README.md rename src/main/java/com/example/demo/{SpringBootApp.java => DemoApplication.java} (67%) delete mode 100644 src/main/java/com/example/demo/dto/EquipoDTO.java delete mode 100644 src/main/java/com/example/demo/repository/EquipoRepository.java create mode 100644 src/main/java/com/example/demo/repository/libroRepository.java delete mode 100644 src/main/java/com/example/demo/rest/EquipoController.java create mode 100644 src/main/java/com/example/demo/rest/libroController.java delete mode 100644 src/main/java/com/example/demo/security/config/SecurityConfig.java delete mode 100644 src/main/java/com/example/demo/security/jwt/JwtAuthEntryPoint.java delete mode 100644 src/main/java/com/example/demo/security/jwt/JwtRequestFilter.java delete mode 100644 src/main/java/com/example/demo/security/jwt/JwtTokenUtil.java delete mode 100644 src/main/java/com/example/demo/security/payload/JwtResponse.java delete mode 100644 src/main/java/com/example/demo/security/payload/LoginRequest.java delete mode 100644 src/main/java/com/example/demo/security/payload/MessageResponse.java delete mode 100644 src/main/java/com/example/demo/security/payload/RegisterRequest.java delete mode 100644 src/main/java/com/example/demo/security/service/UserDetailsServiceImpl.java delete mode 100644 src/main/java/com/example/demo/service/EquipoService.java create mode 100644 src/main/java/com/example/demo/services/libroService.java delete mode 100644 src/main/java/com/example/demo/util/ConverterDTO.java rename src/test/java/com/example/demo/{SpringBootAppTests.java => DemoApplicationTests.java} (85%) delete mode 100644 src/test/java/com/example/demo/controller/AuthControllerTest.java delete mode 100644 src/test/java/com/example/demo/controller/EquipoControllerTest.java delete mode 100644 src/test/java/com/example/demo/jpa/DeleteEquipoTest.java delete mode 100644 src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java delete mode 100644 src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java delete mode 100644 system.properties diff --git a/.gitignore b/.gitignore index 1370f42..549e00a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,116 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ -# Created by https://www.toptal.com/developers/gitignore/api/eclipse,maven,java,code-java -# Edit at https://www.toptal.com/developers/gitignore?templates=eclipse,maven,java,code-java - -### Code-Java ### -# Language Support for Java(TM) by Red Hat extension for Visual Studio Code - https://marketplace.visualstudio.com/items?itemName=redhat.java - -.project +### STS ### +.apt_generated .classpath -factoryConfiguration.json - -### Eclipse ### -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# CDT- autotools -.autotools - -# Java annotation processor (APT) .factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) +.project +.settings .springBeans - -# Code Recommenders -.recommenders/ - -# Annotation Processing -.apt_generated/ -.apt_generated_test/ - -# Scala IDE specific (Scala & Java development for Eclipse) -.cache-main -.scala_dependencies -.worksheet - -# Uncomment this line if you wish to ignore the project description file. -# Typically, this file would be tracked if it contains build/dependency configurations: -#.project - -### Eclipse Patch ### -# Spring Boot Tooling -.sts4-cache/ - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -### Maven ### -target/ -pom.xml.tag -pom.xml.releaseBackup -pom.xml.versionsBackup -pom.xml.next -release.properties -dependency-reduced-pom.xml -buildNumber.properties -.mvn/timing.properties -# https://github.com/takari/maven-wrapper#usage-without-binary-jar -.mvn/wrapper/maven-wrapper.jar - -# End of https://www.toptal.com/developers/gitignore/api/eclipse,maven,java,code-java +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml index e05cc19..b0a043f 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,21 +2,17 @@ - - + - - - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index d9ebe70..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - mysql.8 - true - com.mysql.cj.jdbc.Driver - jdbc:mysql://localhost:3306 - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 41bd1a0..4258c62 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,5 +8,7 @@ - + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml deleted file mode 100644 index 95ce846..0000000 --- a/.idea/sqldialects.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 288b36b..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index e76d1f3..0000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 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 A?*IS* literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index ffdc10e..b27a13f 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,2 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.2/apache-maven-3.9.2-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/README.md b/README.md deleted file mode 100644 index b7b6736..0000000 --- a/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# BackendWeb -* David Sánchez -* Orlando Figueroa -* Andrés Omaña - -Link wiki: -https://replit.com/@JuanPaez49/WikiProyectoWeb?s=app diff --git a/mvnw b/mvnw index a16b543..66df285 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script +# Apache Maven Wrapper startup batch script, version 3.2.0 # # Required ENV vars: # ------------------ @@ -27,7 +27,6 @@ # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir # MAVEN_OPTS - parameters passed to the Java VM when running Maven # e.g. to debug Maven itself, use # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -36,6 +35,10 @@ if [ -z "$MAVEN_SKIP_RC" ] ; then + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + if [ -f /etc/mavenrc ] ; then . /etc/mavenrc fi @@ -50,7 +53,7 @@ fi cygwin=false; darwin=false; mingw=false -case "`uname`" in +case "$(uname)" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true @@ -58,9 +61,9 @@ case "`uname`" in # See https://developer.apple.com/library/mac/qa/qa1170/_index.html if [ -z "$JAVA_HOME" ]; then if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME else - export JAVA_HOME="/Library/Java/Home" + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME fi fi ;; @@ -68,68 +71,38 @@ esac if [ -z "$JAVA_HOME" ] ; then if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + JAVA_HOME=$(java-config --jre-home) fi fi -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") fi # For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" else - javaExecutable="`readlink -f \"$javaExecutable\"`" + javaExecutable="$(readlink -f "\"$javaExecutable\"")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') JAVA_HOME="$javaHome" export JAVA_HOME fi @@ -145,7 +118,7 @@ if [ -z "$JAVACMD" ] ; then JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" fi fi @@ -159,12 +132,9 @@ if [ -z "$JAVA_HOME" ] ; then echo "Warning: JAVA_HOME environment variable is not set." fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - if [ -z "$1" ] then echo "Path not specified to find_maven_basedir" @@ -180,96 +150,99 @@ find_maven_basedir() { fi # workaround for JBEAP-8937 (on Solaris 10/Sparc) if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + wdir=$(cd "$wdir/.." || exit 1; pwd) fi # end of workaround done - echo "${basedir}" + printf '%s' "$(cd "$basedir" || exit 1; pwd)" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" fi } -BASE_DIR=`find_maven_basedir "$(pwd)"` +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") if [ -z "$BASE_DIR" ]; then exit 1; fi +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. ########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi + log "Couldn't find $wrapperJarPath, downloading it ..." + if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") fi if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" fi elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" fi - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" # For Cygwin, switch paths to Windows format before running javac if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" fi fi fi @@ -278,33 +251,58 @@ fi # End of extension ########################################################################################## -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi fi + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" # For Cygwin, switch paths to Windows format before running java if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") fi # Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +# shellcheck disable=SC2086 # safe args exec "$JAVACMD" \ $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index c8d4337..95ba6f5 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -18,13 +18,12 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script +@REM Apache Maven Wrapper startup batch script, version 3.2.0 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @@ -46,8 +45,8 @@ if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* :skipRcPre @setlocal @@ -120,10 +119,10 @@ SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B ) @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central @@ -134,11 +133,11 @@ if exist %WRAPPER_JAR% ( ) ) else ( if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" ) if "%MVNW_VERBOSE%" == "true" ( echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% + echo Downloading from: %WRAPPER_URL% ) powershell -Command "&{"^ @@ -146,7 +145,7 @@ if exist %WRAPPER_JAR% ( "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ "}" if "%MVNW_VERBOSE%" == "true" ( echo Finished downloading %WRAPPER_JAR% @@ -154,11 +153,35 @@ if exist %WRAPPER_JAR% ( ) @REM End of extension +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + @REM Provide a "standardized" way to retrieve the CLI args that will @REM work with both Windows and non-Windows executions. set MAVEN_CMD_LINE_ARGS=%* -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end @@ -168,15 +191,15 @@ set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause +if "%MAVEN_BATCH_PAUSE%"=="on" pause -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% -exit /B %ERROR_CODE% +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml index 6901bcb..a15ba4f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,28 +1,22 @@ - 4.0.0 org.springframework.boot spring-boot-starter-parent - 2.5.3 - + 3.1.0 + com.example - BackendWeb2 + demo 0.0.1-SNAPSHOT - ob-spring-security-jwt + demo Demo project for Spring Boot 17 - - org.modelmapper - modelmapper - 2.3.8 - org.springframework.boot spring-boot-starter-data-jpa @@ -32,49 +26,21 @@ spring-boot-starter-web - - org.springframework.boot - spring-boot-devtools - runtime - true - com.mysql mysql-connector-j - 8.0.32 - - - org.springframework.boot - spring-boot-starter-test - test + runtime - io.springfox - springfox-boot-starter - 3.0.0 + org.projectlombok + lombok + true - - - - org.projectlombok - lombok - true - org.springframework.boot - spring-boot-starter-security - - - org.springframework.security - spring-security-test + spring-boot-starter-test test - - io.jsonwebtoken - jjwt - 0.9.1 - - @@ -82,6 +48,14 @@ org.springframework.boot spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + diff --git a/src/main/java/com/example/demo/SpringBootApp.java b/src/main/java/com/example/demo/DemoApplication.java similarity index 67% rename from src/main/java/com/example/demo/SpringBootApp.java rename to src/main/java/com/example/demo/DemoApplication.java index 8fd49ee..64b538a 100644 --- a/src/main/java/com/example/demo/SpringBootApp.java +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -4,11 +4,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SpringBootApp { +public class DemoApplication { public static void main(String[] args) { - // contenedor de beans - SpringApplication.run(SpringBootApp.class, args); + SpringApplication.run(DemoApplication.class, args); } } diff --git a/src/main/java/com/example/demo/domain/Libro.java b/src/main/java/com/example/demo/domain/Libro.java index 8c9179c..b4c230f 100644 --- a/src/main/java/com/example/demo/domain/Libro.java +++ b/src/main/java/com/example/demo/domain/Libro.java @@ -1,31 +1,22 @@ package com.example.demo.domain; - -import java.util.HashSet; -import java.util.Set; - +import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.SQLDelete; - -import org.hibernate.annotations.Where; - -import javax.persistence.*; @Getter @Setter @Builder @AllArgsConstructor +@NoArgsConstructor @Entity -@Table(name = "libro") -public class Libro { - - private String titulo; - private String referencia; - private String autor; - private String precio; - private String ubicacion; - - public Libro() { - - } - +@Table(name = "libro_lealsa") + +public class libro { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + private String titulo; + private String referencia; + private String autor; + private double precio; + private String ubicacion; } diff --git a/src/main/java/com/example/demo/dto/EquipoDTO.java b/src/main/java/com/example/demo/dto/EquipoDTO.java deleted file mode 100644 index f092c3b..0000000 --- a/src/main/java/com/example/demo/dto/EquipoDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.demo.dto; - -import lombok.Data; -import lombok.Setter; - -@Data -@Setter -public class EquipoDTO { - private long id; - private String nombreEquipo; - private String siglas; -} diff --git a/src/main/java/com/example/demo/repository/EquipoRepository.java b/src/main/java/com/example/demo/repository/EquipoRepository.java deleted file mode 100644 index af06028..0000000 --- a/src/main/java/com/example/demo/repository/EquipoRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.demo.repository; - - -import com.example.demo.domain.Libro; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface EquipoRepository extends JpaRepository { - @Query("SELECT e FROM Equipo e WHERE NOT EXISTS " - + "(SELECT 1 FROM Usuario u JOIN u.equipos_participe ep WHERE ep.id = e.id AND u.id = :userId)") - List buscarEquiposDisponibles(@Param("userId") Long userId); -} diff --git a/src/main/java/com/example/demo/repository/libroRepository.java b/src/main/java/com/example/demo/repository/libroRepository.java new file mode 100644 index 0000000..b15970a --- /dev/null +++ b/src/main/java/com/example/demo/repository/libroRepository.java @@ -0,0 +1,7 @@ +package com.example.demo.repository; + +import com.example.demo.domain.libro; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface libroRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/demo/rest/EquipoController.java b/src/main/java/com/example/demo/rest/EquipoController.java deleted file mode 100644 index 5f2eba7..0000000 --- a/src/main/java/com/example/demo/rest/EquipoController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.demo.rest; - - -import com.example.demo.domain.Libro; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.repository.EquipoRepository; -import com.example.demo.service.EquipoService; -import com.example.demo.util.ConverterDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Set; - -@RestController -@RequestMapping("/equipos") -public class EquipoController { - @Autowired - EquipoRepository equipoRepository; - @Autowired - EquipoService equipoService; - @Autowired - private ConverterDTO converterDTO; - //Obtener todos los equipos - @PostMapping("/create/{idUsuario}") - public ResponseEntity crearEquipo(@RequestBody EquipoDTO equipoDTO,@PathVariable Long idUsuario) { - System.out.println(equipoDTO); - Libro equipo = converterDTO.toEntity(equipoDTO); - equipo = equipoService.save(equipo,idUsuario); - equipoDTO = converterDTO.toDto(equipo); - return ResponseEntity.status(HttpStatus.CREATED).body(equipoDTO); - } - @GetMapping("/{idEquipo}") - public ResponseEntity obtenerEquipo(@PathVariable Long idEquipo) { - Libro equipo = equipoService.findById(idEquipo); - if (equipo == null) { - return ResponseEntity.notFound().build(); - } - EquipoDTO equipoDTO = converterDTO.toDto(equipo); - return ResponseEntity.ok(equipoDTO); - } - //Traer equipos en los que no hace parte el usuario - // Lista equipos -> Presentacion - @GetMapping("/{idUsuario}/equipos_disponibles") - public List obtenerEquiposDisponibles(@PathVariable Long idUsuario) { - List equipos = equipoService.buscarEquiposDisponibles(idUsuario); - List equipoDTO = converterDTO.toDtoListEquipos(equipos); - return equipoDTO; - } - @GetMapping("/{idUsuario}/equipos_participe") - public List obtenerEquiposParticipe(@PathVariable Long idUsuario) { - Set equipos = equipoService.buscarEquiposParticipe(idUsuario); - List equipoDTO = converterDTO.toDtoSetEquipos(equipos); - return equipoDTO; - } - @DeleteMapping("/delete/{idEquipo}") - public ResponseEntity eliminarEquipo(@PathVariable Long idEquipo) { - return equipoService.delete(idEquipo); - } - -} diff --git a/src/main/java/com/example/demo/rest/libroController.java b/src/main/java/com/example/demo/rest/libroController.java new file mode 100644 index 0000000..e955b5a --- /dev/null +++ b/src/main/java/com/example/demo/rest/libroController.java @@ -0,0 +1,26 @@ +package com.example.demo.rest; + +import com.example.demo.domain.libro; +import com.example.demo.services.libroService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/libros") +public class libroController { + + @Autowired + private libroService libroService; + + @PostMapping("/anadir") + public void crearlibro(@RequestBody libro libro){ + libroService.ingresarLibro(libro); + } + + @GetMapping("/lista") + public List obtenerlibros(){ + return libroService.obtenerLibros(); + } +} diff --git a/src/main/java/com/example/demo/security/config/SecurityConfig.java b/src/main/java/com/example/demo/security/config/SecurityConfig.java deleted file mode 100644 index 2e72e4c..0000000 --- a/src/main/java/com/example/demo/security/config/SecurityConfig.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.example.demo.security.config; - -import com.example.demo.security.jwt.JwtAuthEntryPoint; -import com.example.demo.security.jwt.JwtRequestFilter; -import com.example.demo.security.service.UserDetailsServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; - -import java.util.List; - -/** - * Clase para la configuración de seguridad Spring Security - */ -@Configuration -@EnableWebSecurity // permite a Spring aplicar esta configuracion a la configuraicon de seguridad global -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private UserDetailsServiceImpl userDetailsService; - - @Autowired - private JwtAuthEntryPoint unauthorizedHandler; - - // ================ CREACIÓN DE BEANS ====================== - @Bean - public JwtRequestFilter authenticationJwtTokenFilter() { - return new JwtRequestFilter(); - } - - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - /** - * Configuracion global de CORS para toda la aplicacion - */ - @Bean - CorsConfigurationSource corsConfigurationSource() - { - CorsConfiguration configuration = new CorsConfiguration(); - // configuration.setAllowedOrigins(List.of("http://localhost:4200", "https://angular-springboot-*.vercel.app")); - configuration.setAllowedOriginPatterns(List.of("http://localhost:4200", "https://angular-springboot1-beta.vercel.app")); - configuration.setAllowedMethods(List.of("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH")); - configuration.setAllowedHeaders(List.of("Access-Control-Allow-Origin", "X-Requested-With", "Origin", "Content-Type", "Accept", "Authorization")); - configuration.setAllowCredentials(true); - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", configuration); - return source; - } - - // ========================= OVERRIDE: SOBREESCRIBIR FUNCIONALIDAD SECURITY POR DEFECTO ====== - @Override - public void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - // Cross-Site Request Forgery CSRF - // CORS (Cross-origin resource sharing) - http.cors().and().csrf().disable() - .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() - .authorizeRequests().antMatchers("/api/auth/**").permitAll() - .antMatchers("/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**").permitAll() - .antMatchers("/api/hello/**").permitAll() - .antMatchers("/").permitAll() - .anyRequest().authenticated(); - - http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); - } - -} diff --git a/src/main/java/com/example/demo/security/jwt/JwtAuthEntryPoint.java b/src/main/java/com/example/demo/security/jwt/JwtAuthEntryPoint.java deleted file mode 100644 index 31b48ef..0000000 --- a/src/main/java/com/example/demo/security/jwt/JwtAuthEntryPoint.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.example.demo.security.jwt; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * Rechaza peticiones no autenticadas devolviendo - * un código de error 401 unauthorized - */ -@Component -public class JwtAuthEntryPoint implements AuthenticationEntryPoint { - - private static final Logger log = LoggerFactory.getLogger(JwtAuthEntryPoint.class); - - @Override - public void commence(HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse, - AuthenticationException e) throws IOException, ServletException { - log.error("Unauthorized error: {}", e.getMessage()); - httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Error: Unauthorized"); - } -} diff --git a/src/main/java/com/example/demo/security/jwt/JwtRequestFilter.java b/src/main/java/com/example/demo/security/jwt/JwtRequestFilter.java deleted file mode 100644 index 057a3ac..0000000 --- a/src/main/java/com/example/demo/security/jwt/JwtRequestFilter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.example.demo.security.jwt; - -import com.example.demo.security.service.UserDetailsServiceImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is - * found. - * Se ejecuta por cada petición entrante con el fin de validar el token JWT - * en caso de que lo sea se añade al contexto para indicar que un usuario está autenticado - */ -public class JwtRequestFilter extends OncePerRequestFilter { - - private static final Logger logger = LoggerFactory.getLogger(JwtRequestFilter.class); - public static final String BEARER = "Bearer "; - - @Autowired - private JwtTokenUtil jwtTokenUtil; - - @Autowired - private UserDetailsServiceImpl userDetailsService; - - /** - * Same contract as for {@code doFilter}, but guaranteed to be - * just invoked once per request within a single request thread. - * See {@link #shouldNotFilterAsyncDispatch()} for details. - *

Provides HttpServletRequest and HttpServletResponse arguments instead of the - * default ServletRequest and ServletResponse ones. - * - * @param request - * @param response - * @param filterChain - */ - @Override - protected void doFilterInternal(HttpServletRequest request, - HttpServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - try { - String jwt = parseJwt(request); - if (jwt != null && jwtTokenUtil.validateJwtToken(jwt)) { - String username = jwtTokenUtil.getUserNameFromJwtToken(jwt); - - UserDetails userDetails = userDetailsService.loadUserByUsername(username); - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - } - } catch (Exception e) { - logger.error("Cannot set user authentication: {}", e); - } - - filterChain.doFilter(request, response); - } - - /** - * A partir de una cabecera Authorization extrae el token - * @param request - * @return - */ - private String parseJwt(HttpServletRequest request) { - String headerAuth = request.getHeader("Authorization"); - - if (StringUtils.hasText(headerAuth) && headerAuth.startsWith(BEARER)) - return headerAuth.substring(BEARER.length()); - - return null; - } - -} diff --git a/src/main/java/com/example/demo/security/jwt/JwtTokenUtil.java b/src/main/java/com/example/demo/security/jwt/JwtTokenUtil.java deleted file mode 100644 index 598d11a..0000000 --- a/src/main/java/com/example/demo/security/jwt/JwtTokenUtil.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.demo.security.jwt; - -import io.jsonwebtoken.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -import java.util.Date; - -/** - * Métodos para generar y validar los token JWT - */ -@Component -public class JwtTokenUtil { - - private static final Logger log = LoggerFactory.getLogger(JwtTokenUtil.class); - - @Value("${app.jwt.secret}") - private String jwtSecret; - - @Value("${app.jwt.expiration-ms}") - private int jwtExpirationMs; - - public String generateJwtToken(Authentication authentication) { - - UserDetails userPrincipal = (UserDetails) authentication.getPrincipal(); - - return Jwts.builder() - .setSubject((userPrincipal.getUsername())) - .setIssuedAt(new Date()) - .setExpiration(new Date((new Date()).getTime() + jwtExpirationMs)) - .signWith(SignatureAlgorithm.HS512, jwtSecret) - .compact(); - } - - public String getUserNameFromJwtToken(String token) { - return Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody().getSubject(); - } - - public boolean validateJwtToken(String authToken) { - try { - Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); - return true; - } catch (SignatureException e) { - log.error("Invalid JWT signature: {}", e.getMessage()); - } catch (MalformedJwtException e) { - log.error("Invalid JWT token: {}", e.getMessage()); - } catch (ExpiredJwtException e) { - log.error("JWT token is expired: {}", e.getMessage()); - } catch (UnsupportedJwtException e) { - log.error("JWT token is unsupported: {}", e.getMessage()); - } catch (IllegalArgumentException e) { - log.error("JWT claims string is empty: {}", e.getMessage()); - } - - return false; - } -} - diff --git a/src/main/java/com/example/demo/security/payload/JwtResponse.java b/src/main/java/com/example/demo/security/payload/JwtResponse.java deleted file mode 100644 index 74c3948..0000000 --- a/src/main/java/com/example/demo/security/payload/JwtResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.demo.security.payload; - -public class JwtResponse { - - private String token; - - public JwtResponse() { - } - public JwtResponse(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - -} - diff --git a/src/main/java/com/example/demo/security/payload/LoginRequest.java b/src/main/java/com/example/demo/security/payload/LoginRequest.java deleted file mode 100644 index f1bed9b..0000000 --- a/src/main/java/com/example/demo/security/payload/LoginRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.demo.security.payload; - -public class LoginRequest { - - private String username; - private String password; - - public LoginRequest() { - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/src/main/java/com/example/demo/security/payload/MessageResponse.java b/src/main/java/com/example/demo/security/payload/MessageResponse.java deleted file mode 100644 index c43de5f..0000000 --- a/src/main/java/com/example/demo/security/payload/MessageResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.example.demo.security.payload; - -public class MessageResponse { - - private String message; - - public MessageResponse(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/src/main/java/com/example/demo/security/payload/RegisterRequest.java b/src/main/java/com/example/demo/security/payload/RegisterRequest.java deleted file mode 100644 index 2fcf17d..0000000 --- a/src/main/java/com/example/demo/security/payload/RegisterRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.demo.security.payload; - -public class RegisterRequest { - - private String username; - private String email; - private String password; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/src/main/java/com/example/demo/security/service/UserDetailsServiceImpl.java b/src/main/java/com/example/demo/security/service/UserDetailsServiceImpl.java deleted file mode 100644 index 32d761f..0000000 --- a/src/main/java/com/example/demo/security/service/UserDetailsServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.demo.security.service; - -import com.example.demo.repository.UsuarioRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; - -/** - * Autentica un usuario de la base de datos - * - * Authentication Manager llama al método loadUserByUsername de esta clase - * para obtener los detalles del usuario de la base de datos cuando - * se intente autenticar un usuario - */ -@Service -public class UserDetailsServiceImpl implements UserDetailsService { - - @Autowired - private UsuarioRepository userRepository; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - com.example.demo.domain.Usuario user = userRepository.findByUsername(username) - .orElseThrow(() -> new UsernameNotFoundException("User Not Found with username: " + username)); - - return new org.springframework.security.core.userdetails.User( - user.getUsername() ,user.getPassword(),new ArrayList<>()); - } -} diff --git a/src/main/java/com/example/demo/service/EquipoService.java b/src/main/java/com/example/demo/service/EquipoService.java deleted file mode 100644 index fabeed4..0000000 --- a/src/main/java/com/example/demo/service/EquipoService.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.example.demo.service; - - -import com.example.demo.domain.Libro; -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Solicitud; -import com.example.demo.domain.Usuario; -import com.example.demo.repository.EquipoRepository; -import com.example.demo.security.payload.MessageResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; - -import javax.persistence.EntityManager; -import javax.persistence.PreRemove; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.Set; - -@Service -public class EquipoService { - - @Autowired - private EquipoRepository equipoRepository; - @Autowired - private SolicitudService solicitudesService; - - @Autowired - private InvitacionService invitacionService; - @Autowired - private UsuarioService usuarioService; - - private EntityManager entityManager; - - public Iterable findAll(){ - return equipoRepository.findAll(); - } - public Libro findById(Long id) { - Optional equipoOptional = equipoRepository.findById(id); - return equipoOptional.orElseThrow(() -> new RuntimeException("Equipo no encontrado")); - } - public Libro save(Libro equipo,Long idUsuario) { - Usuario usuario = usuarioService.findById(idUsuario); - usuario.getEquipos_participe().add(equipo); - return equipoRepository.save(equipo); - } - public List buscarEquiposDisponibles(Long idUsuario){ - return equipoRepository.buscarEquiposDisponibles(idUsuario); - } - - public ResponseEntity delete(Long idEquipo) { - try { - Libro equipo = findById(idEquipo); - for (Invitacion invitacion: equipo.getInvitaciones_a_jugadores()) { - invitacionService.delete(invitacion.getId()); - } - equipo.getInvitaciones_a_jugadores().clear(); - - for(Solicitud solicitud: equipo.getSolicitudes_de_jugadores()){ - solicitudesService.delete(solicitud.getId()); - } - equipo.getSolicitudes_de_jugadores().clear(); - - for(Usuario usuario : equipo.getJugadores_en_equipo()){ - usuario.getEquipos_participe().remove(equipo); - } - equipoRepository.delete(equipo); - - return ResponseEntity.ok(new MessageResponse("El equipo con ID " + idEquipo + " fue eliminado exitosamente.")); - } catch (NoSuchElementException e) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new MessageResponse("No se encontró el equipo con ID " + idEquipo + ".")); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new MessageResponse("Ocurrió un error al eliminar el equipo con ID " + idEquipo + ".")); - } - - } - - public Set buscarEquiposParticipe(Long idUsuario) { - Usuario usuario = usuarioService.findById(idUsuario); - return usuario.getEquipos_participe(); - - } -} diff --git a/src/main/java/com/example/demo/services/libroService.java b/src/main/java/com/example/demo/services/libroService.java new file mode 100644 index 0000000..7e65ae6 --- /dev/null +++ b/src/main/java/com/example/demo/services/libroService.java @@ -0,0 +1,21 @@ +package com.example.demo.services; + +import com.example.demo.domain.libro; +import com.example.demo.repository.libroRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class libroService { + @Autowired + libroRepository libroRepository; + + public List obtenerLibros(){ + return libroRepository.findAll(); + } + public void ingresarLibro(libro libro){ + libroRepository.save(libro); + } +} diff --git a/src/main/java/com/example/demo/util/ConverterDTO.java b/src/main/java/com/example/demo/util/ConverterDTO.java deleted file mode 100644 index b08a618..0000000 --- a/src/main/java/com/example/demo/util/ConverterDTO.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.example.demo.util; - -import com.example.demo.domain.Libro; -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Solicitud; -import com.example.demo.domain.Usuario; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.dto.InvitacionDTO; -import com.example.demo.dto.SolicitudDTO; -import com.example.demo.dto.UsuarioDTO; -import org.modelmapper.ModelMapper; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - - -@Component -public class ConverterDTO { - public ConverterDTO(){ - modelMapper = new ModelMapper(); - } - private ModelMapper modelMapper; - - public EquipoDTO toDto(Libro equipo){ - EquipoDTO equipoDTO = modelMapper.map(equipo, EquipoDTO.class); - return equipoDTO; - } - public UsuarioDTO toDto(Usuario usuario){ - UsuarioDTO usuarioDTO = modelMapper.map(usuario, UsuarioDTO.class); - return usuarioDTO; - } - public SolicitudDTO toDto(Solicitud solicitud){ - SolicitudDTO solicitudDTO = modelMapper.map(solicitud, SolicitudDTO.class); - return solicitudDTO; - } - public List toDtoListUsuarios(List usuarios) { - List usuariosDTO = usuarios.stream() - .map(usuario -> modelMapper.map(usuario, UsuarioDTO.class)) - .collect(Collectors.toList()); - return usuariosDTO; - } - public List toDtoListEquipos(List equipos) { - List equiposDTO = equipos.stream() - .map(equipo -> modelMapper.map(equipo, EquipoDTO.class)) - .collect(Collectors.toList()); - return equiposDTO; - } - public List toDtoListInvitaciones(List invitaciones){ - List invitacionesDTO = invitaciones.stream() - .map(invitacion -> modelMapper.map(invitacion, InvitacionDTO.class)) - .collect(Collectors.toList()); - return invitacionesDTO; - } - public List toDtoListSolicitudes(List solicitudes){ - List solicitudesDTO = solicitudes.stream() - .map(solicitud -> modelMapper.map(solicitud, SolicitudDTO.class)) - .collect(Collectors.toList()); - return solicitudesDTO; - } - - public List toDtoSetEquipos(Set equipos) { - List equiposDTO = equipos.stream() - .map(equipo -> modelMapper.map(equipo, EquipoDTO.class)) - .collect(Collectors.toList()); - return equiposDTO; - } - public Libro toEntity(EquipoDTO equipoDTO) { - Libro equipo = new Libro(); - equipo.setNombreEquipo(Objects.requireNonNullElse(equipoDTO.getNombreEquipo(), "default")); - equipo.setSiglas(Objects.requireNonNullElse(equipoDTO.getSiglas(), "def")); - return equipo; - } - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c8e3173..1111523 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,14 +1,12 @@ -spring.datasource.url=jdbc:mysql://us-cdbr-east-06.cleardb.net:3306/heroku_99681a45f12dfac -spring.datasource.username=b1ceb54e686081 -spring.datasource.password=63f2f7fd +spring.datasource.url=jdbc:mysql://localhost:3306/Javeriana +spring.datasource.username=root +spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.jpa.hibernate.ddl-auto = update - -# ONLY DEBUG +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE app.jwt.secret=openb -app.jwt.expiration-ms=86400000 +app.jwt.expiration-ms=86400000 \ No newline at end of file diff --git a/src/test/java/com/example/demo/SpringBootAppTests.java b/src/test/java/com/example/demo/DemoApplicationTests.java similarity index 85% rename from src/test/java/com/example/demo/SpringBootAppTests.java rename to src/test/java/com/example/demo/DemoApplicationTests.java index ec0d921..2778a6a 100644 --- a/src/test/java/com/example/demo/SpringBootAppTests.java +++ b/src/test/java/com/example/demo/DemoApplicationTests.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class SpringBootAppTests { +class DemoApplicationTests { @Test void contextLoads() { diff --git a/src/test/java/com/example/demo/controller/AuthControllerTest.java b/src/test/java/com/example/demo/controller/AuthControllerTest.java deleted file mode 100644 index 244e9d9..0000000 --- a/src/test/java/com/example/demo/controller/AuthControllerTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.demo.controller; - -import com.example.demo.domain.Usuario; -import com.example.demo.rest.AuthController; -import com.example.demo.security.jwt.JwtTokenUtil; -import com.example.demo.security.payload.LoginRequest; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -import static org.mockito.Mockito.when; - - -@SpringBootTest -@AutoConfigureMockMvc(addFilters = false) -public class AuthControllerTest { - @Autowired - private MockMvc mockMvc; - @BeforeEach - public void setUp() { - MockitoAnnotations.openMocks(this); - } - @Autowired - private AuthController authController; - @Autowired - private ObjectMapper objectMapper; - @MockBean - private JwtTokenUtil jwtTokenUtil; - @MockBean - private AuthenticationManager authManager; - @Test - public void testLogin() throws Exception { - String jwtToken = "jwtToken"; - LoginRequest loginRequest = new LoginRequest(); - loginRequest.setUsername("prueba"); - loginRequest.setPassword("prueba"); - Authentication authentication = authManager.authenticate( - new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); - - when(jwtTokenUtil.generateJwtToken(authentication)).thenReturn(jwtToken); - mockMvc.perform(MockMvcRequestBuilders.post("/api/auth/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(loginRequest))) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.user").exists()) - .andExpect(MockMvcResultMatchers.jsonPath("$.token").value(jwtToken)); - } -} diff --git a/src/test/java/com/example/demo/controller/EquipoControllerTest.java b/src/test/java/com/example/demo/controller/EquipoControllerTest.java deleted file mode 100644 index 4f65e3f..0000000 --- a/src/test/java/com/example/demo/controller/EquipoControllerTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.example.demo.controller; - -import com.example.demo.domain.Libro; -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Solicitud; -import com.example.demo.dto.EquipoDTO; -import com.example.demo.dto.UsuarioDTO; -import com.example.demo.rest.EquipoController; -import com.example.demo.service.EquipoService; -import com.example.demo.util.ConverterDTO; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; - - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@SpringBootTest -@AutoConfigureMockMvc(addFilters = false) -public class EquipoControllerTest { - @Autowired - private MockMvc mockMvc; - @BeforeEach - public void setUp() { - MockitoAnnotations.openMocks(this); - } - - @Test - public void testEliminarEquipo() throws Exception { - mockMvc.perform(delete("/equipos/delete/{idEquipo}", 12L)) - .andExpect(status().isOk()); - } - @Test - public void testAgregarEquipo() throws Exception { - mockMvc.perform(post("/equipos/create") - .contentType("application/json") - .content("{\"nombreEquipo\":\"Equipo 1\",\"siglas\":\"EQ1\"}")) - .andExpect(status().isCreated()); - } - @Test - public void testEliminarEquipoBadRequest() throws Exception { - mockMvc.perform(delete("/equipos/delete")).andExpect(status().isMethodNotAllowed()); - } -} - diff --git a/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java b/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java deleted file mode 100644 index 994c440..0000000 --- a/src/test/java/com/example/demo/jpa/DeleteEquipoTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.example.demo.jpa; - -import com.example.demo.domain.Libro; -import com.example.demo.repository.EquipoRepository; -import com.example.demo.service.EquipoService; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import javax.transaction.Transactional; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -//@Transactional -@SpringBootTest - -public class DeleteEquipoTest { - @Autowired - private EquipoRepository equipoRepository; - @Autowired - private EquipoService equipoService; - - @Test - @Transactional - public void testDeleteByIdLogic() { - // Elimina el equipo con deleteByIdLogic - equipoService.delete(1L); - - // Verifica si el equipo fue eliminado correctamente - Optional equipoAux = equipoRepository.findById(1L); - Assertions.assertTrue(equipoAux.isEmpty(), "El equipo se borró con exito"); - //Assertions.assertTrue(equipoAux.get().isEliminado(), "La eliminación lógica se realizó correctamente"); - } -} diff --git a/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java b/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java deleted file mode 100644 index 3c00710..0000000 --- a/src/test/java/com/example/demo/jpa/InvitacionSolicitudTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.example.demo.jpa; - - -import com.example.demo.domain.Libro; -import com.example.demo.domain.Invitacion; -import com.example.demo.domain.Solicitud; -import com.example.demo.domain.Usuario; -import com.example.demo.repository.EquipoRepository; -import com.example.demo.repository.InvitacionRepository; -import com.example.demo.repository.SolicitudRepository; -import com.example.demo.repository.UsuarioRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.dao.DataIntegrityViolationException; - -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.fail; - -@SpringBootTest -public class InvitacionSolicitudTest { - - @Autowired - UsuarioRepository userRepository; - @Autowired - EquipoRepository equipoRepository; - @Autowired - SolicitudRepository solicitudRepository; - @Autowired - InvitacionRepository invitacionRepository; - - - @Test - public void testCrearSolicitud() { - - //Confirmar que tanto el jugador como el equipo existen en la base de datos - Usuario usuario = userRepository.findById((long) 1).get(); - Libro equipo = equipoRepository.findById((long) 1).get(); - - // Crear una nueva solicitud - Solicitud solicitud = new Solicitud(); - solicitud.setUsuario(usuario); - solicitud.setEquipo(equipo); - solicitudRepository.save(solicitud); - - // Verificar que la solicitud se haya creado correctamente - assertNotNull(solicitud.getId()); - System.out.println(solicitud.getId()); - } - @Test - public void testSolicitudExistente(){ - Usuario usuario = userRepository.findById((long) 1).get(); - Libro equipo = equipoRepository.findById((long) 1).get(); -// Intentar crear otra invitación con los mismos detalles - Solicitud otraSolicitud = new Solicitud(); - otraSolicitud.setUsuario(usuario); - otraSolicitud.setEquipo(equipo); - try { - solicitudRepository.save(otraSolicitud); - fail("Se esperaba una excepción de tipo DataIntegrityViolationException"); - } catch (DataIntegrityViolationException ex) { - // La excepción fue lanzada, lo que indica que la prueba pasó correctamente - } - } - @Test - public void testCrearInvitacion() { - - //Confirmar que tanto el jugador como el equipo existen en la base de datos - Usuario usuario = userRepository.findById((long) 1).get(); - Libro equipo = equipoRepository.findById((long) 1).get(); - - // Crear una nueva invitación - Invitacion invitacion = new Invitacion(); - invitacion.setUsuario(usuario); - invitacion.setEquipo(equipo); - invitacionRepository.save(invitacion); - - // Verificar que la invitación se haya creado correctamente - assertNotNull(invitacion.getId()); - System.out.println(invitacion.getId()); - } - @Test - public void testInvitacionExistente(){ - Usuario usuario = userRepository.findById((long) 1).get(); - Libro equipo = equipoRepository.findById((long) 1).get(); -// Intentar crear otra invitación con los mismos detalles - Invitacion otraInvitacion = new Invitacion(); - otraInvitacion.setUsuario(usuario); - otraInvitacion.setEquipo(equipo); - try { - invitacionRepository.save(otraInvitacion); - fail("Se esperaba una excepción de tipo DataIntegrityViolationException"); - } catch (DataIntegrityViolationException ex) { - // La excepción fue lanzada, lo que indica que la prueba pasó correctamente - } - } -} diff --git a/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java b/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java deleted file mode 100644 index 0f65c61..0000000 --- a/src/test/java/com/example/demo/jpa/UsuarioEquiposTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.example.demo.jpa; - - -import com.example.demo.domain.Libro; -import com.example.demo.domain.Usuario; -import com.example.demo.repository.EquipoRepository; -import com.example.demo.repository.UsuarioRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Iterator; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SpringBootTest -public class UsuarioEquiposTest { - @Autowired - UsuarioRepository usuarioRepository; - - @Autowired - EquipoRepository equipoRepository; - - @Test - public void testCrearUsuarios(){ - try { - Iterator usuarios = usuarioRepository.findAll().iterator(); - int cantidad = 0; - while( usuarios.hasNext() ) { - usuarios.next(); - cantidad ++; - } - - Usuario user = new Usuario(); - - user.setUsername("Juan"); - user.setEmail("Juan@Paez.es"); - user.setPassword("test"); - usuarioRepository.save(user); - - - user = new Usuario(); - user.setUsername("Juan"); - user.setEmail("Juan@Sanchez.es"); - user.setPassword("test123"); - usuarioRepository.save(user); - - - int nuevaCantidad = 0; - usuarios = usuarioRepository.findAll().iterator(); - while( usuarios.hasNext() ) { - usuarios.next(); - nuevaCantidad ++; - } - - assertTrue(cantidad + 2 == nuevaCantidad, "Si se agregarón los usuarios"); - }catch (Exception e){ - e.printStackTrace(); - assertTrue(false,"Error"); - } - - - - } - @Test - public void testCrearEquipos(){ - try { - Iterator equipos = equipoRepository.findAll().iterator(); - int cantidad = 0; - while( equipos.hasNext() ) { - equipos.next(); - cantidad ++; - } - Libro equipo = new Libro(); - equipo.setNombreEquipo("Eskere FC"); - equipo.setSiglas("EFC"); - equipoRepository.save(equipo); - - equipo = new Libro(); - equipo.setNombreEquipo("Hola FC"); - equipo.setSiglas("HFC"); - equipoRepository.save(equipo); - - - int nuevaCantidad = 0; - - equipos = equipoRepository.findAll().iterator(); - while( equipos.hasNext() ) { - equipos.next(); - nuevaCantidad ++; - } - - assertTrue(cantidad + 2 == nuevaCantidad, "Si se agregarón los equipos"); - }catch (Exception e){ - e.printStackTrace(); - assertTrue(false,"Error"); - } - - - - } -} diff --git a/system.properties b/system.properties deleted file mode 100644 index c6b145d..0000000 --- a/system.properties +++ /dev/null @@ -1 +0,0 @@ -java.runtime.version=16 \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index c8e3173..1111523 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -1,14 +1,12 @@ -spring.datasource.url=jdbc:mysql://us-cdbr-east-06.cleardb.net:3306/heroku_99681a45f12dfac -spring.datasource.username=b1ceb54e686081 -spring.datasource.password=63f2f7fd +spring.datasource.url=jdbc:mysql://localhost:3306/Javeriana +spring.datasource.username=root +spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.jpa.hibernate.ddl-auto = update - -# ONLY DEBUG +spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE app.jwt.secret=openb -app.jwt.expiration-ms=86400000 +app.jwt.expiration-ms=86400000 \ No newline at end of file From 5825c452df52a456c858a21aeb2172ead8635d98 Mon Sep 17 00:00:00 2001 From: noUsoGitHub <89752129+noUsoGitHub@users.noreply.github.com> Date: Thu, 25 May 2023 20:25:59 -0500 Subject: [PATCH 26/26] final --- src/main/resources/application.properties | 6 +- .../com/example/demo/libroServiceTest.java | 64 +++++++++++++++++++ target/classes/application.properties | 6 +- 3 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/example/demo/libroServiceTest.java diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1111523..87440f0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/Javeriana -spring.datasource.username=root -spring.datasource.password=1234 +spring.datasource.url=jdbc:mysql://66.70.137.253:3306/Javeriana +spring.datasource.username=javeriana +spring.datasource.password=87654321 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update diff --git a/src/test/java/com/example/demo/libroServiceTest.java b/src/test/java/com/example/demo/libroServiceTest.java new file mode 100644 index 0000000..2960b51 --- /dev/null +++ b/src/test/java/com/example/demo/libroServiceTest.java @@ -0,0 +1,64 @@ +package com.example.demo; + +import com.example.demo.domain.libro; +import com.example.demo.repository.libroRepository; +import com.example.demo.services.libroService; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; + +@SpringBootTest +public class libroServiceTest { + + @Autowired + private libroRepository libroRepository; + + @Autowired + private libroRepository libroService; + + @Captor + private ArgumentCaptor libroCaptor; + + public void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void testCrearLibro() { + int canti = (int) libroRepository.count(); + libro libro = new libro(); + libro.setReferencia("Libor213"); + libro.setAutor("Dummy autor"); + libro.setPrecio(10000L); + libro.setUbicacion("Panamericana"); + + libroRepository.save(libro); + + int cantiNueva = (int) libroRepository.count(); + assertTrue(cantiNueva == canti+1); + } + @Test + public void testListaLibros(){ + libro libro = new libro(); + libro.setReferencia("Libor213"); + libro.setAutor("Dummy autor"); + libro.setPrecio(10000L); + libro.setUbicacion("Panamericana"); + + libroRepository.save(libro); + List libroList = libroService.findAll(); + + assertTrue(libroList.contains(libro)); + } +} \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index 1111523..87440f0 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -1,6 +1,6 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/Javeriana -spring.datasource.username=root -spring.datasource.password=1234 +spring.datasource.url=jdbc:mysql://66.70.137.253:3306/Javeriana +spring.datasource.username=javeriana +spring.datasource.password=87654321 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update