diff --git a/api/drizzle.config.ts b/api/drizzle.config.ts new file mode 100644 index 0000000..9828696 --- /dev/null +++ b/api/drizzle.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "drizzle-kit"; +import { env } from "@/env"; + +export default defineConfig({ + out: "./drizzle", + schema: "./src/db/schema/*", + dialect: "postgresql", + dbCredentials: { + url: env.DATABASE_URL, + }, +}); diff --git a/api/drizzle/0000_deep_maelstrom.sql b/api/drizzle/0000_long_puff_adder.sql similarity index 70% rename from api/drizzle/0000_deep_maelstrom.sql rename to api/drizzle/0000_long_puff_adder.sql index 78a5017..2e13614 100644 --- a/api/drizzle/0000_deep_maelstrom.sql +++ b/api/drizzle/0000_long_puff_adder.sql @@ -1,4 +1,6 @@ -CREATE TABLE "account" ( +CREATE SCHEMA "shared"; +--> statement-breakpoint +CREATE TABLE "shared"."account" ( "id" text PRIMARY KEY NOT NULL, "account_id" text NOT NULL, "provider_id" text NOT NULL, @@ -14,7 +16,7 @@ CREATE TABLE "account" ( "updated_at" timestamp NOT NULL ); --> statement-breakpoint -CREATE TABLE "apikey" ( +CREATE TABLE "shared"."apikey" ( "id" text PRIMARY KEY NOT NULL, "name" text, "start" text, @@ -38,7 +40,7 @@ CREATE TABLE "apikey" ( "metadata" text ); --> statement-breakpoint -CREATE TABLE "session" ( +CREATE TABLE "shared"."session" ( "id" text PRIMARY KEY NOT NULL, "expires_at" timestamp NOT NULL, "token" text NOT NULL, @@ -50,7 +52,7 @@ CREATE TABLE "session" ( CONSTRAINT "session_token_unique" UNIQUE("token") ); --> statement-breakpoint -CREATE TABLE "user" ( +CREATE TABLE "shared"."user" ( "id" text PRIMARY KEY NOT NULL, "name" text NOT NULL, "email" text NOT NULL, @@ -64,7 +66,7 @@ CREATE TABLE "user" ( CONSTRAINT "user_username_unique" UNIQUE("username") ); --> statement-breakpoint -CREATE TABLE "verification" ( +CREATE TABLE "shared"."verification" ( "id" text PRIMARY KEY NOT NULL, "identifier" text NOT NULL, "value" text NOT NULL, @@ -73,6 +75,6 @@ CREATE TABLE "verification" ( "updated_at" timestamp ); --> statement-breakpoint -ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "apikey" ADD CONSTRAINT "apikey_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file +ALTER TABLE "shared"."account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "shared"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shared"."apikey" ADD CONSTRAINT "apikey_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "shared"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "shared"."session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "shared"."user"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/api/drizzle/meta/0000_snapshot.json b/api/drizzle/meta/0000_snapshot.json index fb99fd2..12ae45d 100644 --- a/api/drizzle/meta/0000_snapshot.json +++ b/api/drizzle/meta/0000_snapshot.json @@ -1,12 +1,12 @@ { - "id": "284c4b80-7cd3-4277-8c67-f346be8d83c2", + "id": "033383bb-5508-4523-b1f5-d7b7f0c00a33", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", "tables": { - "public.account": { + "shared.account": { "name": "account", - "schema": "", + "schema": "shared", "columns": { "id": { "name": "id", @@ -93,6 +93,7 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", + "schemaTo": "shared", "columnsFrom": [ "user_id" ], @@ -109,9 +110,9 @@ "checkConstraints": {}, "isRLSEnabled": false }, - "public.apikey": { + "shared.apikey": { "name": "apikey", - "schema": "", + "schema": "shared", "columns": { "id": { "name": "id", @@ -250,6 +251,7 @@ "name": "apikey_user_id_user_id_fk", "tableFrom": "apikey", "tableTo": "user", + "schemaTo": "shared", "columnsFrom": [ "user_id" ], @@ -266,9 +268,9 @@ "checkConstraints": {}, "isRLSEnabled": false }, - "public.session": { + "shared.session": { "name": "session", - "schema": "", + "schema": "shared", "columns": { "id": { "name": "id", @@ -325,6 +327,7 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", + "schemaTo": "shared", "columnsFrom": [ "user_id" ], @@ -349,9 +352,9 @@ "checkConstraints": {}, "isRLSEnabled": false }, - "public.user": { + "shared.user": { "name": "user", - "schema": "", + "schema": "shared", "columns": { "id": { "name": "id", @@ -431,9 +434,9 @@ "checkConstraints": {}, "isRLSEnabled": false }, - "public.verification": { + "shared.verification": { "name": "verification", - "schema": "", + "schema": "shared", "columns": { "id": { "name": "id", @@ -482,7 +485,9 @@ } }, "enums": {}, - "schemas": {}, + "schemas": { + "shared": "shared" + }, "sequences": {}, "roles": {}, "policies": {}, diff --git a/api/drizzle/meta/_journal.json b/api/drizzle/meta/_journal.json index 6bb6524..e2af491 100644 --- a/api/drizzle/meta/_journal.json +++ b/api/drizzle/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "7", - "when": 1752191664960, - "tag": "0000_deep_maelstrom", + "when": 1752200400975, + "tag": "0000_long_puff_adder", "breakpoints": true } ] diff --git a/api/src/db/index.ts b/api/src/db/index.ts index f0c43f0..520510c 100644 --- a/api/src/db/index.ts +++ b/api/src/db/index.ts @@ -1,4 +1,5 @@ import { drizzle } from "drizzle-orm/bun-sql"; import { env } from "@/env"; +import * as authSchema from "./schema/auth"; -export const db = drizzle(env.DATABASE_URL); +export const db = drizzle(env.DATABASE_URL, { schema: { ...authSchema } }); diff --git a/api/src/db/schema/auth.ts b/api/src/db/schema/auth.ts index 32e9782..8629a8b 100644 --- a/api/src/db/schema/auth.ts +++ b/api/src/db/schema/auth.ts @@ -1,12 +1,14 @@ import { boolean, integer, - pgTable, + pgSchema, text, timestamp, } from "drizzle-orm/pg-core"; -export const user = pgTable("user", { +export const shared = pgSchema("shared"); + +export const user = shared.table("user", { id: text("id").primaryKey(), name: text("name").notNull(), email: text("email").notNull().unique(), @@ -24,7 +26,7 @@ export const user = pgTable("user", { displayUsername: text("display_username"), }); -export const session = pgTable("session", { +export const session = shared.table("session", { id: text("id").primaryKey(), expiresAt: timestamp("expires_at").notNull(), token: text("token").notNull().unique(), @@ -37,7 +39,7 @@ export const session = pgTable("session", { .references(() => user.id, { onDelete: "cascade" }), }); -export const account = pgTable("account", { +export const account = shared.table("account", { id: text("id").primaryKey(), accountId: text("account_id").notNull(), providerId: text("provider_id").notNull(), @@ -55,7 +57,7 @@ export const account = pgTable("account", { updatedAt: timestamp("updated_at").notNull(), }); -export const verification = pgTable("verification", { +export const verification = shared.table("verification", { id: text("id").primaryKey(), identifier: text("identifier").notNull(), value: text("value").notNull(), @@ -64,7 +66,7 @@ export const verification = pgTable("verification", { updatedAt: timestamp("updated_at").$defaultFn(() => new Date()), }); -export const apikey = pgTable("apikey", { +export const apikey = shared.table("apikey", { id: text("id").primaryKey(), name: text("name"), start: text("start"), diff --git a/api/src/db/schema/index.ts b/api/src/db/schema/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/api/src/index.ts b/api/src/index.ts index 399d555..93b7adb 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -1,14 +1,14 @@ import { Hono } from "hono"; import { logger } from "hono/logger"; -import { env } from "./env"; +import { auth } from "./lib/auth"; const app = new Hono(); app.use(logger()); + +app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw)); app.get("/", (c) => { return c.text("Hello Hono!"); }); -console.log(`using env: ${JSON.stringify(env, null, 2)}`); - export default app; diff --git a/api/src/lib/authClient.ts b/api/src/lib/authClient.ts new file mode 100644 index 0000000..ff3857d --- /dev/null +++ b/api/src/lib/authClient.ts @@ -0,0 +1,11 @@ +// mainly for testing +// + +import { createAuthClient } from "better-auth/client"; +import { apiKeyClient } from "better-auth/client/plugins"; +import { env } from "@/env"; + +export const authClient = createAuthClient({ + baseURL: env.BETTER_AUTH_URL, + plugins: [apiKeyClient()], +});