v2 platform runtime (docs 22 Phase 2/4/7 + 17): Project/Environment + Config + Storage + Observability
- Project/Environment model with default environments (dev/staging/prod) - Config Runtime: cascade resolution (platform→org→project→env), secrets via vault - Storage Runtime: local provider, sha256 dedup, integrity check, file list/upload/delete - Observability: execution query, per-action summary (success rate, avg, p95), health - Realtime SSE: workspace event stream endpoint (GET /api/v1/v2/realtime/events) - Phase 1 acceptance: core.health.check, core.user.create, core.user.list - Actions: core.project.*, core.config.*, core.file.*, core.user.* (62 total)
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "Project" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"slug" TEXT NOT NULL,
|
||||
"description" TEXT NOT NULL DEFAULT '',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Environment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"projectId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"level" TEXT NOT NULL DEFAULT 'development',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Environment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "ConfigValue" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"scope" TEXT NOT NULL,
|
||||
"scopeId" TEXT,
|
||||
"key" TEXT NOT NULL,
|
||||
"value" TEXT NOT NULL,
|
||||
"isSecret" BOOLEAN NOT NULL DEFAULT false,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "ConfigValue_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "FileEntry" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"originalName" TEXT NOT NULL,
|
||||
"mimeType" TEXT NOT NULL,
|
||||
"size" INTEGER NOT NULL,
|
||||
"sha256" TEXT NOT NULL,
|
||||
"storageKey" TEXT NOT NULL,
|
||||
"provider" TEXT NOT NULL DEFAULT 'local',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "FileEntry_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Project_workspaceId_idx" ON "Project"("workspaceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Project_workspaceId_slug_key" ON "Project"("workspaceId", "slug");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Environment_projectId_name_key" ON "Environment"("projectId", "name");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ConfigValue_workspaceId_key_idx" ON "ConfigValue"("workspaceId", "key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "ConfigValue_workspaceId_scope_scopeId_key_key" ON "ConfigValue"("workspaceId", "scope", "scopeId", "key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "FileEntry_workspaceId_createdAt_idx" ON "FileEntry"("workspaceId", "createdAt");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Environment" ADD CONSTRAINT "Environment_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
@@ -758,3 +758,73 @@ model ActionExecution {
|
||||
@@index([actionId, createdAt])
|
||||
@@index([status])
|
||||
}
|
||||
|
||||
// ============ v2 P0/P1:Project / Environment / Config / Storage ============
|
||||
|
||||
/// # 数据库表 devos_projects:项目(组织内的工作与环境分组,docs 22 Phase 2)
|
||||
model Project {
|
||||
id String @id @default(uuid())
|
||||
workspaceId String
|
||||
name String
|
||||
slug String
|
||||
description String @default("")
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
environments Environment[]
|
||||
|
||||
@@unique([workspaceId, slug])
|
||||
@@index([workspaceId])
|
||||
}
|
||||
|
||||
/// # 数据库表 devos_environments:项目环境(development/staging/production,docs 22 Phase 2)
|
||||
model Environment {
|
||||
id String @id @default(uuid())
|
||||
projectId String
|
||||
name String
|
||||
/// # 数据库字段 环境级别:development / staging / production
|
||||
level String @default("development")
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([projectId, name])
|
||||
}
|
||||
|
||||
/// # 数据库表 devos_config_values:配置运行时(docs 22 Phase 4,级联解析)
|
||||
model ConfigValue {
|
||||
id String @id @default(uuid())
|
||||
workspaceId String
|
||||
/// # 数据库字段 作用域:platform / organization / project / environment
|
||||
scope String
|
||||
/// # 数据库字段 作用域对象 ID(platform 为空)
|
||||
scopeId String?
|
||||
key String
|
||||
value String
|
||||
/// # 数据库字段 是否敏感(读取时脱敏,存储用保险库加密)
|
||||
isSecret Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([workspaceId, scope, scopeId, key])
|
||||
@@index([workspaceId, key])
|
||||
}
|
||||
|
||||
/// # 数据库表 devos_files:存储运行时文件记录(docs 15,File Resource)
|
||||
model FileEntry {
|
||||
id String @id @default(uuid())
|
||||
workspaceId String
|
||||
name String
|
||||
originalName String
|
||||
mimeType String
|
||||
size Int
|
||||
sha256 String
|
||||
/// # 数据库字段 存储键(存储桶内路径,不含原始文件名)
|
||||
storageKey String
|
||||
/// # 数据库字段 存储提供者:local(后续 S3 兼容)
|
||||
provider String @default("local")
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@index([workspaceId, createdAt])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user