from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List import database import models import schemas from datetime import datetime router = APIRouter(tags=["metrics"]) def get_current_timestamp(): return datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%fZ') # ============================================================ # METRIC TYPES # ============================================================ @router.post("/metric-types/", response_model=schemas.MetricType) def create_metric_type(metric_type: schemas.MetricTypeCreate, db: Session = Depends(database.get_db)): db_mt = db.query(models.MetricType).filter(models.MetricType.sync_id == metric_type.sync_id).first() if db_mt: raise HTTPException(status_code=400, detail="MetricType with this sync_id already exists") db_mt = models.MetricType( **metric_type.dict(), created_at=get_current_timestamp() ) db.add(db_mt) db.commit() db.refresh(db_mt) return db_mt @router.get("/metric-types/", response_model=List[schemas.MetricType]) def list_metric_types(db: Session = Depends(database.get_db)): return db.query(models.MetricType).order_by(models.MetricType.sort_order).all() # ============================================================ # BODY METRICS # ============================================================ @router.post("/body-metrics/", response_model=schemas.BodyMetric) def create_body_metric(metric: schemas.BodyMetricCreate, db: Session = Depends(database.get_db)): db_metric = db.query(models.BodyMetric).filter(models.BodyMetric.sync_id == metric.sync_id).first() if db_metric: raise HTTPException(status_code=400, detail="BodyMetric with this sync_id already exists") db_metric = models.BodyMetric( sync_id=metric.sync_id, client_id=metric.client_id, metric_date=metric.metric_date, notes=metric.notes, created_at=get_current_timestamp() ) db.add(db_metric) db.flush() # Добавляем значения for value_data in metric.values or []: db_value = models.BodyMetricValue( body_metric_id=db_metric.id, metric_type_id=value_data.metric_type_id, value=value_data.value ) db.add(db_value) db.commit() db.refresh(db_metric) return db_metric @router.get("/body-metrics/", response_model=List[schemas.BodyMetric]) def list_body_metrics(client_id: int = None, db: Session = Depends(database.get_db)): query = db.query(models.BodyMetric) if client_id: query = query.filter(models.BodyMetric.client_id == client_id) return query.order_by(models.BodyMetric.metric_date.desc()).all() @router.get("/body-metrics/history") def get_metric_history( client_id: int, metric_type_id: int, limit: int = 50, db: Session = Depends(database.get_db) ): """Получить историю конкретного замера для графиков""" results = db.query( models.BodyMetric.metric_date, models.BodyMetricValue.value ).join( models.BodyMetricValue, models.BodyMetricValue.body_metric_id == models.BodyMetric.id ).filter( models.BodyMetric.client_id == client_id, models.BodyMetricValue.metric_type_id == metric_type_id ).order_by(models.BodyMetric.metric_date.desc()).limit(limit).all() return [ { "date": r.metric_date, "value": r.value } for r in results ]