allium
免费Give your AI agents something more useful than a prompt. Velocity through clarity.
中文简介正在准备中。当前显示原文说明。
Implement command handlers that validate state and emit events using the Grain framework
中文简介正在准备中。当前显示原文说明。
查看安装方法安装前可以查看交给 AI 代理的指令内容。
(ns my.service.core.commands
(:require [ai.obney.grain.event-store-v3.interface :refer [->event]]
[ai.obney.grain.command-processor-v2.interface :refer [defcommand]]
[ai.obney.grain.command-processor-v2.interface :as cp]
[ai.obney.grain.time.interface :as time]
[my.service.core.read-models :as rm]
[cognitect.anomalies :as anom]))
(defcommand :service command-name
"Docstring describing what the command does."
[{{:keys [entity-id field1 field2]} :command
:as ctx}]
;; 1. Read current state from read models (pass ctx, NOT bare event-store)
(let [entity (rm/get-entity ctx entity-id)]
(cond
;; Return anomaly for validation failures
(not entity)
{::anom/category ::anom/not-found
::anom/message "Entity not found"}
(not (:active entity))
{::anom/category ::anom/conflict
::anom/message "Cannot modify inactive entity"}
;; Success: return events
:else
{:command-result/events
[(->event
{:type :service/entity-updated
:tags #{[:entity entity-id]}
:body {:entity-id entity-id
:field1 field1
:field2 field2
:modified-at (str (time/now))}})]})))
{:command-result/events
[(->event {:type :service/thing-created
:tags #{[:thing thing-id]}
:body {:thing-id thing-id :name name}})]}
{::anom/category ::anom/conflict
::anom/message "Name already taken."}
Prevents races by checking state hasn't changed between read and write:
{:command-result/events [...]
:command-result/cas {:types thing-event-types
:predicate-fn (fn [_events]
(= :active (:status (rm/get-thing ctx id))))}}
(let [result (cp/process-command
(assoc ctx :command {:command/id (random-uuid)
:command/timestamp (time/now)
:command/name :other/command-name
:field1 value1}))]
;; result is either anomaly or {:command-result/events [...]}
result)
::anom/not-found -- resource does not exist::anom/conflict -- business rule violation (duplicate, invalid state)::anom/incorrect -- bad input data::anom/forbidden -- not authorized for this actionctx (the full context), not bare event-store#{[:entity entity-id]} for efficient filtered readsmodified-at in event bodies when relevantcomponents/orc-service/src/ai/obney/orc/orc_service/core/commands.clj -- ORC sheet commandscomponents/colbert/src/ai/obney/orc/colbert/core/commands.clj -- ColBERT commandscomponents/ontology/src/ai/obney/orc/ontology/core/commands.clj -- Ontology commands还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
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.
中文简介正在准备中。当前显示原文说明。
Create scheduled background jobs that run on cron schedules
中文简介正在准备中。当前显示原文说明。
Implement query handlers that read from event-sourced read models
中文简介正在准备中。当前显示原文说明。
Build read models by reducing events into queryable state
中文简介正在准备中。当前显示原文说明。