feat(backend): Add API key DB table (#8593)

* add api key db tables

* remove uniqueness constraint on prefix

* add postfix
pull/8496/head^2
Aarushi 2024-11-08 11:48:37 -06:00 committed by GitHub
parent f719c7e70e
commit 359ae8307a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,44 @@
-- CreateEnum
CREATE TYPE "APIKeyPermission" AS ENUM ('EXECUTE_GRAPH', 'READ_GRAPH', 'EXECUTE_BLOCK', 'READ_BLOCK');
-- CreateEnum
CREATE TYPE "APIKeyStatus" AS ENUM ('ACTIVE', 'REVOKED', 'SUSPENDED');
-- CreateTable
CREATE TABLE "APIKey" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"prefix" TEXT NOT NULL,
"postfix" TEXT NOT NULL,
"key" TEXT NOT NULL,
"status" "APIKeyStatus" NOT NULL DEFAULT 'ACTIVE',
"permissions" "APIKeyPermission"[],
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"lastUsedAt" TIMESTAMP(3),
"revokedAt" TIMESTAMP(3),
"description" TEXT,
"userId" TEXT NOT NULL,
CONSTRAINT "APIKey_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "APIKey_key_key" ON "APIKey"("key");
-- CreateIndex
CREATE INDEX "APIKey_key_idx" ON "APIKey"("key");
-- CreateIndex
CREATE INDEX "APIKey_prefix_idx" ON "APIKey"("prefix");
-- CreateIndex
CREATE INDEX "APIKey_userId_idx" ON "APIKey"("userId");
-- CreateIndex
CREATE INDEX "APIKey_status_idx" ON "APIKey"("status");
-- CreateIndex
CREATE INDEX "APIKey_userId_status_idx" ON "APIKey"("userId", "status");
-- AddForeignKey
ALTER TABLE "APIKey" ADD CONSTRAINT "APIKey_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -27,6 +27,7 @@ model User {
AnalyticsDetails AnalyticsDetails[]
AnalyticsMetrics AnalyticsMetrics[]
UserBlockCredit UserBlockCredit[]
APIKeys APIKey[]
@@index([id])
@@index([email])
@ -277,3 +278,42 @@ model UserBlockCredit {
@@id(name: "creditTransactionIdentifier", [transactionKey, userId])
}
enum APIKeyPermission {
EXECUTE_GRAPH // Can execute agent graphs
READ_GRAPH // Can get graph versions and details
EXECUTE_BLOCK // Can execute individual blocks
READ_BLOCK // Can get block information
}
model APIKey {
id String @id @default(uuid())
name String
prefix String // First 8 chars for identification
postfix String
key String @unique // Hashed key
status APIKeyStatus @default(ACTIVE)
permissions APIKeyPermission[]
createdAt DateTime @default(now())
lastUsedAt DateTime?
revokedAt DateTime?
description String?
// Relation to user
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([key])
@@index([prefix])
@@index([userId])
@@index([status])
@@index([userId, status])
}
enum APIKeyStatus {
ACTIVE
REVOKED
SUSPENDED
}