chore: update drizzle-orm version to 0.41.0 in package.json and pnpm-lock.yaml; refactor schema definitions for improved clarity and consistency across various database schemas

This commit is contained in:
Mauricio Siu
2026-02-24 12:58:22 -06:00
parent 0d0383f84a
commit 3b7dcaca7a
19 changed files with 294 additions and 586 deletions

View File

@@ -57,7 +57,7 @@
"dockerode": "4.0.2",
"dotenv": "16.4.5",
"drizzle-dbml-generator": "0.10.0",
"drizzle-orm": "^0.41.0",
"drizzle-orm": "0.41.0",
"drizzle-zod": "0.5.1",
"yaml": "2.8.1",
"lodash": "4.17.21",

View File

@@ -1,8 +1,12 @@
import { and, eq } from "drizzle-orm";
import { drizzle, type PostgresJsDatabase } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import { dbUrl } from "./constants";
import * as schema from "./schema";
export { and, eq };
export * from "./schema";
declare global {
var db: PostgresJsDatabase<typeof schema> | undefined;
}

View File

@@ -37,22 +37,22 @@ const createSchema = createInsertSchema(ai, {
isEnabled: z.boolean().optional(),
});
export const apiCreateAi = z.object({
name: z.string().min(1, { message: "Name is required" }),
apiUrl: z.string().url({ message: "Please enter a valid URL" }),
apiKey: z.string(),
model: z.string().min(1, { message: "Model is required" }),
isEnabled: z.boolean().optional(),
});
export const apiCreateAi = createSchema
.pick({
name: true,
apiUrl: true,
apiKey: true,
model: true,
isEnabled: true,
})
.required();
export const apiUpdateAi = z.object({
aiId: z.string().min(1),
name: z.string().min(1, { message: "Name is required" }).optional(),
apiUrl: z.string().url({ message: "Please enter a valid URL" }).optional(),
apiKey: z.string().optional(),
model: z.string().min(1, { message: "Model is required" }).optional(),
isEnabled: z.boolean().optional(),
});
export const apiUpdateAi = createSchema
.partial()
.extend({
aiId: z.string().min(1),
})
.omit({ organizationId: true });
export const deploySuggestionSchema = z.object({
environmentId: z.string().min(1),

View File

@@ -328,11 +328,9 @@ const createSchema = createInsertSchema(applications, {
customGitUrl: z.string().optional(),
buildPath: z.string().optional(),
environmentId: z.string(),
// Override pgEnums so Zod 4 infers only string literals, not numeric enum indices
sourceType: z
.enum(["github", "docker", "git", "gitlab", "bitbucket", "gitea", "drop"])
.optional(),
triggerType: z.enum(["push", "tag"]).optional(),
applicationStatus: z.enum(["idle", "running", "done", "error"]),
buildType: z.enum([
"dockerfile",
@@ -524,83 +522,9 @@ export const apiFindMonitoringStats = z.object({
appName: z.string().min(1),
});
export const apiUpdateApplication = z.object({
applicationId: z.string().min(1),
name: z.string().min(1).optional(),
appName: z.string().optional(),
description: z.string().optional(),
env: z.string().optional(),
environmentId: z.string().optional(),
title: z.string().optional(),
subtitle: z.string().optional(),
enabled: z.boolean().optional(),
command: z.string().optional(),
args: z.array(z.string()).optional(),
memoryReservation: z.string().optional(),
memoryLimit: z.string().optional(),
cpuReservation: z.string().optional(),
cpuLimit: z.string().optional(),
buildArgs: z.string().optional(),
buildSecrets: z.string().optional(),
watchPaths: z.array(z.string()).optional(),
previewEnv: z.string().optional(),
previewBuildArgs: z.string().optional(),
previewBuildSecrets: z.string().optional(),
previewLabels: z.array(z.string()).optional(),
previewWildcard: z.string().optional(),
previewPort: z.number().optional(),
previewHttps: z.boolean().optional(),
previewPath: z.string().optional(),
previewLimit: z.number().optional(),
isPreviewDeploymentsActive: z.boolean().optional(),
previewRequireCollaboratorPermissions: z.boolean().optional(),
rollbackActive: z.boolean().optional(),
sourceType: z
.enum(["docker", "git", "github", "gitlab", "bitbucket", "gitea", "drop"])
.optional(),
cleanCache: z.boolean().optional(),
repository: z.string().optional(),
owner: z.string().optional(),
branch: z.string().optional(),
buildPath: z.string().optional(),
triggerType: z.enum(["push", "tag"]).optional(),
autoDeploy: z.boolean().optional(),
gitlabProjectId: z.number().optional(),
gitlabRepository: z.string().optional(),
gitlabOwner: z.string().optional(),
gitlabBranch: z.string().optional(),
gitlabBuildPath: z.string().optional(),
giteaRepository: z.string().optional(),
giteaOwner: z.string().optional(),
giteaBranch: z.string().optional(),
giteaBuildPath: z.string().optional(),
bitbucketRepository: z.string().optional(),
bitbucketRepositorySlug: z.string().optional(),
bitbucketOwner: z.string().optional(),
bitbucketBranch: z.string().optional(),
bitbucketBuildPath: z.string().optional(),
dockerImage: z.string().optional(),
username: z.string().optional(),
password: z.string().optional(),
registryUrl: z.string().optional(),
customGitUrl: z.string().optional(),
customGitBranch: z.string().optional(),
customGitBuildPath: z.string().optional(),
customGitSSHKeyId: z.string().optional(),
dockerfile: z.string().optional(),
dockerContextPath: z.string().optional(),
dockerBuildStage: z.string().optional(),
buildType: z
.enum([
"dockerfile",
"heroku_buildpacks",
"paketo_buildpacks",
"nixpacks",
"static",
"railpack",
])
.optional(),
publishDirectory: z.string().optional(),
isStaticSpa: z.boolean().optional(),
createEnvFile: z.boolean().optional(),
});
export const apiUpdateApplication = createSchema
.partial()
.extend({
applicationId: z.string().min(1),
})
.omit({ serverId: true });

View File

@@ -162,36 +162,28 @@ const createSchema = createInsertSchema(compose, {
customGitSSHKeyId: z.string().optional(),
command: z.string().optional(),
composePath: z.string().min(1),
// Override pgEnums so Zod 4 infers only string literals, not numeric enum indices
composeType: z.enum(["docker-compose", "stack"]).optional(),
sourceType: z
.enum(["git", "github", "gitlab", "bitbucket", "gitea", "raw"])
.optional(),
triggerType: z.enum(["push", "tag"]).optional(),
composeStatus: z.enum(["idle", "running", "done", "error"]).optional(),
watchPaths: z.array(z.string()).optional(),
});
export const apiCreateCompose = z.object({
name: z.string().min(1),
description: z.string().optional(),
environmentId: z.string().min(1),
composeType: z.enum(["docker-compose", "stack"]).optional(),
appName: z
.string()
.min(1)
.max(63)
.regex(APP_NAME_REGEX, APP_NAME_MESSAGE)
.optional(),
serverId: z.string().optional(),
composeFile: z.string().optional(),
export const apiCreateCompose = createSchema.pick({
name: true,
description: true,
environmentId: true,
composeType: true,
appName: true,
serverId: true,
composeFile: true,
});
export const apiCreateComposeByTemplate = z.object({
environmentId: z.string().min(1),
id: z.string().min(1),
serverId: z.string().optional(),
});
export const apiCreateComposeByTemplate = createSchema
.pick({
environmentId: true,
})
.extend({
id: z.string().min(1),
serverId: z.string().optional(),
});
export const apiFindCompose = z.object({
composeId: z.string().min(1),
@@ -219,25 +211,20 @@ export const apiFetchServices = z.object({
type: z.enum(["fetch", "cache"]).optional().default("cache"),
});
export const apiUpdateCompose = z.object({
composeId: z.string().min(1),
composeFile: z.string().optional(),
command: z.string().optional(),
name: z.string().min(1).optional(),
description: z.string().optional(),
env: z.string().optional(),
appName: z.string().optional(),
environmentId: z.string().optional(),
composeType: z.enum(["docker-compose", "stack"]).optional(),
sourceType: z
.enum(["git", "github", "gitlab", "bitbucket", "gitea", "raw"])
.optional(),
triggerType: z.enum(["push", "tag"]).optional(),
watchPaths: z.array(z.string()).optional(),
composePath: z.string().min(1).optional(),
});
export const apiUpdateCompose = createSchema
.partial()
.extend({
composeId: z.string(),
composeFile: z.string().optional(),
command: z.string().optional(),
})
.omit({ serverId: true });
export const apiRandomizeCompose = z.object({
composeId: z.string().min(1),
suffix: z.string().optional(),
});
export const apiRandomizeCompose = createSchema
.pick({
composeId: true,
})
.extend({
suffix: z.string().optional(),
composeId: z.string().min(1),
});

View File

@@ -66,5 +66,6 @@ export const apiUpdateGitlab = z.object({
name: z.string().min(1),
gitlabId: z.string().min(1),
gitlabUrl: z.string().min(1),
gitProviderId: z.string().min(1),
gitlabInternalUrl: z.string().optional().nullable(),
});

View File

@@ -198,27 +198,12 @@ export const apiResetMariadb = createSchema
})
.required();
export const apiUpdateMariaDB = z.object({
mariadbId: z.string().min(1),
name: z.string().min(1).optional(),
appName: z.string().optional(),
description: z.string().optional(),
dockerImage: z.string().optional(),
command: z.string().optional(),
args: z.array(z.string()).optional(),
env: z.string().optional(),
databaseName: z.string().min(1).optional(),
databaseUser: z.string().min(1).optional(),
databasePassword: z.string().optional(),
databaseRootPassword: z.string().optional(),
memoryReservation: z.string().optional(),
memoryLimit: z.string().optional(),
cpuReservation: z.string().optional(),
cpuLimit: z.string().optional(),
externalPort: z.number().optional(),
applicationStatus: z.enum(["idle", "running", "done", "error"]).optional(),
environmentId: z.string().optional(),
});
export const apiUpdateMariaDB = createSchema
.partial()
.extend({
mariadbId: z.string().min(1),
})
.omit({ serverId: true });
export const apiRebuildMariadb = createSchema
.pick({

View File

@@ -144,79 +144,65 @@ const createSchema = createInsertSchema(mongo, {
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
});
const mongoPasswordSchema = z
.string()
.regex(/^[a-zA-Z0-9@#%^&*()_+\-=[\]{}|;:,.<>?~`]*$/, {
message:
"Password contains invalid characters. Please avoid: $ ! ' \" \\ / and space characters for database compatibility",
});
export const apiCreateMongo = z.object({
name: z.string().min(1),
appName: z
.string()
.min(1)
.max(63)
.regex(APP_NAME_REGEX, APP_NAME_MESSAGE)
.optional(),
dockerImage: z.string().default("mongo:15"),
environmentId: z.string().min(1),
description: z.string().optional(),
databaseUser: z.string().min(1),
databasePassword: mongoPasswordSchema,
serverId: z.string().optional(),
replicaSets: z.boolean().default(false),
export const apiCreateMongo = createSchema.pick({
name: true,
appName: true,
dockerImage: true,
environmentId: true,
description: true,
databaseUser: true,
databasePassword: true,
serverId: true,
replicaSets: true,
});
export const apiFindOneMongo = z.object({
mongoId: z.string().min(1),
});
export const apiChangeMongoStatus = z.object({
mongoId: z.string().min(1),
applicationStatus: z.enum(["idle", "running", "done", "error"]),
});
export const apiChangeMongoStatus = createSchema
.pick({
mongoId: true,
applicationStatus: true,
})
.required();
export const apiSaveEnvironmentVariablesMongo = z.object({
mongoId: z.string().min(1),
env: z.string().optional(),
});
export const apiSaveEnvironmentVariablesMongo = createSchema
.pick({
mongoId: true,
env: true,
})
.required();
export const apiSaveExternalPortMongo = z.object({
mongoId: z.string().min(1),
externalPort: z.number(),
});
export const apiSaveExternalPortMongo = createSchema
.pick({
mongoId: true,
externalPort: true,
})
.required();
export const apiDeployMongo = z.object({
mongoId: z.string().min(1),
});
export const apiDeployMongo = createSchema
.pick({
mongoId: true,
})
.required();
export const apiUpdateMongo = z.object({
mongoId: z.string().min(1),
name: z.string().min(1).optional(),
appName: z.string().optional(),
description: z.string().optional(),
dockerImage: z.string().optional(),
command: z.string().optional(),
args: z.array(z.string()).optional(),
env: z.string().optional(),
databaseUser: z.string().min(1).optional(),
databasePassword: mongoPasswordSchema.optional(),
memoryReservation: z.string().optional(),
memoryLimit: z.string().optional(),
cpuReservation: z.string().optional(),
cpuLimit: z.string().optional(),
externalPort: z.number().optional(),
applicationStatus: z.enum(["idle", "running", "done", "error"]).optional(),
environmentId: z.string().optional(),
replicaSets: z.boolean().optional(),
});
export const apiUpdateMongo = createSchema
.partial()
.extend({
mongoId: z.string().min(1),
})
.omit({ serverId: true });
export const apiResetMongo = z.object({
mongoId: z.string().min(1),
appName: z.string().min(1),
});
export const apiResetMongo = createSchema
.pick({
mongoId: true,
appName: true,
})
.required();
export const apiRebuildMongo = z.object({
mongoId: z.string().min(1),
});
export const apiRebuildMongo = createSchema
.pick({
mongoId: true,
})
.required();

View File

@@ -144,81 +144,66 @@ const createSchema = createInsertSchema(mysql, {
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
});
const mysqlPasswordSchema = z
.string()
.regex(/^[a-zA-Z0-9@#%^&*()_+\-=[\]{}|;:,.<>?~`]*$/, {
message:
"Password contains invalid characters. Please avoid: $ ! ' \" \\ / and space characters for database compatibility",
});
export const apiCreateMySql = z.object({
name: z.string().min(1),
appName: z
.string()
.min(1)
.max(63)
.regex(APP_NAME_REGEX, APP_NAME_MESSAGE)
.optional(),
dockerImage: z.string().default("mysql:8"),
environmentId: z.string().min(1),
description: z.string().optional(),
databaseName: z.string().min(1),
databaseUser: z.string().min(1),
databasePassword: mysqlPasswordSchema,
databaseRootPassword: mysqlPasswordSchema.optional(),
serverId: z.string().optional(),
export const apiCreateMySql = createSchema.pick({
name: true,
appName: true,
dockerImage: true,
environmentId: true,
description: true,
databaseName: true,
databaseUser: true,
databasePassword: true,
databaseRootPassword: true,
serverId: true,
});
export const apiFindOneMySql = z.object({
mysqlId: z.string().min(1),
});
export const apiChangeMySqlStatus = z.object({
mysqlId: z.string().min(1),
applicationStatus: z.enum(["idle", "running", "done", "error"]),
});
export const apiChangeMySqlStatus = createSchema
.pick({
mysqlId: true,
applicationStatus: true,
})
.required();
export const apiSaveEnvironmentVariablesMySql = z.object({
mysqlId: z.string().min(1),
env: z.string().optional(),
});
export const apiSaveEnvironmentVariablesMySql = createSchema
.pick({
mysqlId: true,
env: true,
})
.required();
export const apiSaveExternalPortMySql = z.object({
mysqlId: z.string().min(1),
externalPort: z.number(),
});
export const apiSaveExternalPortMySql = createSchema
.pick({
mysqlId: true,
externalPort: true,
})
.required();
export const apiResetMysql = z.object({
mysqlId: z.string().min(1),
appName: z.string().min(1),
});
export const apiResetMysql = createSchema
.pick({
mysqlId: true,
appName: true,
})
.required();
export const apiDeployMySql = z.object({
mysqlId: z.string().min(1),
});
export const apiDeployMySql = createSchema
.pick({
mysqlId: true,
})
.required();
export const apiUpdateMySql = z.object({
mysqlId: z.string().min(1),
name: z.string().min(1).optional(),
appName: z.string().optional(),
description: z.string().optional(),
dockerImage: z.string().optional(),
command: z.string().optional(),
args: z.array(z.string()).optional(),
env: z.string().optional(),
databaseName: z.string().min(1).optional(),
databaseUser: z.string().min(1).optional(),
databasePassword: mysqlPasswordSchema.optional(),
databaseRootPassword: mysqlPasswordSchema.optional(),
memoryReservation: z.string().optional(),
memoryLimit: z.string().optional(),
cpuReservation: z.string().optional(),
cpuLimit: z.string().optional(),
externalPort: z.number().optional(),
applicationStatus: z.enum(["idle", "running", "done", "error"]).optional(),
environmentId: z.string().optional(),
});
export const apiUpdateMySql = createSchema
.partial()
.extend({
mysqlId: z.string().min(1),
})
.omit({ serverId: true });
export const apiRebuildMysql = z.object({
mysqlId: z.string().min(1),
});
export const apiRebuildMysql = createSchema
.pick({
mysqlId: true,
})
.required();

View File

@@ -188,26 +188,12 @@ export const apiResetPostgres = createSchema
})
.required();
export const apiUpdatePostgres = z.object({
postgresId: z.string().min(1),
name: z.string().min(1).optional(),
appName: z.string().optional(),
description: z.string().optional(),
dockerImage: z.string().optional(),
command: z.string().optional(),
args: z.array(z.string()).optional(),
env: z.string().optional(),
databaseName: z.string().min(1).optional(),
databaseUser: z.string().min(1).optional(),
databasePassword: z.string().optional(),
memoryReservation: z.string().optional(),
memoryLimit: z.string().optional(),
cpuReservation: z.string().optional(),
cpuLimit: z.string().optional(),
externalPort: z.number().optional(),
applicationStatus: z.enum(["idle", "running", "done", "error"]).optional(),
environmentId: z.string().optional(),
});
export const apiUpdatePostgres = createSchema
.partial()
.extend({
postgresId: z.string().min(1),
})
.omit({ serverId: true });
export const apiRebuildPostgres = createSchema
.pick({

View File

@@ -37,23 +37,31 @@ const createSchema = createInsertSchema(projects, {
description: z.string().optional(),
});
export const apiCreateProject = z.object({
name: z.string().min(1),
description: z.string().optional(),
env: z.string(),
export const apiCreateProject = createSchema.pick({
name: true,
description: true,
env: true,
});
export const apiFindOneProject = z.object({
projectId: z.string().min(1),
});
export const apiRemoveProject = createSchema
.pick({
projectId: true,
})
.required();
export const apiRemoveProject = z.object({
// export const apiUpdateProject = createSchema
// .pick({
// name: true,
// description: true,
// projectId: true,
// env: true,
// })
// .required();
export const apiUpdateProject = createSchema.partial().extend({
projectId: z.string().min(1),
});
export const apiUpdateProject = z.object({
projectId: z.string().min(1),
name: z.string().min(1).optional(),
description: z.string().optional(),
env: z.string().optional(),
});
// .omit({ serverId: true });

View File

@@ -174,24 +174,12 @@ export const apiResetRedis = createSchema
})
.required();
export const apiUpdateRedis = z.object({
redisId: z.string().min(1),
name: z.string().min(1).optional(),
appName: z.string().optional(),
description: z.string().optional(),
dockerImage: z.string().optional(),
command: z.string().optional(),
args: z.array(z.string()).optional(),
env: z.string().optional(),
databasePassword: z.string().optional(),
memoryReservation: z.string().optional(),
memoryLimit: z.string().optional(),
cpuReservation: z.string().optional(),
cpuLimit: z.string().optional(),
externalPort: z.number().optional(),
applicationStatus: z.enum(["idle", "running", "done", "error"]).optional(),
environmentId: z.string().optional(),
});
export const apiUpdateRedis = createSchema
.partial()
.extend({
redisId: z.string().min(1),
})
.omit({ serverId: true });
export const apiRebuildRedis = createSchema
.pick({