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}
+
+
+ }
+ >
+
+
+ );
+}
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,