From 2e0009e3caf2032897bb167a309c11b978a3257e Mon Sep 17 00:00:00 2001 From: Archben Date: Wed, 11 Mar 2026 04:16:51 +0000 Subject: [PATCH] Updates --- src/components/pages/admin/users/index.tsx | 18 ++++++++++ src/db/db-schema.js | 4 +++ src/db/types.ts | 1 + src/{utils => functions/auth}/login-user.ts | 11 +++--- src/functions/auth/logout-user.ts | 36 +++++++++++++++++++ .../pages/admin/default-admin-props.ts | 2 +- src/layouts/admin/(partials)/header-user.tsx | 32 +++++++++++++++++ src/pages/admin/users/index.tsx | 25 +++++++++++++ src/pages/api/auth/login.ts | 2 +- src/pages/api/auth/signup.ts | 2 +- src/pages/auth/logout.tsx | 23 ++++++++++++ src/types/index.ts | 4 ++- src/utils/cookies-actions.ts | 2 +- 13 files changed, 152 insertions(+), 10 deletions(-) create mode 100644 src/components/pages/admin/users/index.tsx rename src/{utils => functions/auth}/login-user.ts (91%) create mode 100644 src/functions/auth/logout-user.ts create mode 100644 src/layouts/admin/(partials)/header-user.tsx create mode 100644 src/pages/admin/users/index.tsx create mode 100644 src/pages/auth/logout.tsx diff --git a/src/components/pages/admin/users/index.tsx b/src/components/pages/admin/users/index.tsx new file mode 100644 index 0000000..71653a3 --- /dev/null +++ b/src/components/pages/admin/users/index.tsx @@ -0,0 +1,18 @@ +import { Fragment, useContext } from "react"; +import { AppContext } from "@/src/pages/_app"; +import Divider from "@/twui/components/layout/Divider"; +import AdminHero from "@/src/components/general/admin/hero"; + +export default function Main() { + const { pageProps } = useContext(AppContext); + + return ( + + All Users in this deployment} + /> + + + ); +} diff --git a/src/db/db-schema.js b/src/db/db-schema.js index c9a2b3e..a93018c 100644 --- a/src/db/db-schema.js +++ b/src/db/db-schema.js @@ -37,6 +37,10 @@ const schema = { fieldName: "is_super_admin", dataType: "INTEGER", }, + { + fieldName: "all_deployment_access", + dataType: "INTEGER", + }, ], }, { diff --git a/src/db/types.ts b/src/db/types.ts index c0c3283..d5c7917 100644 --- a/src/db/types.ts +++ b/src/db/types.ts @@ -23,6 +23,7 @@ export type NSQLITE_TEST_DB_USERS = { image?: string; password?: string; is_super_admin?: number; + all_deployment_access?: number; } export type NSQLITE_TEST_DB_USERS_PORTS = { diff --git a/src/utils/login-user.ts b/src/functions/auth/login-user.ts similarity index 91% rename from src/utils/login-user.ts rename to src/functions/auth/login-user.ts index d778ba0..0738063 100644 --- a/src/utils/login-user.ts +++ b/src/functions/auth/login-user.ts @@ -1,15 +1,15 @@ 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 { setCookie } from "./cookies-actions"; -import { EJSON } from "../exports/client-exports"; +import { NSQLITE_TEST_DB_USERS, NSQLiteTables } from "../../db/types"; +import { User } from "../../types"; +import { setCookie } from "../../utils/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"; -import grabCookieNames from "./grab-cookie-names"; +import grabCookieNames from "../../utils/grab-cookie-names"; type Params = { res: NextApiResponse | ServerResponse; @@ -103,6 +103,7 @@ export default async function loginUser({ logged_in_status: true, image: fetched_user.image, image_thumbnail: fetched_user.image, + super_admin: fetched_user.is_super_admin ? 1 : 0, }; const payload_string = EJSON.stringify(logged_in_user_payload); diff --git a/src/functions/auth/logout-user.ts b/src/functions/auth/logout-user.ts new file mode 100644 index 0000000..ada047e --- /dev/null +++ b/src/functions/auth/logout-user.ts @@ -0,0 +1,36 @@ +import { NextApiResponse } from "next"; +import { ServerResponse } from "http"; +import { deleteCookie } from "../../utils/cookies-actions"; +import { APIResponseObject } from "@moduletrace/datasquirel/dist/package-shared/types"; +import grabCookieNames from "../../utils/grab-cookie-names"; + +type Params = { + res: NextApiResponse | ServerResponse; +}; + +export default async function logoutUser({ + res, +}: Params): Promise { + const { auth_key_cookie_name, csrf_cookie_name } = grabCookieNames(); + + deleteCookie(res, [ + { + name: auth_key_cookie_name, + options: { + path: "/", + domain: process.env.DOMAIN, + }, + }, + { + name: csrf_cookie_name, + options: { + path: "/", + domain: process.env.DOMAIN, + }, + }, + ]); + + return { + success: true, + }; +} diff --git a/src/functions/pages/admin/default-admin-props.ts b/src/functions/pages/admin/default-admin-props.ts index 278ba23..3d79c9f 100644 --- a/src/functions/pages/admin/default-admin-props.ts +++ b/src/functions/pages/admin/default-admin-props.ts @@ -19,7 +19,7 @@ type Params = { props?: PagePropsType; propsFn?: ( params: PropsFnParams, - ) => Promise; + ) => Promise | false | string>; }; const { TURBOCI_DEPLOYMENT_ID_FILE } = grabDirNames(); diff --git a/src/layouts/admin/(partials)/header-user.tsx b/src/layouts/admin/(partials)/header-user.tsx new file mode 100644 index 0000000..61a753e --- /dev/null +++ b/src/layouts/admin/(partials)/header-user.tsx @@ -0,0 +1,32 @@ +import { AppContext } from "@/src/pages/_app"; +import Dropdown from "@/twui/components/elements/Dropdown"; +import LinkList from "@/twui/components/elements/LinkList"; +import LucideIcon from "@/twui/components/elements/lucide-icon"; +import Img from "@/twui/components/layout/Img"; +import Row from "@/twui/components/layout/Row"; +import Span from "@/twui/components/layout/Span"; +import { useContext } from "react"; + +export default function HeaderUser() { + const { pageProps } = useContext(AppContext); + const { user } = pageProps; + + return ( + + {`${user.first_name} + {user.first_name} + + + } + > + + + ); +} diff --git a/src/pages/admin/users/index.tsx b/src/pages/admin/users/index.tsx new file mode 100644 index 0000000..05e40f7 --- /dev/null +++ b/src/pages/admin/users/index.tsx @@ -0,0 +1,25 @@ +import Main from "@/src/components/pages/admin/users"; +import defaultAdminProps from "@/src/functions/pages/admin/default-admin-props"; +import Layout from "@/src/layouts/admin"; +import { GetServerSideProps } from "next"; + +export default function AdminDashboard() { + return ( + +
+ + ); +} + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + return await defaultAdminProps({ + ctx, + async propsFn({ user, props }) { + if (!user.super_admin) { + return `/admin`; + } + + return {}; + }, + }); +}; diff --git a/src/pages/api/auth/login.ts b/src/pages/api/auth/login.ts index 0a1ee24..40cc820 100644 --- a/src/pages/api/auth/login.ts +++ b/src/pages/api/auth/login.ts @@ -1,5 +1,5 @@ import { APIReqObject } from "@/src/types"; -import loginUser from "@/src/utils/login-user"; +import loginUser from "@/src/functions/auth/login-user"; import { APIResponseObject } from "@moduletrace/datasquirel/dist/package-shared/types"; import type { NextApiRequest, NextApiResponse } from "next"; diff --git a/src/pages/api/auth/signup.ts b/src/pages/api/auth/signup.ts index 7738ca3..6a4629c 100644 --- a/src/pages/api/auth/signup.ts +++ b/src/pages/api/auth/signup.ts @@ -1,6 +1,6 @@ import { NSQLITE_TEST_DB_USERS, NSQLiteTables } from "@/src/db/types"; import { APIReqObject } from "@/src/types"; -import loginUser from "@/src/utils/login-user"; +import loginUser from "@/src/functions/auth/login-user"; import hashPassword from "@moduletrace/datasquirel/dist/package-shared/functions/dsql/hashPassword"; import { APIResponseObject } from "@moduletrace/datasquirel/dist/package-shared/types"; import NSQLite from "@moduletrace/nsqlite"; diff --git a/src/pages/auth/logout.tsx b/src/pages/auth/logout.tsx new file mode 100644 index 0000000..97d5752 --- /dev/null +++ b/src/pages/auth/logout.tsx @@ -0,0 +1,23 @@ +import logoutUser from "@/src/functions/auth/logout-user"; +import Layout from "@/src/layouts/login"; +import H2 from "@/twui/components/layout/H2"; +import { GetServerSideProps } from "next"; + +export default function LogoutPage() { + return ( + +

Loging out ...

+
+ ); +} + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + await logoutUser({ res: ctx.res }); + + return { + redirect: { + destination: `/login`, + statusCode: 307, + }, + }; +}; diff --git a/src/types/index.ts b/src/types/index.ts index a20ff2c..52aeb66 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -4,7 +4,9 @@ import useAppInit from "../hooks/use-app-init"; import { ServerWebSocket } from "bun"; import { ChildProcess } from "child_process"; -export type User = DATASQUIREL_LoggedInUser & {}; +export type User = DATASQUIREL_LoggedInUser & { + super_admin?: 0 | 1; +}; export const CloudProviders = [ { diff --git a/src/utils/cookies-actions.ts b/src/utils/cookies-actions.ts index 04f2993..f74eac7 100644 --- a/src/utils/cookies-actions.ts +++ b/src/utils/cookies-actions.ts @@ -70,7 +70,7 @@ export function updateCookie( export function deleteCookie( res: http.ServerResponse, - cookies: Cookie[], + cookies: Pick[], ): void { setCookie( res,