X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fcontrollers%2Fapi%2Fvideo-channel.ts;h=94285a78d203671247d15e3f1101d2b2850f3d4f;hb=a3b472a12ec6e57dbe2f650419f8064864686eab;hp=2454b1ec9342cb945fb4742588deb763f5e5b9fd;hpb=d3d3deaa7aae49d6d949aebcba015af75d292ccc;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts index 2454b1ec9..94285a78d 100644 --- a/server/controllers/api/video-channel.ts +++ b/server/controllers/api/video-channel.ts @@ -6,7 +6,7 @@ import { ActorFollowModel } from '@server/models/actor/actor-follow' import { getServerActor } from '@server/models/application/application' import { guessAdditionalAttributesFromQuery } from '@server/models/video/formatter/video-format-utils' import { MChannelBannerAccountDefault } from '@server/types/models' -import { ActorImageType, HttpStatusCode, VideoChannelCreate, VideoChannelUpdate } from '@shared/models' +import { ActorImageType, HttpStatusCode, VideoChannelCreate, VideoChannelUpdate, VideosImportInChannelCreate } from '@shared/models' import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger' import { resetSequelizeInstance } from '../../helpers/database-utils' import { buildNSFWFilter, createReqFiles, getCountVideos, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils' @@ -36,7 +36,9 @@ import { videoPlaylistsSortValidator } from '../../middlewares' import { + ensureChannelOwnerCanUpload, ensureIsLocalChannel, + videoChannelImportVideosValidator, videoChannelsFollowersSortValidator, videoChannelsListValidator, videoChannelsNameWithHostValidator, @@ -126,7 +128,7 @@ videoChannelRouter.delete('/:nameWithHost', videoChannelRouter.get('/:nameWithHost', asyncMiddleware(videoChannelsNameWithHostValidator), - getVideoChannel + asyncMiddleware(getVideoChannel) ) videoChannelRouter.get('/:nameWithHost/video-playlists', @@ -161,6 +163,16 @@ videoChannelRouter.get('/:nameWithHost/followers', asyncMiddleware(listVideoChannelFollowers) ) +videoChannelRouter.post('/:nameWithHost/import-videos', + authenticate, + asyncMiddleware(videoChannelsNameWithHostValidator), + asyncMiddleware(videoChannelImportVideosValidator), + ensureIsLocalChannel, + ensureCanManageChannel, + asyncMiddleware(ensureChannelOwnerCanUpload), + asyncMiddleware(importVideosInChannel) +) + // --------------------------------------------------------------------------- export { @@ -171,12 +183,19 @@ export { async function listVideoChannels (req: express.Request, res: express.Response) { const serverActor = await getServerActor() - const resultList = await VideoChannelModel.listForApi({ + + const apiOptions = await Hooks.wrapObject({ actorId: serverActor.id, start: req.query.start, count: req.query.count, sort: req.query.sort - }) + }, 'filter:api.video-channels.list.params') + + const resultList = await Hooks.wrapPromiseFun( + VideoChannelModel.listForApi, + apiOptions, + 'filter:api.video-channels.list.result' + ) return res.json(getFormattedObjects(resultList.data, resultList.total)) } @@ -238,11 +257,13 @@ async function addVideoChannel (req: express.Request, res: express.Response) { }) const payload = { actorId: videoChannelCreated.actorId } - await JobQueue.Instance.createJobWithPromise({ type: 'actor-keys', payload }) + await JobQueue.Instance.createJob({ type: 'actor-keys', payload }) auditLogger.create(getAuditIdFromRes(res), new VideoChannelAuditView(videoChannelCreated.toFormattedJSON())) logger.info('Video channel %s created.', videoChannelCreated.Actor.url) + Hooks.runAction('action:api.video-channel.created', { videoChannel: videoChannelCreated, req, res }) + return res.json({ videoChannel: { id: videoChannelCreated.id @@ -281,6 +302,8 @@ async function updateVideoChannel (req: express.Request, res: express.Response) oldVideoChannelAuditKeys ) + Hooks.runAction('action:api.video-channel.updated', { videoChannel: videoChannelInstanceUpdated, req, res }) + logger.info('Video channel %s updated.', videoChannelInstance.Actor.url) }) } catch (err) { @@ -310,6 +333,8 @@ async function removeVideoChannel (req: express.Request, res: express.Response) await videoChannelInstance.destroy({ transaction: t }) + Hooks.runAction('action:api.video-channel.deleted', { videoChannel: videoChannelInstance, req, res }) + auditLogger.delete(getAuditIdFromRes(res), new VideoChannelAuditView(videoChannelInstance.toFormattedJSON())) logger.info('Video channel %s deleted.', videoChannelInstance.Actor.url) }) @@ -317,11 +342,12 @@ async function removeVideoChannel (req: express.Request, res: express.Response) return res.type('json').status(HttpStatusCode.NO_CONTENT_204).end() } -function getVideoChannel (req: express.Request, res: express.Response) { - const videoChannel = res.locals.videoChannel +async function getVideoChannel (req: express.Request, res: express.Response) { + const id = res.locals.videoChannel.id + const videoChannel = await Hooks.wrapObject(res.locals.videoChannel, 'filter:api.video-channel.get.result', { id }) if (videoChannel.isOutdated()) { - JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: videoChannel.Actor.url } }) + JobQueue.Instance.createJobAsync({ type: 'activitypub-refresher', payload: { type: 'actor', url: videoChannel.Actor.url } }) } return res.json(videoChannel.toFormattedJSON()) @@ -390,3 +416,20 @@ async function listVideoChannelFollowers (req: express.Request, res: express.Res return res.json(getFormattedObjects(resultList.data, resultList.total)) } + +async function importVideosInChannel (req: express.Request, res: express.Response) { + const { externalChannelUrl } = req.body as VideosImportInChannelCreate + + await JobQueue.Instance.createJob({ + type: 'video-channel-import', + payload: { + externalChannelUrl, + videoChannelId: res.locals.videoChannel.id, + partOfChannelSyncId: res.locals.videoChannelSync?.id + } + }) + + logger.info('Video import job for channel "%s" with url "%s" created.', res.locals.videoChannel.name, externalChannelUrl) + + return res.type('json').status(HttpStatusCode.NO_CONTENT_204).end() +}