from __future__ import annotations import uuid from shared.exceptions import EntityNotFoundError from shared.types import ChartType from src.application.dto.chart_response import ( ChartResponse, FieldBindingDTO, UpdateChartRequest, ) from src.application.ports.input.update_chart import IUpdateChartUseCase from src.domain.entities.field_binding import FieldBinding from src.domain.repositories.chart_repository import ChartRepository class UpdateChartUseCase(IUpdateChartUseCase): def __init__(self, repository: ChartRepository) -> None: self._repository = repository async def execute( self, chart_id: uuid.UUID, request: UpdateChartRequest ) -> ChartResponse: chart = await self._repository.find_by_id(chart_id) if chart is None: raise EntityNotFoundError("ChartInstance", str(chart_id)) if request.chart_type is not None: chart.chart_type = ChartType(request.chart_type) chart.touch() if request.bindings is not None: new_bindings = [ FieldBinding( axis=b.axis, column_name=b.column_name, aggregation=b.aggregation, ) for b in request.bindings ] chart.update_bindings(new_bindings) if request.style is not None: chart.update_style(request.style) if request.filters is not None: chart.filters = request.filters chart.touch() if request.sort_config is not None: chart.sort_config = request.sort_config chart.touch() if request.top_n is not None: chart.top_n = request.top_n chart.touch() saved = await self._repository.save(chart) return ChartResponse( id=saved.id, dataset_id=saved.dataset_id, chart_type=saved.chart_type.value, bindings=[ FieldBindingDTO( axis=b.axis, column_name=b.column_name, aggregation=b.aggregation ) for b in saved.bindings ], style=saved.style, filters=saved.filters, sort_config=saved.sort_config, top_n=saved.top_n, created_at=saved.created_at, updated_at=saved.updated_at, )