56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
import jwt from "jsonwebtoken";
|
|
import {db} from "../../../../database/dbclient.js";
|
|
import {users} from "../../../../database/schema/users.js";
|
|
import {eq, sql} from "drizzle-orm";
|
|
import {checkPassword} from "../utils/checkPassword.js";
|
|
import {roleCheck} from "./userRoles/getUserAccess.js";
|
|
|
|
/**
|
|
* Authenticate a user and return a JWT.
|
|
*/
|
|
const {sign, verify} = jwt;
|
|
|
|
export async function login(
|
|
username: string,
|
|
password: string
|
|
): Promise<{token: string; user: {user_id: string; username: string}}> {
|
|
const user = await db.select().from(users).where(eq(users.username, username));
|
|
|
|
//console.log(user);
|
|
if (user.length === 0) {
|
|
throw new Error("Invalid or Missing user");
|
|
}
|
|
// check the password
|
|
const checkedPass = await checkPassword(password, user[0]?.password);
|
|
//console.log(checkedPass);
|
|
if (!checkedPass) {
|
|
throw new Error("Invalid Password");
|
|
}
|
|
|
|
// Create a JWT
|
|
const secret: string = process.env.JWT_SECRET!;
|
|
const expiresIn = Number(process.env.JWT_EXPIRES!) || 60;
|
|
|
|
// get the user roles
|
|
const roles = await roleCheck(user[0].user_id);
|
|
const userData = {
|
|
user_id: user[0].user_id,
|
|
username: user[0].username,
|
|
email: user[0].email,
|
|
roles: roles || null,
|
|
role: user[0].role || null, // this should be removed onces full migration to v2 is completed
|
|
};
|
|
|
|
// update the user last login
|
|
// try {
|
|
// db.update(users)
|
|
// .set({lastLogin: sql`NOW()`})
|
|
// .where(eq(users.user_id, user[0].user_id));
|
|
// } catch (e) {
|
|
// console.log(e);
|
|
// }
|
|
const token = sign({user: userData}, secret, {expiresIn: expiresIn * 60});
|
|
|
|
return {token, user: userData};
|
|
}
|