import { NextApiResponse } from "next"; import { ServerResponse } from "http"; import NSQLite from "@moduletrace/nsqlite"; import { NSQLITE_TEST_DB_USERS, NSQLiteTables } from "../db/types"; import { User } from "../types"; import { AppData } from "../data/app-data"; import { setCookie } from "./cookies-actions"; import { EJSON } from "../exports/client-exports"; import encrypt from "@moduletrace/datasquirel/dist/package-shared/functions/dsql/encrypt"; import { APIResponseObject } from "@moduletrace/datasquirel/dist/package-shared/types"; import hashPassword from "@moduletrace/datasquirel/dist/package-shared/functions/dsql/hashPassword"; import dayjs from "dayjs"; type Params = { res: NextApiResponse | ServerResponse; user_id?: string | number; password?: string; email_or_username?: string; }; export default async function loginUser({ res, user_id, password, email_or_username, }: Params): Promise { let fetched_user: NSQLITE_TEST_DB_USERS | undefined; if (user_id) { const user_res = await NSQLite.select< NSQLITE_TEST_DB_USERS, (typeof NSQLiteTables)[number] >({ table: "users", targetId: user_id, }); if (!user_res.singleRes?.id) { throw new Error(`Couldn't Find user for login`); } fetched_user = user_res.singleRes; } if (email_or_username) { const user_res = await NSQLite.select< NSQLITE_TEST_DB_USERS, (typeof NSQLiteTables)[number] >({ table: "users", query: { query: { email: { value: email_or_username, }, username: { value: email_or_username, }, }, searchOperator: "OR", }, }); if (!user_res.singleRes?.id) { throw new Error(`Couldn't Find user for login`); } fetched_user = user_res.singleRes; } if (!fetched_user) { return { success: false, msg: `User Not Found!`, }; } if (password) { const hashed_password = hashPassword({ password }); if (hashed_password !== fetched_user.password) { return { success: false, msg: `Invalid Password.`, }; } } const now = Date.now(); const csrf_k = Math.random().toString(36).substring(2) + "-" + Math.random().toString(36).substring(2); const logged_in_user_payload: User = { first_name: fetched_user.first_name!, last_name: fetched_user.last_name!, date: now, email: fetched_user.email!, csrf_k, id: fetched_user.id!, logged_in_status: true, image: fetched_user.image, image_thumbnail: fetched_user.image, }; const payload_string = EJSON.stringify(logged_in_user_payload); const encrypted_payload = encrypt({ data: payload_string || "" }); const expiration_date = dayjs(Date.now()).add(7, "days"); expiration_date.add(7, "days"); setCookie(res, [ { name: AppData["AuthCookieName"], value: encrypted_payload || "", options: { secure: process.env.DOMAIN !== "localhost", path: "/", expires: expiration_date, domain: process.env.DOMAIN, }, }, { name: AppData["AuthCSRFCookieName"], value: csrf_k, options: { path: "/", expires: expiration_date, domain: process.env.DOMAIN, }, }, ]); return { success: true, singleRes: logged_in_user_payload, }; }