example restaurant review app on atproto
1import { is } from "@atcute/lexicons";
2import { Jetstream } from "@skyware/jetstream";
3import { AppFooodzReview } from "./lexicons";
4import { db } from "./drizzle/db";
5import { reviews } from "./drizzle/schema";
6import { eq } from "drizzle-orm";
7
8const jetstream = new Jetstream({
9 wantedCollections: ["app.fooodz.review"],
10});
11
12jetstream.onCreate("app.fooodz.review", async (event) => {
13 console.info(`new review ${event.commit.rkey}`);
14 if (is(AppFooodzReview.mainSchema, event.commit.record)) {
15 const { place, rating, review, createdAt } = event.commit.record;
16
17 // should store the did and rkey as well
18 await db.insert(reviews).values({
19 rkey: event.commit.rkey,
20 authorDid: event.did,
21 place,
22 rating,
23 review,
24 createdAt,
25 });
26 }
27});
28
29jetstream.onUpdate("app.fooodz.review", async (event) => {
30 if (is(AppFooodzReview.mainSchema, event.commit.record)) {
31 const { place, rating, review, createdAt } = event.commit.record;
32
33 await db
34 .insert(reviews)
35 .values({
36 rkey: event.commit.rkey,
37 authorDid: event.did,
38 place,
39 rating,
40 review,
41 createdAt,
42 })
43 .onConflictDoUpdate({
44 target: reviews.rkey,
45 set: {
46 place,
47 rating,
48 review,
49 },
50 });
51 }
52});
53
54jetstream.onDelete("app.fooodz.review", async (event) => {
55 await db.delete(reviews).where(eq(reviews.rkey, event.commit.rkey));
56 console.log("deleted record", event.commit.rkey);
57});
58
59jetstream.on("open", () => {
60 console.log("jetstream ingester started");
61});
62
63export { jetstream };