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)
 | |
|   }
 | |
| }
 |