38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
|
|
from flask import Blueprint, request
|
||
|
|
from sqlalchemy import func, select
|
||
|
|
|
||
|
|
from extensions import db
|
||
|
|
from models import ShootingSession
|
||
|
|
from .utils import ok, serialize_session
|
||
|
|
|
||
|
|
feed_bp = Blueprint("api_feed", __name__, url_prefix="/feed")
|
||
|
|
|
||
|
|
|
||
|
|
@feed_bp.get("/")
|
||
|
|
def feed():
|
||
|
|
try:
|
||
|
|
page = max(1, int(request.args.get("page", 1)))
|
||
|
|
per_page = min(100, max(1, int(request.args.get("per_page", 20))))
|
||
|
|
except (TypeError, ValueError):
|
||
|
|
page, per_page = 1, 20
|
||
|
|
|
||
|
|
total = db.session.scalar(
|
||
|
|
select(func.count()).select_from(ShootingSession)
|
||
|
|
.where(ShootingSession.is_public == True) # noqa: E712
|
||
|
|
) or 0
|
||
|
|
|
||
|
|
sessions = db.session.scalars(
|
||
|
|
select(ShootingSession)
|
||
|
|
.where(ShootingSession.is_public == True) # noqa: E712
|
||
|
|
.order_by(ShootingSession.session_date.desc(), ShootingSession.created_at.desc())
|
||
|
|
.offset((page - 1) * per_page)
|
||
|
|
.limit(per_page)
|
||
|
|
).all()
|
||
|
|
|
||
|
|
return ok({
|
||
|
|
"data": [serialize_session(s, include_user=True) for s in sessions],
|
||
|
|
"total": total,
|
||
|
|
"page": page,
|
||
|
|
"per_page": per_page,
|
||
|
|
})
|