import { and, eq, lt } from "drizzle-orm"; import { getBlobCidString } from "@atproto/lex"; import type { CollectionHandler } from "../tap"; import * as lexiconProfile from "../../lexicons/app/bsky/actor/profile.ts"; import { db } from "../../db/index.ts"; import { bskyProfile } from "../../db/tables/bsky.ts"; export const ingestProfile: CollectionHandler = async (profiles) => { for (const profile of profiles) { if (profile.action === "delete") { await db .insert(bskyProfile) .values({ did: profile.did, rev: profile.rev, cid: null, deleted: true, }) .onConflictDoUpdate({ target: bskyProfile.did, set: { rev: profile.rev, cid: null, deleted: true, }, setWhere: lt(bskyProfile.rev, profile.rev), }); continue; } const validatedRecord = lexiconProfile.$safeParse(profile.record); if (!validatedRecord.success) continue; const { value: profileRecord } = validatedRecord; const avatar = profileRecord.avatar ? getBlobCidString(profileRecord.avatar) : null; const banner = profileRecord.banner ? getBlobCidString(profileRecord.banner) : null; await db .insert(bskyProfile) .values({ did: profile.did, rev: profile.rev, cid: profile.cid, deleted: false, displayName: profileRecord.displayName, description: profileRecord.description, pronouns: profileRecord.pronouns, website: profileRecord.website, avatar, banner, }) .onConflictDoUpdate({ target: bskyProfile.did, set: { rev: profile.rev, cid: profile.cid, deleted: false, displayName: profileRecord.displayName, description: profileRecord.description, pronouns: profileRecord.pronouns, website: profileRecord.website, avatar, banner, }, setWhere: lt(bskyProfile.rev, profile.rev), }); } };