1 import express from 'express'
2 import { handleToNameAndHost } from '@server/helpers/actors'
3 import { AccountBlocklistModel } from '@server/models/account/account-blocklist'
4 import { getServerActor } from '@server/models/application/application'
5 import { ServerBlocklistModel } from '@server/models/server/server-blocklist'
6 import { MActorAccountId, MUserAccountId } from '@server/types/models'
7 import { BlockStatus } from '@shared/models'
8 import { asyncMiddleware, blocklistStatusValidator, optionalAuthenticate } from '../../middlewares'
9 import { logger } from '@server/helpers/logger'
11 const blocklistRouter = express.Router()
13 blocklistRouter.get('/status',
15 blocklistStatusValidator,
16 asyncMiddleware(getBlocklistStatus)
19 // ---------------------------------------------------------------------------
25 // ---------------------------------------------------------------------------
27 async function getBlocklistStatus (req: express.Request, res: express.Response) {
28 const hosts = req.query.hosts as string[]
29 const accounts = req.query.accounts as string[]
30 const user = res.locals.oauth?.token.User
32 const serverActor = await getServerActor()
34 const byAccountIds = [ serverActor.Account.id ]
35 if (user) byAccountIds.push(user.Account.id)
37 const status: BlockStatus = {
50 populateServerBlocklistStatus({ ...baseOptions, hosts }),
51 populateAccountBlocklistStatus({ ...baseOptions, accounts })
54 return res.json(status)
57 async function populateServerBlocklistStatus (options: {
58 byAccountIds: number[]
60 serverActor: MActorAccountId
64 const { byAccountIds, user, serverActor, hosts, status } = options
66 if (!hosts || hosts.length === 0) return
68 const serverBlocklistStatus = await ServerBlocklistModel.getBlockStatus(byAccountIds, hosts)
70 logger.debug('Got server blocklist status.', { serverBlocklistStatus, byAccountIds, hosts })
72 for (const host of hosts) {
73 const block = serverBlocklistStatus.find(b => b.host === host)
75 status.hosts[host] = getStatus(block, serverActor, user)
79 async function populateAccountBlocklistStatus (options: {
80 byAccountIds: number[]
82 serverActor: MActorAccountId
86 const { byAccountIds, user, serverActor, accounts, status } = options
88 if (!accounts || accounts.length === 0) return
90 const accountBlocklistStatus = await AccountBlocklistModel.getBlockStatus(byAccountIds, accounts)
92 logger.debug('Got account blocklist status.', { accountBlocklistStatus, byAccountIds, accounts })
94 for (const account of accounts) {
95 const sanitizedHandle = handleToNameAndHost(account)
97 const block = accountBlocklistStatus.find(b => b.name === sanitizedHandle.name && b.host === sanitizedHandle.host)
99 status.accounts[sanitizedHandle.handle] = getStatus(block, serverActor, user)
103 function getStatus (block: { accountId: number }, serverActor: MActorAccountId, user?: MUserAccountId) {
105 blockedByServer: !!(block && block.accountId === serverActor.Account.id),
106 blockedByUser: !!(block && user && block.accountId === user.Account.id)