swadhinbiswas fix: remove highlight.js CSS import causing Docker build failure · 7/20/2026
299a084
53 lines · 1.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
"""shop.db — thin SQL helpers over the justapi Database pool.

Wraps `app.db.query`/`execute` and adds pagination + a token generator. All
queries use bound parameters (injection-safe).
"""
from __future__ import annotations

import secrets
from typing import Any, Optional

from .config import db


def q(sql: str, params: list | None = None) -> list[dict]:
    rows = db().query(sql, params or [])
    return [dict(r) for r in rows]


def q1(sql: str, params: list | None = None) -> Optional[dict]:
    rows = q(sql, params)
    return rows[0] if rows else None


def _page(qp: dict) -> tuple[int, int]:
    try:
        page = max(1, int(qp.get("page", 1)))
    except (TypeError, ValueError):
        page = 1
    try:
        size = max(1, min(200, int(qp.get("size", 20))))
    except (TypeError, ValueError):
        size = 20
    return page, size


def paginate(base_sql: str, count_sql: str, params: list, qp: dict) -> dict:
    page, size = _page(qp)
    total = q1(count_sql, params)
    total_n = int(total["c"]) if total and "c" in total else 0
    offset = (page - 1) * size
    rows = q(base_sql + f" LIMIT {size} OFFSET {offset}", params)
    return {
        "page": page,
        "size": size,
        "total": total_n,
        "pages": (total_n + size - 1) // size if total_n else 0,
        "items": rows,
    }


def new_token(prefix: str) -> str:
    return f"{prefix}_{secrets.token_hex(12)}"