1 import express from 'express'
2 import { handleToNameAndHost } from '@server/helpers/actors'
3 import { logger } from '@server/helpers/logger'
4 import { AccountBlocklistModel } from '@server/models/account/account-blocklist'
5 import { getServerActor } from '@server/models/application/application'
6 import { ServerBlocklistModel } from '@server/models/server/server-blocklist'
7 import { MActorAccountId, MUserAccountId } from '@server/types/models'
8 import { BlockStatus } from '@shared/models'
9 import { apiRateLimiter, asyncMiddleware, blocklistStatusValidator, optionalAuthenticate } from '../../middlewares'
11 const blocklistRouter = express.Router()
13 blocklistRouter.use(apiRateLimiter)
15 blocklistRouter.get('/status',
17 blocklistStatusValidator,
18 asyncMiddleware(getBlocklistStatus)
21 // ---------------------------------------------------------------------------
27 // ---------------------------------------------------------------------------
29 async function getBlocklistStatus (req: express.Request, res: express.Response) {
30 const hosts = req.query.hosts as string[]
31 const accounts = req.query.accounts as string[]
32 const user = res.locals.oauth?.token.User
34 const serverActor = await getServerActor()
36 const byAccountIds = [ serverActor.Account.id ]
37 if (user) byAccountIds.push(user.Account.id)
39 const status: BlockStatus = {
52 populateServerBlocklistStatus({ ...baseOptions, hosts }),
53 populateAccountBlocklistStatus({ ...baseOptions, accounts })
56 return res.json(status)
59 async function populateServerBlocklistStatus (options: {
60 byAccountIds: number[]
62 serverActor: MActorAccountId
66 const { byAccountIds, user, serverActor, hosts, status } = options
68 if (!hosts || hosts.length === 0) return
70 const serverBlocklistStatus = await ServerBlocklistModel.getBlockStatus(byAccountIds, hosts)
72 logger.debug('Got server blocklist status.', { serverBlocklistStatus, byAccountIds, hosts })
74 for (const host of hosts) {
75 const block = serverBlocklistStatus.find(b => b.host === host)
77 status.hosts[host] = getStatus(block, serverActor, user)
81 async function populateAccountBlocklistStatus (options: {
82 byAccountIds: number[]
84 serverActor: MActorAccountId
88 const { byAccountIds, user, serverActor, accounts, status } = options
90 if (!accounts || accounts.length === 0) return
92 const accountBlocklistStatus = await AccountBlocklistModel.getBlockStatus(byAccountIds, accounts)
94 logger.debug('Got account blocklist status.', { accountBlocklistStatus, byAccountIds, accounts })
96 for (const account of accounts) {
97 const sanitizedHandle = handleToNameAndHost(account)
99 const block = accountBlocklistStatus.find(b => b.name === sanitizedHandle.name && b.host === sanitizedHandle.host)
101 status.accounts[sanitizedHandle.handle] = getStatus(block, serverActor, user)
105 function getStatus (block: { accountId: number }, serverActor: MActorAccountId, user?: MUserAccountId) {
107 blockedByServer: !!(block && block.accountId === serverActor.Account.id),
108 blockedByUser: !!(block && user && block.accountId === user.Account.id)