dv/backend/services/chart-service/src/application/usecases/update_chart_usecase.py

77 lines
2.4 KiB
Python

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,
)