X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fmodels%2Fvideo%2Fvideo.ts;h=3b7e83779a0437fdc3785a00ebac9fecab2b1998;hb=c986175d68a18e96fbd41537a05c7796a2c64f38;hp=e2069eb0c6d8110280433e4ba978616f627649a2;hpb=54141398354e6e7b94aa3065a705a1251390111c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video.ts b/server/models/video/video.ts index e2069eb0c..3b7e83779 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -78,6 +78,7 @@ let getLanguageLabel: VideoMethods.GetLanguageLabel let generateThumbnailFromData: VideoMethods.GenerateThumbnailFromData let list: VideoMethods.List let listForApi: VideoMethods.ListForApi +let listAllAndSharedByAccountForOutbox: VideoMethods.ListAllAndSharedByAccountForOutbox let listUserVideosForApi: VideoMethods.ListUserVideosForApi let loadByHostAndUUID: VideoMethods.LoadByHostAndUUID let listOwnedAndPopulateAccountAndTags: VideoMethods.ListOwnedAndPopulateAccountAndTags @@ -266,6 +267,7 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da generateThumbnailFromData, list, + listAllAndSharedByAccountForOutbox, listForApi, listUserVideosForApi, listOwnedAndPopulateAccountAndTags, @@ -348,6 +350,14 @@ function associate (models) { }, onDelete: 'cascade' }) + + Video.hasMany(models.VideoShare, { + foreignKey: { + name: 'videoId', + allowNull: false + }, + onDelete: 'cascade' + }) } function afterDestroy (video: VideoInstance) { @@ -775,6 +785,54 @@ list = function () { return Video.findAll(query) } +listAllAndSharedByAccountForOutbox = function (accountId: number, start: number, count: number) { + const queryVideo = 'SELECT "Video"."id" FROM "Videos" AS "Video" ' + + 'INNER JOIN "VideoChannels" AS "VideoChannel" ON "VideoChannel"."id" = "Video"."channelId" ' + + 'WHERE "VideoChannel"."accountId" = ' + accountId + const queryVideoShare = 'SELECT "Video"."id" FROM "VideoShares" AS "VideoShare" ' + + 'INNER JOIN "Videos" AS "Video" ON "Video"."id" = "VideoShare"."videoId" ' + + 'INNER JOIN "VideoChannels" AS "VideoChannel" ON "VideoChannel"."id" = "Video"."channelId" ' + + 'WHERE "VideoShare"."accountId" = ' + accountId + const rawQuery = `(${queryVideo}) UNION (${queryVideoShare}) LIMIT ${count} OFFSET ${start}` + + const query = { + distinct: true, + offset: start, + limit: count, + order: [ getSort('createdAt'), [ Video['sequelize'].models.Tag, 'name', 'ASC' ] ], + where: { + id: { + [Sequelize.Op.in]: Sequelize.literal('(' + rawQuery + ')') + } + }, + include: [ + { + model: Video['sequelize'].models.VideoShare, + required: false + }, + { + model: Video['sequelize'].models.VideoChannel, + required: true, + include: [ + { + model: Video['sequelize'].models.Account, + required: true + } + ] + }, + Video['sequelize'].models.Tag, + Video['sequelize'].models.VideoFile + ] + } + + return Video.findAndCountAll(query).then(({ rows, count }) => { + return { + data: rows, + total: count + } + }) +} + listUserVideosForApi = function (userId: number, start: number, count: number, sort: string) { const query = { distinct: true,