chore: import upstream snapshot with attribution
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,319 @@
|
||||
import { z } from 'zod'
|
||||
import {
|
||||
introspectionResponseSchema,
|
||||
nonEmptyRecordSchema,
|
||||
sqlRowsResponseSchema,
|
||||
} from '@/lib/api/contracts/tools/databases/shared'
|
||||
import {
|
||||
type ContractBodyInput,
|
||||
type ContractJsonResponse,
|
||||
defineRouteContract,
|
||||
} from '@/lib/api/contracts/types'
|
||||
|
||||
const secureFlagSchema = z
|
||||
.union([z.boolean(), z.string()])
|
||||
.transform((value) => (typeof value === 'string' ? value.toLowerCase() === 'true' : value))
|
||||
.default(true)
|
||||
|
||||
export const clickhouseConnectionBodySchema = z.object({
|
||||
host: z.string().min(1, 'Host is required'),
|
||||
port: z.coerce.number().int().positive('Port must be a positive integer'),
|
||||
database: z.string().min(1, 'Database name is required'),
|
||||
username: z.string().min(1, 'Username is required'),
|
||||
password: z.string().default(''),
|
||||
secure: secureFlagSchema,
|
||||
})
|
||||
|
||||
export const clickhouseQueryBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
query: z.string().min(1, 'Query is required'),
|
||||
})
|
||||
|
||||
export const clickhouseExecuteBodySchema = clickhouseQueryBodySchema
|
||||
|
||||
export const clickhouseInsertBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().min(1, 'Table name is required'),
|
||||
data: nonEmptyRecordSchema('Data object cannot be empty'),
|
||||
})
|
||||
|
||||
export const clickhouseUpdateBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().min(1, 'Table name is required'),
|
||||
data: nonEmptyRecordSchema('Data object cannot be empty'),
|
||||
where: z.string().min(1, 'WHERE clause is required'),
|
||||
})
|
||||
|
||||
export const clickhouseDeleteBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().min(1, 'Table name is required'),
|
||||
where: z.string().min(1, 'WHERE clause is required'),
|
||||
})
|
||||
|
||||
export const clickhouseIntrospectBodySchema = clickhouseConnectionBodySchema
|
||||
|
||||
export const clickhouseQueryContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/query',
|
||||
body: clickhouseQueryBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseExecuteContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/execute',
|
||||
body: clickhouseExecuteBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseInsertContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/insert',
|
||||
body: clickhouseInsertBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseUpdateContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/update',
|
||||
body: clickhouseUpdateBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseDeleteContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/delete',
|
||||
body: clickhouseDeleteBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseIntrospectContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/introspect',
|
||||
body: clickhouseIntrospectBodySchema,
|
||||
response: { mode: 'json', schema: introspectionResponseSchema },
|
||||
})
|
||||
|
||||
const clickhouseTableBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().min(1, 'Table name is required'),
|
||||
})
|
||||
|
||||
const clickhouseCountResponseSchema = z.object({
|
||||
message: z.string(),
|
||||
count: z.number(),
|
||||
})
|
||||
|
||||
const clickhouseDdlResponseSchema = z.object({
|
||||
message: z.string(),
|
||||
ddl: z.string(),
|
||||
})
|
||||
|
||||
export const clickhouseListDatabasesBodySchema = clickhouseConnectionBodySchema
|
||||
export const clickhouseListTablesBodySchema = clickhouseConnectionBodySchema
|
||||
export const clickhouseDescribeTableBodySchema = clickhouseTableBodySchema
|
||||
export const clickhouseShowCreateTableBodySchema = clickhouseTableBodySchema
|
||||
export const clickhouseCountRowsBodySchema = clickhouseTableBodySchema.extend({
|
||||
where: z.string().optional(),
|
||||
})
|
||||
export const clickhouseListPartitionsBodySchema = clickhouseTableBodySchema
|
||||
export const clickhouseListMutationsBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().optional(),
|
||||
onlyRunning: z
|
||||
.union([z.boolean(), z.string()])
|
||||
.transform((value) => (typeof value === 'string' ? value.toLowerCase() === 'true' : value))
|
||||
.default(false),
|
||||
})
|
||||
export const clickhouseListRunningQueriesBodySchema = clickhouseConnectionBodySchema
|
||||
export const clickhouseTableStatsBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().optional(),
|
||||
})
|
||||
export const clickhouseListClustersBodySchema = clickhouseConnectionBodySchema
|
||||
export const clickhouseCreateDatabaseBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
name: z.string().min(1, 'Database name is required'),
|
||||
})
|
||||
export const clickhouseDropDatabaseBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
name: z.string().min(1, 'Database name is required'),
|
||||
})
|
||||
export const clickhouseCreateTableBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
table: z.string().min(1, 'Table name is required'),
|
||||
columns: z
|
||||
.array(
|
||||
z.object({
|
||||
name: z.string().min(1, 'Column name is required'),
|
||||
type: z.string().min(1, 'Column type is required'),
|
||||
})
|
||||
)
|
||||
.min(1, 'At least one column is required'),
|
||||
engine: z.string().min(1).default('MergeTree'),
|
||||
orderBy: z.string().min(1, 'ORDER BY expression is required'),
|
||||
partitionBy: z.string().optional(),
|
||||
})
|
||||
export const clickhouseDropTableBodySchema = clickhouseTableBodySchema
|
||||
export const clickhouseTruncateTableBodySchema = clickhouseTableBodySchema
|
||||
export const clickhouseRenameTableBodySchema = clickhouseTableBodySchema.extend({
|
||||
newTable: z.string().min(1, 'New table name is required'),
|
||||
})
|
||||
export const clickhouseOptimizeTableBodySchema = clickhouseTableBodySchema.extend({
|
||||
final: z
|
||||
.union([z.boolean(), z.string()])
|
||||
.transform((value) => (typeof value === 'string' ? value.toLowerCase() === 'true' : value))
|
||||
.default(false),
|
||||
})
|
||||
export const clickhouseDropPartitionBodySchema = clickhouseTableBodySchema.extend({
|
||||
partition: z.string().min(1, 'Partition expression is required'),
|
||||
})
|
||||
export const clickhouseKillQueryBodySchema = clickhouseConnectionBodySchema.extend({
|
||||
queryId: z.string().min(1, 'Query ID is required'),
|
||||
})
|
||||
export const clickhouseInsertRowsBodySchema = clickhouseTableBodySchema.extend({
|
||||
rows: z.array(z.record(z.string(), z.unknown())).min(1, 'At least one row is required'),
|
||||
})
|
||||
|
||||
export const clickhouseListDatabasesContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/list-databases',
|
||||
body: clickhouseListDatabasesBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseListTablesContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/list-tables',
|
||||
body: clickhouseListTablesBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseDescribeTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/describe-table',
|
||||
body: clickhouseDescribeTableBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseShowCreateTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/show-create-table',
|
||||
body: clickhouseShowCreateTableBodySchema,
|
||||
response: { mode: 'json', schema: clickhouseDdlResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseCountRowsContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/count-rows',
|
||||
body: clickhouseCountRowsBodySchema,
|
||||
response: { mode: 'json', schema: clickhouseCountResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseListPartitionsContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/list-partitions',
|
||||
body: clickhouseListPartitionsBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseListMutationsContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/list-mutations',
|
||||
body: clickhouseListMutationsBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseListRunningQueriesContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/list-running-queries',
|
||||
body: clickhouseListRunningQueriesBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseTableStatsContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/table-stats',
|
||||
body: clickhouseTableStatsBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseListClustersContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/list-clusters',
|
||||
body: clickhouseListClustersBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseCreateDatabaseContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/create-database',
|
||||
body: clickhouseCreateDatabaseBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseDropDatabaseContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/drop-database',
|
||||
body: clickhouseDropDatabaseBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseCreateTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/create-table',
|
||||
body: clickhouseCreateTableBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseDropTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/drop-table',
|
||||
body: clickhouseDropTableBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseTruncateTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/truncate-table',
|
||||
body: clickhouseTruncateTableBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseRenameTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/rename-table',
|
||||
body: clickhouseRenameTableBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseOptimizeTableContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/optimize-table',
|
||||
body: clickhouseOptimizeTableBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseDropPartitionContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/drop-partition',
|
||||
body: clickhouseDropPartitionBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseKillQueryContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/kill-query',
|
||||
body: clickhouseKillQueryBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export const clickhouseInsertRowsContract = defineRouteContract({
|
||||
method: 'POST',
|
||||
path: '/api/tools/clickhouse/insert-rows',
|
||||
body: clickhouseInsertRowsBodySchema,
|
||||
response: { mode: 'json', schema: sqlRowsResponseSchema },
|
||||
})
|
||||
|
||||
export type ClickHouseQueryRequest = ContractBodyInput<typeof clickhouseQueryContract>
|
||||
export type ClickHouseQueryResponse = ContractJsonResponse<typeof clickhouseQueryContract>
|
||||
export type ClickHouseExecuteRequest = ContractBodyInput<typeof clickhouseExecuteContract>
|
||||
export type ClickHouseExecuteResponse = ContractJsonResponse<typeof clickhouseExecuteContract>
|
||||
export type ClickHouseInsertRequest = ContractBodyInput<typeof clickhouseInsertContract>
|
||||
export type ClickHouseInsertResponse = ContractJsonResponse<typeof clickhouseInsertContract>
|
||||
export type ClickHouseUpdateRequest = ContractBodyInput<typeof clickhouseUpdateContract>
|
||||
export type ClickHouseUpdateResponse = ContractJsonResponse<typeof clickhouseUpdateContract>
|
||||
export type ClickHouseDeleteRequest = ContractBodyInput<typeof clickhouseDeleteContract>
|
||||
export type ClickHouseDeleteResponse = ContractJsonResponse<typeof clickhouseDeleteContract>
|
||||
export type ClickHouseIntrospectRequest = ContractBodyInput<typeof clickhouseIntrospectContract>
|
||||
export type ClickHouseIntrospectResponse = ContractJsonResponse<typeof clickhouseIntrospectContract>
|
||||
Reference in New Issue
Block a user