backend on fastapi

This commit is contained in:
2026-09-30 00:21:17 +03:00
parent fe9221a4dd
commit 06715f952b
14 changed files with 1113 additions and 1 deletions
+99
View File
@@ -0,0 +1,99 @@
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
]