diff --git a/autogpt_platform/backend/migrations/20241108170448_add_api_key_support/migration.sql b/autogpt_platform/backend/migrations/20241108170448_add_api_key_support/migration.sql new file mode 100644 index 000000000000..6c4bbfd4ca7c --- /dev/null +++ b/autogpt_platform/backend/migrations/20241108170448_add_api_key_support/migration.sql @@ -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; diff --git a/autogpt_platform/backend/schema.prisma b/autogpt_platform/backend/schema.prisma index 3fedcb37171c..b8df6b1ed7ae 100644 --- a/autogpt_platform/backend/schema.prisma +++ b/autogpt_platform/backend/schema.prisma @@ -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 +}