"""Read and update administrator-managed risk-model configuration.""" from decimal import Decimal from sqlalchemy.ext.asyncio import AsyncSession from app.domain.model_config import DEFAULT_FREQUENCY_CAP, DEFAULT_FREQUENCY_COEFFICIENT, DEFAULT_WEIGHTS from app.models.entities import OperationAudit, RiskModelConfig, UserAccount from app.schemas.model_config import ModelWeightConfigData, ModelWeightConfigUpdate class ModelConfigService: def __init__(self, session: AsyncSession) -> None: self.session = session async def get(self) -> ModelWeightConfigData: row = await self.session.get(RiskModelConfig, 1) if row is None: return ModelWeightConfigData( weights=DEFAULT_WEIGHTS, frequency_coefficient=DEFAULT_FREQUENCY_COEFFICIENT, frequency_cap=DEFAULT_FREQUENCY_CAP, ) return self._to_data(row) async def update(self, payload: ModelWeightConfigUpdate, user: UserAccount) -> ModelWeightConfigData: row = await self.session.get(RiskModelConfig, 1) if row is None: row = RiskModelConfig(id=1) self.session.add(row) row.weights = payload.weights row.frequency_coefficient = Decimal(str(payload.frequency_coefficient)) row.frequency_cap = Decimal(str(payload.frequency_cap)) row.updated_by = user.emp_no self.session.add( OperationAudit( actor_user_id=user.id, actor_emp_no=user.emp_no, action="model_weight.update", resource_type="risk_model_config", resource_id="1", audit_metadata=payload.model_dump(), ) ) await self.session.flush() await self.session.refresh(row) return self._to_data(row) @staticmethod def _to_data(row: RiskModelConfig) -> ModelWeightConfigData: return ModelWeightConfigData( weights={key: float(value) for key, value in row.weights.items()}, frequency_coefficient=float(row.frequency_coefficient), frequency_cap=float(row.frequency_cap), updated_by=row.updated_by, updated_at=row.updated_at, )