Skip to content

Commit b60b098

Browse files
committed
api key v1
1 parent b229639 commit b60b098

File tree

2 files changed

+48
-19
lines changed

2 files changed

+48
-19
lines changed

packages/auth/src/auth.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { betterAuth } from "better-auth";
2-
import { customSession, multiSession, twoFactor, emailOTP, magicLink, organization } from "better-auth/plugins";
3-
import { db, eq, user, websites, account, inArray } from "@databuddy/db";
2+
import { customSession, twoFactor, emailOTP, magicLink, organization } from "better-auth/plugins";
3+
import { db, eq, user, websites, inArray } from "@databuddy/db";
44
import { Resend } from "resend";
55
import { getRedisCache } from "@databuddy/redis";
66

packages/db/src/drizzle/schema.ts

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -678,40 +678,68 @@ export const team = pgTable(
678678
],
679679
);
680680

681+
export const apiKeyType = pgEnum("api_key_type", ["user", "sdk", "automation"]);
682+
export const apiScope = pgEnum("api_scope", [
683+
"read:data",
684+
"write:data",
685+
"read:experiments",
686+
"track:events",
687+
"admin:apikeys",
688+
]);
689+
681690
export const apikey = pgTable(
682691
"apikey",
683692
{
684693
id: text().primaryKey().notNull(),
685-
name: text(),
686-
start: text(),
687-
prefix: text(),
694+
name: text().notNull(),
695+
prefix: text().notNull(),
696+
start: text().notNull(),
688697
key: text().notNull(),
689-
userId: text("user_id").notNull(),
698+
userId: text("user_id"),
699+
organizationId: text("organization_id"),
700+
type: apiKeyType("type").notNull().default("user"),
701+
scopes: apiScope("scopes").array().notNull().default([]),
702+
enabled: boolean("enabled").notNull().default(true),
703+
rateLimitEnabled: boolean("rate_limit_enabled").notNull().default(true),
704+
rateLimitTimeWindow: integer("rate_limit_time_window"),
705+
rateLimitMax: integer("rate_limit_max"),
706+
requestCount: integer("request_count").notNull().default(0),
707+
remaining: integer("remaining"),
708+
lastRequest: timestamp("last_request", { mode: "string" }),
709+
lastRefillAt: timestamp("last_refill_at", { mode: "string" }),
690710
refillInterval: integer("refill_interval"),
691711
refillAmount: integer("refill_amount"),
692-
lastRefillAt: timestamp("last_refill_at", { mode: "string" }),
693-
enabled: boolean().default(true),
694-
rateLimitEnabled: boolean("rate_limit_enabled").default(true),
695-
rateLimitTimeWindow: integer("rate_limit_time_window").default(86400000),
696-
rateLimitMax: integer("rate_limit_max").default(10),
697-
requestCount: integer("request_count"),
698-
remaining: integer(),
699-
lastRequest: timestamp("last_request", { mode: "string" }),
700712
expiresAt: timestamp("expires_at", { mode: "string" }),
701-
createdAt: timestamp("created_at", { mode: "string" }).notNull(),
702-
updatedAt: timestamp("updated_at", { mode: "string" }).notNull(),
703-
permissions: text(),
704-
metadata: text(),
713+
metadata: jsonb("metadata").default({}),
714+
createdAt: timestamp("created_at", { mode: "string" }).notNull().default(sql`CURRENT_TIMESTAMP`),
715+
updatedAt: timestamp("updated_at", { mode: "string" }).notNull().default(sql`CURRENT_TIMESTAMP`),
705716
},
706717
(table) => [
707718
foreignKey({
708719
columns: [table.userId],
709720
foreignColumns: [user.id],
710721
name: "apikey_user_id_user_id_fk",
711722
}).onDelete("cascade"),
723+
foreignKey({
724+
columns: [table.organizationId],
725+
foreignColumns: [organization.id],
726+
name: "apikey_organization_id_organization_id_fk",
727+
}).onDelete("cascade"),
728+
index("apikey_user_id_idx").using(
729+
"btree",
730+
table.userId.asc().nullsLast().op("text_ops"),
731+
),
732+
index("apikey_organization_id_idx").using(
733+
"btree",
734+
table.organizationId.asc().nullsLast().op("text_ops"),
735+
),
736+
index("apikey_prefix_idx").using(
737+
"btree",
738+
table.prefix.asc().nullsLast().op("text_ops"),
739+
),
740+
index("apikey_enabled_idx").using("btree", table.enabled.asc().nullsLast().op("boolean_ops")),
712741
],
713742
);
714-
715743
export const organization = pgTable(
716744
"organization",
717745
{
@@ -724,3 +752,4 @@ export const organization = pgTable(
724752
},
725753
(table) => [unique("organization_slug_unique").on(table.slug)],
726754
);
755+

0 commit comments

Comments
 (0)