/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { z } from 'zod'
import type { Model } from '../types'
import { parseModelTags as parseTagsFromUtils } from './model-utils'
// ============================================================================
// Model Form Schema
// ============================================================================
/**
* Model form validation schema
*/
export const modelFormSchema = z.object({
id: z.number().optional(),
model_name: z.string().min(1, 'Model name is required'),
description: z.string().default(''),
icon: z.string().default(''),
tags: z.array(z.string()).default([]),
vendor_id: z.number().optional(),
endpoints: z.string().default(''),
name_rule: z.number().min(0).max(3).default(0),
status: z.boolean().default(true),
sync_official: z.boolean().default(true),
enable_groups: z.array(z.string()).default([]),
quota_types: z.array(z.number()).default([]),
})
export type ModelFormValues = z.infer
// ============================================================================
// Vendor Form Schema
// ============================================================================
/**
* Vendor form validation schema
*/
export const vendorFormSchema = z.object({
id: z.number().optional(),
name: z.string().min(1, 'Vendor name is required'),
description: z.string().default(''),
icon: z.string().default(''),
status: z.number().default(1),
})
export type VendorFormValues = z.infer
// ============================================================================
// Form Data Transformation
// ============================================================================
/**
* Transform model to form default values
*/
export function transformModelToFormDefaults(model: Model): ModelFormValues {
return {
id: model.id,
model_name: model.model_name,
description: model.description || '',
icon: model.icon || '',
tags: parseTagsFromUtils(model.tags),
vendor_id: model.vendor_id,
endpoints: model.endpoints || '',
name_rule: model.name_rule || 0,
status: model.status === 1,
sync_official: model.sync_official === 1,
enable_groups: model.enable_groups || [],
quota_types: model.quota_types || [],
}
}
/**
* Transform form data to model create/update payload
*/
export function transformFormDataToModelPayload(
formData: ModelFormValues
): Partial {
return {
id: formData.id,
model_name: formData.model_name,
description: formData.description || '',
icon: formData.icon || '',
tags: formatTagsArray(formData.tags),
vendor_id: formData.vendor_id,
endpoints: formData.endpoints || '',
name_rule: formData.name_rule,
status: formData.status ? 1 : 0,
sync_official: formData.sync_official ? 1 : 0,
enable_groups: formData.enable_groups,
quota_types: formData.quota_types,
}
}
// ============================================================================
// Parsing and Formatting Helpers
// ============================================================================
/**
* Format tags array to string
*/
export function formatTagsArray(tags: string[]): string {
return tags.filter(Boolean).join(',')
}
/**
* Validate JSON string
*/
export function validateJSON(value: string): boolean {
if (!value || value.trim() === '') return true
try {
JSON.parse(value)
return true
} catch {
return false
}
}
/**
* Validate endpoints JSON
*/
export function validateEndpoints(endpoints: string): boolean {
return validateJSON(endpoints)
}