from typing import List from utils.exceptions import BadRequest from performance.repository import MetricsRepository from performance.schemas import MetricsFieldSchema, ObjectiveSchema, MetricsResponseSchema class MetricsListService: repository: MetricsRepository = MetricsRepository() def get_all_metrics_list(self) -> MetricsResponseSchema: objectives = self.repository.fetch_metrics_fields_by_objective() metrics = self.repository.fetch_metrics_fields() metrics_by_objectives = list(map(self.__map_objective, objectives)) all_metrics = list(map(MetricsFieldSchema, metrics)) return MetricsResponseSchema(objectives=metrics_by_objectives, allFields=all_metrics) def __map_objective(self, objective): fields = [MetricsFieldSchema(field) for field in objective.metric_fields] return ObjectiveSchema(id=objective.id, name=objective.name, fields=fields) def get_metrics_list_for_user(self, user_id: int) -> List[MetricsFieldSchema]: fields = self.repository.fetch_metrics_fields_for_user(user_id) return [MetricsFieldSchema(field) for field in fields] def update_metrics_list_for_user(self, user_id: int, metrics: List[int]) -> List[MetricsFieldSchema]: if not self.repository.validate_metrics_ids(metrics): raise BadRequest("Invalid metrics field ids") self.repository.update_metrics_fields_for_user(user_id, metrics) return self.get_metrics_list_for_user(user_id)