98 lines
2.9 KiB
TypeScript
98 lines
2.9 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";
|
|
import { createLog } from "../../logger/logger.js";
|
|
import { differenceInDays } from "date-fns";
|
|
import { tryCatch } from "../../../globalUtils/tryCatch.js";
|
|
import { settings } from "../../../../database/schema/settings.js";
|
|
|
|
/**
|
|
* Authenticate a user and return a JWT.
|
|
*/
|
|
const { sign } = 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
|
|
prod: btoa(`${username.toLowerCase()}:${password}`),
|
|
};
|
|
|
|
// update the user last login
|
|
try {
|
|
const lastLog = await db
|
|
.update(users)
|
|
.set({ lastLogin: sql`NOW()` })
|
|
.where(eq(users.user_id, user[0].user_id))
|
|
.returning({ lastLogin: users.lastLogin });
|
|
createLog(
|
|
"info",
|
|
"lst",
|
|
"auth",
|
|
`Its been ${differenceInDays(
|
|
lastLog[0]?.lastLogin ?? "",
|
|
new Date(Date.now())
|
|
)} days since ${user[0].username} has logged in`
|
|
);
|
|
//]);
|
|
} catch (error) {
|
|
createLog(
|
|
"error",
|
|
"lst",
|
|
"auth",
|
|
"There was an error updating the user last login"
|
|
);
|
|
}
|
|
|
|
const token = sign({ user: userData }, secret, {
|
|
expiresIn: expiresIn * 60,
|
|
});
|
|
|
|
return { token, user: userData };
|
|
}
|
|
|
|
// export const login = async (username: string, password: string) => {
|
|
// // get the settings so we know what server to call.
|
|
// const { data, error } = (await tryCatch(db.select().from(settings))) as any;
|
|
|
|
// if (error) {
|
|
// return {
|
|
// success: false,
|
|
// message: "Failed to get settings",
|
|
// data: error,
|
|
// };
|
|
// }
|
|
|
|
// };
|