Spec modularization: - Add (define-module :name) markers to primitives.sx creating 11 modules (7 core, 4 stdlib). Bootstrappers can now selectively include modules. - Add parse_primitives_by_module() to boundary_parser.py. - Remove split-ids primitive; inline at 4 call sites in blog/market queries. Python file split: - primitives.py: slimmed to registry + core primitives only (~350 lines) - primitives_stdlib.py: NEW — stdlib primitives (format, text, style, debug) - primitives_ctx.py: NEW — extracted 12 page context builders from IO - primitives_io.py: add register_io_handler decorator, auto-derive IO_PRIMITIVES from registry, move sync IO bridges here JS parity fixes: - = uses === (strict equality), != uses !== - round supports optional ndigits parameter - concat uses nil-check not falsy-check (preserves 0, "", false) - escape adds single quote entity (') matching Python/markupsafe - assert added (was missing from JS entirely) Bootstrapper modularization: - PRIMITIVES_JS_MODULES / PRIMITIVES_PY_MODULES dicts keyed by module - --modules CLI flag for selective inclusion (core.* always included) - Regenerated sx-ref.js and sx_ref.py with all fixes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
41 lines
1.6 KiB
Plaintext
41 lines
1.6 KiB
Plaintext
;; Blog service — inter-service data queries
|
|
|
|
(defquery post-by-slug (&key slug)
|
|
"Fetch a single blog post by its URL slug."
|
|
(service "blog" "get-post-by-slug" :slug slug))
|
|
|
|
(defquery post-by-id (&key id)
|
|
"Fetch a single blog post by its primary key."
|
|
(service "blog" "get-post-by-id" :id id))
|
|
|
|
(defquery posts-by-ids (&key ids)
|
|
"Fetch multiple blog posts by comma-separated IDs."
|
|
(service "blog" "get-posts-by-ids"
|
|
:ids (map parse-int (filter (fn (s) (not (empty? s))) (split (str ids) ",")))))
|
|
|
|
(defquery search-posts (&key query page per-page)
|
|
"Search blog posts by text query, paginated."
|
|
(let ((result (service "blog" "search-posts"
|
|
:query query :page page :per-page per-page)))
|
|
{"posts" (nth result 0) "total" (nth result 1)}))
|
|
|
|
(defquery page-config-ensure (&key container-type container-id)
|
|
"Get or create a PageConfig for a container."
|
|
(service "page-config" "ensure"
|
|
:container-type container-type :container-id container-id))
|
|
|
|
(defquery page-config (&key container-type container-id)
|
|
"Return a single PageConfig by container type + id."
|
|
(service "page-config" "get-by-container"
|
|
:container-type container-type :container-id container-id))
|
|
|
|
(defquery page-config-by-id (&key id)
|
|
"Return a single PageConfig by primary key."
|
|
(service "page-config" "get-by-id" :id id))
|
|
|
|
(defquery page-configs-batch (&key container-type ids)
|
|
"Return PageConfigs for multiple container IDs (comma-separated)."
|
|
(service "page-config" "get-batch"
|
|
:container-type container-type
|
|
:ids (map parse-int (filter (fn (s) (not (empty? s))) (split (str ids) ",")))))
|