From eb08047657e739bcd9e592d76307befa3998482b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 25 Oct 2017 11:55:06 +0200 Subject: Use async/await in controllers --- server/controllers/api/videos/channel.ts | 153 ++++++++++++++----------------- 1 file changed, 71 insertions(+), 82 deletions(-) (limited to 'server/controllers/api/videos/channel.ts') diff --git a/server/controllers/api/videos/channel.ts b/server/controllers/api/videos/channel.ts index 630fc4f53..ab54eedee 100644 --- a/server/controllers/api/videos/channel.ts +++ b/server/controllers/api/videos/channel.ts @@ -4,7 +4,8 @@ import { database as db } from '../../../initializers' import { logger, getFormattedObjects, - retryTransactionWrapper + retryTransactionWrapper, + resetSequelizeInstance } from '../../../helpers' import { authenticate, @@ -16,7 +17,8 @@ import { videoChannelsRemoveValidator, videoChannelGetValidator, videoChannelsUpdateValidator, - listVideoAuthorChannelsValidator + listVideoAuthorChannelsValidator, + asyncMiddleware } from '../../../middlewares' import { createVideoChannel, @@ -32,18 +34,18 @@ videoChannelRouter.get('/channels', videoChannelsSortValidator, setVideoChannelsSort, setPagination, - listVideoChannels + asyncMiddleware(listVideoChannels) ) videoChannelRouter.get('/authors/:authorId/channels', listVideoAuthorChannelsValidator, - listVideoAuthorChannels + asyncMiddleware(listVideoAuthorChannels) ) videoChannelRouter.post('/channels', authenticate, videoChannelsAddValidator, - addVideoChannelRetryWrapper + asyncMiddleware(addVideoChannelRetryWrapper) ) videoChannelRouter.put('/channels/:id', @@ -55,12 +57,12 @@ videoChannelRouter.put('/channels/:id', videoChannelRouter.delete('/channels/:id', authenticate, videoChannelsRemoveValidator, - removeVideoChannelRetryWrapper + asyncMiddleware(removeVideoChannelRetryWrapper) ) videoChannelRouter.get('/channels/:id', videoChannelGetValidator, - getVideoChannel + asyncMiddleware(getVideoChannel) ) // --------------------------------------------------------------------------- @@ -71,126 +73,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 db.VideoChannel.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 listVideoAuthorChannels (req: express.Request, res: express.Response, next: express.NextFunction) { + const resultList = await db.VideoChannel.listByAuthor(res.locals.author.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 + let videoChannelCreated: VideoChannelInstance - 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 + await db.sequelize.transaction(async t => { + videoChannelCreated = await createVideoChannel(videoChannelInfo, author, t) }) + + logger.info('Video channel with uuid %s created.', videoChannelCreated.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) { +async function updateVideoChannel (req: express.Request, res: express.Response) { const videoChannelInstance: VideoChannelInstance = res.locals.videoChannel const videoChannelFieldsSave = videoChannelInstance.toJSON() const videoChannelInfoToUpdate: VideoChannelUpdate = req.body - return db.sequelize.transaction(t => { - const options = { - transaction: t - } + try { + await db.sequelize.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) + const json = videoChannelInstance.toUpdateRemoteJSON() + + // Now we'll update the video channel's meta data to our friends + return updateVideoChannelToFriends(json, t) - // 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 }) + + 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! + 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) { +async function removeVideoChannel (req: express.Request, res: express.Response) { const videoChannelInstance: VideoChannelInstance = 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 + await db.sequelize.transaction(async t => { + await videoChannelInstance.destroy({ transaction: t }) }) + + logger.info('Video channel with name %s and uuid %s deleted.', videoChannelInstance.name, videoChannelInstance.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 db.VideoChannel.loadAndPopulateAuthorAndVideos(res.locals.videoChannel.id) + + return res.json(videoChannelWithVideos.toFormattedJSON()) } -- cgit v1.2.3