100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
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
|
|
]
|