aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/video
diff options
context:
space:
mode:
Diffstat (limited to 'server/models/video')
-rw-r--r--server/models/video/video-comment.ts45
-rw-r--r--server/models/video/video.ts46
2 files changed, 80 insertions, 11 deletions
diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts
index d2d8945c3..66fca2484 100644
--- a/server/models/video/video-comment.ts
+++ b/server/models/video/video-comment.ts
@@ -7,12 +7,14 @@ import { VideoCommentObject } from '../../../shared/models/activitypub/objects/v
7import { VideoComment } from '../../../shared/models/videos/video-comment.model' 7import { VideoComment } from '../../../shared/models/videos/video-comment.model'
8import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' 8import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
9import { CONSTRAINTS_FIELDS } from '../../initializers' 9import { CONSTRAINTS_FIELDS } from '../../initializers'
10import { sendDeleteVideoComment } from '../../lib/activitypub/send'
10import { AccountModel } from '../account/account' 11import { AccountModel } from '../account/account'
11import { ActorModel } from '../activitypub/actor' 12import { ActorModel } from '../activitypub/actor'
12import { AvatarModel } from '../avatar/avatar' 13import { AvatarModel } from '../avatar/avatar'
13import { ServerModel } from '../server/server' 14import { ServerModel } from '../server/server'
14import { getSort, throwIfNotValid } from '../utils' 15import { getSort, throwIfNotValid } from '../utils'
15import { VideoModel } from './video' 16import { VideoModel } from './video'
17import { VideoChannelModel } from './video-channel'
16 18
17enum ScopeNames { 19enum ScopeNames {
18 WITH_ACCOUNT = 'WITH_ACCOUNT', 20 WITH_ACCOUNT = 'WITH_ACCOUNT',
@@ -70,7 +72,25 @@ enum ScopeNames {
70 include: [ 72 include: [
71 { 73 {
72 model: () => VideoModel, 74 model: () => VideoModel,
73 required: false 75 required: true,
76 include: [
77 {
78 model: () => VideoChannelModel.unscoped(),
79 required: true,
80 include: [
81 {
82 model: () => AccountModel,
83 required: true,
84 include: [
85 {
86 model: () => ActorModel,
87 required: true
88 }
89 ]
90 }
91 ]
92 }
93 ]
74 } 94 }
75 ] 95 ]
76 } 96 }
@@ -155,9 +175,10 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
155 Account: AccountModel 175 Account: AccountModel
156 176
157 @AfterDestroy 177 @AfterDestroy
158 static sendDeleteIfOwned (instance: VideoCommentModel) { 178 static async sendDeleteIfOwned (instance: VideoCommentModel) {
159 // TODO 179 if (instance.isOwned()) {
160 return undefined 180 await sendDeleteVideoComment(instance, undefined)
181 }
161 } 182 }
162 183
163 static loadById (id: number, t?: Sequelize.Transaction) { 184 static loadById (id: number, t?: Sequelize.Transaction) {
@@ -198,6 +219,18 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
198 return VideoCommentModel.findOne(query) 219 return VideoCommentModel.findOne(query)
199 } 220 }
200 221
222 static loadByUrlAndPopulateAccount (url: string, t?: Sequelize.Transaction) {
223 const query: IFindOptions<VideoCommentModel> = {
224 where: {
225 url
226 }
227 }
228
229 if (t !== undefined) query.transaction = t
230
231 return VideoCommentModel.scope([ ScopeNames.WITH_ACCOUNT ]).findOne(query)
232 }
233
201 static listThreadsForApi (videoId: number, start: number, count: number, sort: string) { 234 static listThreadsForApi (videoId: number, start: number, count: number, sort: string) {
202 const query = { 235 const query = {
203 offset: start, 236 offset: start,
@@ -237,6 +270,10 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
237 }) 270 })
238 } 271 }
239 272
273 isOwned () {
274 return this.Account.isOwned()
275 }
276
240 toFormattedJSON () { 277 toFormattedJSON () {
241 return { 278 return {
242 id: this.id, 279 id: this.id,
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index c4b716cd2..4d15c2a50 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -43,7 +43,8 @@ import { VideoTagModel } from './video-tag'
43 43
44enum ScopeNames { 44enum ScopeNames {
45 AVAILABLE_FOR_LIST = 'AVAILABLE_FOR_LIST', 45 AVAILABLE_FOR_LIST = 'AVAILABLE_FOR_LIST',
46 WITH_ACCOUNT = 'WITH_ACCOUNT', 46 WITH_ACCOUNT_API = 'WITH_ACCOUNT_API',
47 WITH_ACCOUNT_DETAILS = 'WITH_ACCOUNT_DETAILS',
47 WITH_TAGS = 'WITH_TAGS', 48 WITH_TAGS = 'WITH_TAGS',
48 WITH_FILES = 'WITH_FILES', 49 WITH_FILES = 'WITH_FILES',
49 WITH_SHARES = 'WITH_SHARES', 50 WITH_SHARES = 'WITH_SHARES',
@@ -62,7 +63,35 @@ enum ScopeNames {
62 privacy: VideoPrivacy.PUBLIC 63 privacy: VideoPrivacy.PUBLIC
63 } 64 }
64 }, 65 },
65 [ScopeNames.WITH_ACCOUNT]: { 66 [ScopeNames.WITH_ACCOUNT_API]: {
67 include: [
68 {
69 model: () => VideoChannelModel.unscoped(),
70 required: true,
71 include: [
72 {
73 attributes: [ 'name' ],
74 model: () => AccountModel.unscoped(),
75 required: true,
76 include: [
77 {
78 attributes: [ 'serverId' ],
79 model: () => ActorModel.unscoped(),
80 required: true,
81 include: [
82 {
83 model: () => ServerModel.unscoped(),
84 required: false
85 }
86 ]
87 }
88 ]
89 }
90 ]
91 }
92 ]
93 },
94 [ScopeNames.WITH_ACCOUNT_DETAILS]: {
66 include: [ 95 include: [
67 { 96 {
68 model: () => VideoChannelModel, 97 model: () => VideoChannelModel,
@@ -146,6 +175,9 @@ enum ScopeNames {
146 }, 175 },
147 { 176 {
148 fields: [ 'channelId' ] 177 fields: [ 'channelId' ]
178 },
179 {
180 fields: [ 'id', 'privacy' ]
149 } 181 }
150 ] 182 ]
151}) 183})
@@ -461,7 +493,7 @@ export class VideoModel extends Model<VideoModel> {
461 order: [ getSort(sort) ] 493 order: [ getSort(sort) ]
462 } 494 }
463 495
464 return VideoModel.scope([ ScopeNames.AVAILABLE_FOR_LIST, ScopeNames.WITH_ACCOUNT ]) 496 return VideoModel.scope([ ScopeNames.AVAILABLE_FOR_LIST, ScopeNames.WITH_ACCOUNT_API ])
465 .findAndCountAll(query) 497 .findAndCountAll(query)
466 .then(({ rows, count }) => { 498 .then(({ rows, count }) => {
467 return { 499 return {
@@ -496,7 +528,7 @@ export class VideoModel extends Model<VideoModel> {
496 528
497 if (t !== undefined) query.transaction = t 529 if (t !== undefined) query.transaction = t
498 530
499 return VideoModel.scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_FILES ]).findOne(query) 531 return VideoModel.scope([ ScopeNames.WITH_ACCOUNT_DETAILS, ScopeNames.WITH_FILES ]).findOne(query)
500 } 532 }
501 533
502 static loadByUUIDOrURL (uuid: string, url: string, t?: Sequelize.Transaction) { 534 static loadByUUIDOrURL (uuid: string, url: string, t?: Sequelize.Transaction) {
@@ -520,7 +552,7 @@ export class VideoModel extends Model<VideoModel> {
520 } 552 }
521 553
522 return VideoModel 554 return VideoModel
523 .scope([ ScopeNames.WITH_TAGS, ScopeNames.WITH_FILES, ScopeNames.WITH_ACCOUNT ]) 555 .scope([ ScopeNames.WITH_TAGS, ScopeNames.WITH_FILES, ScopeNames.WITH_ACCOUNT_DETAILS ])
524 .findById(id, options) 556 .findById(id, options)
525 } 557 }
526 558
@@ -545,7 +577,7 @@ export class VideoModel extends Model<VideoModel> {
545 } 577 }
546 578
547 return VideoModel 579 return VideoModel
548 .scope([ ScopeNames.WITH_TAGS, ScopeNames.WITH_FILES, ScopeNames.WITH_ACCOUNT ]) 580 .scope([ ScopeNames.WITH_TAGS, ScopeNames.WITH_FILES, ScopeNames.WITH_ACCOUNT_DETAILS ])
549 .findOne(options) 581 .findOne(options)
550 } 582 }
551 583
@@ -563,7 +595,7 @@ export class VideoModel extends Model<VideoModel> {
563 ScopeNames.WITH_SHARES, 595 ScopeNames.WITH_SHARES,
564 ScopeNames.WITH_TAGS, 596 ScopeNames.WITH_TAGS,
565 ScopeNames.WITH_FILES, 597 ScopeNames.WITH_FILES,
566 ScopeNames.WITH_ACCOUNT, 598 ScopeNames.WITH_ACCOUNT_DETAILS,
567 ScopeNames.WITH_COMMENTS 599 ScopeNames.WITH_COMMENTS
568 ]) 600 ])
569 .findOne(options) 601 .findOne(options)