Skip to content

Commit

Permalink
addded userAuth logics b00tc4mp#252
Browse files Browse the repository at this point in the history
  • Loading branch information
itsmePo committed Dec 30, 2024
1 parent a37e408 commit f1c1d79
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 18 deletions.
3 changes: 2 additions & 1 deletion staff/borja-garcia/project/appProjectApi/.env
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
MONGODB_URI = mongodb://127.0.0.1:27017/appProject
PORT = 4321
PORT = 4321
JWT_SECRET= Y+RMQzBtoOMZ2P+NyUgKcUsjloKAUbwETexXJ4aFuLU@
1 change: 1 addition & 0 deletions staff/borja-garcia/project/appProjectApi/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/staff/borja-garcia/project/appProjectApi/.env
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
import express from "express";
import { createUser, deleteUserById, getUserById, getUsers, updateUserById } from "../services/userService.js"; // Importa funciones del controlador
import {
createUser,
deleteUserById,
getUserById,
getUsers,
updateUserById,
authUser
} from "../services/userService.js"; // Importa funciones del controlador
import jwt from "jsonwebtoken";

const router = express.Router();

// Crear un usuario
router.post("/", async (req, res) => {
try {
const { email, username, password } = req.body;
const userObject = { email, username, password };
const userObject = {
email: req.body.email,
username: req.body.username,
pwd: req.body.password,
repeatPwd: req.body.repeatPassword
};
await createUser(userObject);
res.status(200).json({ message: 'Usuario creado correctamente' });
res.status(200).json({ message: "Usuario creado correctamente" });
} catch (error) {
res.status(400).json({ error: error.message });
}
Expand All @@ -25,28 +37,28 @@ router.get("/", async (req, res) => {
}
});

router.delete('/:userId', async (req, res) => {
router.delete("/:userId", async (req, res) => {
try {
const { userId } = req.params; // Captura el parámetro dinámico desde la ruta
const deletedUser = await deleteUserById(userId); // Busca y elimina el usuario por su ID

if (!deletedUser) {
return res.status(404).json({ message: 'Usuario no encontrado' }); // Respuesta si el usuario no existe
return res.status(404).json({ message: "Usuario no encontrado" }); // Respuesta si el usuario no existe
}

res.status(200).json({ message: 'Usuario eliminado correctamente' });
res.status(200).json({ message: "Usuario eliminado correctamente" });
} catch (error) {
res.status(400).json({ error: error.message }); // Manejo de errores
}
});

router.get('/:userId', async (req, res) => {
router.get("/:userId", async (req, res) => {
try {
const { userId } = req.params; // Captura el parámetro dinámico desde la ruta
const fetchUserById = await getUserById(userId); // Busca y elimina el usuario por su ID

if (!fetchUserById) {
return res.status(404).json({ message: 'Usuario no encontrado' }); // Respuesta si el usuario no existe
return res.status(404).json({ message: "Usuario no encontrado" }); // Respuesta si el usuario no existe
}

res.json(fetchUserById);
Expand All @@ -55,7 +67,7 @@ router.get('/:userId', async (req, res) => {
}
});

router.put('/:userId', async (req, res) => {
router.put("/:userId", async (req, res) => {
try {
const { userId } = req.params; // Captura el parámetro dinámico desde la ruta
const { email, username, password } = req.body;
Expand All @@ -67,13 +79,28 @@ router.put('/:userId', async (req, res) => {
const modifyUserById = await updateUserById(userId, updateUser); // Busca y modifica el usuario por su ID

if (!modifyUserById) {
return res.status(404).json({ message: 'Usuario no encontrado' }); // Respuesta si el usuario no existe
return res.status(404).json({ message: "Usuario no encontrado" }); // Respuesta si el usuario no existe
}

res.status(200).json({ message: 'Usuario modificado correctamente' });
res.status(200).json({ message: "Usuario modificado correctamente" });
} catch (error) {
res.status(400).json({ error: error.message }); // Manejo de errores
}
});

router.post("/auth", async (req, res) => {
try {
const user = await authUser(req.body.email, req.body.password);
if (!user || user.length === 0) {
return res
.status(404)
.json({ message: "Credentials error" });
}
const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: "1h" });
res.status(200).json({ token: token });
} catch (err) {
res.status(400).json({ message: err.message });
}
});

export default router;
42 changes: 37 additions & 5 deletions staff/borja-garcia/project/appProjectApi/services/userService.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,25 @@
import User from "../models/users.js";
import bcrypt from 'bcrypt';

// Crear un usuario
export const createUser = async (userObject) => {
const user = new User(userObject);
// Comparar las contraseñas en texto plano antes de cifrarlas
if (userObject.pwd !== userObject.repeatPwd) {
throw new Error("Las contraseñas no coinciden, torpe");
}

// Cifrar la contraseña solo después de la validación
const hashedPwd = await bcrypt.hash(userObject.pwd, 10);

// Crear el objeto userData con la contraseña cifrada
const userData = {
username: userObject.username,
email: userObject.email,
password: hashedPwd,
};

// Guardar el usuario en la base de datos
const user = new User(userData);
return await user.save();
};

Expand All @@ -13,24 +30,39 @@ export const getUsers = async () => {

export const deleteUserById = async (userId) => {
return await User.findByIdAndDelete(userId);
}
};

export const updateUserById = async (userId, updatedUser) => {
return await User.findByIdAndUpdate(userId, updatedUser, { new: true });
}
};

export const getUserById = async (userId) => {
return await User.findById(userId);
}
};

export const saveUserContact = async (user, contact) => {
user.contacts = user.contacts || []; // Comprobar para que tenga sentido
user.contacts.push(contact._id); // Asegúrate de que el esquema del usuario tenga el campo `contacts`
await user.save();
}
};

export const saveUserEvent = async (user, event) => {
user.events = user.events || []; // Comprobar para que tenga sentido
user.events.push(event._id); // Asegúrate de que el esquema del usuario tenga el campo `contacts`
await user.save();
};

////////////// Gestión de autentificación y Contraseñas (cifrados) //////////////

export const authUser = async (email, pwd) => {

const user = await User.findOne({ email });
if (!user || !(await isPasswordValid(pwd, user.password))) {
throw new Error("Credenciales incorrectas");
}
return user;
};

export const isPasswordValid = async (pwd, hashedPwd) => {
return await bcrypt.compare(pwd, hashedPwd);
}
Empty file.

0 comments on commit f1c1d79

Please sign in to comment.