feat(auth) : improve Google account handling
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { redirect } from "next/navigation";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { eq, sql } from "drizzle-orm";
|
||||
import { getDb } from "@/db";
|
||||
import { users } from "@/db/schema";
|
||||
import { accounts, users } from "@/db/schema";
|
||||
import { SiteHeader } from "@/components/public/site-header";
|
||||
import { isAuthorizedAdmin } from "@/lib/auth/authorization";
|
||||
import { getCustomerSession, isGoogleAuthEnabled } from "@/lib/auth/server";
|
||||
@@ -9,19 +9,23 @@ import { safeAuthReturnPath } from "@/lib/auth/return-path";
|
||||
import { AccountForm } from "./account-form";
|
||||
import { ProfileForm } from "./profile-form";
|
||||
|
||||
export async function AccountPage({ mode, next, verified, verificationError, setup = false }: {
|
||||
mode: "login" | "register"; next: unknown; verified?: boolean; verificationError?: boolean; setup?: boolean;
|
||||
export async function AccountPage({ mode, next, verified, verificationError, accountNotLinkedError, googleSignInError, setup = false }: {
|
||||
mode: "login" | "register"; next: unknown; verified?: boolean; verificationError?: boolean;
|
||||
accountNotLinkedError?: boolean; googleSignInError?: boolean; setup?: boolean;
|
||||
}) {
|
||||
const nextPath = safeAuthReturnPath(next);
|
||||
const session = await getCustomerSession();
|
||||
if (session) {
|
||||
const returnPath = nextPath.startsWith("/admin") && !isAuthorizedAdmin(session.user) ? "/" : nextPath;
|
||||
if (mode === "register" && setup) {
|
||||
const [user] = await getDb().select({ name: users.name, email: users.email, image: users.image })
|
||||
const [user] = await getDb().select({ name: users.name, email: users.email, image: users.image,
|
||||
hasGoogleAccount: sql<boolean>`exists (select 1 from ${accounts}
|
||||
where ${accounts.userId} = ${users.id} and ${accounts.providerId} = 'google')` })
|
||||
.from(users).where(eq(users.id, session.user.id)).limit(1);
|
||||
if (!user) redirect("/auth/login");
|
||||
return <div className="min-h-svh"><SiteHeader /><main className="grid min-h-[calc(100svh-4rem)] place-items-center p-4">
|
||||
<div className="w-full max-w-sm"><ProfileForm {...user} nextPath={returnPath} setup /></div>
|
||||
<div className="w-full max-w-sm"><ProfileForm {...user} nextPath={returnPath} setup
|
||||
googlePhotoDefault={Boolean(user.image && user.hasGoogleAccount)} /></div>
|
||||
</main></div>;
|
||||
}
|
||||
if (returnPath !== nextPath) redirect(returnPath);
|
||||
@@ -31,6 +35,7 @@ export async function AccountPage({ mode, next, verified, verificationError, set
|
||||
if (process.env.NODE_ENV !== "development" && !siteKey) throw new Error("TURNSTILE_SITE_KEY is required");
|
||||
return <div className="min-h-svh"><SiteHeader /><main className="grid min-h-[calc(100svh-4rem)] place-items-center p-4">
|
||||
<AccountForm mode={mode} siteKey={siteKey} nextPath={nextPath} googleEnabled={isGoogleAuthEnabled()}
|
||||
verified={verified} verificationError={verificationError} />
|
||||
verified={verified} verificationError={verificationError} accountNotLinkedError={accountNotLinkedError}
|
||||
googleSignInError={googleSignInError} />
|
||||
</main></div>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user