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

# -*- 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