refactor(services): update service creation logic and enhance service group schema
Build and Push CFDM Docker Image / build-and-push (push) Successful in 2m2s
Build and Push CFDM Docker Image / create-release (push) Skipped
Build and Push CFDM Docker Image / update-wiki (push) Successful in 6s

- Changed service creation to default `enabled` to true in the database schema.
- Updated service group schema to set default values for `icon`, `domain`, and health check parameters.
- Refactored service routes to use `await` for fetching service views, ensuring proper asynchronous handling.
- Improved error handling in service groups query to provide clearer feedback on response validation.

This commit enhances the overall service management experience by ensuring services are enabled by default and improving the robustness of the service group schema.
This commit is contained in:
Denozordec
2026-08-07 13:18:47 +07:00
parent 3fb8480f8a
commit ce8393e0c3
12 changed files with 346 additions and 186 deletions
+21 -21
View File
@@ -24,15 +24,15 @@ export const serviceGroupSchema = z.object({
id: z.number(),
name: z.string(),
type: serviceGroupTypeSchema.catch('custom'),
icon: z.string().nullable(),
domain: z.string().nullable(),
icon: z.string().nullable().default(null),
domain: z.string().nullable().default(null),
enabled: z.coerce.boolean(),
lb_mode: z.enum(['round_robin', 'failover', 'weighted']).catch('round_robin'),
health_check_enabled: z.coerce.boolean().default(false),
health_check_type: z.enum(['tcp', 'http']).catch('tcp'),
health_check_port: z.number().nullable(),
health_check_path: z.string().nullable(),
health_check_expected_status: z.number().nullable(),
health_check_type: z.enum(['tcp', 'http', 'ping', 'dns']).catch('tcp'),
health_check_port: z.number().nullable().default(null),
health_check_path: z.string().nullable().default(null),
health_check_expected_status: z.number().nullable().default(null),
health_check_interval_sec: z.number().default(30),
health_check_timeout_ms: z.number().default(3000),
health_check_verify_tls: z.coerce.boolean().default(false),
@@ -64,19 +64,19 @@ export const serviceDomainBindingSchema = z
record_type: z.enum(['A', 'CNAME']).default('A'),
target_ips: z.array(z.string()).optional(),
target_ip: z.string().nullable().optional(),
target_ip_weights: z.record(z.string(), z.number()).optional(),
target_ip_priorities: z.record(z.string(), z.number()).optional(),
target_ip_weights: z.record(z.string(), z.coerce.number()).optional(),
target_ip_priorities: z.record(z.string(), z.coerce.number()).optional(),
target_cname: z.string().nullable().optional(),
lb_mode: z.enum(['round_robin', 'failover', 'weighted']).catch('round_robin'),
health_check_enabled: z.coerce.boolean().default(false),
health_check_type: z.enum(['tcp', 'http']).catch('tcp'),
health_check_port: z.number().nullable(),
health_check_path: z.string().nullable(),
health_check_expected_status: z.number().nullable(),
health_check_type: z.enum(['tcp', 'http', 'ping', 'dns']).catch('tcp'),
health_check_port: z.number().nullable().default(null),
health_check_path: z.string().nullable().default(null),
health_check_expected_status: z.number().nullable().default(null),
health_check_interval_sec: z.number().default(30),
health_check_timeout_ms: z.number().default(3000),
health_check_verify_tls: z.coerce.boolean().default(false),
sync_status: z.string().nullable(),
sync_status: z.string().nullable().default(null),
})
.transform((binding) => ({
...binding,
@@ -149,18 +149,18 @@ export const serviceBindingSchema = z
service_slug: z.string(),
target_ip: z.string().nullable(),
target_ips: z.array(z.string()).optional(),
target_ip_weights: z.record(z.string(), z.number()).optional(),
target_ip_priorities: z.record(z.string(), z.number()).optional(),
target_ip_weights: z.record(z.string(), z.coerce.number()).optional(),
target_ip_priorities: z.record(z.string(), z.coerce.number()).optional(),
lb_mode: z.enum(['round_robin', 'failover', 'weighted']).catch('round_robin'),
health_check_enabled: z.coerce.boolean().default(false),
health_check_type: z.enum(['tcp', 'http']).catch('tcp'),
health_check_port: z.number().nullable(),
health_check_path: z.string().nullable(),
health_check_expected_status: z.number().nullable(),
health_check_type: z.enum(['tcp', 'http', 'ping', 'dns']).catch('tcp'),
health_check_port: z.number().nullable().default(null),
health_check_path: z.string().nullable().default(null),
health_check_expected_status: z.number().nullable().default(null),
health_check_interval_sec: z.number().default(30),
health_check_timeout_ms: z.number().default(3000),
health_check_verify_tls: z.coerce.boolean().default(false),
sync_status: z.string().nullable(),
sync_status: z.string().nullable().default(null),
created_at: z.string(),
updated_at: z.string(),
})
@@ -233,7 +233,7 @@ const ipv4Schema = z
)
const lbModeSchema = z.enum(['round_robin', 'failover', 'weighted'])
const healthCheckTypeSchema = z.enum(['tcp', 'http'])
const healthCheckTypeSchema = z.enum(['tcp', 'http', 'ping', 'dns'])
const healthCheckConfigFields = {
health_check_enabled: z.boolean().optional(),