From 392d6b6e5119de86fd918ea6dcacf0c716194aa1 Mon Sep 17 00:00:00 2001 From: Jorge Vargas Date: Fri, 7 Mar 2025 22:03:36 -0600 Subject: [PATCH] WIP --- package.json | 2 +- .../20250308034728_api_support/migration.sql | 29 +++++++++++++++++++ prisma/schema.prisma | 28 ++++++++++++++++++ src/auth.ts | 4 +-- src/utils/auth-client.ts | 4 +-- 5 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 prisma/migrations/20250308034728_api_support/migration.sql diff --git a/package.json b/package.json index 7db56cf..a17b6c3 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@types/react-dom": "^18.3.1", "astro": "^5.3.0", "astro-icon": "^1.1.1", - "better-auth": "^1.1.11", + "better-auth": "^1.2.3", "clsx": "^2.1.1", "nodemailer": "^6.10.0", "prisma": "^6.4.1", diff --git a/prisma/migrations/20250308034728_api_support/migration.sql b/prisma/migrations/20250308034728_api_support/migration.sql new file mode 100644 index 0000000..46b6d5c --- /dev/null +++ b/prisma/migrations/20250308034728_api_support/migration.sql @@ -0,0 +1,29 @@ +-- CreateTable +CREATE TABLE `apiKey` ( + `id` VARCHAR(191) NOT NULL, + `name` VARCHAR(191) NULL, + `start` VARCHAR(191) NULL, + `prefix` VARCHAR(191) NULL, + `key` VARCHAR(191) NOT NULL, + `userId` VARCHAR(255) NOT NULL, + `refillInterval` INTEGER NULL, + `refillAmmount` INTEGER NULL, + `lastRefillAt` DATETIME(3) NULL, + `enabled` BOOLEAN NOT NULL, + `rateLimitEnabled` BOOLEAN NOT NULL, + `rateLimitTimeWindow` INTEGER NULL, + `rateLimitMax` INTEGER NULL, + `requestCount` INTEGER NOT NULL, + `remaining` INTEGER NULL, + `lastRequest` DATETIME(3) NULL, + `expiresAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL, + `updatedAt` DATETIME(3) NOT NULL, + `permissions` VARCHAR(191) NULL, + `metadata` JSON NULL, + + PRIMARY KEY (`id`) +); + +-- AddForeignKey +ALTER TABLE `apiKey` ADD CONSTRAINT `apiKey_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f0d6762..cc15071 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -451,6 +451,7 @@ model users { submissions submissions[] sessions session[] accounts account[] + ApiKey ApiKey[] } model session { @@ -492,3 +493,30 @@ model account { user users @relation(fields: [userId], references: [id]) } + +model ApiKey { + id String @id + name String? + start String? + prefix String? + key String + userId String @db.VarChar(255) + user users @relation(fields: [userId], references: [id]) + refillInterval Int? + refillAmmount Int? + lastRefillAt DateTime? + enabled Boolean + rateLimitEnabled Boolean + rateLimitTimeWindow Int? + rateLimitMax Int? + requestCount Int + remaining Int? + lastRequest DateTime? + expiresAt DateTime? + createdAt DateTime + updatedAt DateTime + permissions String? + metadata Json? + + @@map("apiKey") +} diff --git a/src/auth.ts b/src/auth.ts index af95db4..86a3dbe 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -1,6 +1,6 @@ import { betterAuth } from 'better-auth' import { prismaAdapter } from 'better-auth/adapters/prisma' -import { username } from 'better-auth/plugins' +import { username, apiKey } from 'better-auth/plugins' import prismaClient from './utils/prisma-client' import { sendEmail } from 'utils/email' @@ -10,7 +10,7 @@ import verifyTemplate from 'utils/verifyTemplate' export const auth = betterAuth({ database: prismaAdapter(prismaClient, { provider: 'mysql' }), user: { modelName: 'users' }, - plugins: [username()], + plugins: [username(), apiKey()], emailVerification: { sendOnSignUp: true, autoSignInAfterVerification: true, diff --git a/src/utils/auth-client.ts b/src/utils/auth-client.ts index 3b7e592..fc187aa 100644 --- a/src/utils/auth-client.ts +++ b/src/utils/auth-client.ts @@ -1,7 +1,7 @@ import { createAuthClient } from 'better-auth/client' -import { usernameClient } from 'better-auth/client/plugins' +import { apiKeyClient, usernameClient } from 'better-auth/client/plugins' export const authClient = createAuthClient({ - plugins: [usernameClient()] + plugins: [usernameClient(), apiKeyClient()] }) export const { useSession, signIn, signUp, signOut, forgetPassword, resetPassword } = authClient