aboutsummaryrefslogtreecommitdiff
path: root/packages/web/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'packages/web/src/server')
-rw-r--r--packages/web/src/server/api/routers/post.ts2
-rw-r--r--packages/web/src/server/api/trpc.ts13
-rw-r--r--packages/web/src/server/auth/config.ts66
-rw-r--r--packages/web/src/server/auth/index.ts21
-rw-r--r--packages/web/src/server/db/schema.ts80
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] })],
-);