UNPKG

@atproto/ozone

Version:

Backend service for moderating the Bluesky network.

81 lines 3.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = default_1; const syntax_1 = require("@atproto/syntax"); const util_1 = require("../util"); function default_1(server, ctx) { server.tools.ozone.moderation.getSubjects({ auth: ctx.authVerifier.modOrAdminToken, handler: async ({ params, auth, req }) => { const { subjects } = params; const db = ctx.db; const labelers = ctx.reqLabelers(req); const uris = new Set(); const dids = new Set(); for (const subject of subjects) { if (subject.startsWith('did:')) { dids.add(subject); } if (subject.startsWith('at://')) { uris.add(subject); dids.add(new syntax_1.AtUri(subject).host); } } const didsArray = Array.from(dids); const modViews = ctx.modService(db).views; const [partialRepos, accountInfo, recordInfo, profiles] = await Promise.all([ modViews.repoDetails(didsArray, labelers), (0, util_1.getPdsAccountInfos)(ctx, didsArray), modViews.recordDetails(Array.from(uris).map((uri) => ({ uri })), labelers), modViews.getProfiles(didsArray), ]); const missingSubjects = []; const subjectWithDetails = new Map(); for (const subject of subjects) { const type = subject.startsWith('did:') ? 'account' : 'record'; const did = type === 'account' ? subject : new syntax_1.AtUri(subject).host; const partialRepo = partialRepos.get(did); const repo = partialRepo ? (0, util_1.addAccountInfoToRepoViewDetail)(partialRepo, accountInfo.get(did) || null, auth.credentials.isModerator) : undefined; const profile = profiles.get(did); const record = type === 'record' ? recordInfo.get(subject) : undefined; const status = type === 'record' ? record?.moderation.subjectStatus : repo?.moderation.subjectStatus; subjectWithDetails.set(subject, { type, repo, record, profile: profile && { $type: 'app.bsky.actor.defs#profileViewDetailed', ...profile, }, status, subject, }); if ((type === 'record' && !record) || (type === 'account' && !repo)) { missingSubjects.push(subject); } } // When a subject is repo or record but the repo/record was deleted, we still want to attach moderation status if any exists const missingSubjectStatuses = await modViews.getSubjectStatus(missingSubjects); for (const [subject, status] of missingSubjectStatuses) { const subjectView = subjectWithDetails.get(subject); if (subjectView) subjectView.status = modViews.formatSubjectStatus(status); } const allSubjects = []; for (const subject of subjects) { const subjectView = subjectWithDetails.get(subject); if (subjectView) allSubjects.push(subjectView); } return { encoding: 'application/json', body: { subjects: allSubjects }, }; }, }); } //# sourceMappingURL=getSubjects.js.map