mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-06-19 14:15:21 +02:00
* refactor: add sidebar * chore: add deps * refactor: update sidebar * refactor: another layout * refactor: update variant * refactor: change layout * refactor: change variant * refactor: enhance sidebar navigation with active state management * feat: add project button to dashboard * Merge branch 'canary' into feat/add-sidebar * refactor: add loader * refactor: update destinations and refactor * refactor: ui refactor certificates * refactor: delete unused files * refactor: remove unused files and duplicate registry * refactor: update style registry * refactor: add new design registry * refactor: enhance git providers * refactor: remove duplicate files * refactor: update * refactor: update users * refactor: delete unused files * refactor: update profile * refactor: apply changes * refactor: update UI * refactor: enhance Docker monitoring UI layout * refactor: add theme toggle and language selection to user navigation (#1083) * refactor: remove unused files * feat: add filter to services * refactor: add active items * refactor: remove tab prop * refactor: remove unused files * refactor: remove duplicated files * refactor: remove unused files * refactor: remove duplicate files * refactor: remove unused files * refactor: delete unused files * refactor: remove unsued files * refactor: delete unused files * refactor: lint * refactor: remove unused secuirty * refactor: delete unused files * refactor: delete unused files * remove imports * refactor: add update button * refactor: delete unused files * refactor: remove unused code * refactor: remove unused files * refactor: update login page * refactor: update login UI * refactor: update ui reset password * refactor: add justify end * feat: add suscriptions * feat: add sheet * feat: add logs for postgres * feat: add logs for all databases * feat: add server logs with drawer logs * refactor: remove unused files * refactor: add refetch when closing * refactor: fix linter * chore: bump node-20 * revert * refactor: fix conflicts * refactor: update * refactor: add missing deps * refactor: delete duplicate files * refactor: delete unsued files * chore: lint * refactor: remove unsued file * refactor: add refetch * refactor: remove duplicated files * refactor: delete unused files * refactor: update setup onboarding * refactor: add breadcrumb * refactor: apply updates * refactor: add faker * refactor: use 0 in validation * refactor: show correct state * refactor: update --------- Co-authored-by: vishalkadam47 <vishal@jeevops.com> Co-authored-by: Vishal kadam <107353260+vishalkadam47@users.noreply.github.com>
118 lines
2.8 KiB
TypeScript
118 lines
2.8 KiB
TypeScript
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
import { findAdminByAuthId } from "@dokploy/server/services/admin";
|
|
import { findUserByAuthId } from "@dokploy/server/services/user";
|
|
import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle";
|
|
import { TimeSpan } from "lucia";
|
|
import { Lucia } from "lucia/dist/core.js";
|
|
import type { Session, User } from "lucia/dist/core.js";
|
|
import { db } from "../db";
|
|
import { type DatabaseUser, auth, sessionTable } from "../db/schema";
|
|
|
|
export const adapter = new DrizzlePostgreSQLAdapter(db, sessionTable, auth);
|
|
|
|
export const lucia = new Lucia(adapter, {
|
|
sessionCookie: {
|
|
attributes: {
|
|
secure: false,
|
|
},
|
|
},
|
|
sessionExpiresIn: new TimeSpan(1, "d"),
|
|
getUserAttributes: (attributes) => {
|
|
return {
|
|
email: attributes.email,
|
|
rol: attributes.rol,
|
|
secret: attributes.secret !== null,
|
|
adminId: attributes.adminId,
|
|
};
|
|
},
|
|
});
|
|
|
|
declare module "lucia" {
|
|
interface Register {
|
|
Lucia: typeof lucia;
|
|
DatabaseUserAttributes: Omit<DatabaseUser, "id"> & {
|
|
authId: string;
|
|
adminId: string;
|
|
};
|
|
}
|
|
}
|
|
|
|
export type ReturnValidateToken = Promise<{
|
|
user: (User & { authId: string; adminId: string }) | null;
|
|
session: Session | null;
|
|
}>;
|
|
|
|
export async function validateRequest(
|
|
req: IncomingMessage,
|
|
res: ServerResponse,
|
|
): ReturnValidateToken {
|
|
const sessionId = lucia.readSessionCookie(req.headers.cookie ?? "");
|
|
|
|
if (!sessionId) {
|
|
return {
|
|
user: null,
|
|
session: null,
|
|
};
|
|
}
|
|
const result = await lucia.validateSession(sessionId);
|
|
if (result?.session?.fresh) {
|
|
res.appendHeader(
|
|
"Set-Cookie",
|
|
lucia.createSessionCookie(result.session.id).serialize(),
|
|
);
|
|
}
|
|
if (!result.session) {
|
|
res.appendHeader(
|
|
"Set-Cookie",
|
|
lucia.createBlankSessionCookie().serialize(),
|
|
);
|
|
}
|
|
if (result.user) {
|
|
try {
|
|
if (result.user?.rol === "admin") {
|
|
const admin = await findAdminByAuthId(result.user.id);
|
|
result.user.adminId = admin.adminId;
|
|
} else if (result.user?.rol === "user") {
|
|
const userResult = await findUserByAuthId(result.user.id);
|
|
result.user.adminId = userResult.adminId;
|
|
}
|
|
} catch (error) {
|
|
return {
|
|
user: null,
|
|
session: null,
|
|
};
|
|
}
|
|
}
|
|
|
|
return {
|
|
session: result.session,
|
|
...((result.user && {
|
|
user: {
|
|
authId: result.user.id,
|
|
email: result.user.email,
|
|
rol: result.user.rol,
|
|
id: result.user.id,
|
|
secret: result.user.secret,
|
|
adminId: result.user.adminId,
|
|
},
|
|
}) || {
|
|
user: null,
|
|
}),
|
|
};
|
|
}
|
|
|
|
export async function validateWebSocketRequest(
|
|
req: IncomingMessage,
|
|
): Promise<{ user: User; session: Session } | { user: null; session: null }> {
|
|
const sessionId = lucia.readSessionCookie(req.headers.cookie ?? "");
|
|
|
|
if (!sessionId) {
|
|
return {
|
|
user: null,
|
|
session: null,
|
|
};
|
|
}
|
|
const result = await lucia.validateSession(sessionId);
|
|
return result;
|
|
}
|