diff --git a/pom.xml b/pom.xml index 540531c..7ce8159 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -16,6 +16,7 @@ 17 + org.springframework.boot @@ -48,6 +49,11 @@ spring-boot-starter-test test + + com.sun.mail + javax.mail + 1.6.2 + diff --git a/src/main/java/Proyecto/GestorAlmuerzo/FoodExpress.java b/src/main/java/Proyecto/GestorAlmuerzo/FoodExpress.java index 8f10ae4..5212fb2 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/FoodExpress.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/FoodExpress.java @@ -1,6 +1,9 @@ package Proyecto.GestorAlmuerzo; +import Proyecto.GestorAlmuerzo.Repository.RoleRepository; +import Proyecto.GestorAlmuerzo.model.Category; import Proyecto.GestorAlmuerzo.service.AppServices; +import Proyecto.GestorAlmuerzo.service.CategoryServices; import Proyecto.GestorAlmuerzo.service.UserServices; import Proyecto.GestorAlmuerzo.service.PlateServices; import Proyecto.GestorAlmuerzo.model.User; @@ -12,42 +15,63 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + @SpringBootApplication public class FoodExpress { @Autowired + RoleRepository roleRepository; + @Autowired(required = true) UserServices usuarioService; - @Autowired + @Autowired(required = true) AppServices appService; - @Autowired + @Autowired(required = true) + CategoryServices categoryServices; + + @Autowired(required = true) PlateServices plateServices; public static void main(String[] args) { SpringApplication.run(FoodExpress.class, args); } + @Bean public CommandLineRunner run() throws Exception { return (args) -> { - appService.addRol(new Role("1", "cliente")); - appService.addRol(new Role("2", "administrador")); - appService.addRol(new Role("3", "empleado")); - usuarioService.addUser(new User("sebastian@foodexpres.com", "Sebastian", "Zamora", "1234", "1")); - plateServices.addPlate(new Plate("1", "Brillo Andino", "Ensalada de quinoa con aguacate y tomate cherry")); - plateServices.addPlate(new Plate("2", "Delicia Marina", "Carpaccio de salmón con alcaparras y limón")); - plateServices.addPlate(new Plate("3", "Susurros Tropicales", "Crema de calabaza con jengibre y coco")); - plateServices.addPlate(new Plate("4", "Aromas de la Tierra", "Sopa de lentejas con chorizo y espinacas")); - plateServices.addPlate(new Plate("5", "Melodía de Sabores", "Solomillo de ternera con salsa de vino tinto")); - plateServices.addPlate(new Plate("6", "Fusión Exótica", "Pollo al curry con leche de coco y verduras")); - plateServices.addPlate(new Plate("7", "Ritmo del Mar", "Filete de salmón a la parrilla con salsa de eneldo")); - plateServices.addPlate(new Plate("8", "Viaje a la Costa", "Paella de mariscos")); - plateServices.addPlate(new Plate("9", "Armonía en el Plato", "Risotto de champiñones y espinacas")); - plateServices.addPlate(new Plate("10", "Capricho Vegetal", "Lasaña de berenjena con ricotta y espinacas")); - plateServices.addPlate(new Plate("11", "Dulce Contraste", "Puré de batata con nueces y miel")); - plateServices.addPlate(new Plate("12", "Elegancia Verde", "Brócoli al vapor con almendras tostadas")); - plateServices.addPlate(new Plate("13", "Tradición Italiana", "Lasaña boloñesa")); - plateServices.addPlate(new Plate("14", "Fiesta Mexicana", "Tacos de carnitas con salsa de aguacate")); - plateServices.getAllPlates().forEach(plate -> System.out.println(plate)); + appService.addRol(new Role("1", "client")); + appService.addRol(new Role("2", "admin")); + appService.addRol(new Role("3", "cooker")); + appService.addRol(new Role("4", "waiter")); + usuarioService.addUser(new User("sebassele2008@gmail.com", "Sebastian", "Zamora", "1234", "client",roleRepository)); + usuarioService.addUser(new User("christian@foodexpres.com", "Chirstian", "Duarte", "1234", "admin",roleRepository)); + usuarioService.addUser(new User("cesar@foodexpres.com", "Cesar", "Amaya", "1234", "cooker",roleRepository)); + usuarioService.addUser(new User("johann@foodexpres.com", "Johann", "Amaya", "1234", "waiter",roleRepository)); + categoryServices.addCategory(new Category("Ensalada")); + categoryServices.addCategory(new Category("Postre")); + categoryServices.addCategory(new Category("Entradas")); + categoryServices.addCategory(new Category("Plato Principal")); + categoryServices.addCategory(new Category("Especiales")); + categoryServices.addCategory(new Category("Nuevo Plato")); + Set defaulCategoria = new HashSet<>(); + defaulCategoria.add(categoryServices.getCategoryByName("salads")); + plateServices.addPlate(new Plate(1, "Brillo Andino", "Ensalada de quinoa con aguacate y tomate cherry",12000,defaulCategoria)); + plateServices.addPlate(new Plate(2, "Delicia Marina", "Carpaccio de salmón con alcaparras y limón",13000,defaulCategoria)); + plateServices.addPlate(new Plate(3, "Susurros Tropicales", "Crema de calabaza con jengibre y coco",11000,defaulCategoria)); + plateServices.addPlate(new Plate(4, "Aromas de la Tierra", "Sopa de lentejas con chorizo y espinacas",12300,defaulCategoria)); + plateServices.addPlate(new Plate(5, "Melodía de Sabores", "Solomillo de ternera con salsa de vino tinto",11800,defaulCategoria)); + plateServices.addPlate(new Plate(6, "Fusión Exótica", "Pollo al curry con leche de coco y verduras",14000,defaulCategoria)); + plateServices.addPlate(new Plate(7, "Ritmo del Mar", "Filete de salmón a la parrilla con salsa de eneldo",15000,defaulCategoria)); + plateServices.addPlate(new Plate(8, "Viaje a la Costa", "Paella de mariscos",13200,defaulCategoria)); + plateServices.addPlate(new Plate(9, "Armonía en el Plato", "Risotto de champiñones y espinacas",11500,defaulCategoria)); + plateServices.addPlate(new Plate(10, "Capricho Vegetal", "Lasaña de berenjena con ricotta y espinacas",14500,defaulCategoria)); + plateServices.addPlate(new Plate(11, "Dulce Contraste", "Puré de batata con nueces y miel",10000,defaulCategoria)); + plateServices.addPlate(new Plate(12, "Elegancia Verde", "Brócoli al vapor con almendras tostadas",10800,defaulCategoria)); + plateServices.addPlate(new Plate(13, "Tradición Italiana", "Lasaña boloñesa",12100,defaulCategoria)); + plateServices.addPlate(new Plate(14, "Fiesta Mexicana", "Tacos de carnitas con salsa de aguacate",11500,defaulCategoria)); }; }} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/Repository/AppRepository.java b/src/main/java/Proyecto/GestorAlmuerzo/Repository/AppRepository.java deleted file mode 100644 index a226513..0000000 --- a/src/main/java/Proyecto/GestorAlmuerzo/Repository/AppRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package Proyecto.GestorAlmuerzo.Repository; - -import Proyecto.GestorAlmuerzo.model.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; -import java.util.List; - -/** - * Interface que nos permite conectarnos con la base de datos - * - * @author Sebastian Zamora Urrego - * @author Sebastian Zamora - * @author Johann Amaya - * @author Cesar Amaya - * @author Christian Duarte - * @version 28/10/2023 - */ -@Repository -public interface AppRepository extends JpaRepository { - -} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/Repository/CategoryRepository.java b/src/main/java/Proyecto/GestorAlmuerzo/Repository/CategoryRepository.java new file mode 100644 index 0000000..7d1fae1 --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/Repository/CategoryRepository.java @@ -0,0 +1,8 @@ +package Proyecto.GestorAlmuerzo.Repository; + +import Proyecto.GestorAlmuerzo.model.Category; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CategoryRepository extends JpaRepository { + Category findByName(String categoryName); +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/Repository/PayRepository.java b/src/main/java/Proyecto/GestorAlmuerzo/Repository/PayRepository.java new file mode 100644 index 0000000..88d3580 --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/Repository/PayRepository.java @@ -0,0 +1,7 @@ +package Proyecto.GestorAlmuerzo.Repository; + +import Proyecto.GestorAlmuerzo.model.Pay; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PayRepository extends JpaRepository { +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/Repository/PlateRepository.java b/src/main/java/Proyecto/GestorAlmuerzo/Repository/PlateRepository.java index 88fa0fb..ca1fb3a 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/Repository/PlateRepository.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/Repository/PlateRepository.java @@ -3,7 +3,9 @@ import Proyecto.GestorAlmuerzo.model.Plate; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; + import java.util.List; +import java.util.Optional; /** * Interface que nos permite conectar con la base de datos. @@ -15,6 +17,7 @@ * @version 14/11/2023 */ @Repository -public interface PlateRepository extends JpaRepository { - List findById(Long id); +public interface PlateRepository extends JpaRepository { + + List findByCategoriesId(Long categoryId); } diff --git a/src/main/java/Proyecto/GestorAlmuerzo/Repository/SuscriptionRepository.java b/src/main/java/Proyecto/GestorAlmuerzo/Repository/SuscriptionRepository.java new file mode 100644 index 0000000..c1a1803 --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/Repository/SuscriptionRepository.java @@ -0,0 +1,8 @@ +package Proyecto.GestorAlmuerzo.Repository; + +import Proyecto.GestorAlmuerzo.model.Role; +import Proyecto.GestorAlmuerzo.model.Suscription; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SuscriptionRepository extends JpaRepository { +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/controller/MenuController.java b/src/main/java/Proyecto/GestorAlmuerzo/controller/MenuController.java new file mode 100644 index 0000000..754b8a1 --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/controller/MenuController.java @@ -0,0 +1,86 @@ +package Proyecto.GestorAlmuerzo.controller; + +import Proyecto.GestorAlmuerzo.model.Category; +import Proyecto.GestorAlmuerzo.model.Plate; +import Proyecto.GestorAlmuerzo.service.CategoryServices; +import Proyecto.GestorAlmuerzo.service.PlateServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@Controller +public class MenuController { + + @Autowired + private PlateServices plateServices; + + @Autowired + private CategoryServices categoryServices; + + @GetMapping("/configure-menu") + public String showMenu(@RequestParam(name = "sortBy",defaultValue = "name") String sortBy, + @RequestParam(name = "categoryFilter",required = false) Long categoryId, + Model model) { + + List menu; + + if(categoryId != null){ + menu = plateServices.findByCategoriesId(categoryId); + }else { + + if ("name".equals(sortBy)) { + menu = plateServices.getAllPlatesOrderedByName(); + } else if ("price".equals(sortBy)) { + menu = plateServices.getAllPlatesOrderedByPrice(); + } else { + menu = plateServices.getAllPlates(); + } + } + List allCategories = categoryServices.getAllCategories(); + model.addAttribute("allCategories", allCategories); + model.addAttribute("menu", menu); + return "admin/menu"; + } + + + @PostMapping("/addPlate") + public String addPlate(@ModelAttribute("plate") Plate plate) { + plateServices.addPlate(plate); + return "redirect:/admin/menu"; + } + + @GetMapping("/editPlate/{id}") + public String showEditPlateForm(@PathVariable String id, Model model) { + int plateId = Integer.parseInt(id); + Optional plate = plateServices.getPlateById(plateId); + List allCategories = categoryServices.getAllCategories(); + model.addAttribute("allCategories", allCategories); + model.addAttribute("plate", plate); + return "admin/editPlate"; + } + + @PostMapping("/editPlate/{id}") + public String editPlate(@PathVariable String id, @ModelAttribute("plate") Plate plate) { + int plateId = Integer.parseInt(id); + Optional existingPlate = plateServices.getPlateById(plateId); + if(existingPlate.isEmpty()) { + } + else { + plate.setId(plateId); + plateServices.updatePlate(plate); + } + return "redirect:/admin/menu"; + } + + @RequestMapping("/deletePlate/{id}") + public String deletePlate(@PathVariable String id) { + int plateId = Integer.parseInt(id); + plateServices.deletePlate(plateId); + return "redirect:/admin/menu"; + } +} + diff --git a/src/main/java/Proyecto/GestorAlmuerzo/controller/UserController.java b/src/main/java/Proyecto/GestorAlmuerzo/controller/UserController.java index b47dd42..5333b9c 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/controller/UserController.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/controller/UserController.java @@ -1,5 +1,6 @@ package Proyecto.GestorAlmuerzo.controller; +import Proyecto.GestorAlmuerzo.Repository.UserRepository; import Proyecto.GestorAlmuerzo.exceptions.GestorAlmuerzosAppException; import Proyecto.GestorAlmuerzo.model.Plate; import Proyecto.GestorAlmuerzo.model.User; @@ -10,16 +11,17 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; -import java.util.List; +import java.net.SocketOption; import java.util.Optional; - +import java.util.List; @Controller public class UserController { + private String userLogin; @Autowired UserServices userRepository; @Autowired - PlateServices plateServices; + UserRepository repository; @GetMapping("/login") public String showUserLogin(Model model) { @@ -31,12 +33,36 @@ public String verifyLogin(@RequestParam("correo") String correo, @RequestParam("contraseña") String contraseña, Model model) throws GestorAlmuerzosAppException { String redirect = "login"; - if (userRepository.login(correo, contraseña)) { - redirect = "redirect:/"; + try { + if (userRepository.login(correo, contraseña)) { + Optional u = userRepository.getUser(correo); + User usuario = u.orElseThrow(); + userLogin = usuario.getNombre().split(" ")[0] + " " + usuario.getApellido().split(" ")[0]; + redirect = "redirect:/" + usuario.getRole(); + }else{ + model.addAttribute("error", GestorAlmuerzosAppException.IncorrectInformation); + return redirect; + } + }catch (GestorAlmuerzosAppException e){ + model.addAttribute("error", e.getMessage()); + return redirect; } return redirect; } + @GetMapping("/client") + public String loginUser(Model m){ + String username = (String)m.getAttribute("username"); + m.addAttribute("username",userLogin); + return "user/client"; + } + + @GetMapping("/admin") + public String loginAdmin(Model m){ + String username = (String)m.getAttribute("username"); + m.addAttribute("username",userLogin); + return "admin/admin"; + } @GetMapping("/register") public String showUserRegisterForm(Model model) { model.addAttribute("user", new User()); @@ -44,8 +70,29 @@ public String showUserRegisterForm(Model model) { } @PostMapping("/save") - public String saveUser(@ModelAttribute("user") User user) { - System.out.println(user); + public String saveUser(@RequestParam("nombre") String name, + @RequestParam("apellido") String lastName,@RequestParam("email") String email,@RequestParam("password") String password, + @RequestParam("confirm_password") String confirm,@ModelAttribute("user") User user,Model model) { + if(repository.findById(email).isPresent()){ + model.addAttribute("error", GestorAlmuerzosAppException.EmailExist); + return "register"; + } + if(!password.equals(confirm)){ + model.addAttribute("error", GestorAlmuerzosAppException.NotPasswordConcident); + return "register"; + } + if(name.isEmpty()){ + model.addAttribute("error", GestorAlmuerzosAppException.NameEmpty); + return "register"; + } + if(lastName.isEmpty()){ + model.addAttribute("error", GestorAlmuerzosAppException.LastNameEmpty); + return "register"; + } + if(email.isEmpty()){ + model.addAttribute("error", GestorAlmuerzosAppException.EmptyEmail); + return "register"; + } userRepository.addUser(user); return "redirect:/"; } @@ -57,6 +104,39 @@ public String showUserUpdateForm(@PathVariable(value = "id") String id, Model mo return "update"; } + @GetMapping("/") + public String index(){ + return "index"; + } + + @GetMapping("/forgotPassword") + public String forgotPassword(){ + return "forgotPassword"; + } + + @GetMapping("/about-us") + public String aboutUs(){ + return "about-us"; + } + + @GetMapping("/contact-us") + public String contactUs(){ + return "contact-us"; + } + + @PostMapping("/sendEmail") + public String sendEmail(@RequestParam("email") String email,Model model) throws GestorAlmuerzosAppException { + Optional usuario = userRepository.getUser(email); + try { + User user = usuario.orElseThrow(() -> new GestorAlmuerzosAppException(GestorAlmuerzosAppException.EmailNoExist)); + userRepository.sendEmailForgotPassword(user); + }catch(GestorAlmuerzosAppException e){ + model.addAttribute("error", e.getMessage()); + return("/forgotPassword"); + } + return "redirect:/"; + } + @PostMapping("/update") public String updateUser(@ModelAttribute("user") User user) { userRepository.updateUser(user); @@ -68,11 +148,5 @@ public String deleteUser(@PathVariable String id) { userRepository.deleteUser(id); return "redirect:/index"; } - @GetMapping("/Menu") - public String showMenu(Model m) { - List menu= plateServices.getAllPlates(); - m.addAttribute("menu", menu); - return "menu"; - } } diff --git a/src/main/java/Proyecto/GestorAlmuerzo/exceptions/GestorAlmuerzosAppException.java b/src/main/java/Proyecto/GestorAlmuerzo/exceptions/GestorAlmuerzosAppException.java index 1ac5bb5..195eeba 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/exceptions/GestorAlmuerzosAppException.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/exceptions/GestorAlmuerzosAppException.java @@ -1,12 +1,18 @@ package Proyecto.GestorAlmuerzo.exceptions; public class GestorAlmuerzosAppException extends Exception{ - public static final String EmptyName = "Correo Vacio, Porfavor llenar el campo"; - public static final String EmptyPassword = "Contraceña Vacia, Porfavor llenar el campo"; + public static final String EmptyPassword = "Contraseña Vacia, Porfavor llenar el campo"; public static final String IncorrectInformation = "Información Incorrecta. Porfavor verifique datos"; - public static final String UserExist = "El usuario ya existe. Porfavor cambien información"; - public static String Emptyemail = "El usuario debe rellenar el campo de email"; + public static final String EmailExist = "El correo ya esta registrado, por favor escoja otro"; + public static String EmptyEmail = "El usuario debe rellenar el campo de email"; + public static String NotPasswordConcident = "Ambas contraseñas no coinciden , por favor revisar"; + public static String NameEmpty = "Falta Nombre"; + public static String LastNameEmpty = "Falta Apellido"; + + public static final String EmailNoExist = "El correo no esta registrado, por favor ingrese un correo valido"; + + public static final String RoleNotExist = "El rol asignado no existe"; public GestorAlmuerzosAppException(String msm) { super(msm); } diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/Category.java b/src/main/java/Proyecto/GestorAlmuerzo/model/Category.java new file mode 100644 index 0000000..24dfc7d --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/model/Category.java @@ -0,0 +1,58 @@ +package Proyecto.GestorAlmuerzo.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; + +import jakarta.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +@Table(name = "categories") +public class Category { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @ManyToMany(mappedBy = "categories") + private Set plates = new HashSet<>(); + + // constructores, getters y setters + + public Category() { + // Constructor vacío necesario para JPA + } + + public Category(String name) { + this.name = name; + } + + // getters y setters + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getPlates() { + return plates; + } + + public void setPlates(Set plates) { + this.plates = plates; + } +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/Cliente.java b/src/main/java/Proyecto/GestorAlmuerzo/model/Cliente.java deleted file mode 100644 index 0f0579f..0000000 --- a/src/main/java/Proyecto/GestorAlmuerzo/model/Cliente.java +++ /dev/null @@ -1,9 +0,0 @@ -package Proyecto.GestorAlmuerzo.model; - -public class Cliente extends Role { - - public Cliente(String id, String type) { - this.id = id; - } - -} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/GestorAlmuerzoApplication.java b/src/main/java/Proyecto/GestorAlmuerzo/model/GestorAlmuerzoApplication.java deleted file mode 100644 index 58d2c1f..0000000 --- a/src/main/java/Proyecto/GestorAlmuerzo/model/GestorAlmuerzoApplication.java +++ /dev/null @@ -1,8 +0,0 @@ -package Proyecto.GestorAlmuerzo.model; - -import org.springframework.boot.autoconfigure.domain.EntityScan; - -public class GestorAlmuerzoApplication { - - -} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/Pay.java b/src/main/java/Proyecto/GestorAlmuerzo/model/Pay.java new file mode 100644 index 0000000..9986579 --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/model/Pay.java @@ -0,0 +1,21 @@ +package Proyecto.GestorAlmuerzo.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "Pago") +public class Pay { + @Id + @Column + private String idPay; + + @Column + private int price; + + @Column + private String Method; + + @OneToOne + private User usuario; + +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/Plate.java b/src/main/java/Proyecto/GestorAlmuerzo/model/Plate.java index 1e7cae6..0873723 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/model/Plate.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/model/Plate.java @@ -1,9 +1,8 @@ package Proyecto.GestorAlmuerzo.model; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import org.springframework.beans.factory.annotation.Autowired; +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Set; @Entity @Table(name = "Plate") @@ -18,31 +17,35 @@ */ public class Plate { @Id - private Long id; + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; @Column private String name; - @Override - public String toString() { - return "Plate{" + - "id=" + id + - ", name='" + name + '\'' + - ", description='" + description + '\'' + - '}'; - } - @Column private String description; + @Column + private int price; + + @ManyToMany + @JoinTable( + name = "plate_categories", + joinColumns = @JoinColumn(name = "plate_id"), + inverseJoinColumns = @JoinColumn(name = "category_id")) + private Set categories = new HashSet<>(); + /** * El constructor de la clase Plate. * * @param name El nombre del plato */ - public Plate(String id, String name, String description){ - this.id= Long.parseLong(id); + public Plate(Integer id, String name, String description, int price,Set categories){ + this.id= id; this.name = name; this.description = description; + this.price = price; + this.categories = categories; } public Plate(){ @@ -58,14 +61,42 @@ public String getDescription() { return description; } - public Long getId() { + public void setDescription(String description) { + this.description = description; + } + + public int getId() { return id; } - public void setDescription(String description) { - this.description = description; + public void setId(int plateId) { + this.id = plateId; } + public int getPrice() { + return price; + } + + public void setPrice(int price){ + this.price = price; + } + + public Set getCategories() { + return categories; + } + + public void setCategories(Set categories){ + this.categories = categories; + } + + @Override + public String toString() { + return "Plate{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + '}'; + } } diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/Role.java b/src/main/java/Proyecto/GestorAlmuerzo/model/Role.java index 1cb2258..bc66e74 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/model/Role.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/model/Role.java @@ -1,9 +1,8 @@ package Proyecto.GestorAlmuerzo.model; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; + +import java.util.List; /** * Entidad de la base de datos que guarda todos la información de los tipos de @@ -25,6 +24,9 @@ public class Role { @Column(name = "Category") protected String category; + @OneToMany(mappedBy = "role") + private List usuarios; + public Role(String id, String category) { this.id = id; this.category = category; @@ -46,9 +48,9 @@ public String getNombre() { /** * Me permite cambiar la descripción del tipo de cliente * - * @param Nombre La nueva descripción del tipo de cliente - */ - public void setNombre(String category) { + * @param category La nueva descripción del tipo de cliente + **/ + public void setCategory(String category) { this.category = category; } diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/Suscription.java b/src/main/java/Proyecto/GestorAlmuerzo/model/Suscription.java new file mode 100644 index 0000000..d75beb4 --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/model/Suscription.java @@ -0,0 +1,77 @@ +package Proyecto.GestorAlmuerzo.model; + +import jakarta.persistence.*; + +import java.util.List; +import java.util.Objects; + +@Entity +@Table(name = "Suscripcion") +public class Suscription { + @Id + @Column(name = "id") + private String idSuscription; + + @Column(name = "Tipo") + private String Type; + + @Column(name= "precio") + private int price; + + @OneToMany(mappedBy = "suscripcion") + List usersSuscribe; + + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public Suscription(String idSuscription, String type, int price) { + this.idSuscription = idSuscription; + Type = type; + this.price= price; + } + + public Suscription() { + } + + public void setIdSuscription(String idSuscription) { + this.idSuscription = idSuscription; + } + + public void setType(String type) { + Type = type; + } + + public String getIdSuscription() { + return idSuscription; + } + + public String getType() { + return Type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Suscription that)) return false; + return Objects.equals(getIdSuscription(), that.getIdSuscription()) && Objects.equals(getType(), that.getType()); + } + + @Override + public int hashCode() { + return Objects.hash(getIdSuscription(), getType()); + } + + @Override + public String toString() { + return "Suscription{" + + "idSuscription='" + idSuscription + '\'' + + ", Type='" + Type + '\'' + + '}'; + } +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/model/User.java b/src/main/java/Proyecto/GestorAlmuerzo/model/User.java index 3f9b42c..149a202 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/model/User.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/model/User.java @@ -1,19 +1,13 @@ package Proyecto.GestorAlmuerzo.model; - -import java.lang.reflect.InvocationTargetException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Objects; import java.util.Optional; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.persistence.Transient; - -import org.springframework.beans.factory.annotation.Autowired; - import Proyecto.GestorAlmuerzo.Repository.RoleRepository; +import Proyecto.GestorAlmuerzo.exceptions.GestorAlmuerzosAppException; +import Proyecto.GestorAlmuerzo.service.AppServices; +import jakarta.persistence.*; +import org.springframework.beans.factory.annotation.Autowired; @Entity @Table(name = "Usuario") @@ -39,8 +33,11 @@ public class User { private String nombre; @Column private String apellido; - @Transient - private String OriginPassword; + + @ManyToOne + @JoinColumn(name = "suscripcion", nullable = true) + private Suscription suscripcion; + /** * El constructor de la clase User. @@ -50,18 +47,32 @@ public class User { * @param role Que tipo de usuario es. */ - public User(String email, String name,String lastName, String password, String role) { + public User(String email, String name,String lastName, String password, String role,RoleRepository repository) throws GestorAlmuerzosAppException { this.email = email; - this.password = password; - this.OriginPassword = password; this.nombre = name; this.apellido=lastName; + this.password=encrypt(password); + Optional posibleRol= repository.findByCategory(role); + this.role = posibleRol.orElseThrow(() -> new GestorAlmuerzosAppException(GestorAlmuerzosAppException.RoleNotExist)); + } + + public Suscription getSuscripcion() { + return suscripcion; } public void setApellido(String apellido) { this.apellido = apellido; } + public void setRole(String role , RoleRepository repository) { + Optional posibleRol= repository.findByCategory(role); + this.role = posibleRol.orElseThrow(); + } + + public void setSuscripcion(Suscription suscripcion) { + this.suscripcion = suscripcion; + } + public void setNombre(String nombre) { this.nombre = nombre; } @@ -80,16 +91,16 @@ public String getApellido() { /** * Me devuelve el Tipo de usuario que es. - * + * * @return El tipo de usuario. */ - public Role getRole() { - return role; + public String getRole() { + return role.getNombre(); } /** * Me devuelve el correo del usuario - * + * * @return El correo del usuario. */ public String getEmail() { @@ -98,7 +109,7 @@ public String getEmail() { /** * Me devuelve la contraceña del usuario. - * + * * @return La contraceña del usuario. */ public String getPassword() { @@ -107,7 +118,7 @@ public String getPassword() { /** * Me permite cambiar el correo del usuario. - * + * * @param email El nuevo correo del usuario. */ public void setEmail(String email) { @@ -116,11 +127,37 @@ public void setEmail(String email) { /** * Me permite cambiar la contraceña del usuario. - * + * * @param password La nueva contraceña. */ public void setPassword(String password) { - this.password = password; + this.password= encrypt(password); + } + + /** + * Me permite encriptar la contraseña para guardarla en la base de datos + * + * @param password La contraseña que voy a encriptar. + */ + public String encrypt(String password){ + String encryptPassword = ""; + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hashBytes = md.digest(password.getBytes()); + StringBuilder hexStringBuilder = new StringBuilder(); + for (byte b : hashBytes) { + hexStringBuilder.append(String.format("%02X", b)); + } + encryptPassword = hexStringBuilder.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return encryptPassword; + } + + public boolean verifyPassword(String userPassword){ + String prueba = encrypt(userPassword); + return prueba.equals(this.password); } @Override @@ -129,9 +166,19 @@ public String toString() { "email='" + email + '\'' + ", password='" + password + '\'' + ", role=" + role + - ", nombre='" + nombre + '\'' + - ", apellido='" + apellido + '\'' + - ", OriginPassword='" + OriginPassword + '\'' + + ", nombre='" + nombre + ' ' + apellido + '\'' + '}'; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof User user)) return false; + return Objects.equals(getEmail(), user.getEmail()) && Objects.equals(getPassword(), user.getPassword()) && Objects.equals(getRole(), user.getRole()) && Objects.equals(getNombre(), user.getNombre()) && Objects.equals(getApellido(), user.getApellido()) && Objects.equals(suscripcion, user.suscripcion); + } + + @Override + public int hashCode() { + return Objects.hash(getEmail(), getPassword(), getRole(), getNombre(), getApellido(), suscripcion); + } } diff --git a/src/main/java/Proyecto/GestorAlmuerzo/service/AppServices.java b/src/main/java/Proyecto/GestorAlmuerzo/service/AppServices.java index deb4135..ea18e38 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/service/AppServices.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/service/AppServices.java @@ -1,25 +1,23 @@ package Proyecto.GestorAlmuerzo.service; -import Proyecto.GestorAlmuerzo.Repository.AppRepository; import Proyecto.GestorAlmuerzo.Repository.RoleRepository; -import Proyecto.GestorAlmuerzo.exceptions.GestorAlmuerzosAppException; +import Proyecto.GestorAlmuerzo.Repository.SuscriptionRepository; import Proyecto.GestorAlmuerzo.model.Role; -import Proyecto.GestorAlmuerzo.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; -import java.lang.reflect.InvocationTargetException; @Service public class AppServices { - @Autowired - private AppRepository appRepository; @Autowired private RoleRepository roleRepository; + @Autowired + private SuscriptionRepository suscriptionRepository; + /** * Me devuelve el rol * @@ -43,7 +41,7 @@ public Role addRol(Role rol) { /** * Me actualiza la información de un usuario. * - * @param user El usuario que voy actualizar. + * @param rol El usuario que voy actualizar. * @return El usuarío actualizado en la base de datos. */ public Role updateRole(Role rol) { diff --git a/src/main/java/Proyecto/GestorAlmuerzo/service/CategoryServices.java b/src/main/java/Proyecto/GestorAlmuerzo/service/CategoryServices.java new file mode 100644 index 0000000..859d6bf --- /dev/null +++ b/src/main/java/Proyecto/GestorAlmuerzo/service/CategoryServices.java @@ -0,0 +1,32 @@ +package Proyecto.GestorAlmuerzo.service; + +import Proyecto.GestorAlmuerzo.Repository.CategoryRepository; +import Proyecto.GestorAlmuerzo.model.Category; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class CategoryServices { + + @Autowired + private CategoryRepository categoryRepository; + + public List getAllCategories() { + return categoryRepository.findAll(); + } + + public Optional getCategoryById(Integer id) { + return categoryRepository.findById(id); + } + + public void addCategory(Category category) { + categoryRepository.save(category); + } + + public Category getCategoryByName(String categoryName) { + return categoryRepository.findByName(categoryName); + } +} diff --git a/src/main/java/Proyecto/GestorAlmuerzo/service/PlateServices.java b/src/main/java/Proyecto/GestorAlmuerzo/service/PlateServices.java index 73aac76..78ea592 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/service/PlateServices.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/service/PlateServices.java @@ -3,23 +3,52 @@ import Proyecto.GestorAlmuerzo.Repository.PlateRepository; import Proyecto.GestorAlmuerzo.model.Plate; +import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; + @Service public class PlateServices { + @Autowired private PlateRepository plateRepository; - /** - * Me obtiene todos los platos que ofrece el restaurante. - * - * @return La lista de los platos que ofrece el restaurante. - */ + public List getAllPlates() { return plateRepository.findAll(); } + + public Optional getPlateById(int id) { + return plateRepository.findById(id); + } + public Plate addPlate(Plate plate) { return plateRepository.save(plate); } + + @Transactional + public void updatePlate(Plate plate) { + plateRepository.save(plate); + } + + public void deletePlate(int id) { + plateRepository.deleteById(id); + } + + public List getAllPlatesOrderedByName() { + return plateRepository.findAll(Sort.by(Sort.Direction.ASC, "name")); + } + + public List getAllPlatesOrderedByPrice() { + return plateRepository.findAll(Sort.by(Sort.Direction.ASC, "price")); + + } + + public List findByCategoriesId(Long categoryId) { + return plateRepository.findByCategoriesId(categoryId); + } } + diff --git a/src/main/java/Proyecto/GestorAlmuerzo/service/UserServices.java b/src/main/java/Proyecto/GestorAlmuerzo/service/UserServices.java index 6349ad5..354d05f 100644 --- a/src/main/java/Proyecto/GestorAlmuerzo/service/UserServices.java +++ b/src/main/java/Proyecto/GestorAlmuerzo/service/UserServices.java @@ -1,104 +1,101 @@ package Proyecto.GestorAlmuerzo.service; -import Proyecto.GestorAlmuerzo.Repository.AppRepository; +import Proyecto.GestorAlmuerzo.Repository.RoleRepository; +import Proyecto.GestorAlmuerzo.Repository.SuscriptionRepository; +import Proyecto.GestorAlmuerzo.Repository.UserRepository; import Proyecto.GestorAlmuerzo.exceptions.GestorAlmuerzosAppException; import Proyecto.GestorAlmuerzo.model.User; +import javax.mail.*; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.List; +import java.util.Optional; +import java.util.Properties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.lang.reflect.InvocationTargetException; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Optional; - @Service public class UserServices { + @Autowired - private AppRepository UserRepository; - - /** - * Verifica que el ususario si este registrado, si esta le da acceso a ala - * plataforma - * - * @param email Correo del Usuario. - * @param password Contraceña del Usuario. - * @throws GestorAlmuerzosAppException Empy - */ - public boolean login(String email, String password) throws GestorAlmuerzosAppException { - System.out.println(password); + private UserRepository UserRepository; - if (email.equals("")) - throw new GestorAlmuerzosAppException(GestorAlmuerzosAppException.Emptyemail); - if (password.equals("")) + @Autowired + private RoleRepository roleRepository; + @Autowired + private SuscriptionRepository suscriptionRepository; + + public boolean login(String email, String password) throws GestorAlmuerzosAppException { + if (email.isEmpty()) { + throw new GestorAlmuerzosAppException(GestorAlmuerzosAppException.EmptyEmail); + } + if (password.isEmpty()) { throw new GestorAlmuerzosAppException(GestorAlmuerzosAppException.EmptyPassword); + } Optional newUser = getUser(email); - User usuario = newUser.orElseThrow(() -> new NoSuchElementException("No existe un usuario")); + User usuario = newUser.orElseThrow(() -> new GestorAlmuerzosAppException(GestorAlmuerzosAppException.IncorrectInformation)); + String encryptPassword = usuario.encrypt(password); String userPassword = usuario.getPassword(); - return password.equals(userPassword); + return encryptPassword.equals(userPassword); } - /** - * - * @param email user's email - * @param password user's password - * @param role user's role - */ - public void singup(String email, String name,String lastName, String password, String role) - throws GestorAlmuerzosAppException { - if (getUser(email) == null) { - throw new GestorAlmuerzosAppException(GestorAlmuerzosAppException.UserExist); - } else { - new User(email, name, lastName,password, role); - } - } - - /** - * Me Obtiene un usuario atravez de su id. - * - * @param email Correo del usuario. - * @return El usuario si se encontro. - */ public Optional getUser(String email) { return UserRepository.findById(email); } - /** - * Me agrega un usuario a la base de datos - * - * @param user El ususarío que voy agregar - * @return El usuarío que se agrego a la base de datos - */ - public User addUser(User user) { - return UserRepository.save(user); + public void addUser(User user) { + UserRepository.save(user); + if(user.getRole().isEmpty()){ + user.setRole("client",roleRepository); + UserRepository.save(user); + } } - /** - * Me actualiza la información de un usuario. - * - * @param user El usuario que voy actualizar. - * @return El usuarío actualizado en la base de datos. - */ public User updateUser(User user) { UserRepository.findById(user.getEmail()); return UserRepository.save(user); } - /** - * Me obtiene todos los usuaríos en la base de datos. - * - * @return La lista de los usuariós de la base de datos. - */ public List getAllUsers() { return UserRepository.findAll(); } - /** - * Me elimina un usuarío. - * - * @param id El id del usuarío que voy a eliminar. - */ public void deleteUser(String id) { UserRepository.deleteById(id); } + + public void sendEmailForgotPassword(User user) { + Properties props = new Properties(); + props.put("mail.smtp.host", "smtp.yandex.com"); + props.put("mail.smtp.socketFactory.port", "465"); + props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.port", "465"); + + Session session = Session.getInstance(props, new Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication("foodexpressadm@yandex.com", "foodexpress123#"); + } + }); + + try { + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress("pruebasfoodexpress@gmail.com")); + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(user.getEmail())); + message.setSubject("Recuperar Contraseña"); + + String resetPasswordLink = "https://tu-sitio.com/reset-password?token=abcd1234"; + String emailContent = String.format( + "Hola %s %s,\n\nDale click al siguiente link para que recuperes tu contraseña:\n%s", + user.getNombre(), user.getApellido(), resetPasswordLink); + + message.setText(emailContent); + + Transport.send(message); + } catch (MessagingException e) { + throw new RuntimeException(e); + } + } } + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b20f003..e723a17 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,17 @@ +#Config + +spring.thymeleaf.prefix=classpath:/templates/ +spring.thymeleaf.suffix=.html +spring.thymeleaf.mode=HTML5 +spring.thymeleaf.encoding=UTF-8 + # Reload spring.devtools.restart.enabled=true spring.devtools.restart.additional-paths=src,static/** +spring.web.resources.static-locations=classpath:/static/,classpath:/templates/ +spring.jpa.properties.hibernate.default_schema=sys + + spring.thymeleaf.cache = false spring.freemarker.cache = false spring.groovy.template.cache = false @@ -8,10 +19,9 @@ server.port=80 # ORM spring.jpa.hibernate.ddl-auto=create -spring.datasource.url=${DATABASE_UR} -spring.datasource.username=${DATABASE_NAME} -spring.datasource.password=${DATABASE_PASSWORD} -# +spring.datasource.url=jdbc:mysql://localhost:3306/sys?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=my-secret-pw # Use the correct driver class name (update if needed) spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/js/script.js b/src/main/resources/js/script.js deleted file mode 100644 index 4b9d818..0000000 --- a/src/main/resources/js/script.js +++ /dev/null @@ -1,14 +0,0 @@ -$(document).ready(function() { - $("#password-toggle, #confirm-password-toggle").click(function() { - var inputField = $(this).parent().find("input"); - var passwordIcon = $(this).find("i"); - - if (inputField.attr("type") === "password") { - inputField.attr("type", "text"); - passwordIcon.removeClass("fa-eye").addClass("fa-eye-slash"); - } else { - inputField.attr("type", "password"); - passwordIcon.removeClass("fa-eye-slash").addClass("fa-eye"); - } - }); -}); diff --git a/src/main/resources/static/css/estilo.css b/src/main/resources/static/css/estilo.css deleted file mode 100644 index 8052baf..0000000 --- a/src/main/resources/static/css/estilo.css +++ /dev/null @@ -1,15 +0,0 @@ - #formulario{ - width: 200px; - height: 250px; - border: 3px cyan solid; - padding: 20px 20px; - vertical-align: middle; - float: left; - display: flex; - align-items: center; - } - - #titulo{ - background-color: red; - text-align: center; - } \ No newline at end of file diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index 2e7808e..e8f2cdd 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -101,4 +101,20 @@ body { .product-card img { max-width: 100%; - } \ No newline at end of file + } + +<<<<<<< HEAD +.liveAlertPlaceholder { + position: fixed; + top: 0; + right: 0; + z-index: 10000; /* Ajusta el z-index según sea necesario para estar por encima de todo */ + width: 300px; /* Ajusta el ancho según sea necesario */ + margin: 10px; /* Ajusta el margen según sea necesario */ + } +======= + +.error-message { + color: red; +} +>>>>>>> 854281c8ab28f2854c343e3627348689171fdf15 diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html deleted file mode 100644 index f449478..0000000 --- a/src/main/resources/static/index.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - Food Express - - - - - - - - - - - - -
-
-
-
- - - - Tiempo de espera corto. -
-
-
-
- - - - Planes de fidelizacion. -
-
- -
-
- - - - Medios de pagos diversos. -
-
- - -
-
- - - - - Menú -
-
- -
-
-
-
-
-
Product Name
-

$28.00

- Add to Cart -
-
- Product Image -
-
-
-
-
- - - - - - - - - diff --git a/src/main/resources/js/all.min.js b/src/main/resources/static/js/all.min.js similarity index 100% rename from src/main/resources/js/all.min.js rename to src/main/resources/static/js/all.min.js diff --git a/src/main/resources/js/bootstrap.bundle.min.js b/src/main/resources/static/js/bootstrap.bundle.min.js similarity index 100% rename from src/main/resources/js/bootstrap.bundle.min.js rename to src/main/resources/static/js/bootstrap.bundle.min.js diff --git a/src/main/resources/js/bootstrap.min.js b/src/main/resources/static/js/bootstrap.min.js similarity index 100% rename from src/main/resources/js/bootstrap.min.js rename to src/main/resources/static/js/bootstrap.min.js diff --git a/src/main/resources/js/fontawesome.js b/src/main/resources/static/js/fontawesome.js similarity index 100% rename from src/main/resources/js/fontawesome.js rename to src/main/resources/static/js/fontawesome.js diff --git a/src/main/resources/static/js/script.js b/src/main/resources/static/js/script.js new file mode 100644 index 0000000..994021b --- /dev/null +++ b/src/main/resources/static/js/script.js @@ -0,0 +1,41 @@ +$(document).ready(function() { + // Cambiar la visibilidad de la contraseña + $("#password-toggle, #confirm-password-toggle").click(function() { + let inputField = $(this).parent().find("input"); + let passwordIcon = $(this).find("i"); + + if (inputField.attr("type") === "password") { + inputField.attr("type", "text"); + passwordIcon.removeClass("fa-eye").addClass("fa-eye-slash"); + } else { + inputField.attr("type", "password"); + passwordIcon.removeClass("fa-eye-slash").addClass("fa-eye"); + } + }); + + // Mostrar alertas personalizadas + const alertPlaceholder = document.getElementById('liveAlertPlaceholder'); + + const appendAlert = (message, type) => { + const wrapper = document.createElement('div'); + wrapper.innerHTML = ` + + `; + + // Limpiar alertas anteriores + alertPlaceholder.innerHTML = ''; + alertPlaceholder.append(wrapper); + }; + + const alertTrigger = document.getElementById('liveAlertBtn'); + if (alertTrigger) { + alertTrigger.addEventListener('click', () => { + appendAlert('Nice, you triggered this alert message!', 'success'); + }); + } +}); diff --git a/src/main/resources/templates/about-us.html b/src/main/resources/templates/about-us.html new file mode 100644 index 0000000..c4a3eb7 --- /dev/null +++ b/src/main/resources/templates/about-us.html @@ -0,0 +1,112 @@ + + + + + + + + About us + + + + + + + +
+ +
+
+
+
+

Sobre Nosotros

+

+ En Food Express, hemos transformado la experiencia culinaria para superar desafíos comunes en la industria alimentaria. Nos enorgullece ofrecer soluciones innovadoras a problemas que afectan tanto a nuestros clientes como a nuestro equipo. +

+

Compromiso con la Eficiencia:

+

+ Hemos eliminado los largos tiempos de espera en filas gracias a nuestra variedad de métodos de pago y opciones de pedidos anticipados, garantizando que disfrutes de tu comida sin demoras innecesarias. +

+

Sostenibilidad y Frescura:

+

+ Abordamos el problema del vencimiento de ingredientes al trabajar con proveedores locales, asegurando la frescura de nuestros insumos y reduciendo el desperdicio de alimentos. +

+

Innovación en el Servicio al Cliente:

+

+ Eliminamos la necesidad de cajeros y "meseros" al incorporar sistemas de pago automatizados, reduciendo costos y mejorando la atención al cliente con una experiencia más ágil. +

+
+
+
+ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/admin/admin.html b/src/main/resources/templates/admin/admin.html new file mode 100644 index 0000000..3165528 --- /dev/null +++ b/src/main/resources/templates/admin/admin.html @@ -0,0 +1,300 @@ + + + + + + + + Food Express + + + + + +
+ + + + + + + +
+
+
+
+ + + + Tiempo de espera corto. +
+
+
+
+ + + + Planes de fidelizacion. +
+
+ +
+
+ + + + Medios de pagos diversos. +
+
+ + +
+
+
+
+ Product Image +
+
Product Name
+

$28.00

+ Add to Cart +
+
+
+ +
+
+ Product Image +
+
Product Name
+

$28.00

+ Add to Cart +
+
+
+ +
+
+ Product Image +
+
Product Name
+

$28.00

+ Add to Cart +
+
+
+ +
+
+ Product Image +
+
Product Name
+

$28.00

+ Add to Cart +
+
+
+
+
+ Product Image +
+
Product Name
+

$28.00

+ Add to Cart +
+
+
+
+
+ + + + + + + + + +
+
+ + diff --git a/src/main/resources/templates/admin/editPlate.html b/src/main/resources/templates/admin/editPlate.html new file mode 100644 index 0000000..f6d27c1 --- /dev/null +++ b/src/main/resources/templates/admin/editPlate.html @@ -0,0 +1,112 @@ + + + + + Actualizar Plato + + + + + + + +

Actualizar Plato

+ +
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/admin/menu.html b/src/main/resources/templates/admin/menu.html new file mode 100644 index 0000000..7b5ca94 --- /dev/null +++ b/src/main/resources/templates/admin/menu.html @@ -0,0 +1,171 @@ + + + + + Menú de Platos + + + + + + + + + + + +

Menú de Platos

+ + +
+ + + +
+ + +
+

Filtrar por Categoría

+
+
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + +
IDNombreDescripciónPrecioAcciones
IDNombreDescripción Precio +
+ + +
+
Editar
+ + +
+

Agregar Nuevo Plato

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/contact-us.html b/src/main/resources/templates/contact-us.html new file mode 100644 index 0000000..728fd9f --- /dev/null +++ b/src/main/resources/templates/contact-us.html @@ -0,0 +1,124 @@ + + + + + + + + Contact Us + + + + + + + +
+ +
+
+
+
+
+
+
+ +
+

Contáctanos

+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..181a2d4 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,139 @@ +package Proyecto.GestorAlmuerzo.controller; + +import Proyecto.GestorAlmuerzo.Repository.UserRepository; +import Proyecto.GestorAlmuerzo.exceptions.GestorAlmuerzosAppException; +import Proyecto.GestorAlmuerzo.model.Plate; +import Proyecto.GestorAlmuerzo.model.User; +import Proyecto.GestorAlmuerzo.service.PlateServices; +import Proyecto.GestorAlmuerzo.service.UserServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import java.util.Optional; +import java.util.List; +@Controller +public class UserController { + private String userLogin; + @Autowired + UserServices userRepository; + @Autowired + PlateServices plateServices; + @Autowired + UserRepository repository; + + @GetMapping("/login") + public String showUserLogin(Model model) { + return "login"; + } + + @PostMapping("/verifyProfile") + public String verifyLogin(@RequestParam("correo") String correo, + @RequestParam("contraseña") String contraseña, Model model) + throws GestorAlmuerzosAppException { + String redirect = "login"; + try { + if (userRepository.login(correo, contraseña)) { + User user = userRepository.getUser(correo).orElseThrow(() -> new GestorAlmuerzosAppException(GestorAlmuerzosAppException.EmailNoExist)); + String username = user.getNombre(); + }else{ + model.addAttribute("error", GestorAlmuerzosAppException.IncorrectInformation); + return redirect; + } + }catch (GestorAlmuerzosAppException e){ + model.addAttribute("error", e.getMessage()); + return redirect; + } + return redirect; + } + + @GetMapping("/register") + public String showUserRegisterForm(Model model) { + model.addAttribute("user", new User()); + return "register"; + } + + @PostMapping("/save") + public String saveUser(@RequestParam("nombre") String name, + @RequestParam("apellido") String lastName,@RequestParam("email") String email,@RequestParam("password") String password, + @RequestParam("confirm_password") String confirm,@ModelAttribute("user") User user,Model model) { + if(repository.findById(email).isPresent()){ + model.addAttribute("error", GestorAlmuerzosAppException.EmailExist); + return "register"; + } + if(!password.equals(confirm)){ + model.addAttribute("error", GestorAlmuerzosAppException.NotPasswordConcident); + return "register"; + } + if(name.isEmpty()){ + model.addAttribute("error", GestorAlmuerzosAppException.NameEmpty); + return "register"; + } + if(lastName.isEmpty()){ + model.addAttribute("error", GestorAlmuerzosAppException.LastNameEmpty); + return "register"; + } + if(email.isEmpty()){ + model.addAttribute("error", GestorAlmuerzosAppException.EmptyEmail); + return "register"; + } + userRepository.addUser(user); + return "redirect:/"; + } + + @GetMapping("/updateProfile/{id}") + public String showUserUpdateForm(@PathVariable(value = "id") String id, Model model) { + Optional usuario = userRepository.getUser(id); + model.addAttribute("user", usuario.orElse(new User())); // Handle the case where the user is not found + return "update"; + } + + @GetMapping("/") + public String index(Model model){ + List menu = plateServices.getAllPlates(); + model.addAttribute("menu", menu); + return "index"; + } + + @GetMapping("/forgotPassword") + public String forgotPassword(){ + return "forgotPassword"; + } + + @GetMapping("/about-us") + public String aboutUs(){ + return "about-us"; + } + + @GetMapping("/contact-us") + public String contactUs(){ + return "contact-us"; + } + + @PostMapping("/sendEmail") + public String sendEmail(@RequestParam("email") String email,Model model) throws GestorAlmuerzosAppException { + Optional usuario = userRepository.getUser(email); + try { + User user = usuario.orElseThrow(() -> new GestorAlmuerzosAppException(GestorAlmuerzosAppException.EmailNoExist)); + userRepository.sendEmailForgotPassword(user); + }catch(GestorAlmuerzosAppException e){ + model.addAttribute("error", e.getMessage()); + return("/forgotPassword"); + } + return "redirect:/"; + } + + @PostMapping("/update") + public String updateUser(@ModelAttribute("user") User user) { + userRepository.updateUser(user); + return "redirect:/index"; + } + + @RequestMapping("/delete/{id}") + public String deleteUser(@PathVariable String id) { + userRepository.deleteUser(id); + return "redirect:/index"; + } + +} + diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index f727228..f5022c2 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -1,5 +1,6 @@ - + + @@ -8,7 +9,7 @@ Login - + @@ -17,64 +18,61 @@
diff --git a/src/main/resources/templates/register.html b/src/main/resources/templates/register.html index 8d02cfa..d4b17ee 100644 --- a/src/main/resources/templates/register.html +++ b/src/main/resources/templates/register.html @@ -1,5 +1,6 @@ - + + @@ -17,64 +18,61 @@