user-exports.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import express from 'express'
  2. import { FileStorage, HttpStatusCode, UserExportRequest, UserExportRequestResult, UserExportState } from '@peertube/peertube-models'
  3. import {
  4. apiRateLimiter,
  5. asyncMiddleware,
  6. authenticate,
  7. userExportDeleteValidator,
  8. userExportRequestValidator,
  9. userExportsListValidator
  10. } from '../../../middlewares/index.js'
  11. import { UserExportModel } from '@server/models/user/user-export.js'
  12. import { getFormattedObjects } from '@server/helpers/utils.js'
  13. import { sequelizeTypescript } from '@server/initializers/database.js'
  14. import { JobQueue } from '@server/lib/job-queue/job-queue.js'
  15. import { CONFIG } from '@server/initializers/config.js'
  16. const userExportsRouter = express.Router()
  17. userExportsRouter.use(apiRateLimiter)
  18. userExportsRouter.post('/:userId/exports/request',
  19. authenticate,
  20. asyncMiddleware(userExportRequestValidator),
  21. asyncMiddleware(requestExport)
  22. )
  23. userExportsRouter.get('/:userId/exports',
  24. authenticate,
  25. asyncMiddleware(userExportsListValidator),
  26. asyncMiddleware(listUserExports)
  27. )
  28. userExportsRouter.delete('/:userId/exports/:id',
  29. authenticate,
  30. asyncMiddleware(userExportDeleteValidator),
  31. asyncMiddleware(deleteUserExport)
  32. )
  33. // ---------------------------------------------------------------------------
  34. export {
  35. userExportsRouter
  36. }
  37. // ---------------------------------------------------------------------------
  38. async function requestExport (req: express.Request, res: express.Response) {
  39. const body = req.body as UserExportRequest
  40. const exportModel = new UserExportModel({
  41. state: UserExportState.PENDING,
  42. withVideoFiles: body.withVideoFiles,
  43. storage: CONFIG.OBJECT_STORAGE.ENABLED
  44. ? FileStorage.OBJECT_STORAGE
  45. : FileStorage.FILE_SYSTEM,
  46. userId: res.locals.user.id,
  47. createdAt: new Date()
  48. })
  49. exportModel.generateAndSetFilename()
  50. await sequelizeTypescript.transaction(async transaction => {
  51. await exportModel.save({ transaction })
  52. })
  53. await JobQueue.Instance.createJob({ type: 'create-user-export', payload: { userExportId: exportModel.id } })
  54. return res.json({
  55. export: {
  56. id: exportModel.id
  57. }
  58. } as UserExportRequestResult)
  59. }
  60. async function listUserExports (req: express.Request, res: express.Response) {
  61. const resultList = await UserExportModel.listForApi({
  62. start: req.query.start,
  63. count: req.query.count,
  64. user: res.locals.user
  65. })
  66. return res.json(getFormattedObjects(resultList.data, resultList.total))
  67. }
  68. async function deleteUserExport (req: express.Request, res: express.Response) {
  69. const userExport = res.locals.userExport
  70. await sequelizeTypescript.transaction(async transaction => {
  71. await userExport.reload({ transaction })
  72. if (!userExport.canBeSafelyRemoved()) {
  73. return res.sendStatus(HttpStatusCode.CONFLICT_409)
  74. }
  75. await userExport.destroy({ transaction })
  76. })
  77. return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
  78. }