diff options
Diffstat (limited to 'packages/web/src/server')
| -rw-r--r-- | packages/web/src/server/api/routers/post.ts | 2 | ||||
| -rw-r--r-- | packages/web/src/server/api/trpc.ts | 13 | ||||
| -rw-r--r-- | packages/web/src/server/auth/config.ts | 66 | ||||
| -rw-r--r-- | packages/web/src/server/auth/index.ts | 21 | ||||
| -rw-r--r-- | packages/web/src/server/db/schema.ts | 80 |
5 files changed, 26 insertions, 156 deletions
diff --git a/packages/web/src/server/api/routers/post.ts b/packages/web/src/server/api/routers/post.ts index 2bd03a4..301e252 100644 --- a/packages/web/src/server/api/routers/post.ts +++ b/packages/web/src/server/api/routers/post.ts @@ -20,7 +20,7 @@ export const postRouter = createTRPCRouter({ .mutation(async ({ ctx, input }) => { await ctx.db.insert(posts).values({ name: input.name, - createdById: ctx.session.user.id, + createdById: ctx.user.id, }); }), diff --git a/packages/web/src/server/api/trpc.ts b/packages/web/src/server/api/trpc.ts index 65c86f4..e4dd0ab 100644 --- a/packages/web/src/server/api/trpc.ts +++ b/packages/web/src/server/api/trpc.ts @@ -10,7 +10,7 @@ import { initTRPC, TRPCError } from "@trpc/server"; import superjson from "superjson"; import { ZodError } from "zod"; -import { auth } from "~/server/auth"; +import { getUser } from "~/server/auth"; import { db } from "~/server/db"; /** @@ -26,11 +26,11 @@ import { db } from "~/server/db"; * @see https://trpc.io/docs/server/context */ export const createTRPCContext = async (opts: { headers: Headers }) => { - const session = await auth(); + const user = await getUser(); return { db, - session, + user, ...opts, }; }; @@ -114,21 +114,20 @@ export const publicProcedure = t.procedure.use(timingMiddleware); * Protected (authenticated) procedure * * If you want a query or mutation to ONLY be accessible to logged in users, use this. It verifies - * the session is valid and guarantees `ctx.session.user` is not null. + * the user is authenticated and guarantees `ctx.user` is not null. * * @see https://trpc.io/docs/procedures */ export const protectedProcedure = t.procedure .use(timingMiddleware) .use(({ ctx, next }) => { - if (!ctx.session?.user) { + if (!ctx.user) { throw new TRPCError({ code: "UNAUTHORIZED" }); } return next({ ctx: { - // infers the `session` as non-nullable - session: { ...ctx.session, user: ctx.session.user }, + user: ctx.user, }, }); }); diff --git a/packages/web/src/server/auth/config.ts b/packages/web/src/server/auth/config.ts deleted file mode 100644 index b3307cc..0000000 --- a/packages/web/src/server/auth/config.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { DrizzleAdapter } from "@auth/drizzle-adapter"; -import type { DefaultSession, NextAuthConfig } from "next-auth"; -import DiscordProvider from "next-auth/providers/discord"; -import { db } from "~/server/db"; -import { - accounts, - sessions, - users, - verificationTokens, -} from "~/server/db/schema"; - -/** - * Module augmentation for `next-auth` types. Allows us to add custom properties to the `session` - * object and keep type safety. - * - * @see https://next-auth.js.org/getting-started/typescript#module-augmentation - */ -declare module "next-auth" { - interface Session extends DefaultSession { - user: { - id: string; - // ...other properties - // role: UserRole; - } & DefaultSession["user"]; - } - - // interface User { - // // ...other properties - // // role: UserRole; - // } -} - -/** - * Options for NextAuth.js used to configure adapters, providers, callbacks, etc. - * - * @see https://next-auth.js.org/configuration/options - */ -export const authConfig = { - providers: [ - DiscordProvider, - /** - * ...add more providers here. - * - * Most other providers require a bit more work than the Discord provider. For example, the - * GitHub provider requires you to add the `refresh_token_expires_in` field to the Account - * model. Refer to the NextAuth.js docs for the provider you want to use. Example: - * - * @see https://next-auth.js.org/providers/github - */ - ], - adapter: DrizzleAdapter(db, { - usersTable: users, - accountsTable: accounts, - sessionsTable: sessions, - verificationTokensTable: verificationTokens, - }), - callbacks: { - session: ({ session, user }) => ({ - ...session, - user: { - ...session.user, - id: user.id, - }, - }), - }, -} satisfies NextAuthConfig; diff --git a/packages/web/src/server/auth/index.ts b/packages/web/src/server/auth/index.ts index 21f0ee0..f94f4e4 100644 --- a/packages/web/src/server/auth/index.ts +++ b/packages/web/src/server/auth/index.ts @@ -1,8 +1,19 @@ -import NextAuth from "next-auth"; import { cache } from "react"; -import { authConfig } from "./config"; +import { createClient } from "~/lib/supabase/server"; -const { auth: uncachedAuth, handlers, signIn, signOut } = NextAuth(authConfig); -const auth = cache(uncachedAuth); +export const getUser = cache(async () => { + const supabase = await createClient(); + const { + data: { user }, + } = await supabase.auth.getUser(); -export { auth, handlers, signIn, signOut }; + return user; +}); +export const getSession = cache(async () => { + const supabase = await createClient(); + const { + data: { session }, + } = await supabase.auth.getSession(); + + return session; +}); diff --git a/packages/web/src/server/db/schema.ts b/packages/web/src/server/db/schema.ts index 08c1551..aae0ace 100644 --- a/packages/web/src/server/db/schema.ts +++ b/packages/web/src/server/db/schema.ts @@ -1,6 +1,4 @@ -import { relations } from "drizzle-orm"; -import { index, pgTableCreator, primaryKey } from "drizzle-orm/pg-core"; -import type { AdapterAccount } from "next-auth/adapters"; +import { index, pgTableCreator } from "drizzle-orm/pg-core"; /** * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same @@ -14,13 +12,10 @@ export const posts = createTable( (d) => ({ id: d.integer().primaryKey().generatedByDefaultAsIdentity(), name: d.varchar({ length: 256 }), - createdById: d - .varchar({ length: 255 }) - .notNull() - .references(() => users.id), + createdById: d.varchar({ length: 255 }).notNull(), createdAt: d .timestamp({ withTimezone: true }) - .$defaultFn(() => /* @__PURE__ */ new Date()) + .$defaultFn(() => new Date()) .notNull(), updatedAt: d.timestamp({ withTimezone: true }).$onUpdate(() => new Date()), }), @@ -29,72 +24,3 @@ export const posts = createTable( index("name_idx").on(t.name), ], ); -export const users = createTable("user", (d) => ({ - id: d - .varchar({ length: 255 }) - .notNull() - .primaryKey() - .$defaultFn(() => crypto.randomUUID()), - name: d.varchar({ length: 255 }), - email: d.varchar({ length: 255 }).notNull(), - emailVerified: d - .timestamp({ - mode: "date", - withTimezone: true, - }) - .$defaultFn(() => /* @__PURE__ */ new Date()), - image: d.varchar({ length: 255 }), -})); -export const usersRelations = relations(users, ({ many }) => ({ - accounts: many(accounts), -})); -export const accounts = createTable( - "account", - (d) => ({ - userId: d - .varchar({ length: 255 }) - .notNull() - .references(() => users.id), - type: d.varchar({ length: 255 }).$type<AdapterAccount["type"]>().notNull(), - provider: d.varchar({ length: 255 }).notNull(), - providerAccountId: d.varchar({ length: 255 }).notNull(), - refresh_token: d.text(), - access_token: d.text(), - expires_at: d.integer(), - token_type: d.varchar({ length: 255 }), - scope: d.varchar({ length: 255 }), - id_token: d.text(), - session_state: d.varchar({ length: 255 }), - }), - (t) => [ - primaryKey({ columns: [t.provider, t.providerAccountId] }), - index("account_user_id_idx").on(t.userId), - ], -); -export const accountsRelations = relations(accounts, ({ one }) => ({ - user: one(users, { fields: [accounts.userId], references: [users.id] }), -})); -export const sessions = createTable( - "session", - (d) => ({ - sessionToken: d.varchar({ length: 255 }).notNull().primaryKey(), - userId: d - .varchar({ length: 255 }) - .notNull() - .references(() => users.id), - expires: d.timestamp({ mode: "date", withTimezone: true }).notNull(), - }), - (t) => [index("t_user_id_idx").on(t.userId)], -); -export const sessionsRelations = relations(sessions, ({ one }) => ({ - user: one(users, { fields: [sessions.userId], references: [users.id] }), -})); -export const verificationTokens = createTable( - "verification_token", - (d) => ({ - identifier: d.varchar({ length: 255 }).notNull(), - token: d.varchar({ length: 255 }).notNull(), - expires: d.timestamp({ mode: "date", withTimezone: true }).notNull(), - }), - (t) => [primaryKey({ columns: [t.identifier, t.token] })], -); |