Stonecrusher
Stonecrusher
TTCTheo's Typesafe Cult
Created by Steve Melons on 11/30/2023 in #questions
Extend next-auth session with drizzle adapter
Finally something totally working without any ts error and working fine in project: In schema.ts
export const users = createTable("user", {
id: varchar("id", { length: 255 })
.notNull()
.primaryKey()
.$defaultFn(() => crypto.randomUUID()),
name: varchar("name", { length: 255 }),
email: varchar("email", { length: 255 }).notNull(),
emailVerified: timestamp("email_verified", {
mode: "date",
withTimezone: true,
}).default(sql`CURRENT_TIMESTAMP`),
image: varchar("image", { length: 255 }),
role: varchar("role").default(Roles.User), // added role field
});
export const users = createTable("user", {
id: varchar("id", { length: 255 })
.notNull()
.primaryKey()
.$defaultFn(() => crypto.randomUUID()),
name: varchar("name", { length: 255 }),
email: varchar("email", { length: 255 }).notNull(),
emailVerified: timestamp("email_verified", {
mode: "date",
withTimezone: true,
}).default(sql`CURRENT_TIMESTAMP`),
image: varchar("image", { length: 255 }),
role: varchar("role").default(Roles.User), // added role field
});
In config.ts:
import { Adapter } from "next-auth/adapters";
import { api } from "@/trpc/server";

declare module "next-auth" {
interface Session extends DefaultSession {
user: {
id: string;
role: Roles;
} & DefaultSession["user"];
}
interface User {
role: Roles;
}
}
export const authConfig = {
providers: [
Google({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
],
adapter: DrizzleAdapter(db, {
usersTable: users,
accountsTable: accounts,
sessionsTable: sessions,
verificationTokensTable: verificationTokens,
}) as Adapter, // added as Adapter
callbacks: {
session: ({ session, user }) => ({
...session,
user: {
...session.user,
id: user.id,
role: user.role,
},
}),
async signIn({ user, profile }) {
if (user.id && user.email === "[email protected]") {
// set role in db
await api.auth.setRole({
id: user.id,
role: Roles.Super,
});
}
return true;
},
},
} satisfies NextAuthConfig;
import { Adapter } from "next-auth/adapters";
import { api } from "@/trpc/server";

declare module "next-auth" {
interface Session extends DefaultSession {
user: {
id: string;
role: Roles;
} & DefaultSession["user"];
}
interface User {
role: Roles;
}
}
export const authConfig = {
providers: [
Google({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
],
adapter: DrizzleAdapter(db, {
usersTable: users,
accountsTable: accounts,
sessionsTable: sessions,
verificationTokensTable: verificationTokens,
}) as Adapter, // added as Adapter
callbacks: {
session: ({ session, user }) => ({
...session,
user: {
...session.user,
id: user.id,
role: user.role,
},
}),
async signIn({ user, profile }) {
if (user.id && user.email === "[email protected]") {
// set role in db
await api.auth.setRole({
id: user.id,
role: Roles.Super,
});
}
return true;
},
},
} satisfies NextAuthConfig;
76 replies