Add server API actors route

This commit is contained in:
Kimsible 2021-04-28 17:33:55 +02:00
parent ff8c5ccf09
commit 1e37d32f4b
6 changed files with 120 additions and 9 deletions

View File

@ -0,0 +1,37 @@
import * as express from 'express'
import { JobQueue } from '../../lib/job-queue'
import { asyncMiddleware } from '../../middlewares'
import { actorNameWithHostGetValidator } from '../../middlewares/validators'
const actorRouter = express.Router()
actorRouter.get('/:actorName',
asyncMiddleware(actorNameWithHostGetValidator),
getActor
)
// ---------------------------------------------------------------------------
export {
actorRouter
}
// ---------------------------------------------------------------------------
function getActor (req: express.Request, res: express.Response) {
let accountOrVideoChannel
if (res.locals.account) {
accountOrVideoChannel = res.locals.account
}
if (res.locals.videoChannel) {
accountOrVideoChannel = res.locals.videoChannel
}
if (accountOrVideoChannel.isOutdated()) {
JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: accountOrVideoChannel.Actor.url } })
}
return res.json(accountOrVideoChannel.toFormattedJSON())
}

View File

@ -15,6 +15,7 @@ import { pluginRouter } from './plugins'
import { searchRouter } from './search'
import { serverRouter } from './server'
import { usersRouter } from './users'
import { actorRouter } from './actor'
import { videoChannelRouter } from './video-channel'
import { videoPlaylistRouter } from './video-playlist'
import { videosRouter } from './videos'
@ -39,6 +40,7 @@ apiRouter.use('/bulk', bulkRouter)
apiRouter.use('/oauth-clients', oauthClientsRouter)
apiRouter.use('/config', configRouter)
apiRouter.use('/users', usersRouter)
apiRouter.use('/actors', actorRouter)
apiRouter.use('/accounts', accountsRouter)
apiRouter.use('/video-channels', videoChannelRouter)
apiRouter.use('/video-playlists', videoPlaylistRouter)

View File

@ -0,0 +1,10 @@
import { isAccountNameValid } from './accounts'
import { isVideoChannelNameValid } from './video-channels'
function isActorNameValid (value: string) {
return isAccountNameValid(value) || isVideoChannelNameValid(value)
}
export {
isActorNameValid
}

View File

@ -3,22 +3,22 @@ import { MChannelBannerAccountDefault } from '@server/types/models'
import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
import { VideoChannelModel } from '../../models/video/video-channel'
async function doesLocalVideoChannelNameExist (name: string, res: express.Response) {
async function doesLocalVideoChannelNameExist (name: string, res: express.Response, sendNotFound = true) {
const videoChannel = await VideoChannelModel.loadLocalByNameAndPopulateAccount(name)
return processVideoChannelExist(videoChannel, res)
return processVideoChannelExist(videoChannel, res, sendNotFound)
}
async function doesVideoChannelIdExist (id: number, res: express.Response) {
async function doesVideoChannelIdExist (id: number, res: express.Response, sendNotFound = true) {
const videoChannel = await VideoChannelModel.loadAndPopulateAccount(+id)
return processVideoChannelExist(videoChannel, res)
return processVideoChannelExist(videoChannel, res, sendNotFound)
}
async function doesVideoChannelNameWithHostExist (nameWithDomain: string, res: express.Response) {
async function doesVideoChannelNameWithHostExist (nameWithDomain: string, res: express.Response, sendNotFound = true) {
const videoChannel = await VideoChannelModel.loadByNameWithHostAndPopulateAccount(nameWithDomain)
return processVideoChannelExist(videoChannel, res)
return processVideoChannelExist(videoChannel, res, sendNotFound)
}
// ---------------------------------------------------------------------------
@ -29,10 +29,12 @@ export {
doesVideoChannelNameWithHostExist
}
function processVideoChannelExist (videoChannel: MChannelBannerAccountDefault, res: express.Response) {
function processVideoChannelExist (videoChannel: MChannelBannerAccountDefault, res: express.Response, sendNotFound = true) {
if (!videoChannel) {
if (sendNotFound) {
res.status(HttpStatusCode.NOT_FOUND_404)
.json({ error: 'Video channel not found' })
}
return false
}

View File

@ -0,0 +1,59 @@
import * as express from 'express'
import { param } from 'express-validator'
import { isActorNameValid } from '../../helpers/custom-validators/actor'
import { logger } from '../../helpers/logger'
import { areValidationErrors } from './utils'
import {
doesAccountNameWithHostExist,
doesLocalAccountNameExist,
doesVideoChannelNameWithHostExist,
doesLocalVideoChannelNameExist
} from '../../helpers/middlewares'
import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
const localActorValidator = [
param('actorName').custom(isActorNameValid).withMessage('Should have a valid actor name'),
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
logger.debug('Checking localActorValidator parameters', { parameters: req.params })
if (areValidationErrors(req, res)) return
const isAccount = await doesLocalAccountNameExist(req.params.actorName, res, false)
const isVideoChannel = await doesLocalVideoChannelNameExist(req.params.actorName, res, false)
if (!isAccount || !isVideoChannel) {
res.status(HttpStatusCode.NOT_FOUND_404)
.json({ error: 'Actor not found' })
}
return next()
}
]
const actorNameWithHostGetValidator = [
param('actorName').exists().withMessage('Should have an actor name with host'),
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
logger.debug('Checking actorNameWithHostGetValidator parameters', { parameters: req.params })
if (areValidationErrors(req, res)) return
const isAccount = await doesAccountNameWithHostExist(req.params.actorName, res, false)
const isVideoChannel = await doesVideoChannelNameWithHostExist(req.params.actorName, res, false)
if (!isAccount && !isVideoChannel) {
res.status(HttpStatusCode.NOT_FOUND_404)
.json({ error: 'Actor not found' })
}
return next()
}
]
// ---------------------------------------------------------------------------
export {
localActorValidator,
actorNameWithHostGetValidator
}

View File

@ -1,5 +1,6 @@
export * from './abuse'
export * from './account'
export * from './actor'
export * from './actor-image'
export * from './blocklist'
export * from './oembed'