accounts.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import * as express from 'express'
  2. import { getFormattedObjects, getServerActor } from '../../helpers/utils'
  3. import {
  4. asyncMiddleware,
  5. authenticate,
  6. commonVideosFiltersValidator,
  7. optionalAuthenticate,
  8. paginationValidator,
  9. setDefaultPagination,
  10. setDefaultSort,
  11. videoPlaylistsSortValidator,
  12. videoRatesSortValidator,
  13. videoRatingValidator
  14. } from '../../middlewares'
  15. import {
  16. accountNameWithHostGetValidator,
  17. accountsSortValidator,
  18. ensureAuthUserOwnsAccountValidator,
  19. videoChannelsSortValidator,
  20. videosSortValidator
  21. } from '../../middlewares/validators'
  22. import { AccountModel } from '../../models/account/account'
  23. import { AccountVideoRateModel } from '../../models/account/account-video-rate'
  24. import { VideoModel } from '../../models/video/video'
  25. import { buildNSFWFilter, getCountVideos, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils'
  26. import { VideoChannelModel } from '../../models/video/video-channel'
  27. import { JobQueue } from '../../lib/job-queue'
  28. import { VideoPlaylistModel } from '../../models/video/video-playlist'
  29. import { commonVideoPlaylistFiltersValidator, videoPlaylistsSearchValidator } from '../../middlewares/validators/videos/video-playlists'
  30. const accountsRouter = express.Router()
  31. accountsRouter.get('/',
  32. paginationValidator,
  33. accountsSortValidator,
  34. setDefaultSort,
  35. setDefaultPagination,
  36. asyncMiddleware(listAccounts)
  37. )
  38. accountsRouter.get('/:accountName',
  39. asyncMiddleware(accountNameWithHostGetValidator),
  40. getAccount
  41. )
  42. accountsRouter.get('/:accountName/videos',
  43. asyncMiddleware(accountNameWithHostGetValidator),
  44. paginationValidator,
  45. videosSortValidator,
  46. setDefaultSort,
  47. setDefaultPagination,
  48. optionalAuthenticate,
  49. commonVideosFiltersValidator,
  50. asyncMiddleware(listAccountVideos)
  51. )
  52. accountsRouter.get('/:accountName/video-channels',
  53. asyncMiddleware(accountNameWithHostGetValidator),
  54. paginationValidator,
  55. videoChannelsSortValidator,
  56. setDefaultSort,
  57. setDefaultPagination,
  58. asyncMiddleware(listAccountChannels)
  59. )
  60. accountsRouter.get('/:accountName/video-playlists',
  61. optionalAuthenticate,
  62. asyncMiddleware(accountNameWithHostGetValidator),
  63. paginationValidator,
  64. videoPlaylistsSortValidator,
  65. setDefaultSort,
  66. setDefaultPagination,
  67. commonVideoPlaylistFiltersValidator,
  68. videoPlaylistsSearchValidator,
  69. asyncMiddleware(listAccountPlaylists)
  70. )
  71. accountsRouter.get('/:accountName/ratings',
  72. authenticate,
  73. asyncMiddleware(accountNameWithHostGetValidator),
  74. ensureAuthUserOwnsAccountValidator,
  75. paginationValidator,
  76. videoRatesSortValidator,
  77. setDefaultSort,
  78. setDefaultPagination,
  79. videoRatingValidator,
  80. asyncMiddleware(listAccountRatings)
  81. )
  82. // ---------------------------------------------------------------------------
  83. export {
  84. accountsRouter
  85. }
  86. // ---------------------------------------------------------------------------
  87. function getAccount (req: express.Request, res: express.Response) {
  88. const account = res.locals.account
  89. if (account.isOutdated()) {
  90. JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: account.Actor.url } })
  91. }
  92. return res.json(account.toFormattedJSON())
  93. }
  94. async function listAccounts (req: express.Request, res: express.Response) {
  95. const resultList = await AccountModel.listForApi(req.query.start, req.query.count, req.query.sort)
  96. return res.json(getFormattedObjects(resultList.data, resultList.total))
  97. }
  98. async function listAccountChannels (req: express.Request, res: express.Response) {
  99. const options = {
  100. accountId: res.locals.account.id,
  101. start: req.query.start,
  102. count: req.query.count,
  103. sort: req.query.sort
  104. }
  105. const resultList = await VideoChannelModel.listByAccount(options)
  106. return res.json(getFormattedObjects(resultList.data, resultList.total))
  107. }
  108. async function listAccountPlaylists (req: express.Request, res: express.Response) {
  109. const serverActor = await getServerActor()
  110. // Allow users to see their private/unlisted video playlists
  111. let listMyPlaylists = false
  112. if (res.locals.oauth && res.locals.oauth.token.User.Account.id === res.locals.account.id) {
  113. listMyPlaylists = true
  114. }
  115. const resultList = await VideoPlaylistModel.listForApi({
  116. search: req.query.search,
  117. followerActorId: serverActor.id,
  118. start: req.query.start,
  119. count: req.query.count,
  120. sort: req.query.sort,
  121. accountId: res.locals.account.id,
  122. listMyPlaylists,
  123. type: req.query.playlistType
  124. })
  125. return res.json(getFormattedObjects(resultList.data, resultList.total))
  126. }
  127. async function listAccountVideos (req: express.Request, res: express.Response) {
  128. const account = res.locals.account
  129. const followerActorId = isUserAbleToSearchRemoteURI(res) ? null : undefined
  130. const countVideos = getCountVideos(req)
  131. const resultList = await VideoModel.listForApi({
  132. followerActorId,
  133. start: req.query.start,
  134. count: req.query.count,
  135. sort: req.query.sort,
  136. includeLocalVideos: true,
  137. categoryOneOf: req.query.categoryOneOf,
  138. licenceOneOf: req.query.licenceOneOf,
  139. languageOneOf: req.query.languageOneOf,
  140. tagsOneOf: req.query.tagsOneOf,
  141. tagsAllOf: req.query.tagsAllOf,
  142. filter: req.query.filter,
  143. nsfw: buildNSFWFilter(res, req.query.nsfw),
  144. withFiles: false,
  145. accountId: account.id,
  146. user: res.locals.oauth ? res.locals.oauth.token.User : undefined,
  147. countVideos
  148. })
  149. return res.json(getFormattedObjects(resultList.data, resultList.total))
  150. }
  151. async function listAccountRatings (req: express.Request, res: express.Response) {
  152. const account = res.locals.account
  153. const resultList = await AccountVideoRateModel.listByAccountForApi({
  154. accountId: account.id,
  155. start: req.query.start,
  156. count: req.query.count,
  157. sort: req.query.sort,
  158. type: req.query.rating
  159. })
  160. return res.json(getFormattedObjects(resultList.rows, resultList.count))
  161. }