Open History to see the last commit
1import * as Cloudflare from "@alchemy.run/cloudflare";
2import * as Http from "alchemy/Http";
3import * as Effect from "effect/Effect";
4import * as HttpApiBuilder from "effect/http-api/HttpApiBuilder";
5import * as HttpRouter from "effect/http/HttpRouter";
6import * as Layer from "effect/Layer";
7import { AdminApi, Product } from "./Api.ts";
8import { Catalog, HOSTNAME } from "./Store.ts";
9
10/** `/admin/*` — write-only access to the catalog. */
11export default class Admin extends Cloudflare.Worker<Admin>()(
12 "Admin",
13 {
14 main: import.meta.url,
15 routes: [{ pattern: `${HOSTNAME}/admin/*` }],
16 },
17 Effect.gen(function* () {
18 const catalog = yield* Cloudflare.KV.WriteNamespace(Catalog);
19
20 return {
21 fetch: yield* HttpRouter.toHttpEffect(
22 HttpApiBuilder.layer(AdminApi).pipe(
23 Layer.provide(Http.Platform),
24 Layer.provide(
25 HttpApiBuilder.group(AdminApi, "admin", (handlers) =>
26 handlers.handle("putProduct", ({ params, payload }) =>
27 Effect.gen(function* () {
28 const product = new Product({ id: params.id, ...payload });
29 yield* catalog.put(product.id, JSON.stringify(product)).pipe(Effect.orDie);
30 return product;
31 }),
32 ),
33 ),
34 ),
35 ),
36 ),
37 };
38 }).pipe(Effect.provide(Cloudflare.KV.WriteNamespaceBinding)),
39) {}