33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import { createAuthEngine, SqlAuthStore, type AuthStore } from "@wrnexus/auth";
|
|
import { getDb } from "@wrnexus/db";
|
|
import { dbPermissionStore } from "@wrnexus/authz/db";
|
|
import { ensureCrmWorkspace } from "./workspace.ts";
|
|
|
|
// Config is imported before the runtime opens its configured database. This
|
|
// forwarding store resolves getDb() only when an auth operation actually runs.
|
|
const store = new Proxy({} as AuthStore, {
|
|
get(_target, property) {
|
|
const value = Reflect.get(new SqlAuthStore(getDb()), property);
|
|
return typeof value === "function" ? value.bind(new SqlAuthStore(getDb())) : value;
|
|
},
|
|
});
|
|
|
|
export const auth = createAuthEngine({
|
|
store,
|
|
secret: process.env.AUTH_SECRET ?? "northstar-crm-development-secret-change-me",
|
|
issuer: "Northstar CRM",
|
|
onSignedIn(ctx, returnTo) {
|
|
const destination =
|
|
returnTo?.startsWith("/") && !returnTo.startsWith("//") ? returnTo : "/dashboard";
|
|
return Response.redirect(new URL(destination, ctx.url), 303);
|
|
},
|
|
onSignedOut(ctx) {
|
|
return Response.redirect(new URL("/", ctx.url), 303);
|
|
},
|
|
async onSuccessfulSignUp(_ctx, user) {
|
|
await dbPermissionStore(getDb()).assignRole(user.id, "sales-rep");
|
|
await ensureCrmWorkspace(user.id);
|
|
return { autoSignIn: true, redirectTo: "/dashboard" };
|
|
},
|
|
});
|