example restaurant review app on atproto
at main 1.5 kB view raw
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 };