|
from flask import Blueprint, jsonify, request |
|
from sqlalchemy import select |
|
from sqlalchemy.orm import selectinload |
|
|
|
from .models import db, Item, Owner |
|
from .query_helpers import paginate, get_or_404 |
|
|
|
items_bp = Blueprint("items", __name__) |
|
owners_bp = Blueprint("owners", __name__) |
|
|
|
def items_base_stmt(): |
|
return select(Item).options(selectinload(Item.owner)) |
|
|
|
def owners_base_stmt(): |
|
return select(Owner) |
|
|
|
def serialize_item(item: Item) -> dict: |
|
return { |
|
"id": item.id, |
|
"name": item.name, |
|
"owner": {"id": item.owner.id, "name": item.owner.name} if item.owner else None, |
|
} |
|
|
|
def serialize_owner(owner: Owner, items: list[Item] | None = None) -> dict: |
|
payload = {"id": owner.id, "name": owner.name} |
|
if items is not None: |
|
payload["items"] = [{"id": i.id, "name": i.name} for i in items] |
|
return payload |
|
|
|
@items_bp.get("/api/items") |
|
def list_items(): |
|
page = request.args.get("page", default=1, type=int) |
|
page_size = request.args.get("pageSize", default=20, type=int) |
|
owner_id = request.args.get("ownerId", type=int) |
|
|
|
stmt = items_base_stmt() |
|
if owner_id is not None: |
|
stmt = stmt.where(Item.owner_id == owner_id) |
|
stmt = stmt.order_by(Item.name.asc()) |
|
|
|
page_result = paginate(db.session, stmt, page=page, page_size=page_size) |
|
return jsonify(page_result.to_response("items", serialize_item)) |
|
|
|
@items_bp.get("/api/items/<int:item_id>") |
|
def get_item(item_id: int): |
|
item = get_or_404( |
|
db.session, |
|
items_base_stmt().where(Item.id == item_id), |
|
message="Item not found", |
|
) |
|
return jsonify(serialize_item(item)) |
|
|
|
@owners_bp.get("/api/owners") |
|
def list_owners(): |
|
stmt = owners_base_stmt().order_by(Owner.name.asc()) |
|
owners = db.session.scalars(stmt).all() |
|
return jsonify({"owners": [serialize_owner(o) for o in owners]}) |
|
|
|
@owners_bp.get("/api/owners/<int:owner_id>") |
|
def get_owner(owner_id: int): |
|
stmt = ( |
|
owners_base_stmt() |
|
.where(Owner.id == owner_id) |
|
.options(selectinload(Owner.items)) |
|
) |
|
owner = get_or_404(db.session, stmt, message="Owner not found") |
|
return jsonify(serialize_owner(owner, items=owner.items)) |