88 lines
2.0 KiB
TypeScript
88 lines
2.0 KiB
TypeScript
import bcrypt from "bcryptjs";
|
|
import jwt from "jsonwebtoken";
|
|
import User from "../models/User";
|
|
import dbConnect from "@/lib/db/connection";
|
|
|
|
const JWT_SECRET = process.env.JWT_SECRET || "your-secret-key";
|
|
|
|
export async function register(data: {
|
|
username: string;
|
|
email: string;
|
|
password: string;
|
|
}) {
|
|
try {
|
|
await dbConnect();
|
|
const { username, email, password } = data;
|
|
|
|
const existingUser = await User.findOne({ $or: [{ email }, { username }] });
|
|
if (existingUser) {
|
|
return { error: "User already exists", status: 400 };
|
|
}
|
|
|
|
const hashedPassword = await bcrypt.hash(password, 10);
|
|
|
|
const user = await User.create({
|
|
username,
|
|
email,
|
|
password: hashedPassword,
|
|
});
|
|
|
|
const token = jwt.sign({ userId: user._id }, JWT_SECRET, {
|
|
expiresIn: "7d",
|
|
});
|
|
|
|
return {
|
|
token,
|
|
user: {
|
|
id: user._id,
|
|
username: user.username,
|
|
email: user.email,
|
|
},
|
|
};
|
|
} catch (error) {
|
|
console.error("Error en el registro:", error);
|
|
return { error: "Internal server error", status: 500 };
|
|
}
|
|
}
|
|
|
|
export async function loginUser(data: {
|
|
email: string;
|
|
password: string;
|
|
rememberMe?: boolean;
|
|
}) {
|
|
try {
|
|
await dbConnect();
|
|
const { email, password, rememberMe } = data;
|
|
|
|
const user = await User.findOne({ email });
|
|
if (!user) {
|
|
return { error: "Invalid credentials", status: 401 };
|
|
}
|
|
|
|
const isValidPassword = await bcrypt.compare(password, user.password);
|
|
if (!isValidPassword) {
|
|
return { error: "Invalid credentials", status: 401 };
|
|
}
|
|
|
|
let tokenOptions = {};
|
|
|
|
if (!rememberMe) {
|
|
tokenOptions = { expiresIn: "7d" };
|
|
}
|
|
|
|
const token = jwt.sign({ userId: user._id }, JWT_SECRET, tokenOptions);
|
|
|
|
return {
|
|
token,
|
|
user: {
|
|
id: user._id,
|
|
username: user.username,
|
|
email: user.email,
|
|
},
|
|
};
|
|
} catch (error) {
|
|
console.error("Error en el login:", error);
|
|
return { error: "Internal server error", status: 500 };
|
|
}
|
|
}
|