import Resolver from "../resolver.js"; import { fetchPerson } from "../models/person.js"; import { createBite } from "../../../services/create-bite.js"; import { tickBiteIncoming } from "../../../metrics.js"; import { getNote } from "../../../server/api/common/getters.js"; import { parseUri } from "../db-resolver.js"; export default (async (actor, bite)=>{ if (actor.uri !== bite.actor) { return "skip: actor uri mismatch"; } if (bite.id === null) { return "skip: bite id not specified"; } const resolver = new Resolver(); const biteActor = await fetchPerson(bite.actor, resolver); if (biteActor === null) { return "skip: biteActor is null"; } const targetParsed = parseUri(bite.target); if (!targetParsed.local) { return "skip: target is not local"; } const targetDbId = targetParsed.id; const targetPathType = targetParsed.type; let targetType; let targetId; let fallback = false; if (targetPathType === "users") { targetType = "user"; targetId = targetDbId; } else if (targetPathType === "bites") { targetType = "bite"; targetId = targetDbId; } else if (targetPathType === "notes") { targetType = "note"; targetId = targetDbId; try { await getNote(targetDbId, actor); } catch (err) { if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") { // note either doesn't exist or the remote user shouldn't be able to access it fallback = true; } } } else { fallback = true; } if (fallback) { // fallback for unknown object types targetType = "user"; if (bite.to !== undefined) { const to = Array.isArray(bite.to) ? bite.to[0] : bite.to; targetId = to.split("/").pop(); } else { return "skip: unknown type missing to field"; } } await createBite(biteActor, targetType, targetId, bite.id, bite.published ? new Date(bite.published) : null); tickBiteIncoming(); return "ok"; });