allium
免费Give your AI agents something more useful than a prompt. Velocity through clarity.
中文简介正在准备中。当前显示原文说明。
Implement query handlers that read from event-sourced read models
中文简介正在准备中。当前显示原文说明。
查看安装方法安装前可以查看交给 AI 代理的指令内容。
(ns my.service.core.queries
(:require [ai.obney.grain.event-store-v3.interface :as es]
[ai.obney.grain.query-processor.interface :refer [defquery]]
[my.service.interface.read-models :as rm]
[cognitect.anomalies :as anom]))
(defquery :namespace query-name
"Docstring describing what the query returns."
[{{:keys [entity-id filter-param]} :query
:keys [event-store other-dependency]}]
(let [entity (rm/get-entity event-store entity-id)]
(if entity
{:query/result {:entity entity}}
{::anom/category ::anom/not-found
::anom/message "Entity not found"})))
{:query/result {:entity data
:related-data more-data}}
{::anom/category ::anom/not-found
::anom/message "Human readable message"}
Load all data needed for a UI screen in one query:
(defquery :advisor meetings-screen
"Fat query for meetings screen - returns all data needed."
[{{:keys [student-id]} :query
:keys [event-store]}]
(let [;; Get primary entity
student (rm/get-student event-store student-id)
;; Get related data
meetings (rm/get-meetings-for-student event-store student-id)
;; Get metadata/options
meeting-types (rm/get-meeting-types event-store)]
(if student
{:query/result {:student student
:meetings meetings
:meeting-types meeting-types}}
{::anom/category ::anom/not-found
::anom/message "Student not found"})))
(defquery :crm list-contacts
"List contacts with optional filters and pagination."
[{{:keys [type-slug status limit offset]} :query
:keys [event-store]}]
(let [;; Get all matching contacts
all-contacts (cond->> (rm/get-contacts-all event-store)
type-slug (filter #(= type-slug (:type-slug %)))
status (filter #(= status (:status %))))
total (count all-contacts)
;; Apply pagination
paginated (cond->> all-contacts
offset (drop offset)
limit (take limit))]
{:query/result {:contacts (vec paginated)
:total total}}))
Pre-load related data to avoid N+1 queries:
(defquery :crm list-contacts-with-types
[{{:keys [type-slug]} :query
:keys [event-store]}]
(let [;; Pre-load all contact types (1 query instead of N)
types-by-id (rm/get-contact-types-by-id event-store)
;; Get contacts
contacts (rm/get-contacts-by-type event-store type-slug)
;; Enrich with type data
enriched (mapv #(assoc % :contact-type (get types-by-id (:type-id %)))
contacts)]
{:query/result {:contacts enriched}}))
(defquery :crm get-contact
"Get contact with attribution in single query."
[{{:keys [contact-id]} :query
:keys [event-store]}]
(let [contact (rm/get-contact event-store contact-id)]
(if contact
(let [;; Get related data
relationships (rm/get-relationships-for-contact event-store contact-id)
attribution (rm/get-attribution event-store contact-id)]
{:query/result {:contact (cond-> contact
attribution (assoc :attribution attribution)
(seq relationships) (assoc :relationships relationships))}})
{::anom/category ::anom/not-found
::anom/message "Contact not found"})))
{:query/result {...}} for success:total) for list queriescomponents/crm-service/src/ai/obney/workshop/crm_service/core/queries.clj - CRM queries with batch loading还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Give your AI agents something more useful than a prompt. Velocity through clarity.
中文简介正在准备中。当前显示原文说明。
Extract an Allium specification from an existing codebase. Use when the user has existing code and wants to distil behaviour into a spec, reverse engineer a specification from implementation, generate a spec from code, turn implementation into a behavioural specification, or document what a codebase does in Allium terms.
中文简介正在准备中。当前显示原文说明。
Run a structured discovery session to build an Allium specification through conversation. Use when the user wants to create a new spec from scratch, elicit or gather requirements, capture domain behaviour, specify a feature or system, define what a system should do, or is describing functionality and needs help shaping it into a specification.
中文简介正在准备中。当前显示原文说明。
Implement command handlers that validate state and emit events using the Grain framework
中文简介正在准备中。当前显示原文说明。
Create scheduled background jobs that run on cron schedules
中文简介正在准备中。当前显示原文说明。
Build read models by reducing events into queryable state
中文简介正在准备中。当前显示原文说明。