mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			109 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
import express from 'express'
 | 
						|
import { handleToNameAndHost } from '@server/helpers/actors'
 | 
						|
import { AccountBlocklistModel } from '@server/models/account/account-blocklist'
 | 
						|
import { getServerActor } from '@server/models/application/application'
 | 
						|
import { ServerBlocklistModel } from '@server/models/server/server-blocklist'
 | 
						|
import { MActorAccountId, MUserAccountId } from '@server/types/models'
 | 
						|
import { BlockStatus } from '@shared/models'
 | 
						|
import { asyncMiddleware, blocklistStatusValidator, optionalAuthenticate } from '../../middlewares'
 | 
						|
import { logger } from '@server/helpers/logger'
 | 
						|
 | 
						|
const blocklistRouter = express.Router()
 | 
						|
 | 
						|
blocklistRouter.get('/status',
 | 
						|
  optionalAuthenticate,
 | 
						|
  blocklistStatusValidator,
 | 
						|
  asyncMiddleware(getBlocklistStatus)
 | 
						|
)
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------
 | 
						|
 | 
						|
export {
 | 
						|
  blocklistRouter
 | 
						|
}
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------
 | 
						|
 | 
						|
async function getBlocklistStatus (req: express.Request, res: express.Response) {
 | 
						|
  const hosts = req.query.hosts as string[]
 | 
						|
  const accounts = req.query.accounts as string[]
 | 
						|
  const user = res.locals.oauth?.token.User
 | 
						|
 | 
						|
  const serverActor = await getServerActor()
 | 
						|
 | 
						|
  const byAccountIds = [ serverActor.Account.id ]
 | 
						|
  if (user) byAccountIds.push(user.Account.id)
 | 
						|
 | 
						|
  const status: BlockStatus = {
 | 
						|
    accounts: {},
 | 
						|
    hosts: {}
 | 
						|
  }
 | 
						|
 | 
						|
  const baseOptions = {
 | 
						|
    byAccountIds,
 | 
						|
    user,
 | 
						|
    serverActor,
 | 
						|
    status
 | 
						|
  }
 | 
						|
 | 
						|
  await Promise.all([
 | 
						|
    populateServerBlocklistStatus({ ...baseOptions, hosts }),
 | 
						|
    populateAccountBlocklistStatus({ ...baseOptions, accounts })
 | 
						|
  ])
 | 
						|
 | 
						|
  return res.json(status)
 | 
						|
}
 | 
						|
 | 
						|
async function populateServerBlocklistStatus (options: {
 | 
						|
  byAccountIds: number[]
 | 
						|
  user?: MUserAccountId
 | 
						|
  serverActor: MActorAccountId
 | 
						|
  hosts: string[]
 | 
						|
  status: BlockStatus
 | 
						|
}) {
 | 
						|
  const { byAccountIds, user, serverActor, hosts, status } = options
 | 
						|
 | 
						|
  if (!hosts || hosts.length === 0) return
 | 
						|
 | 
						|
  const serverBlocklistStatus = await ServerBlocklistModel.getBlockStatus(byAccountIds, hosts)
 | 
						|
 | 
						|
  logger.debug('Got server blocklist status.', { serverBlocklistStatus, byAccountIds, hosts })
 | 
						|
 | 
						|
  for (const host of hosts) {
 | 
						|
    const block = serverBlocklistStatus.find(b => b.host === host)
 | 
						|
 | 
						|
    status.hosts[host] = getStatus(block, serverActor, user)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
async function populateAccountBlocklistStatus (options: {
 | 
						|
  byAccountIds: number[]
 | 
						|
  user?: MUserAccountId
 | 
						|
  serverActor: MActorAccountId
 | 
						|
  accounts: string[]
 | 
						|
  status: BlockStatus
 | 
						|
}) {
 | 
						|
  const { byAccountIds, user, serverActor, accounts, status } = options
 | 
						|
 | 
						|
  if (!accounts || accounts.length === 0) return
 | 
						|
 | 
						|
  const accountBlocklistStatus = await AccountBlocklistModel.getBlockStatus(byAccountIds, accounts)
 | 
						|
 | 
						|
  logger.debug('Got account blocklist status.', { accountBlocklistStatus, byAccountIds, accounts })
 | 
						|
 | 
						|
  for (const account of accounts) {
 | 
						|
    const sanitizedHandle = handleToNameAndHost(account)
 | 
						|
 | 
						|
    const block = accountBlocklistStatus.find(b => b.name === sanitizedHandle.name && b.host === sanitizedHandle.host)
 | 
						|
 | 
						|
    status.accounts[sanitizedHandle.handle] = getStatus(block, serverActor, user)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function getStatus (block: { accountId: number }, serverActor: MActorAccountId, user?: MUserAccountId) {
 | 
						|
  return {
 | 
						|
    blockedByServer: !!(block && block.accountId === serverActor.Account.id),
 | 
						|
    blockedByUser: !!(block && user && block.accountId === user.Account.id)
 | 
						|
  }
 | 
						|
}
 |