Define the data.
Each garden has twelve spots. flowers stores the seeds under [garden, id] keys; garden is a derived view that counts blooms and free spots.
import { canonicalJson, collection, define, derive, fail, mutation, query, v } from "@flower-js/sdk";
import { scheduler } from "@flower-js/sdk/scheduler";
const GARDEN_SIZE = 12;
const name = v.string({ min: 1, max: 64 });
const flowers = collection<{ garden: string; id: string; plantedAt: number; bloomed: boolean }>("flowers")
.key(v.tuple([name, name]))
.index("garden", ["garden"]);
const garden = derive("garden", (ctx, id: string) => {
const rows = ctx.query(flowers.by("garden").eq(id));
return {
spacesLeft: GARDEN_SIZE - rows.length,
blooming: rows.filter((flower) => flower.bloomed).length,
flowers: Object.fromEntries(rows.map((flower) => [flower.id, flower.bloomed ? "🌼" : "🌱"])),
};
});
const view = query("view", { args: name, consistency: "replica-local" }, (ctx, id) => ctx.get(garden, id));