import { lt } from "drizzle-orm"; import type { CollectionHandler } from "../tap.ts"; import * as lexiconReaction from "../../lexicons/sh/tangled/feed/reaction.ts"; import { db } from "../../db/index.ts"; import { tangledReaction } from "../../db/tables/tangled.ts"; export const ingestReaction: CollectionHandler = async (reactions) => { for (const reaction of reactions) { if (reaction.action === "delete") { await db .insert(tangledReaction) .values({ did: reaction.did, rev: reaction.rev, rkey: reaction.rkey, cid: null, deleted: true, }) .onConflictDoUpdate({ target: [tangledReaction.did, tangledReaction.rkey], set: { rev: reaction.rev, cid: null, deleted: true, }, setWhere: lt(tangledReaction.rev, reaction.rev), }); continue; } const validatedRecord = lexiconReaction.$safeParse(reaction.record); if (!validatedRecord.success) continue; const { value: reactionRecord } = validatedRecord; await db .insert(tangledReaction) .values({ did: reaction.did, rev: reaction.rev, rkey: reaction.rkey, cid: reaction.cid, deleted: false, subject: reactionRecord.subject, reaction: reactionRecord.reaction, createdAt: new Date(reactionRecord.createdAt), }) .onConflictDoUpdate({ target: [tangledReaction.did, tangledReaction.rkey], set: { rev: reaction.rev, cid: reaction.cid, deleted: false, subject: reactionRecord.subject, reaction: reactionRecord.reaction, createdAt: new Date(reactionRecord.createdAt), }, setWhere: lt(tangledReaction.rev, reaction.rev), }); } };