From 72a5160b9171af88650a61e83857731d004c4034 Mon Sep 17 00:00:00 2001 From: George Payne Date: Wed, 12 Aug 2026 16:23:01 +0200 Subject: [PATCH] Rewrite the projections tutorial around gaffer The tutorial walked readers through creating a projection by posting JavaScript to the HTTP API and clicking through the embedded UI, then reading results back over AtomPub. Two of those three no longer work on a default node: AtomPub has been off by default since v20 and is slated for removal, so the "read the result stream" steps fail for anyone following the quick-start install. Rewrite it around gaffer, which authors and deploys projections and runs the same JavaScript engine the server does: - The projection now runs locally against a JSON fixture before any database exists, so the write-run-inspect loop takes seconds and the reader sees state after every event. - Deploying is `gaffer deploy` against an environment in `gaffer.toml`, replacing the hand-written create and update calls, and state is read back over the management API rather than AtomPub. - A closing section changes the projection and shows the change as a diff against what is deployed. - Documents that a logic change does not rebuild existing state, and how to opt into reprocessing. The old page never mentioned it. Keeps the shopping-cart sample data and the Xbox One S counter, so readers who know the old page recognise this one. `outputState()` and result streams move to a note pointing at the projections API reference, since a curl walkthrough of them cannot work without AtomPub. Engine V1 throughout, matching the server default. V2 is linked as the experimental alternative. The two embedded-UI screenshots the page carried are deleted with it - nothing else referenced them. --- ...getting-started-create-projection-dark.png | Bin 42700 -> 0 bytes .../getting-started-create-projection.png | Bin 42170 -> 0 bytes docs/server/features/projections/tutorial.md | 381 +++++++++++++----- 3 files changed, 281 insertions(+), 100 deletions(-) delete mode 100644 docs/server/features/projections/images/getting-started-create-projection-dark.png delete mode 100644 docs/server/features/projections/images/getting-started-create-projection.png diff --git a/docs/server/features/projections/images/getting-started-create-projection-dark.png b/docs/server/features/projections/images/getting-started-create-projection-dark.png deleted file mode 100644 index 7d5342280f57ce8c4c5f94c0c49cda9b1d358ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42700 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 AHvj+t diff --git a/docs/server/features/projections/images/getting-started-create-projection.png b/docs/server/features/projections/images/getting-started-create-projection.png deleted file mode 100644 index d044baa3641776174049e0dd35fca6432840b036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42170 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 z 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 w= 0) { + state.count += 1; + } + return state; + }, + }) +``` + +`event.body` is the event's JSON payload, already parsed. Events that are not `ItemAdded` have no handler, so the projection ignores them. + +## Run it without a database + +A projection is only interesting once events flow through it, and you do not need a running KurrentDB for that. Put some events in a JSON file - `fixtures/carts.json` - where each entry names the stream it belongs to: + +```json +[ + { + "eventType": "ItemAdded", + "streamId": "shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1164", + "data": "{\"Description\": \"Xbox One S 1TB (Console)\"}" + }, + { + "eventType": "ItemAdded", + "streamId": "shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1164", + "data": "{\"Description\": \"Gears of War 4\"}" + } +] +``` + +The companion project's file holds seven such events across four carts. Register it in `gaffer.toml` as a named fixture: + +```toml +[[projection]] + name = "xbox-one-s-counter" + entry = "projections/xbox-one-s-counter.js" + engine_version = 1 + fixtures.carts = "fixtures/carts.json" +``` + +Then run the projection against it: + +```bash:no-line-numbers +gaffer dev xbox-one-s-counter --fixture carts +``` + +Gaffer summarises what it found in your projection, then feeds each event through your handlers and shows the state after every one: + +```text:no-line-numbers +xbox-one-s-counter + Source: $all + Events: ItemAdded + Engine: v1 + Quirks: unversioned (matching all KurrentDB quirks) + +0@shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1164 +│ type: ItemAdded +│ data: {"Description": "Xbox One S 1TB (Console)"} +╰ processed + state: {"count":1} + +1@shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1164 +│ type: ItemAdded +│ data: {"Description": "Gears of War 4"} +╰ processed + state: {"count":1} + +7 events processed + + State: {"count":3} +``` + +Three of the seven items are Xbox One S consoles, and the second event leaves the count alone because a copy of Gears of War 4 is not a console. Edit the projection and run it again as often as you like: the loop takes seconds and touches no database. -@[code](@samples/http-api/xbox-one-s-counter-outputState.sh) +::: tip +The [VS Code extension](https://gaffer.kurrent.io/extension/vs-code/) runs the same thing with breakpoints, so you can step through a handler and inspect the state as it changes. +::: -Then reset the projection you created above: +## Count the items in each cart -@[code](@samples/http-api/projections/reset-projection.sh) +The projection so far keeps one number for the whole database. More often you want a number per stream - here, how many items are in each cart. -You should get a response similar to the one below: +Add a second projection, `projections/shopping-cart-counter.js`: -@[code](@samples/http-api/projections/reset-projection.json) +```javascript +fromCategory("shoppingCart") + .foreachStream() + .when({ + $init() { + return { count: 0 }; + }, + ItemAdded(state) { + state.count += 1; + return state; + }, + }) +``` -You can now read the events in the result stream by issuing a read request. +Two changes matter. `fromCategory("shoppingCart")` reads only the streams whose names start with `shoppingCart-`, and `.foreachStream()` gives each of those streams its own state, so the counters do not merge into one. -@[code](@samples/http-api/projections/read-projection-events.sh) +Register it the same way, then run it: -And you'll get a response like this: +```bash:no-line-numbers +gaffer dev shopping-cart-counter --fixture carts +``` -@[code](@samples/http-api/projections/reset-projection.json) +This time the result is one state per cart, printed in no particular order: -## The number of items per shopping cart +```text:no-line-numbers +7 events processed -The example in this step so far relied on a global state for the projection, but what if you wanted a count of the number of items in the shopping cart per shopping cart. +shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1164 + state: {"count":2} +shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1165 + state: {"count":2} +shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1166 + state: {"count":2} +shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1167 + state: {"count":1} +``` -KurrentDB has a built-in `$by_category` projection that lets you select events from a particular list of streams. Enable this projection with the following command. +::: tip +On a server, `fromCategory` reads the `$ce-shoppingCart` stream, which the [`$by_category`](system.md#by-category) system projection maintains. That projection must be running, which the database you start in the next section does for you. +::: -@[code](@samples/http-api/projections/enable-by-category.sh) +## Deploy to KurrentDB -The projection links events from existing streams to new streams by splitting the stream name by a separator. You can configure the projection to specify the position of where to split the stream `id` and provide a separator. +Start a database. From the companion project: -By default, the category splits the stream `id` by a dash. The category is the first string. +```bash:no-line-numbers +docker compose up -d +docker compose wait seed +``` -| Stream Name | Category | -|--------------------|----------------------------------------| -| shoppingCart-54 | shoppingCart | -| shoppingCart-v1-54 | shoppingCart | -| shoppingCart | _No category as there is no separator_ | +The first command starts a single insecure KurrentDB node on `localhost:2113` with projections enabled, alongside a one-shot service that appends the same seven events to it. The second waits for that seeding to finish, so the projections have the same data to work with as they did locally. -You want to define a projection that produces a count per stream for a category, but the state needs to be per stream. To do so, use `$by_category` and its `fromCategory` API method. +Tell gaffer about the database by adding an environment to `gaffer.toml`: -Below is the projection: +```toml +[env.local] +connection = "kurrentdb://localhost:2113?tls=false" +default = true +``` -@[code](@samples/http-api/projections/shopping-cart-counter.js) +Then deploy: -Create the projection with the following request: +```bash:no-line-numbers +gaffer deploy +``` -@[code](@samples/http-api/projections/shopping-cart-counter.sh) +Gaffer works out what needs to change and shows you the plan before writing anything: what it would create or update, with everything already in sync reported as a count rather than listed. Confirming applies it: -### Querying for the state of the projection by partition +```text:no-line-numbers + ✓ xbox-one-s-counter created + ✓ shopping-cart-counter created -Querying for the state of the projection is different due to the partitioning of the projection. You have to specify the partition and the name of the stream. +2 created · 0 updated · 0 skipped +``` -@[code](@samples/http-api/projections/read-state-partition.sh) +Deploying is safe to repeat. A projection whose definition has not changed is skipped rather than rewritten, so running `gaffer deploy` twice does nothing the second time. In a script, pass `--yes` to skip the confirmation. -The server then returns the state for the partition: +`gaffer status` then lists each projection with its state on the server, when it was last deployed, and whether what is deployed still matches your local files. -@[code](@samples/http-api/projections/read-state-partition.json) +Your projections are now running on the server, processing events as they arrive. Ask the server what a projection's state is - give it a moment after deploying, since a projection that has just started may still be working through the events: -## Configure projection properties +```bash:no-line-numbers +curl http://localhost:2113/projection/xbox-one-s-counter/state +``` -You can configure properties of the projection by updating values of the `options` object. For example, the following projection changes the name of the results stream: +```json +{"count":3} +``` -@[code{2}](@samples/http-api/projections/update-projection-options.js) +The same count you saw locally. For the partitioned projection, name the partition you want: -Then send the update to the projection: +```bash:no-line-numbers +curl "http://localhost:2113/projection/shopping-cart-counter/state?partition=shoppingCart-b989fe21-9469-4017-8d71-9820b8dd1164" +``` -@[code](@samples/http-api/projections/update-projection-options.sh) +```json +{"count":2} +``` ::: tip -You can find all the options available in the [projections API](custom.md#projections-api) documentation. +Polling for state is not the only option. A projection that calls `.outputState()` also publishes its state as events - on `$projections-{projection-name}-result`, or one stream per partition for a partitioned projection - and a client can subscribe to those the way it would any other stream. They are system streams, so a secured server may require additional permissions to read them. See [User-defined projections](custom.md#projections-api) for that and the rest of the API. ::: -Now you can read the result as above, but use the new stream name: - -@[code](@samples/http-api/projections/read-projection-events-renamed.sh) - -## Query running projections - -You can also query the state of all projections using the HTTP API. - -@[code](@samples/http-api/projections/list-all-projections.sh) - -The response is a list of all known projections and useful information about them. +## Change it and see the difference + +Projections evolve. Suppose you also want to know how many items were added in total, not only the consoles: + +```javascript + $init() { + return { count: 0, items: 0 }; + }, + ItemAdded(state, event) { + state.items += 1; + if (event.body.Description.indexOf("Xbox One S") >= 0) { + state.count += 1; + } + return state; + }, +``` + +Your local file and the deployed projection now disagree. Ask gaffer what changed: + +```bash:no-line-numbers +gaffer diff xbox-one-s-counter +``` + +```text:no-line-numbers +xbox-one-s-counter + Query: +2 -1 + Engine version: 1 + Emit: disabled + Drift: drifted + Last deploy: 2026-08-12 13:08 + + 1 1 fromAll() + 2 2 .when({ + 3 3 $init() { + 4 - return { count: 0 }; + 4 + return { count: 0, items: 0 }; + 5 5 }, + 6 6 ItemAdded(state, event) { + 7 + state.items += 1; + 7 8 if (event.body.Description.indexOf("Xbox One S") >= 0) { + 8 9 state.count += 1; + 9 10 } +10 11 return state; +11 12 }, +12 13 }) +``` + +Run it locally first if you want to check the new logic, then `gaffer deploy` again to update the server. + +::: warning +Changing a projection's logic does not change the state it has already built. By default the updated projection carries on from where it left off, so state accumulated by the old code is still there - here, `items` counts from the point you deployed rather than from the first event. Pass `--reset-on-logic-change` to `gaffer deploy` to reprocess from the beginning instead. +::: -@[code](@samples/http-api/projections/list-all-projections.json) +## Next steps +- [User-defined projections](custom.md) - the full JavaScript API: selectors, partitioning, emitting events, and the options you can set. +- [System projections](system.md) - the projections KurrentDB ships with, including the `$by_category` projection used above. +- [Projections engine V2](./engine-v2.md) - the experimental parallel-partition engine, and how it differs from the engine used here. +- [Gaffer documentation](https://gaffer.kurrent.io) - testing projections, deploying from CI, reviewing deploy history, and rolling back. +- Managing projections from your application: see the projections page for your [client SDK](https://docs.kurrent.io/clients/).