Add server API actors route
This commit is contained in:
parent
ff8c5ccf09
commit
1e37d32f4b
|
@ -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())
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
import { isAccountNameValid } from './accounts'
|
||||
import { isVideoChannelNameValid } from './video-channels'
|
||||
|
||||
function isActorNameValid (value: string) {
|
||||
return isAccountNameValid(value) || isVideoChannelNameValid(value)
|
||||
}
|
||||
|
||||
export {
|
||||
isActorNameValid
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
export * from './abuse'
|
||||
export * from './account'
|
||||
export * from './actor'
|
||||
export * from './actor-image'
|
||||
export * from './blocklist'
|
||||
export * from './oembed'
|
||||
|
|
Loading…
Reference in New Issue