X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fvideos%2Fchannel.ts;h=8ec53d9ae1b3991d502e792a20c72b74a3a66afd;hb=ac81d1a06d57b9ae86663831e7f5edcef57b0fa4;hp=630fc4f53d02bce16cad4aed37fee0f044c324c1;hpb=72c7248b6fdcdb2175e726ff51b42e7555f2bd84;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/channel.ts b/server/controllers/api/videos/channel.ts index 630fc4f53..8ec53d9ae 100644 --- a/server/controllers/api/videos/channel.ts +++ b/server/controllers/api/videos/channel.ts @@ -1,66 +1,55 @@ import * as express from 'express' - -import { database as db } from '../../../initializers' -import { - logger, - getFormattedObjects, - retryTransactionWrapper -} from '../../../helpers' +import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared' +import { retryTransactionWrapper } from '../../../helpers/database-utils' +import { logger } from '../../../helpers/logger' +import { getFormattedObjects, resetSequelizeInstance } from '../../../helpers/utils' +import { sequelizeTypescript } from '../../../initializers' +import { setAsyncActorKeys } from '../../../lib/activitypub' +import { createVideoChannel } from '../../../lib/video-channel' import { - authenticate, - paginationValidator, - videoChannelsSortValidator, - videoChannelsAddValidator, - setVideoChannelsSort, - setPagination, - videoChannelsRemoveValidator, - videoChannelGetValidator, - videoChannelsUpdateValidator, - listVideoAuthorChannelsValidator + asyncMiddleware, authenticate, listVideoAccountChannelsValidator, paginationValidator, setDefaultSort, setDefaultPagination, + videoChannelsAddValidator, videoChannelsGetValidator, videoChannelsRemoveValidator, videoChannelsSortValidator, + videoChannelsUpdateValidator } from '../../../middlewares' -import { - createVideoChannel, - updateVideoChannelToFriends -} from '../../../lib' -import { VideoChannelInstance, AuthorInstance } from '../../../models' -import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared' +import { AccountModel } from '../../../models/account/account' +import { VideoChannelModel } from '../../../models/video/video-channel' const videoChannelRouter = express.Router() videoChannelRouter.get('/channels', paginationValidator, videoChannelsSortValidator, - setVideoChannelsSort, - setPagination, - listVideoChannels + setDefaultSort, + setDefaultPagination, + asyncMiddleware(listVideoChannels) ) -videoChannelRouter.get('/authors/:authorId/channels', - listVideoAuthorChannelsValidator, - listVideoAuthorChannels +videoChannelRouter.get('/accounts/:accountId/channels', + asyncMiddleware(listVideoAccountChannelsValidator), + asyncMiddleware(listVideoAccountChannels) ) videoChannelRouter.post('/channels', authenticate, videoChannelsAddValidator, - addVideoChannelRetryWrapper + asyncMiddleware(addVideoChannelRetryWrapper) ) videoChannelRouter.put('/channels/:id', authenticate, - videoChannelsUpdateValidator, + asyncMiddleware(videoChannelsUpdateValidator), updateVideoChannelRetryWrapper ) videoChannelRouter.delete('/channels/:id', authenticate, - videoChannelsRemoveValidator, - removeVideoChannelRetryWrapper + asyncMiddleware(videoChannelsRemoveValidator), + asyncMiddleware(removeVideoChannelRetryWrapper) ) videoChannelRouter.get('/channels/:id', - videoChannelGetValidator, - getVideoChannel + asyncMiddleware(videoChannelsGetValidator), + asyncMiddleware(getVideoChannel) ) // --------------------------------------------------------------------------- @@ -71,126 +60,113 @@ export { // --------------------------------------------------------------------------- -function listVideoChannels (req: express.Request, res: express.Response, next: express.NextFunction) { - db.VideoChannel.listForApi(req.query.start, req.query.count, req.query.sort) - .then(result => res.json(getFormattedObjects(result.data, result.total))) - .catch(err => next(err)) +async function listVideoChannels (req: express.Request, res: express.Response, next: express.NextFunction) { + const resultList = await VideoChannelModel.listForApi(req.query.start, req.query.count, req.query.sort) + + return res.json(getFormattedObjects(resultList.data, resultList.total)) } -function listVideoAuthorChannels (req: express.Request, res: express.Response, next: express.NextFunction) { - db.VideoChannel.listByAuthor(res.locals.author.id) - .then(result => res.json(getFormattedObjects(result.data, result.total))) - .catch(err => next(err)) +async function listVideoAccountChannels (req: express.Request, res: express.Response, next: express.NextFunction) { + const resultList = await VideoChannelModel.listByAccount(res.locals.account.id) + + return res.json(getFormattedObjects(resultList.data, resultList.total)) } -// Wrapper to video channel add that retry the function if there is a database error +// Wrapper to video channel add that retry the async function if there is a database error // We need this because we run the transaction in SERIALIZABLE isolation that can fail -function addVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { +async function addVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { const options = { arguments: [ req, res ], errorMessage: 'Cannot insert the video video channel with many retries.' } - retryTransactionWrapper(addVideoChannel, options) - .then(() => { - // TODO : include Location of the new video channel -> 201 - res.type('json').status(204).end() - }) - .catch(err => next(err)) + await retryTransactionWrapper(addVideoChannel, options) + + // TODO : include Location of the new video channel -> 201 + return res.type('json').status(204).end() } -function addVideoChannel (req: express.Request, res: express.Response) { +async function addVideoChannel (req: express.Request, res: express.Response) { const videoChannelInfo: VideoChannelCreate = req.body - const author: AuthorInstance = res.locals.oauth.token.User.Author + const account: AccountModel = res.locals.oauth.token.User.Account - return db.sequelize.transaction(t => { - return createVideoChannel(videoChannelInfo, author, t) - }) - .then(videoChannelUUID => logger.info('Video channel with uuid %s created.', videoChannelUUID)) - .catch((err: Error) => { - logger.debug('Cannot insert the video channel.', err) - throw err + const videoChannelCreated = await sequelizeTypescript.transaction(async t => { + return createVideoChannel(videoChannelInfo, account, t) }) + + setAsyncActorKeys(videoChannelCreated.Actor) + + logger.info('Video channel with uuid %s created.', videoChannelCreated.Actor.uuid) } -function updateVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { +async function updateVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { const options = { arguments: [ req, res ], errorMessage: 'Cannot update the video with many retries.' } - retryTransactionWrapper(updateVideoChannel, options) - .then(() => res.type('json').status(204).end()) - .catch(err => next(err)) + await retryTransactionWrapper(updateVideoChannel, options) + + return res.type('json').status(204).end() } -function updateVideoChannel (req: express.Request, res: express.Response) { - const videoChannelInstance: VideoChannelInstance = res.locals.videoChannel +async function updateVideoChannel (req: express.Request, res: express.Response) { + const videoChannelInstance = res.locals.videoChannel as VideoChannelModel const videoChannelFieldsSave = videoChannelInstance.toJSON() - const videoChannelInfoToUpdate: VideoChannelUpdate = req.body + const videoChannelInfoToUpdate = req.body as VideoChannelUpdate - return db.sequelize.transaction(t => { - const options = { - transaction: t - } + try { + await sequelizeTypescript.transaction(async t => { + const sequelizeOptions = { + transaction: t + } - if (videoChannelInfoToUpdate.name !== undefined) videoChannelInstance.set('name', videoChannelInfoToUpdate.name) - if (videoChannelInfoToUpdate.description !== undefined) videoChannelInstance.set('description', videoChannelInfoToUpdate.description) + if (videoChannelInfoToUpdate.name !== undefined) videoChannelInstance.set('name', videoChannelInfoToUpdate.name) + if (videoChannelInfoToUpdate.description !== undefined) videoChannelInstance.set('description', videoChannelInfoToUpdate.description) - return videoChannelInstance.save(options) - .then(() => { - const json = videoChannelInstance.toUpdateRemoteJSON() + await videoChannelInstance.save(sequelizeOptions) - // Now we'll update the video channel's meta data to our friends - return updateVideoChannelToFriends(json, t) - }) - }) - .then(() => { - logger.info('Video channel with name %s and uuid %s updated.', videoChannelInstance.name, videoChannelInstance.uuid) - }) - .catch(err => { - logger.debug('Cannot update the video channel.', err) - - // Force fields we want to update - // If the transaction is retried, sequelize will think the object has not changed - // So it will skip the SQL request, even if the last one was ROLLBACKed! - Object.keys(videoChannelFieldsSave).forEach(key => { - const value = videoChannelFieldsSave[key] - videoChannelInstance.set(key, value) - }) - - throw err + // TODO + // await sendUpdateVideoChannel(videoChannelInstanceUpdated, t) }) + + logger.info('Video channel with name %s and uuid %s updated.', videoChannelInstance.name, videoChannelInstance.Actor.uuid) + } catch (err) { + logger.debug('Cannot update the video channel.', err) + + // Force fields we want to update + // If the transaction is retried, sequelize will think the object has not changed + // So it will skip the SQL request, even if the last one was ROLLBACKed! + resetSequelizeInstance(videoChannelInstance, videoChannelFieldsSave) + + throw err + } } -function removeVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { +async function removeVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { const options = { arguments: [ req, res ], errorMessage: 'Cannot remove the video channel with many retries.' } - retryTransactionWrapper(removeVideoChannel, options) - .then(() => res.type('json').status(204).end()) - .catch(err => next(err)) + await retryTransactionWrapper(removeVideoChannel, options) + + return res.type('json').status(204).end() } -function removeVideoChannel (req: express.Request, res: express.Response) { - const videoChannelInstance: VideoChannelInstance = res.locals.videoChannel +async function removeVideoChannel (req: express.Request, res: express.Response) { + const videoChannelInstance: VideoChannelModel = res.locals.videoChannel - return db.sequelize.transaction(t => { - return videoChannelInstance.destroy({ transaction: t }) - }) - .then(() => { - logger.info('Video channel with name %s and uuid %s deleted.', videoChannelInstance.name, videoChannelInstance.uuid) - }) - .catch(err => { - logger.error('Errors when removed the video channel.', err) - throw err + return sequelizeTypescript.transaction(async t => { + await videoChannelInstance.destroy({ transaction: t }) + + logger.info('Video channel with name %s and uuid %s deleted.', videoChannelInstance.name, videoChannelInstance.Actor.uuid) }) + } -function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) { - db.VideoChannel.loadAndPopulateAuthorAndVideos(res.locals.videoChannel.id) - .then(videoChannelWithVideos => res.json(videoChannelWithVideos.toFormattedJSON())) - .catch(err => next(err)) +async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) { + const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id) + + return res.json(videoChannelWithVideos.toFormattedJSON()) }