diff options
-rw-r--r-- | server/lib/activitypub/misc.ts | 6 | ||||
-rw-r--r-- | server/lib/activitypub/process-add.ts | 13 | ||||
-rw-r--r-- | server/lib/activitypub/process-create.ts | 2 | ||||
-rw-r--r-- | server/lib/activitypub/process-delete.ts | 2 | ||||
-rw-r--r-- | server/lib/activitypub/process-update.ts | 4 | ||||
-rw-r--r-- | server/lib/activitypub/send-request.ts | 20 | ||||
-rw-r--r-- | server/models/account/account-follow.ts | 4 | ||||
-rw-r--r-- | server/models/video/video-channel-share-interface.ts | 3 | ||||
-rw-r--r-- | server/models/video/video-channel-share.ts | 23 | ||||
-rw-r--r-- | server/models/video/video-interface.ts | 4 | ||||
-rw-r--r-- | server/models/video/video-share-interface.ts | 3 | ||||
-rw-r--r-- | server/models/video/video-share.ts | 23 | ||||
-rw-r--r-- | server/models/video/video.ts | 21 |
13 files changed, 102 insertions, 26 deletions
diff --git a/server/lib/activitypub/misc.ts b/server/lib/activitypub/misc.ts index 13838fc4c..f853d742e 100644 --- a/server/lib/activitypub/misc.ts +++ b/server/lib/activitypub/misc.ts | |||
@@ -25,12 +25,8 @@ function videoChannelActivityObjectToDBAttributes (videoChannelObject: VideoChan | |||
25 | 25 | ||
26 | async function videoActivityObjectToDBAttributes ( | 26 | async function videoActivityObjectToDBAttributes ( |
27 | videoChannel: VideoChannelInstance, | 27 | videoChannel: VideoChannelInstance, |
28 | videoObject: VideoTorrentObject, | 28 | videoObject: VideoTorrentObject |
29 | t: Sequelize.Transaction | ||
30 | ) { | 29 | ) { |
31 | const videoFromDatabase = await db.Video.loadByUUIDOrURL(videoObject.uuid, videoObject.id, t) | ||
32 | if (videoFromDatabase) throw new Error('Video with this UUID/Url already exists.') | ||
33 | |||
34 | const duration = videoObject.duration.replace(/[^\d]+/, '') | 30 | const duration = videoObject.duration.replace(/[^\d]+/, '') |
35 | const videoData: VideoAttributes = { | 31 | const videoData: VideoAttributes = { |
36 | name: videoObject.name, | 32 | name: videoObject.name, |
diff --git a/server/lib/activitypub/process-add.ts b/server/lib/activitypub/process-add.ts index df7139d46..72c5b1932 100644 --- a/server/lib/activitypub/process-add.ts +++ b/server/lib/activitypub/process-add.ts | |||
@@ -1,12 +1,12 @@ | |||
1 | import * as Bluebird from 'bluebird' | ||
1 | import { VideoTorrentObject } from '../../../shared' | 2 | import { VideoTorrentObject } from '../../../shared' |
2 | import { ActivityAdd } from '../../../shared/models/activitypub/activity' | 3 | import { ActivityAdd } from '../../../shared/models/activitypub/activity' |
3 | import { generateThumbnailFromUrl, logger, retryTransactionWrapper, getOrCreateAccount } from '../../helpers' | 4 | import { generateThumbnailFromUrl, getOrCreateAccount, logger, retryTransactionWrapper } from '../../helpers' |
5 | import { getOrCreateVideoChannel } from '../../helpers/activitypub' | ||
4 | import { database as db } from '../../initializers' | 6 | import { database as db } from '../../initializers' |
5 | import { AccountInstance } from '../../models/account/account-interface' | 7 | import { AccountInstance } from '../../models/account/account-interface' |
6 | import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc' | ||
7 | import Bluebird = require('bluebird') | ||
8 | import { getOrCreateVideoChannel } from '../../helpers/activitypub' | ||
9 | import { VideoChannelInstance } from '../../models/video/video-channel-interface' | 8 | import { VideoChannelInstance } from '../../models/video/video-channel-interface' |
9 | import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc' | ||
10 | 10 | ||
11 | async function processAddActivity (activity: ActivityAdd) { | 11 | async function processAddActivity (activity: ActivityAdd) { |
12 | const activityObject = activity.object | 12 | const activityObject = activity.object |
@@ -51,7 +51,10 @@ function addRemoteVideo (account: AccountInstance, videoChannel: VideoChannelIns | |||
51 | 51 | ||
52 | if (videoChannel.Account.id !== account.id) throw new Error('Video channel is not owned by this account.') | 52 | if (videoChannel.Account.id !== account.id) throw new Error('Video channel is not owned by this account.') |
53 | 53 | ||
54 | const videoData = await videoActivityObjectToDBAttributes(videoChannel, videoToCreateData, t) | 54 | const videoFromDatabase = await db.Video.loadByUUIDOrURL(videoToCreateData.uuid, videoToCreateData.id, t) |
55 | if (videoFromDatabase) throw new Error('Video with this UUID/Url already exists.') | ||
56 | |||
57 | const videoData = await videoActivityObjectToDBAttributes(videoChannel, videoToCreateData) | ||
55 | const video = db.Video.build(videoData) | 58 | const video = db.Video.build(videoData) |
56 | 59 | ||
57 | // Don't block on request | 60 | // Don't block on request |
diff --git a/server/lib/activitypub/process-create.ts b/server/lib/activitypub/process-create.ts index c4706a66b..faea3f48a 100644 --- a/server/lib/activitypub/process-create.ts +++ b/server/lib/activitypub/process-create.ts | |||
@@ -69,7 +69,7 @@ function addRemoteVideoAbuse (account: AccountInstance, videoAbuseToCreateData: | |||
69 | logger.debug('Reporting remote abuse for video %s.', videoAbuseToCreateData.object) | 69 | logger.debug('Reporting remote abuse for video %s.', videoAbuseToCreateData.object) |
70 | 70 | ||
71 | return db.sequelize.transaction(async t => { | 71 | return db.sequelize.transaction(async t => { |
72 | const video = await db.Video.loadByUrl(videoAbuseToCreateData.object, t) | 72 | const video = await db.Video.loadByUrlAndPopulateAccount(videoAbuseToCreateData.object, t) |
73 | if (!video) { | 73 | if (!video) { |
74 | logger.warn('Unknown video %s for remote video abuse.', videoAbuseToCreateData.object) | 74 | logger.warn('Unknown video %s for remote video abuse.', videoAbuseToCreateData.object) |
75 | return | 75 | return |
diff --git a/server/lib/activitypub/process-delete.ts b/server/lib/activitypub/process-delete.ts index 377df432d..d4487d2cc 100644 --- a/server/lib/activitypub/process-delete.ts +++ b/server/lib/activitypub/process-delete.ts | |||
@@ -15,7 +15,7 @@ async function processDeleteActivity (activity: ActivityDelete) { | |||
15 | } | 15 | } |
16 | 16 | ||
17 | { | 17 | { |
18 | let videoObject = await db.Video.loadByUrl(activity.id) | 18 | let videoObject = await db.Video.loadByUrlAndPopulateAccount(activity.id) |
19 | if (videoObject !== undefined) { | 19 | if (videoObject !== undefined) { |
20 | return processDeleteVideo(account, videoObject) | 20 | return processDeleteVideo(account, videoObject) |
21 | } | 21 | } |
diff --git a/server/lib/activitypub/process-update.ts b/server/lib/activitypub/process-update.ts index cd8a4b8e2..4aefd1b9b 100644 --- a/server/lib/activitypub/process-update.ts +++ b/server/lib/activitypub/process-update.ts | |||
@@ -50,14 +50,14 @@ async function updateRemoteVideo (account: AccountInstance, videoAttributesToUpd | |||
50 | transaction: t | 50 | transaction: t |
51 | } | 51 | } |
52 | 52 | ||
53 | const videoInstance = await db.Video.loadByUrl(videoAttributesToUpdate.id, t) | 53 | const videoInstance = await db.Video.loadByUrlAndPopulateAccount(videoAttributesToUpdate.id, t) |
54 | if (!videoInstance) throw new Error('Video ' + videoAttributesToUpdate.id + ' not found.') | 54 | if (!videoInstance) throw new Error('Video ' + videoAttributesToUpdate.id + ' not found.') |
55 | 55 | ||
56 | if (videoInstance.VideoChannel.Account.id !== account.id) { | 56 | if (videoInstance.VideoChannel.Account.id !== account.id) { |
57 | throw new Error('Account ' + account.url + ' does not own video channel ' + videoInstance.VideoChannel.url) | 57 | throw new Error('Account ' + account.url + ' does not own video channel ' + videoInstance.VideoChannel.url) |
58 | } | 58 | } |
59 | 59 | ||
60 | const videoData = await videoActivityObjectToDBAttributes(videoInstance.VideoChannel, videoAttributesToUpdate, t) | 60 | const videoData = await videoActivityObjectToDBAttributes(videoInstance.VideoChannel, videoAttributesToUpdate) |
61 | videoInstance.set('name', videoData.name) | 61 | videoInstance.set('name', videoData.name) |
62 | videoInstance.set('category', videoData.category) | 62 | videoInstance.set('category', videoData.category) |
63 | videoInstance.set('licence', videoData.licence) | 63 | videoInstance.set('licence', videoData.licence) |
diff --git a/server/lib/activitypub/send-request.ts b/server/lib/activitypub/send-request.ts index f9b72f2a8..d5d07011a 100644 --- a/server/lib/activitypub/send-request.ts +++ b/server/lib/activitypub/send-request.ts | |||
@@ -24,13 +24,19 @@ async function sendUpdateVideoChannel (videoChannel: VideoChannelInstance, t: Se | |||
24 | const videoChannelObject = videoChannel.toActivityPubObject() | 24 | const videoChannelObject = videoChannel.toActivityPubObject() |
25 | const data = await updateActivityData(videoChannel.url, videoChannel.Account, videoChannelObject) | 25 | const data = await updateActivityData(videoChannel.url, videoChannel.Account, videoChannelObject) |
26 | 26 | ||
27 | return broadcastToFollowers(data, [ videoChannel.Account ], t) | 27 | const accountsInvolved = await db.VideoChannelShare.loadAccountsByShare(videoChannel.id) |
28 | accountsInvolved.push(videoChannel.Account) | ||
29 | |||
30 | return broadcastToFollowers(data, accountsInvolved, t) | ||
28 | } | 31 | } |
29 | 32 | ||
30 | async function sendDeleteVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { | 33 | async function sendDeleteVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { |
31 | const data = await deleteActivityData(videoChannel.url, videoChannel.Account) | 34 | const data = await deleteActivityData(videoChannel.url, videoChannel.Account) |
32 | 35 | ||
33 | return broadcastToFollowers(data, [ videoChannel.Account ], t) | 36 | const accountsInvolved = await db.VideoChannelShare.loadAccountsByShare(videoChannel.id) |
37 | accountsInvolved.push(videoChannel.Account) | ||
38 | |||
39 | return broadcastToFollowers(data, accountsInvolved, t) | ||
34 | } | 40 | } |
35 | 41 | ||
36 | async function sendAddVideo (video: VideoInstance, t: Sequelize.Transaction) { | 42 | async function sendAddVideo (video: VideoInstance, t: Sequelize.Transaction) { |
@@ -44,13 +50,19 @@ async function sendUpdateVideo (video: VideoInstance, t: Sequelize.Transaction) | |||
44 | const videoObject = video.toActivityPubObject() | 50 | const videoObject = video.toActivityPubObject() |
45 | const data = await updateActivityData(video.url, video.VideoChannel.Account, videoObject) | 51 | const data = await updateActivityData(video.url, video.VideoChannel.Account, videoObject) |
46 | 52 | ||
47 | return broadcastToFollowers(data, [ video.VideoChannel.Account ], t) | 53 | const accountsInvolved = await db.VideoShare.loadAccountsByShare(video.id) |
54 | accountsInvolved.push(video.VideoChannel.Account) | ||
55 | |||
56 | return broadcastToFollowers(data, accountsInvolved, t) | ||
48 | } | 57 | } |
49 | 58 | ||
50 | async function sendDeleteVideo (video: VideoInstance, t: Sequelize.Transaction) { | 59 | async function sendDeleteVideo (video: VideoInstance, t: Sequelize.Transaction) { |
51 | const data = await deleteActivityData(video.url, video.VideoChannel.Account) | 60 | const data = await deleteActivityData(video.url, video.VideoChannel.Account) |
52 | 61 | ||
53 | return broadcastToFollowers(data, [ video.VideoChannel.Account ], t) | 62 | const accountsInvolved = await db.VideoShare.loadAccountsByShare(video.id) |
63 | accountsInvolved.push(video.VideoChannel.Account) | ||
64 | |||
65 | return broadcastToFollowers(data, accountsInvolved, t) | ||
54 | } | 66 | } |
55 | 67 | ||
56 | async function sendDeleteAccount (account: AccountInstance, t: Sequelize.Transaction) { | 68 | async function sendDeleteAccount (account: AccountInstance, t: Sequelize.Transaction) { |
diff --git a/server/models/account/account-follow.ts b/server/models/account/account-follow.ts index 8a7474c9d..cc9b7c42b 100644 --- a/server/models/account/account-follow.ts +++ b/server/models/account/account-follow.ts | |||
@@ -187,13 +187,13 @@ async function createListAcceptedFollowForApiQuery ( | |||
187 | let query = 'SELECT ' + selection + ' FROM "Accounts" ' + | 187 | let query = 'SELECT ' + selection + ' FROM "Accounts" ' + |
188 | 'INNER JOIN "AccountFollows" ON "AccountFollows"."' + firstJoin + '" = "Accounts"."id" ' + | 188 | 'INNER JOIN "AccountFollows" ON "AccountFollows"."' + firstJoin + '" = "Accounts"."id" ' + |
189 | 'INNER JOIN "Accounts" AS "Follows" ON "AccountFollows"."' + secondJoin + '" = "Follows"."id" ' + | 189 | 'INNER JOIN "Accounts" AS "Follows" ON "AccountFollows"."' + secondJoin + '" = "Follows"."id" ' + |
190 | 'WHERE "Accounts"."id" IN ($accountIds) AND "AccountFollows"."state" = \'accepted\' ' | 190 | 'WHERE "Accounts"."id" = ANY ($accountIds) AND "AccountFollows"."state" = \'accepted\' ' |
191 | 191 | ||
192 | if (start !== undefined) query += 'LIMIT ' + start | 192 | if (start !== undefined) query += 'LIMIT ' + start |
193 | if (count !== undefined) query += ', ' + count | 193 | if (count !== undefined) query += ', ' + count |
194 | 194 | ||
195 | const options = { | 195 | const options = { |
196 | bind: { accountIds: accountIds.join(',') }, | 196 | bind: { accountIds }, |
197 | type: Sequelize.QueryTypes.SELECT | 197 | type: Sequelize.QueryTypes.SELECT |
198 | } | 198 | } |
199 | tasks.push(AccountFollow['sequelize'].query(query, options)) | 199 | tasks.push(AccountFollow['sequelize'].query(query, options)) |
diff --git a/server/models/video/video-channel-share-interface.ts b/server/models/video/video-channel-share-interface.ts index 9ac6d7b23..8bb531af2 100644 --- a/server/models/video/video-channel-share-interface.ts +++ b/server/models/video/video-channel-share-interface.ts | |||
@@ -1,11 +1,14 @@ | |||
1 | import * as Bluebird from 'bluebird' | ||
1 | import * as Sequelize from 'sequelize' | 2 | import * as Sequelize from 'sequelize' |
2 | import { AccountInstance } from '../account/account-interface' | 3 | import { AccountInstance } from '../account/account-interface' |
3 | import { VideoChannelInstance } from './video-channel-interface' | 4 | import { VideoChannelInstance } from './video-channel-interface' |
4 | 5 | ||
5 | export namespace VideoChannelShareMethods { | 6 | export namespace VideoChannelShareMethods { |
7 | export type LoadAccountsByShare = (videoChannelId: number) => Bluebird<AccountInstance[]> | ||
6 | } | 8 | } |
7 | 9 | ||
8 | export interface VideoChannelShareClass { | 10 | export interface VideoChannelShareClass { |
11 | loadAccountsByShare: VideoChannelShareMethods.LoadAccountsByShare | ||
9 | } | 12 | } |
10 | 13 | ||
11 | export interface VideoChannelShareAttributes { | 14 | export interface VideoChannelShareAttributes { |
diff --git a/server/models/video/video-channel-share.ts b/server/models/video/video-channel-share.ts index b6199279f..01f84c806 100644 --- a/server/models/video/video-channel-share.ts +++ b/server/models/video/video-channel-share.ts | |||
@@ -1,9 +1,10 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { addMethodsToModel } from '../utils' | 3 | import { addMethodsToModel } from '../utils' |
4 | import { VideoChannelShareAttributes, VideoChannelShareInstance } from './video-channel-share-interface' | 4 | import { VideoChannelShareAttributes, VideoChannelShareInstance, VideoChannelShareMethods } from './video-channel-share-interface' |
5 | 5 | ||
6 | let VideoChannelShare: Sequelize.Model<VideoChannelShareInstance, VideoChannelShareAttributes> | 6 | let VideoChannelShare: Sequelize.Model<VideoChannelShareInstance, VideoChannelShareAttributes> |
7 | let loadAccountsByShare: VideoChannelShareMethods.LoadAccountsByShare | ||
7 | 8 | ||
8 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { | 9 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { |
9 | VideoChannelShare = sequelize.define<VideoChannelShareInstance, VideoChannelShareAttributes>('VideoChannelShare', | 10 | VideoChannelShare = sequelize.define<VideoChannelShareInstance, VideoChannelShareAttributes>('VideoChannelShare', |
@@ -21,7 +22,8 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da | |||
21 | ) | 22 | ) |
22 | 23 | ||
23 | const classMethods = [ | 24 | const classMethods = [ |
24 | associate | 25 | associate, |
26 | loadAccountsByShare | ||
25 | ] | 27 | ] |
26 | addMethodsToModel(VideoChannelShare, classMethods) | 28 | addMethodsToModel(VideoChannelShare, classMethods) |
27 | 29 | ||
@@ -47,3 +49,20 @@ function associate (models) { | |||
47 | onDelete: 'cascade' | 49 | onDelete: 'cascade' |
48 | }) | 50 | }) |
49 | } | 51 | } |
52 | |||
53 | loadAccountsByShare = function (videoChannelId: number) { | ||
54 | const query = { | ||
55 | where: { | ||
56 | videoChannelId | ||
57 | }, | ||
58 | include: [ | ||
59 | { | ||
60 | model: VideoChannelShare['sequelize'].models.Account, | ||
61 | required: true | ||
62 | } | ||
63 | ] | ||
64 | } | ||
65 | |||
66 | return VideoChannelShare.findAll(query) | ||
67 | .then(res => res.map(r => r.Account)) | ||
68 | } | ||
diff --git a/server/models/video/video-interface.ts b/server/models/video/video-interface.ts index 4df33f801..9f29c842c 100644 --- a/server/models/video/video-interface.ts +++ b/server/models/video/video-interface.ts | |||
@@ -56,7 +56,7 @@ export namespace VideoMethods { | |||
56 | 56 | ||
57 | export type Load = (id: number) => Bluebird<VideoInstance> | 57 | export type Load = (id: number) => Bluebird<VideoInstance> |
58 | export type LoadByUUID = (uuid: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> | 58 | export type LoadByUUID = (uuid: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> |
59 | export type LoadByUrl = (url: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> | 59 | export type LoadByUrlAndPopulateAccount = (url: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> |
60 | export type LoadLocalVideoByUUID = (uuid: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> | 60 | export type LoadLocalVideoByUUID = (uuid: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> |
61 | export type LoadByHostAndUUID = (fromHost: string, uuid: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> | 61 | export type LoadByHostAndUUID = (fromHost: string, uuid: string, t?: Sequelize.Transaction) => Bluebird<VideoInstance> |
62 | export type LoadAndPopulateAccount = (id: number) => Bluebird<VideoInstance> | 62 | export type LoadAndPopulateAccount = (id: number) => Bluebird<VideoInstance> |
@@ -82,7 +82,7 @@ export interface VideoClass { | |||
82 | loadAndPopulateAccountAndServerAndTags: VideoMethods.LoadAndPopulateAccountAndServerAndTags | 82 | loadAndPopulateAccountAndServerAndTags: VideoMethods.LoadAndPopulateAccountAndServerAndTags |
83 | loadByHostAndUUID: VideoMethods.LoadByHostAndUUID | 83 | loadByHostAndUUID: VideoMethods.LoadByHostAndUUID |
84 | loadByUUID: VideoMethods.LoadByUUID | 84 | loadByUUID: VideoMethods.LoadByUUID |
85 | loadByUrl: VideoMethods.LoadByUrl | 85 | loadByUrlAndPopulateAccount: VideoMethods.LoadByUrlAndPopulateAccount |
86 | loadByUUIDOrURL: VideoMethods.LoadByUUIDOrURL | 86 | loadByUUIDOrURL: VideoMethods.LoadByUUIDOrURL |
87 | loadLocalVideoByUUID: VideoMethods.LoadLocalVideoByUUID | 87 | loadLocalVideoByUUID: VideoMethods.LoadLocalVideoByUUID |
88 | loadByUUIDAndPopulateAccountAndServerAndTags: VideoMethods.LoadByUUIDAndPopulateAccountAndServerAndTags | 88 | loadByUUIDAndPopulateAccountAndServerAndTags: VideoMethods.LoadByUUIDAndPopulateAccountAndServerAndTags |
diff --git a/server/models/video/video-share-interface.ts b/server/models/video/video-share-interface.ts index 7928b9a9c..569568842 100644 --- a/server/models/video/video-share-interface.ts +++ b/server/models/video/video-share-interface.ts | |||
@@ -1,11 +1,14 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { AccountInstance } from '../account/account-interface' | 2 | import { AccountInstance } from '../account/account-interface' |
3 | import { VideoInstance } from './video-interface' | 3 | import { VideoInstance } from './video-interface' |
4 | import * as Bluebird from 'bluebird' | ||
4 | 5 | ||
5 | export namespace VideoShareMethods { | 6 | export namespace VideoShareMethods { |
7 | export type LoadAccountsByShare = (videoChannelId: number) => Bluebird<AccountInstance[]> | ||
6 | } | 8 | } |
7 | 9 | ||
8 | export interface VideoShareClass { | 10 | export interface VideoShareClass { |
11 | loadAccountsByShare: VideoShareMethods.LoadAccountsByShare | ||
9 | } | 12 | } |
10 | 13 | ||
11 | export interface VideoShareAttributes { | 14 | export interface VideoShareAttributes { |
diff --git a/server/models/video/video-share.ts b/server/models/video/video-share.ts index 358491fd2..22ac31a4a 100644 --- a/server/models/video/video-share.ts +++ b/server/models/video/video-share.ts | |||
@@ -1,9 +1,10 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { addMethodsToModel } from '../utils' | 3 | import { addMethodsToModel } from '../utils' |
4 | import { VideoShareAttributes, VideoShareInstance } from './video-share-interface' | 4 | import { VideoShareAttributes, VideoShareInstance, VideoShareMethods } from './video-share-interface' |
5 | 5 | ||
6 | let VideoShare: Sequelize.Model<VideoShareInstance, VideoShareAttributes> | 6 | let VideoShare: Sequelize.Model<VideoShareInstance, VideoShareAttributes> |
7 | let loadAccountsByShare: VideoShareMethods.LoadAccountsByShare | ||
7 | 8 | ||
8 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { | 9 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { |
9 | VideoShare = sequelize.define<VideoShareInstance, VideoShareAttributes>('VideoShare', | 10 | VideoShare = sequelize.define<VideoShareInstance, VideoShareAttributes>('VideoShare', |
@@ -21,7 +22,8 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da | |||
21 | ) | 22 | ) |
22 | 23 | ||
23 | const classMethods = [ | 24 | const classMethods = [ |
24 | associate | 25 | associate, |
26 | loadAccountsByShare | ||
25 | ] | 27 | ] |
26 | addMethodsToModel(VideoShare, classMethods) | 28 | addMethodsToModel(VideoShare, classMethods) |
27 | 29 | ||
@@ -47,3 +49,20 @@ function associate (models) { | |||
47 | onDelete: 'cascade' | 49 | onDelete: 'cascade' |
48 | }) | 50 | }) |
49 | } | 51 | } |
52 | |||
53 | loadAccountsByShare = function (videoId: number) { | ||
54 | const query = { | ||
55 | where: { | ||
56 | videoId | ||
57 | }, | ||
58 | include: [ | ||
59 | { | ||
60 | model: VideoShare['sequelize'].models.Account, | ||
61 | required: true | ||
62 | } | ||
63 | ] | ||
64 | } | ||
65 | |||
66 | return VideoShare.findAll(query) | ||
67 | .then(res => res.map(r => r.Account)) | ||
68 | } | ||
diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 64ee7ae34..5b0377c2e 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts | |||
@@ -84,6 +84,7 @@ let loadByHostAndUUID: VideoMethods.LoadByHostAndUUID | |||
84 | let listOwnedAndPopulateAccountAndTags: VideoMethods.ListOwnedAndPopulateAccountAndTags | 84 | let listOwnedAndPopulateAccountAndTags: VideoMethods.ListOwnedAndPopulateAccountAndTags |
85 | let listOwnedByAccount: VideoMethods.ListOwnedByAccount | 85 | let listOwnedByAccount: VideoMethods.ListOwnedByAccount |
86 | let load: VideoMethods.Load | 86 | let load: VideoMethods.Load |
87 | let loadByUrlAndPopulateAccount: VideoMethods.LoadByUrlAndPopulateAccount | ||
87 | let loadByUUID: VideoMethods.LoadByUUID | 88 | let loadByUUID: VideoMethods.LoadByUUID |
88 | let loadByUUIDOrURL: VideoMethods.LoadByUUIDOrURL | 89 | let loadByUUIDOrURL: VideoMethods.LoadByUUIDOrURL |
89 | let loadLocalVideoByUUID: VideoMethods.LoadLocalVideoByUUID | 90 | let loadLocalVideoByUUID: VideoMethods.LoadLocalVideoByUUID |
@@ -271,6 +272,7 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da | |||
271 | listOwnedAndPopulateAccountAndTags, | 272 | listOwnedAndPopulateAccountAndTags, |
272 | listOwnedByAccount, | 273 | listOwnedByAccount, |
273 | load, | 274 | load, |
275 | loadByUrlAndPopulateAccount, | ||
274 | loadAndPopulateAccount, | 276 | loadAndPopulateAccount, |
275 | loadAndPopulateAccountAndServerAndTags, | 277 | loadAndPopulateAccountAndServerAndTags, |
276 | loadByHostAndUUID, | 278 | loadByHostAndUUID, |
@@ -936,6 +938,25 @@ loadByUUID = function (uuid: string, t?: Sequelize.Transaction) { | |||
936 | return Video.findOne(query) | 938 | return Video.findOne(query) |
937 | } | 939 | } |
938 | 940 | ||
941 | loadByUrlAndPopulateAccount = function (url: string, t?: Sequelize.Transaction) { | ||
942 | const query: Sequelize.FindOptions<VideoAttributes> = { | ||
943 | where: { | ||
944 | url | ||
945 | }, | ||
946 | include: [ | ||
947 | Video['sequelize'].models.VideoFile, | ||
948 | { | ||
949 | model: Video['sequelize'].models.VideoChannel, | ||
950 | include: [ Video['sequelize'].models.Account ] | ||
951 | } | ||
952 | ] | ||
953 | } | ||
954 | |||
955 | if (t !== undefined) query.transaction = t | ||
956 | |||
957 | return Video.findOne(query) | ||
958 | } | ||
959 | |||
939 | loadByUUIDOrURL = function (uuid: string, url: string, t?: Sequelize.Transaction) { | 960 | loadByUUIDOrURL = function (uuid: string, url: string, t?: Sequelize.Transaction) { |
940 | const query: Sequelize.FindOptions<VideoAttributes> = { | 961 | const query: Sequelize.FindOptions<VideoAttributes> = { |
941 | where: { | 962 | where: { |