Initial commit: Happy Up monorepo through Sprint 5.
Document-driven MVP with FastAPI backend, Vue H5, WeChat mini shell, product demo, and Docker dev stack. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
from datetime import date
|
||||
|
||||
from sqlalchemy import func, select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.db.models import Child
|
||||
from app.schemas.models import ChildCreateRequest, ChildUpdateRequest
|
||||
|
||||
|
||||
def calc_age(birthday: date) -> int:
|
||||
today = date.today()
|
||||
age = today.year - birthday.year
|
||||
if (today.month, today.day) < (birthday.month, birthday.day):
|
||||
age -= 1
|
||||
return age
|
||||
|
||||
|
||||
def child_to_dict(child: Child) -> dict:
|
||||
return {
|
||||
"id": child.id,
|
||||
"name": child.name,
|
||||
"birthday": child.birthday.isoformat(),
|
||||
"age": calc_age(child.birthday),
|
||||
"height": float(child.height) if child.height is not None else None,
|
||||
"weight": float(child.weight) if child.weight is not None else None,
|
||||
"status": child.status,
|
||||
}
|
||||
|
||||
|
||||
def list_children(db: Session, parent_user_id: int, page: int, page_size: int) -> tuple[list[Child], int]:
|
||||
filters = (Child.parent_user_id == parent_user_id, Child.status != "archived")
|
||||
total = db.scalar(select(func.count()).select_from(Child).where(*filters)) or 0
|
||||
items = db.scalars(
|
||||
select(Child)
|
||||
.where(*filters)
|
||||
.order_by(Child.id.desc())
|
||||
.offset((page - 1) * page_size)
|
||||
.limit(page_size)
|
||||
).all()
|
||||
return items, total
|
||||
|
||||
|
||||
def get_child(db: Session, parent_user_id: int, child_id: int) -> Child | None:
|
||||
return db.scalar(
|
||||
select(Child).where(
|
||||
Child.id == child_id,
|
||||
Child.parent_user_id == parent_user_id,
|
||||
Child.status != "archived",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def create_child(db: Session, parent_user_id: int, tenant_id: int | None, body: ChildCreateRequest) -> Child:
|
||||
child = Child(
|
||||
parent_user_id=parent_user_id,
|
||||
tenant_id=tenant_id,
|
||||
name=body.name,
|
||||
birthday=body.birthday,
|
||||
gender=body.gender.value,
|
||||
height=body.height,
|
||||
weight=body.weight,
|
||||
contraindications=body.contraindications,
|
||||
status="active",
|
||||
)
|
||||
db.add(child)
|
||||
db.commit()
|
||||
db.refresh(child)
|
||||
return child
|
||||
|
||||
|
||||
def update_child(db: Session, child: Child, body: ChildUpdateRequest) -> Child:
|
||||
child.name = body.name
|
||||
child.birthday = body.birthday
|
||||
child.gender = body.gender.value
|
||||
child.height = body.height
|
||||
child.weight = body.weight
|
||||
child.contraindications = body.contraindications
|
||||
db.commit()
|
||||
db.refresh(child)
|
||||
return child
|
||||
|
||||
|
||||
def archive_child(db: Session, child: Child) -> None:
|
||||
from datetime import datetime, timezone
|
||||
|
||||
child.status = "archived"
|
||||
child.deleted_at = datetime.now(timezone.utc)
|
||||
db.commit()
|
||||
Reference in New Issue
Block a user