diff --git a/.tokeignore b/.tokeignore new file mode 100644 index 0000000..9981ffe --- /dev/null +++ b/.tokeignore @@ -0,0 +1,2 @@ +pnpm-lock.yaml +backend/package-lock.json diff --git a/backend/controllers/auth.controller.js b/backend/controllers/auth.controller.js index 9229942..3be3031 100644 --- a/backend/controllers/auth.controller.js +++ b/backend/controllers/auth.controller.js @@ -1,95 +1,95 @@ -import "dotenv/config"; -import jwt from "jsonwebtoken"; -import { nanoid } from "nanoid"; -import { authModel } from "../models/auth.model.js"; -import { isValidEmail } from "../utils/validators/email.validate.js"; - -const login = async (req, res) => { - try { - const { email = "", password = "" } = req.body; - - if (!email.trim() || !password.trim()) { - return res.status(400).json({ error: "Email and password are required" }); - } - - if (!isValidEmail(email)) { - return res.status(400).json({ error: "Invalid email" }); - } - - if (password.length < 6) { - return res - .status(400) - .json({ error: "Password must be at least 6 characters" }); - } - - const user = await authModel.getUserByEmail(email); - - if (!user) { - return res.status(400).json({ error: "User not found" }); - } - - if (user.password !== password) { - return res.status(400).json({ error: "Invalid password" }); - } - - const payload = { email, id: user.id }; - const token = jwt.sign(payload, process.env.JWT_SECRET); - - return res.json({ email, token }); - } catch (error) { - // console.log(error); - return res.status(500).json({ error: "Server error" }); - } -}; - -const register = async (req, res) => { - try { - const { email = "", password = "" } = req.body; - - if (!email.trim() || !password.trim()) { - return res.status(400).json({ error: "Email and password are required" }); - } - - if (!isValidEmail(email)) { - return res.status(400).json({ error: "Invalid email" }); - } - - if (password.length < 6) { - return res - .status(400) - .json({ error: "Password must be at least 6 characters" }); - } - - const user = await authModel.getUserByEmail(email); - if (user) { - return res.status(400).json({ error: "User already exists" }); - } - const newUser = { email, password, id: nanoid() }; - await authModel.addUser(newUser); - - const payload = { email, id: newUser.id }; - const token = jwt.sign(payload, process.env.JWT_SECRET); - - return res.json({ email, token }); - } catch (error) { - // console.log(error); - return res.status(500).json({ error: "Server error" }); - } -}; - -const me = async (req, res) => { - try { - const { email } = req.user; - const user = await authModel.getUserByEmail(email); - return res.json({ email, id: user.id }); - } catch (error) { - // console.log(error); - return res.status(500).json({ error: "Server error" }); - } -}; - -export const authController = { - login, - register, - me, -}; +import "dotenv/config"; +import jwt from "jsonwebtoken"; +import { nanoid } from "nanoid"; +import { authModel } from "../models/auth.model.js"; +import { isValidEmail } from "../utils/validators/email.validate.js"; + +const login = async (req, res) => { + try { + const { email = "", password = "" } = req.body; + + if (!email.trim() || !password.trim()) { + return res.status(400).json({ error: "Email and password are required" }); + } + + if (!isValidEmail(email)) { + return res.status(400).json({ error: "Invalid email" }); + } + + if (password.length < 6) { + return res + .status(400) + .json({ error: "Password must be at least 6 characters" }); + } + + const user = await authModel.getUserByEmail(email); + + if (!user) { + return res.status(400).json({ error: "User not found" }); + } + + if (user.password !== password) { + return res.status(400).json({ error: "Invalid password" }); + } + + const payload = { email, id: user.id }; + const token = jwt.sign(payload, process.env.JWT_SECRET); + + return res.json({ email, token }); + } catch (error) { + // console.log(error); + return res.status(500).json({ error: "Server error" }); + } +}; + +const register = async (req, res) => { + try { + const { email = "", password = "" } = req.body; + + if (!email.trim() || !password.trim()) { + return res.status(400).json({ error: "Email and password are required" }); + } + + if (!isValidEmail(email)) { + return res.status(400).json({ error: "Invalid email" }); + } + + if (password.length < 6) { + return res + .status(400) + .json({ error: "Password must be at least 6 characters" }); + } + + const user = await authModel.getUserByEmail(email); + if (user) { + return res.status(400).json({ error: "User already exists" }); + } + const newUser = { email, password, id: nanoid() }; + await authModel.addUser(newUser); + + const payload = { email, id: newUser.id }; + const token = jwt.sign(payload, process.env.JWT_SECRET); + + return res.json({ email, token }); + } catch (error) { + // console.log(error); + return res.status(500).json({ error: "Server error" }); + } +}; + +const me = async (req, res) => { + try { + const { email } = req.user; + const user = await authModel.getUserByEmail(email); + return res.json({ email, id: user.id }); + } catch (error) { + // console.log(error); + return res.status(500).json({ error: "Server error" }); + } +}; + +export const authController = { + login, + register, + me, +}; diff --git a/backend/controllers/checkout.controller.js b/backend/controllers/checkout.controller.js index 716b9b1..76f6aee 100644 --- a/backend/controllers/checkout.controller.js +++ b/backend/controllers/checkout.controller.js @@ -1,16 +1,16 @@ -const create = async (req, res) => { - try { - return res.json({ - message: "Checkout successful", - cart: req.body, - user: req.user, - }); - } catch (error) { - // console.log(error); - return res.status(500).json({ error: "Server error" }); - } -}; - -export const checkoutController = { - create, -}; +const create = async (req, res) => { + try { + return res.json({ + message: "Checkout successful", + cart: req.body, + user: req.user, + }); + } catch (error) { + // console.log(error); + return res.status(500).json({ error: "Server error" }); + } +}; + +export const checkoutController = { + create, +}; diff --git a/backend/controllers/pizza.controller.js b/backend/controllers/pizza.controller.js index 3d09e97..d46c2dd 100644 --- a/backend/controllers/pizza.controller.js +++ b/backend/controllers/pizza.controller.js @@ -1,20 +1,20 @@ -import { pizzaModel } from "../models/pizza.model.js"; - -const readPizzas = async (req, res) => { - const pizzas = await pizzaModel.getPizzas(); - res.json(pizzas); -}; - -const readPizza = async (req, res) => { - const { id } = req.params; - const pizza = await pizzaModel.getPizza(id.toLowerCase()); - if (!pizza) { - return res.status(404).json({ message: "Pizza not found" }); - } - res.json(pizza); -}; - -export const pizzaController = { - readPizzas, - readPizza, -}; +import { pizzaModel } from "../models/pizza.model.js"; + +const readPizzas = async (req, res) => { + const pizzas = await pizzaModel.getPizzas(); + res.json(pizzas); +}; + +const readPizza = async (req, res) => { + const { id } = req.params; + const pizza = await pizzaModel.getPizza(id.toLowerCase()); + if (!pizza) { + return res.status(404).json({ message: "Pizza not found" }); + } + res.json(pizza); +}; + +export const pizzaController = { + readPizzas, + readPizza, +}; diff --git a/backend/db/pizzas.json b/backend/db/pizzas.json index fde6397..a038c7c 100644 --- a/backend/db/pizzas.json +++ b/backend/db/pizzas.json @@ -1,50 +1,50 @@ -[ - { - "desc": "La pizza napolitana, de masa tierna y delgada pero bordes altos, es la versión propia de la cocina napolitana de la pizza redonda. El término pizza napoletana, por su importancia histórica o regional, se emplea en algunas zonas como sinónimo de pizza tonda.", - "id": "p001", - "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-1239077_640_cl.jpg?alt=media&token=6a9a33da-5c00-49d4-9080-784dcc87ec2c", - "ingredients": ["mozzarella", "tomates", "jamón", "orégano"], - "name": "napolitana", - "price": 5950 - }, - { - "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", - "id": "p002", - "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fcheese-164872_640_com.jpg?alt=media&token=18b2b821-4d0d-43f2-a1c6-8c57bc388fab", - "ingredients": ["mozzarella", "tomates", "jamón", "choricillo"], - "name": "española", - "price": 7250 - }, - { - "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", - "id": "p003", - "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-1239077_640_com.jpg?alt=media&token=e7cde87a-08d5-4040-ac54-90f6c31eb3e3", - "ingredients": ["mozzarella", "tomates", "salame", "orégano"], - "name": "salame", - "price": 5990 - }, - { - "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", - "id": "p004", - "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-2000595_640_c.jpg?alt=media&token=61325b6e-a1e0-441e-b3b5-7335ba13e8be", - "ingredients": ["mozzarella", "salame", "aceitunas", "champiñones"], - "name": "cuatro estaciones", - "price": 9590 - }, - { - "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", - "id": "p005", - "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-salame.jpg?alt=media&token=ab3d4bf8-01f2-4810-982b-bd7fb6b517b2", - "ingredients": ["mozzarella", "tomates cherry", "bacon", "orégano"], - "name": "bacon", - "price": 6450 - }, - { - "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", - "id": "p006", - "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-2000595_640_c.jpg?alt=media&token=61325b6e-a1e0-441e-b3b5-7335ba13e8be", - "ingredients": ["mozzarella", "pimientos", "pollo grillé", "orégano"], - "name": "pollo picante", - "price": 8500 - } -] +[ + { + "desc": "La pizza napolitana, de masa tierna y delgada pero bordes altos, es la versión propia de la cocina napolitana de la pizza redonda. El término pizza napoletana, por su importancia histórica o regional, se emplea en algunas zonas como sinónimo de pizza tonda.", + "id": "p001", + "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-1239077_640_cl.jpg?alt=media&token=6a9a33da-5c00-49d4-9080-784dcc87ec2c", + "ingredients": ["mozzarella", "tomates", "jamón", "orégano"], + "name": "napolitana", + "price": 5950 + }, + { + "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", + "id": "p002", + "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fcheese-164872_640_com.jpg?alt=media&token=18b2b821-4d0d-43f2-a1c6-8c57bc388fab", + "ingredients": ["mozzarella", "tomates", "jamón", "choricillo"], + "name": "española", + "price": 7250 + }, + { + "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", + "id": "p003", + "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-1239077_640_com.jpg?alt=media&token=e7cde87a-08d5-4040-ac54-90f6c31eb3e3", + "ingredients": ["mozzarella", "tomates", "salame", "orégano"], + "name": "salame", + "price": 5990 + }, + { + "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", + "id": "p004", + "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-2000595_640_c.jpg?alt=media&token=61325b6e-a1e0-441e-b3b5-7335ba13e8be", + "ingredients": ["mozzarella", "salame", "aceitunas", "champiñones"], + "name": "cuatro estaciones", + "price": 9590 + }, + { + "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", + "id": "p005", + "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-salame.jpg?alt=media&token=ab3d4bf8-01f2-4810-982b-bd7fb6b517b2", + "ingredients": ["mozzarella", "tomates cherry", "bacon", "orégano"], + "name": "bacon", + "price": 6450 + }, + { + "desc": "La pizza es una preparación culinaria que consiste en un pan plano, habitualmente de forma circular, elaborado con harina de trigo, levadura, agua y sal (a veces aceite de oliva) que comúnmente se cubre con salsa de tomate, queso y otros muchos ingredientes, y que se hornea a alta temperatura, tradicionalmente en un horno de leña.", + "id": "p006", + "img": "https://firebasestorage.googleapis.com/v0/b/apis-varias-mias.appspot.com/o/pizzeria%2Fpizza-2000595_640_c.jpg?alt=media&token=61325b6e-a1e0-441e-b3b5-7335ba13e8be", + "ingredients": ["mozzarella", "pimientos", "pollo grillé", "orégano"], + "name": "pollo picante", + "price": 8500 + } +] diff --git a/backend/db/users.json b/backend/db/users.json index 9a0ca48..a2ade60 100644 --- a/backend/db/users.json +++ b/backend/db/users.json @@ -1,7 +1,7 @@ [ - { - "email": "test@test.com", - "password": "123123", - "id": "UYz_2Vy9rNw7uELQ7AZ8D" - } -] \ No newline at end of file + { + "email": "test@test.com", + "password": "123123", + "id": "UYz_2Vy9rNw7uELQ7AZ8D" + } +] diff --git a/backend/index.js b/backend/index.js index 8ea15f7..f6152f2 100644 --- a/backend/index.js +++ b/backend/index.js @@ -1,24 +1,24 @@ -import cors from "cors"; -import "dotenv/config"; -import express from "express"; - -import authRoute from "./routes/auth.route.js"; -import checkoutRoute from "./routes/checkout.route.js"; -import pizzaRoute from "./routes/pizza.route.js"; - -const app = express(); - -app.use(express.json()); -app.use(cors()); - -app.use("/api/auth", authRoute); -app.use("/api/pizzas", pizzaRoute); -app.use("/api/checkouts", checkoutRoute); -app.use((_, res) => { - res.status(404).json({ error: "Not Found" }); -}); - -const PORT = process.env.PORT || 5000; -app.listen(PORT, () => { - console.log(`Server is running on port http://localhost:${PORT}`); -}); +import cors from "cors"; +import "dotenv/config"; +import express from "express"; + +import authRoute from "./routes/auth.route.js"; +import checkoutRoute from "./routes/checkout.route.js"; +import pizzaRoute from "./routes/pizza.route.js"; + +const app = express(); + +app.use(express.json()); +app.use(cors()); + +app.use("/api/auth", authRoute); +app.use("/api/pizzas", pizzaRoute); +app.use("/api/checkouts", checkoutRoute); +app.use((_, res) => { + res.status(404).json({ error: "Not Found" }); +}); + +const PORT = process.env.PORT || 5000; +app.listen(PORT, () => { + console.log(`Server is running on port http://localhost:${PORT}`); +}); diff --git a/backend/middlewares/auth.middleware.js b/backend/middlewares/auth.middleware.js index ff3eeb9..16020db 100644 --- a/backend/middlewares/auth.middleware.js +++ b/backend/middlewares/auth.middleware.js @@ -1,18 +1,18 @@ -import "dotenv/config"; -import jwt from "jsonwebtoken"; - -export const authMiddleware = (req, res, next) => { - const token = req.headers.authorization?.split(" ")[1]; - if (!token) { - return res.status(401).json({ error: "No token provided" }); - } - - try { - const payload = jwt.verify(token, process.env.JWT_SECRET); - req.user = payload; - next(); - } catch (error) { - // console.log(error); - return res.status(401).send({ error: "Invalid token" }); - } -}; +import "dotenv/config"; +import jwt from "jsonwebtoken"; + +export const authMiddleware = (req, res, next) => { + const token = req.headers.authorization?.split(" ")[1]; + if (!token) { + return res.status(401).json({ error: "No token provided" }); + } + + try { + const payload = jwt.verify(token, process.env.JWT_SECRET); + req.user = payload; + next(); + } catch (error) { + // console.log(error); + return res.status(401).send({ error: "Invalid token" }); + } +}; diff --git a/backend/models/auth.model.js b/backend/models/auth.model.js index 9a0a220..b070296 100644 --- a/backend/models/auth.model.js +++ b/backend/models/auth.model.js @@ -1,19 +1,19 @@ -import { readFile, writeFile } from "node:fs/promises"; - -const getUserByEmail = async (email) => { - const data = await readFile("db/users.json", "utf-8"); - const users = JSON.parse(data); - return users.find((user) => user.email === email); -}; - -const addUser = async (newUser) => { - const data = await readFile("db/users.json", "utf-8"); - const users = JSON.parse(data); - users.push(newUser); - await writeFile("db/users.json", JSON.stringify(users, null, 2)); -}; - -export const authModel = { - getUserByEmail, - addUser, -}; +import { readFile, writeFile } from "node:fs/promises"; + +const getUserByEmail = async (email) => { + const data = await readFile("db/users.json", "utf-8"); + const users = JSON.parse(data); + return users.find((user) => user.email === email); +}; + +const addUser = async (newUser) => { + const data = await readFile("db/users.json", "utf-8"); + const users = JSON.parse(data); + users.push(newUser); + await writeFile("db/users.json", JSON.stringify(users, null, 2)); +}; + +export const authModel = { + getUserByEmail, + addUser, +}; diff --git a/backend/models/pizza.model.js b/backend/models/pizza.model.js index 0734ab4..3521290 100644 --- a/backend/models/pizza.model.js +++ b/backend/models/pizza.model.js @@ -1,16 +1,16 @@ -import { readFile } from "node:fs/promises"; - -const getPizzas = async () => { - const data = await readFile("db/pizzas.json", "utf-8"); - return JSON.parse(data); -}; - -const getPizza = async (id) => { - const pizzas = await getPizzas(); - return pizzas.find((pizza) => pizza.id === id); -}; - -export const pizzaModel = { - getPizzas, - getPizza, -}; +import { readFile } from "node:fs/promises"; + +const getPizzas = async () => { + const data = await readFile("db/pizzas.json", "utf-8"); + return JSON.parse(data); +}; + +const getPizza = async (id) => { + const pizzas = await getPizzas(); + return pizzas.find((pizza) => pizza.id === id); +}; + +export const pizzaModel = { + getPizzas, + getPizza, +}; diff --git a/backend/package.json b/backend/package.json index 389df34..546272e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,24 +1,24 @@ { - "name": "simple-api-jwt", - "type": "module", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "dev": "nodemon index.js" - }, - "keywords": [], - "author": "bluuweb", - "license": "ISC", - "dependencies": { - "cors": "^2.8.5", - "dotenv": "^16.4.5", - "express": "^4.19.2", - "jsonwebtoken": "^9.0.2", - "nanoid": "^5.0.6" - }, - "devDependencies": { - "nodemon": "^3.1.0" - } + "name": "simple-api-jwt", + "type": "module", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "dev": "nodemon index.js" + }, + "keywords": [], + "author": "bluuweb", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", + "nanoid": "^5.0.6" + }, + "devDependencies": { + "nodemon": "^3.1.0" + } } diff --git a/backend/routes/auth.route.js b/backend/routes/auth.route.js index 5d272d0..51e6d8e 100644 --- a/backend/routes/auth.route.js +++ b/backend/routes/auth.route.js @@ -1,11 +1,11 @@ -import { Router } from "express"; -import { authController } from "../controllers/auth.controller.js"; -import { authMiddleware } from "../middlewares/auth.middleware.js"; - -const router = Router(); - -router.post("/login", authController.login); -router.post("/register", authController.register); -router.get("/me", authMiddleware, authController.me); - -export default router; +import { Router } from "express"; +import { authController } from "../controllers/auth.controller.js"; +import { authMiddleware } from "../middlewares/auth.middleware.js"; + +const router = Router(); + +router.post("/login", authController.login); +router.post("/register", authController.register); +router.get("/me", authMiddleware, authController.me); + +export default router; diff --git a/backend/routes/checkout.route.js b/backend/routes/checkout.route.js index 41d1c70..0c59c20 100644 --- a/backend/routes/checkout.route.js +++ b/backend/routes/checkout.route.js @@ -1,10 +1,10 @@ -import { Router } from "express"; -import { checkoutController } from "../controllers/checkout.controller.js"; -import { authMiddleware } from "../middlewares/auth.middleware.js"; - -const router = Router(); - -router.use(authMiddleware); -router.post("/", checkoutController.create); - -export default router; +import { Router } from "express"; +import { checkoutController } from "../controllers/checkout.controller.js"; +import { authMiddleware } from "../middlewares/auth.middleware.js"; + +const router = Router(); + +router.use(authMiddleware); +router.post("/", checkoutController.create); + +export default router; diff --git a/backend/routes/pizza.route.js b/backend/routes/pizza.route.js index 32e3016..eca85d5 100644 --- a/backend/routes/pizza.route.js +++ b/backend/routes/pizza.route.js @@ -1,9 +1,9 @@ -import { Router } from "express"; -import { pizzaController } from "../controllers/pizza.controller.js"; - -const router = Router(); - -router.get("/", pizzaController.readPizzas); -router.get("/:id", pizzaController.readPizza); - -export default router; +import { Router } from "express"; +import { pizzaController } from "../controllers/pizza.controller.js"; + +const router = Router(); + +router.get("/", pizzaController.readPizzas); +router.get("/:id", pizzaController.readPizza); + +export default router; diff --git a/backend/utils/validators/email.validate.js b/backend/utils/validators/email.validate.js index 89aa31a..17fe269 100644 --- a/backend/utils/validators/email.validate.js +++ b/backend/utils/validators/email.validate.js @@ -1,5 +1,5 @@ -export const isValidEmail = (email) => { - const regexEmail = - /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return regexEmail.test(email); -}; +export const isValidEmail = (email) => { + const regexEmail = + /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return regexEmail.test(email); +}; diff --git a/package.json b/package.json index feee186..ae3056b 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,33 @@ { - "name": "desafio", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "biome check", - "preview": "vite preview" - }, - "dependencies": { - "radashi": "^12.7.2", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "react-router-dom": "^7.14.2" - }, - "devDependencies": { - "@commitlint/cli": "^20.5.0", - "@commitlint/config-conventional": "^20.5.0", - "@eslint/js": "^9.39.4", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@unocss/reset": "^66.6.7", - "@vitejs/plugin-react": "^6.0.1", - "eslint": "^9.39.4", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.5.2", - "globals": "^17.4.0", - "unocss": "^66.6.7", - "vite": "^8.0.1" - } + "name": "desafio", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "biome check", + "preview": "vite preview" + }, + "dependencies": { + "radashi": "^12.7.2", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.2" + }, + "devDependencies": { + "@commitlint/cli": "^20.5.0", + "@commitlint/config-conventional": "^20.5.0", + "@eslint/js": "^9.39.4", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@unocss/reset": "^66.6.7", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "unocss": "^66.6.7", + "vite": "^8.0.1" + } } diff --git a/src/App.jsx b/src/App.jsx index 27fcd24..9e3a802 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,28 +1,40 @@ -import { Route, Routes } from "react-router-dom"; +import { useContext } from "react"; +import { Navigate, Route, Routes } from "react-router-dom"; +import "./App.css"; +import CartProvider from "./context/CartContext.jsx"; +import { UserContext } from "./context/UserContext.jsx"; import Footer from "./Footer"; import Navbar from "./Navbar"; import Cart from "./pages/Cart"; import Home from "./pages/Home"; import Login from "./pages/Login"; -import Register from "./pages/Register"; -import "./App.css"; import NotFound from "./pages/NotFound"; import Pizza from "./pages/Pizza"; import Profile from "./pages/Profile.jsx"; -import CartProvider from "./context/CartContext.jsx"; +import Register from "./pages/Register"; function App() { + const { token } = useContext(UserContext); return (
} /> - } /> - } /> - } /> + : } + /> + : } + /> + } /> } /> - } /> + : } + /> } />
diff --git a/src/Navbar.jsx b/src/Navbar.jsx index e586bc1..6d293b4 100644 --- a/src/Navbar.jsx +++ b/src/Navbar.jsx @@ -1,12 +1,13 @@ import { CartContext } from "./context/CartContext"; +import { UserContext } from "./context/UserContext"; import "./Navbar.css"; import { useContext } from "react"; import { Link } from "react-router-dom"; const Navbar = () => { - const { cart } = useContext(CartContext); - const token = false; - const total = cart.reduce((acc, it) => acc + it.price * it.count, 0); + const { getTotal } = useContext(CartContext); + const { logout, token } = useContext(UserContext); + const total = getTotal(); return (