diff options
Diffstat (limited to 'server/models/account/user-notification.ts')
-rw-r--r-- | server/models/account/user-notification.ts | 95 |
1 files changed, 89 insertions, 6 deletions
diff --git a/server/models/account/user-notification.ts b/server/models/account/user-notification.ts index 251244374..79afce600 100644 --- a/server/models/account/user-notification.ts +++ b/server/models/account/user-notification.ts | |||
@@ -25,6 +25,8 @@ import { AccountModel } from './account' | |||
25 | import { VideoAbuseModel } from '../video/video-abuse' | 25 | import { VideoAbuseModel } from '../video/video-abuse' |
26 | import { VideoBlacklistModel } from '../video/video-blacklist' | 26 | import { VideoBlacklistModel } from '../video/video-blacklist' |
27 | import { VideoImportModel } from '../video/video-import' | 27 | import { VideoImportModel } from '../video/video-import' |
28 | import { ActorModel } from '../activitypub/actor' | ||
29 | import { ActorFollowModel } from '../activitypub/actor-follow' | ||
28 | 30 | ||
29 | enum ScopeNames { | 31 | enum ScopeNames { |
30 | WITH_ALL = 'WITH_ALL' | 32 | WITH_ALL = 'WITH_ALL' |
@@ -38,17 +40,17 @@ function buildVideoInclude (required: boolean) { | |||
38 | } | 40 | } |
39 | } | 41 | } |
40 | 42 | ||
41 | function buildChannelInclude () { | 43 | function buildChannelInclude (required: boolean) { |
42 | return { | 44 | return { |
43 | required: true, | 45 | required, |
44 | attributes: [ 'id', 'name' ], | 46 | attributes: [ 'id', 'name' ], |
45 | model: () => VideoChannelModel.unscoped() | 47 | model: () => VideoChannelModel.unscoped() |
46 | } | 48 | } |
47 | } | 49 | } |
48 | 50 | ||
49 | function buildAccountInclude () { | 51 | function buildAccountInclude (required: boolean) { |
50 | return { | 52 | return { |
51 | required: true, | 53 | required, |
52 | attributes: [ 'id', 'name' ], | 54 | attributes: [ 'id', 'name' ], |
53 | model: () => AccountModel.unscoped() | 55 | model: () => AccountModel.unscoped() |
54 | } | 56 | } |
@@ -58,14 +60,14 @@ function buildAccountInclude () { | |||
58 | [ScopeNames.WITH_ALL]: { | 60 | [ScopeNames.WITH_ALL]: { |
59 | include: [ | 61 | include: [ |
60 | Object.assign(buildVideoInclude(false), { | 62 | Object.assign(buildVideoInclude(false), { |
61 | include: [ buildChannelInclude() ] | 63 | include: [ buildChannelInclude(true) ] |
62 | }), | 64 | }), |
63 | { | 65 | { |
64 | attributes: [ 'id', 'originCommentId' ], | 66 | attributes: [ 'id', 'originCommentId' ], |
65 | model: () => VideoCommentModel.unscoped(), | 67 | model: () => VideoCommentModel.unscoped(), |
66 | required: false, | 68 | required: false, |
67 | include: [ | 69 | include: [ |
68 | buildAccountInclude(), | 70 | buildAccountInclude(true), |
69 | buildVideoInclude(true) | 71 | buildVideoInclude(true) |
70 | ] | 72 | ] |
71 | }, | 73 | }, |
@@ -86,6 +88,42 @@ function buildAccountInclude () { | |||
86 | model: () => VideoImportModel.unscoped(), | 88 | model: () => VideoImportModel.unscoped(), |
87 | required: false, | 89 | required: false, |
88 | include: [ buildVideoInclude(false) ] | 90 | include: [ buildVideoInclude(false) ] |
91 | }, | ||
92 | { | ||
93 | attributes: [ 'id', 'name' ], | ||
94 | model: () => AccountModel.unscoped(), | ||
95 | required: false, | ||
96 | include: [ | ||
97 | { | ||
98 | attributes: [ 'id', 'preferredUsername' ], | ||
99 | model: () => ActorModel.unscoped(), | ||
100 | required: true | ||
101 | } | ||
102 | ] | ||
103 | }, | ||
104 | { | ||
105 | attributes: [ 'id' ], | ||
106 | model: () => ActorFollowModel.unscoped(), | ||
107 | required: false, | ||
108 | include: [ | ||
109 | { | ||
110 | attributes: [ 'preferredUsername' ], | ||
111 | model: () => ActorModel.unscoped(), | ||
112 | required: true, | ||
113 | as: 'ActorFollower', | ||
114 | include: [ buildAccountInclude(true) ] | ||
115 | }, | ||
116 | { | ||
117 | attributes: [ 'preferredUsername' ], | ||
118 | model: () => ActorModel.unscoped(), | ||
119 | required: true, | ||
120 | as: 'ActorFollowing', | ||
121 | include: [ | ||
122 | buildChannelInclude(false), | ||
123 | buildAccountInclude(false) | ||
124 | ] | ||
125 | } | ||
126 | ] | ||
89 | } | 127 | } |
90 | ] | 128 | ] |
91 | } | 129 | } |
@@ -193,6 +231,30 @@ export class UserNotificationModel extends Model<UserNotificationModel> { | |||
193 | }) | 231 | }) |
194 | VideoImport: VideoImportModel | 232 | VideoImport: VideoImportModel |
195 | 233 | ||
234 | @ForeignKey(() => AccountModel) | ||
235 | @Column | ||
236 | accountId: number | ||
237 | |||
238 | @BelongsTo(() => AccountModel, { | ||
239 | foreignKey: { | ||
240 | allowNull: true | ||
241 | }, | ||
242 | onDelete: 'cascade' | ||
243 | }) | ||
244 | Account: AccountModel | ||
245 | |||
246 | @ForeignKey(() => ActorFollowModel) | ||
247 | @Column | ||
248 | actorFollowId: number | ||
249 | |||
250 | @BelongsTo(() => ActorFollowModel, { | ||
251 | foreignKey: { | ||
252 | allowNull: true | ||
253 | }, | ||
254 | onDelete: 'cascade' | ||
255 | }) | ||
256 | ActorFollow: ActorFollowModel | ||
257 | |||
196 | static listForApi (userId: number, start: number, count: number, sort: string, unread?: boolean) { | 258 | static listForApi (userId: number, start: number, count: number, sort: string, unread?: boolean) { |
197 | const query: IFindOptions<UserNotificationModel> = { | 259 | const query: IFindOptions<UserNotificationModel> = { |
198 | offset: start, | 260 | offset: start, |
@@ -264,6 +326,25 @@ export class UserNotificationModel extends Model<UserNotificationModel> { | |||
264 | video: this.formatVideo(this.VideoBlacklist.Video) | 326 | video: this.formatVideo(this.VideoBlacklist.Video) |
265 | } : undefined | 327 | } : undefined |
266 | 328 | ||
329 | const account = this.Account ? { | ||
330 | id: this.Account.id, | ||
331 | displayName: this.Account.getDisplayName(), | ||
332 | name: this.Account.Actor.preferredUsername | ||
333 | } : undefined | ||
334 | |||
335 | const actorFollow = this.ActorFollow ? { | ||
336 | id: this.ActorFollow.id, | ||
337 | follower: { | ||
338 | displayName: this.ActorFollow.ActorFollower.Account.getDisplayName(), | ||
339 | name: this.ActorFollow.ActorFollower.preferredUsername | ||
340 | }, | ||
341 | following: { | ||
342 | type: this.ActorFollow.ActorFollowing.VideoChannel ? 'channel' as 'channel' : 'account' as 'account', | ||
343 | displayName: (this.ActorFollow.ActorFollowing.VideoChannel || this.ActorFollow.ActorFollowing.Account).getDisplayName(), | ||
344 | name: this.ActorFollow.ActorFollowing.preferredUsername | ||
345 | } | ||
346 | } : undefined | ||
347 | |||
267 | return { | 348 | return { |
268 | id: this.id, | 349 | id: this.id, |
269 | type: this.type, | 350 | type: this.type, |
@@ -273,6 +354,8 @@ export class UserNotificationModel extends Model<UserNotificationModel> { | |||
273 | comment, | 354 | comment, |
274 | videoAbuse, | 355 | videoAbuse, |
275 | videoBlacklist, | 356 | videoBlacklist, |
357 | account, | ||
358 | actorFollow, | ||
276 | createdAt: this.createdAt.toISOString(), | 359 | createdAt: this.createdAt.toISOString(), |
277 | updatedAt: this.updatedAt.toISOString() | 360 | updatedAt: this.updatedAt.toISOString() |
278 | } | 361 | } |