This commit is contained in:
Aodhan
2025-07-08 23:37:57 +01:00
parent f03ac0abdb
commit 02083c1cf9

View File

@@ -162,24 +162,95 @@ async def items(
):
"""Return items from all_items view with pagination."""
offset = (page - 1) * page_size
params = {"limit": page_size, "offset": offset}
where_clauses = ["name != '.'"]
params: dict[str, Any] = {"limit": page_size, "offset": offset}
where_clauses: list[str] = ["a.name != '.'"]
if type:
if type == 'MANNEQUIN':
where_clauses.append("type_description IN ('MANNEQUIN', 'NOTHING', 'UNKNOWN')")
if type == "MANNEQUIN":
where_clauses.append("a.type_description IN ('MANNEQUIN', 'NOTHING', 'UNKNOWN')")
else:
where_clauses.append("type_description = :type")
where_clauses.append("a.type_description = :type")
params["type"] = type
if search:
where_clauses.append("name ILIKE :search")
where_clauses.append("a.name ILIKE :search")
params["search"] = f"%{search}%"
where_sql = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
# Calculate total count for pagination
count_q = text(f"SELECT COUNT(*) FROM all_items {where_sql}")
join_sql = "FROM all_items a LEFT JOIN armor_items ai ON ai.id = a.id"
# Total count for pagination (exclude limit/offset)
count_params = {k: v for k, v in params.items() if k not in ("limit", "offset")}
count_q = text(f"SELECT COUNT(*) {join_sql} {where_sql}")
total_res = await session.execute(count_q, count_params)
total_count = total_res.scalar() or 0
response.headers["X-Total-Count"] = str(total_count)
# Main query
q = text(
f"SELECT a.id, a.name, a.icon_id, a.type_description, ai.jobs_description "
f"{join_sql} {where_sql} ORDER BY a.id LIMIT :limit OFFSET :offset"
)
result = await session.execute(q, params)
rows = result.fetchall()
return [
ItemSummary(
id=r.id,
name=r.name,
icon_id=r.icon_id,
type_description=r.type_description,
jobs_description=r.jobs_description,
)
for r in rows
]
async def items(
response: Response,
type: Optional[str] = Query(None, alias="type"),
search: Optional[str] = Query(None, description="Substring search on item name"),
page: int = Query(1, ge=1),
page_size: int = Query(40, ge=1, le=100),
session: AsyncSession = Depends(get_session),
):
"""Return items from all_items view with pagination."""
offset = (page - 1) * page_size
params: dict[str, Any] = {"limit": page_size, "offset": offset}
where_clauses: list[str] = ["a.name != '.'"]
if type:
if type == "MANNEQUIN":
where_clauses.append("a.type_description IN ('MANNEQUIN', 'NOTHING', 'UNKNOWN')")
else:
where_clauses.append("a.type_description = :type")
params["type"] = type
if search:
where_clauses.append("a.name ILIKE :search")
params["search"] = f"%{search}%"
where_sql = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
# Use LEFT JOIN to fetch jobs_description from armor_items table; it will be NULL for non-armor.
join_sql = "FROM all_items a LEFT JOIN armor_items ai ON ai.id = a.id"
params = {"limit": page_size, "offset": offset}
where_clauses = ["a.name != '.'"]
if type:
if type == 'MANNEQUIN':
where_clauses.append("a.type_description IN ('MANNEQUIN', 'NOTHING', 'UNKNOWN')")
else:
where_clauses.append("a.type_description = :type")
params["type"] = type
if search:
where_clauses.append("a.name ILIKE :search")
params["search"] = f"%{search}%"
where_sql = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
# Calculate total count for pagination
count_q = text(f"SELECT COUNT(*) {join_sql} {where_sql}") {join_sql} {where_sql}")
# Use only relevant params for count query (exclude limit/offset)
count_params = {k: v for k, v in params.items() if k not in ("limit", "offset")}
total_res = await session.execute(count_q, count_params)
@@ -196,6 +267,8 @@ async def items(
return [ItemSummary(id=r.id, name=r.name, icon_id=r.icon_id, type_description=r.type_description, jobs_description=r.jobs_description) for r in rows]
class ItemDetail(BaseModel):
id: int
name: str