77 lines
2.4 KiB
Python
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,
|
|
)
|