You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.4 KiB
133 lines
3.4 KiB
# -*- coding: utf-8 -*-
|
|
"""System configuration API schemas."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, List, Literal, Optional
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
class SystemConfigFieldSchema(BaseModel):
|
|
"""Metadata schema for a single config field."""
|
|
|
|
key: str = Field(..., description="Configuration key name")
|
|
title: Optional[str] = Field(None, description="Display title")
|
|
description: Optional[str] = Field(None, description="Field description")
|
|
category: Literal["base", "data_source", "ai_model", "notification", "system", "backtest", "uncategorized"]
|
|
data_type: Literal["string", "integer", "number", "boolean", "array", "json", "time"]
|
|
ui_control: Literal["text", "password", "number", "select", "textarea", "switch", "time"]
|
|
is_sensitive: bool
|
|
is_required: bool
|
|
is_editable: bool
|
|
default_value: Optional[str] = None
|
|
options: List[str] = Field(default_factory=list)
|
|
validation: Dict[str, Any] = Field(default_factory=dict)
|
|
display_order: int
|
|
|
|
|
|
class SystemConfigCategorySchema(BaseModel):
|
|
"""Category grouping metadata."""
|
|
|
|
category: str
|
|
title: str
|
|
description: Optional[str] = None
|
|
display_order: int
|
|
fields: List[SystemConfigFieldSchema]
|
|
|
|
|
|
class SystemConfigSchemaResponse(BaseModel):
|
|
"""Metadata response for dynamic frontend rendering."""
|
|
|
|
schema_version: str
|
|
categories: List[SystemConfigCategorySchema]
|
|
|
|
|
|
class SystemConfigItem(BaseModel):
|
|
"""Config value entry with optional schema metadata."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
key: str
|
|
value: str
|
|
raw_value_exists: bool
|
|
is_masked: bool
|
|
schema_: Optional[SystemConfigFieldSchema] = Field(default=None, alias="schema")
|
|
|
|
|
|
class SystemConfigResponse(BaseModel):
|
|
"""Read response for current configuration values."""
|
|
|
|
config_version: str
|
|
mask_token: str
|
|
items: List[SystemConfigItem]
|
|
updated_at: Optional[str] = None
|
|
|
|
|
|
class SystemConfigUpdateItem(BaseModel):
|
|
"""Single key-value update item."""
|
|
|
|
key: str
|
|
value: str
|
|
|
|
|
|
class UpdateSystemConfigRequest(BaseModel):
|
|
"""Update request payload."""
|
|
|
|
config_version: str
|
|
mask_token: str = "******"
|
|
reload_now: bool = True
|
|
items: List[SystemConfigUpdateItem] = Field(..., min_length=1)
|
|
|
|
|
|
class UpdateSystemConfigResponse(BaseModel):
|
|
"""Update operation result payload."""
|
|
|
|
success: bool
|
|
config_version: str
|
|
applied_count: int
|
|
skipped_masked_count: int
|
|
reload_triggered: bool
|
|
updated_keys: List[str]
|
|
warnings: List[str] = Field(default_factory=list)
|
|
|
|
|
|
class ValidateSystemConfigRequest(BaseModel):
|
|
"""Validation request payload."""
|
|
|
|
items: List[SystemConfigUpdateItem] = Field(..., min_length=1)
|
|
|
|
|
|
class ConfigValidationIssue(BaseModel):
|
|
"""Validation issue details."""
|
|
|
|
key: str
|
|
code: str
|
|
message: str
|
|
severity: Literal["error", "warning"]
|
|
expected: Optional[str] = None
|
|
actual: Optional[str] = None
|
|
|
|
|
|
class ValidateSystemConfigResponse(BaseModel):
|
|
"""Validation result payload."""
|
|
|
|
valid: bool
|
|
issues: List[ConfigValidationIssue]
|
|
|
|
|
|
class SystemConfigValidationErrorResponse(BaseModel):
|
|
"""Error payload for failed update validation."""
|
|
|
|
error: str
|
|
message: str
|
|
issues: List[ConfigValidationIssue]
|
|
|
|
|
|
class SystemConfigConflictResponse(BaseModel):
|
|
"""Error payload for optimistic lock conflict."""
|
|
|
|
error: str
|
|
message: str
|
|
current_config_version: str
|