import { z } from 'zod';
// Common schemas
const EnvVarSchema = z.object({
key: z.string().min(1),
value: z.string(),
description: z.string().optional(),
});
const GitRepositorySchema = z.object({
url: z.string().url(),
branch: z.string().optional(),
commitSha: z.string().optional(),
});
// Project schemas
export const ListProjectsSchema = z.object({
teamId: z.string().optional(),
});
export const CreateProjectSchema = z.object({
name: z.string().min(1).max(255),
description: z.string().optional(),
teamId: z.string().optional(),
});
// Application schemas
export const ListAppsSchema = z.object({
projectId: z.string().min(1),
});
export const GetAppSchema = z.object({
id: z.string().min(1),
});
export const CreateAppSchema = z.object({
projectId: z.string().min(1),
name: z.string().min(1).max(255),
description: z.string().optional(),
type: z.enum(['dockerfile', 'image', 'compose']),
gitRepository: GitRepositorySchema.optional(),
dockerImage: z.string().optional(),
dockerCompose: z.string().optional(),
environment: z.record(z.string()).optional(),
ports: z.array(z.number().int().positive()).optional(),
});
export const UpdateAppSchema = z.object({
id: z.string().min(1),
name: z.string().min(1).max(255).optional(),
description: z.string().optional(),
environment: z.record(z.string()).optional(),
ports: z.array(z.number().int().positive()).optional(),
});
export const DeleteAppSchema = z.object({
id: z.string().min(1),
});
// Deployment schemas
export const DeployAppSchema = z.object({
id: z.string().min(1),
force: z.boolean().default(false),
});
export const GetDeploymentStatusSchema = z.object({
deploymentId: z.string().min(1),
});
export const GetDeploymentLogsSchema = z.object({
deploymentId: z.string().min(1),
lines: z.number().int().positive().max(1000).optional().default(100),
});
// Template schemas
export const TemplateEnvVarSchema = z.object({
key: z.string().min(1),
description: z.string(),
required: z.boolean(),
defaultValue: z.string().optional(),
});
export const DeployTemplateSchema = z.object({
templateName: z.string().min(1),
projectId: z.string().min(1),
appName: z.string().min(1).max(255),
environment: z.record(z.string()),
gitRepo: z.string().url().optional(),
dockerImage: z.string().optional(),
buildType: z.enum(['dockerfile', 'image', 'compose']).default('dockerfile'),
branch: z.string().optional(),
overwrite: z.boolean().default(false),
});
// Safety schemas
export const CheckQuotaSchema = z.object({
projectId: z.string().min(1),
});
export const CheckNameConflictsSchema = z.object({
projectId: z.string().min(1),
name: z.string().min(1),
});
// Response schemas for validation
export const ProjectResponseSchema = z.object({
id: z.string(),
name: z.string(),
description: z.string().nullable(),
teamId: z.string().nullable(),
createdAt: z.string(),
updatedAt: z.string(),
});
export const ApplicationResponseSchema = z.object({
id: z.string(),
name: z.string(),
description: z.string().nullable(),
projectId: z.string(),
type: z.enum(['dockerfile', 'image', 'compose']),
gitRepository: GitRepositorySchema.nullable(),
dockerImage: z.string().nullable(),
dockerCompose: z.string().nullable(),
environment: z.record(z.string()),
ports: z.array(z.number()),
domains: z.array(z.string()),
status: z.enum(['running', 'stopped', 'error', 'deploying']),
createdAt: z.string(),
updatedAt: z.string(),
});
export const DeploymentResponseSchema = z.object({
id: z.string(),
applicationId: z.string(),
status: z.enum(['pending', 'running', 'success', 'failed']),
logs: z.array(z.string()),
startedAt: z.string(),
completedAt: z.string().nullable(),
url: z.string().nullable(),
});
export const QuotaCheckResponseSchema = z.object({
withinLimit: z.boolean(),
currentApps: z.number(),
maxApps: z.number(),
projectId: z.string(),
});
export const NameConflictCheckResponseSchema = z.object({
isAvailable: z.boolean(),
conflictingApp: ApplicationResponseSchema.optional(),
projectName: z.string().optional(),
});
// Error response schema
export const ErrorResponseSchema = z.object({
code: z.string(),
message: z.string(),
details: z.any().optional(),
});
// Template metadata schema
export const TemplateMetadataSchema = z.object({
name: z.string(),
description: z.string(),
source: z.object({
type: z.enum(['git', 'docker_image']),
repository: z.string().optional(),
branch: z.string().optional(),
image: z.string().optional(),
}),
buildType: z.enum(['dockerfile', 'image', 'compose']),
ports: z.array(z.number()),
requiredEnvVars: z.array(TemplateEnvVarSchema),
optionalServices: z.array(z.enum(['postgres', 'redis', 'mysql', 'mongo'])).optional(),
iconUrl: z.string().url().optional(),
tags: z.array(z.string()).optional(),
});