@atproto/ozone
Version:
Backend service for moderating the Bluesky network.
43 lines (39 loc) • 1.56 kB
text/typescript
import { InvalidRequestError } from '@atproto/xrpc-server'
import { AppContext } from '../../context'
import { Server } from '../../lexicon'
import { ids } from '../../lexicon/lexicons'
export default function (server: Server, ctx: AppContext) {
server.chat.bsky.moderation.getMessageContext({
auth: ctx.authVerifier.modOrAdminToken,
handler: async ({ params, auth }) => {
if (!ctx.chatAgent) {
throw new InvalidRequestError('No chat agent configured')
}
const maxWindowSize = auth.credentials.isModerator ? 5 : 0
const before = Math.min(maxWindowSize, params.before)
const after = Math.min(maxWindowSize, params.after)
// Ensure that the requested message was actually reported to prevent arbitrary lookups
const found = await ctx.db.db
.selectFrom('moderation_event')
.select('id')
.where('subjectMessageId', '=', params.messageId)
// uses "moderation_event_message_id_idx" index
.where('subjectMessageId', 'is not', null)
.where('action', '=', 'tools.ozone.moderation.defs#modEventReport')
.limit(1)
.executeTakeFirst()
if (!found) {
throw new InvalidRequestError('No report for requested message')
}
const res =
await ctx.chatAgent.api.chat.bsky.moderation.getMessageContext(
{ ...params, before, after },
await ctx.chatAuth(ids.ChatBskyModerationGetMessageContext),
)
return {
encoding: 'application/json',
body: res.data,
}
},
})
}