diff options
Diffstat (limited to 'server/models')
-rw-r--r-- | server/models/account/user.ts | 12 | ||||
-rw-r--r-- | server/models/video/video-change-ownership.ts | 127 |
2 files changed, 139 insertions, 0 deletions
diff --git a/server/models/account/user.ts b/server/models/account/user.ts index 89265774b..4b13e47a0 100644 --- a/server/models/account/user.ts +++ b/server/models/account/user.ts | |||
@@ -39,6 +39,7 @@ import { AccountModel } from './account' | |||
39 | import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type' | 39 | import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type' |
40 | import { values } from 'lodash' | 40 | import { values } from 'lodash' |
41 | import { NSFW_POLICY_TYPES } from '../../initializers' | 41 | import { NSFW_POLICY_TYPES } from '../../initializers' |
42 | import { VideoFileModel } from '../video/video-file' | ||
42 | 43 | ||
43 | enum ScopeNames { | 44 | enum ScopeNames { |
44 | WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL' | 45 | WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL' |
@@ -393,4 +394,15 @@ export class UserModel extends Model<UserModel> { | |||
393 | return parseInt(total, 10) | 394 | return parseInt(total, 10) |
394 | }) | 395 | }) |
395 | } | 396 | } |
397 | |||
398 | static autocomplete (search: string) { | ||
399 | return UserModel.findAll({ | ||
400 | where: { | ||
401 | username: { | ||
402 | [Sequelize.Op.like]: `%${search}%` | ||
403 | } | ||
404 | } | ||
405 | }) | ||
406 | .then(u => u.map(u => u.username)) | ||
407 | } | ||
396 | } | 408 | } |
diff --git a/server/models/video/video-change-ownership.ts b/server/models/video/video-change-ownership.ts new file mode 100644 index 000000000..c9cff5054 --- /dev/null +++ b/server/models/video/video-change-ownership.ts | |||
@@ -0,0 +1,127 @@ | |||
1 | import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' | ||
2 | import { AccountModel } from '../account/account' | ||
3 | import { VideoModel } from './video' | ||
4 | import { VideoChangeOwnership, VideoChangeOwnershipStatus } from '../../../shared/models/videos' | ||
5 | import { getSort } from '../utils' | ||
6 | import { VideoFileModel } from './video-file' | ||
7 | |||
8 | enum ScopeNames { | ||
9 | FULL = 'FULL' | ||
10 | } | ||
11 | |||
12 | @Table({ | ||
13 | tableName: 'videoChangeOwnership', | ||
14 | indexes: [ | ||
15 | { | ||
16 | fields: ['videoId'] | ||
17 | }, | ||
18 | { | ||
19 | fields: ['initiatorAccountId'] | ||
20 | }, | ||
21 | { | ||
22 | fields: ['nextOwnerAccountId'] | ||
23 | } | ||
24 | ] | ||
25 | }) | ||
26 | @Scopes({ | ||
27 | [ScopeNames.FULL]: { | ||
28 | include: [ | ||
29 | { | ||
30 | model: () => AccountModel, | ||
31 | as: 'Initiator', | ||
32 | required: true | ||
33 | }, | ||
34 | { | ||
35 | model: () => AccountModel, | ||
36 | as: 'NextOwner', | ||
37 | required: true | ||
38 | }, | ||
39 | { | ||
40 | model: () => VideoModel, | ||
41 | required: true, | ||
42 | include: [{ model: () => VideoFileModel }] | ||
43 | } | ||
44 | ] | ||
45 | } | ||
46 | }) | ||
47 | export class VideoChangeOwnershipModel extends Model<VideoChangeOwnershipModel> { | ||
48 | @CreatedAt | ||
49 | createdAt: Date | ||
50 | |||
51 | @UpdatedAt | ||
52 | updatedAt: Date | ||
53 | |||
54 | @AllowNull(false) | ||
55 | @Column | ||
56 | status: VideoChangeOwnershipStatus | ||
57 | |||
58 | @ForeignKey(() => AccountModel) | ||
59 | @Column | ||
60 | initiatorAccountId: number | ||
61 | |||
62 | @BelongsTo(() => AccountModel, { | ||
63 | foreignKey: { | ||
64 | name: 'initiatorAccountId', | ||
65 | allowNull: false | ||
66 | }, | ||
67 | onDelete: 'cascade' | ||
68 | }) | ||
69 | Initiator: AccountModel | ||
70 | |||
71 | @ForeignKey(() => AccountModel) | ||
72 | @Column | ||
73 | nextOwnerAccountId: number | ||
74 | |||
75 | @BelongsTo(() => AccountModel, { | ||
76 | foreignKey: { | ||
77 | name: 'nextOwnerAccountId', | ||
78 | allowNull: false | ||
79 | }, | ||
80 | onDelete: 'cascade' | ||
81 | }) | ||
82 | NextOwner: AccountModel | ||
83 | |||
84 | @ForeignKey(() => VideoModel) | ||
85 | @Column | ||
86 | videoId: number | ||
87 | |||
88 | @BelongsTo(() => VideoModel, { | ||
89 | foreignKey: { | ||
90 | allowNull: false | ||
91 | }, | ||
92 | onDelete: 'cascade' | ||
93 | }) | ||
94 | Video: VideoModel | ||
95 | |||
96 | static listForApi (nextOwnerId: number, start: number, count: number, sort: string) { | ||
97 | return VideoChangeOwnershipModel.scope(ScopeNames.FULL).findAndCountAll({ | ||
98 | offset: start, | ||
99 | limit: count, | ||
100 | order: getSort(sort), | ||
101 | where: { | ||
102 | nextOwnerAccountId: nextOwnerId | ||
103 | } | ||
104 | }) | ||
105 | .then(({ rows, count }) => ({ total: count, data: rows })) | ||
106 | } | ||
107 | |||
108 | static load (id: number) { | ||
109 | return VideoChangeOwnershipModel.scope(ScopeNames.FULL).findById(id) | ||
110 | } | ||
111 | |||
112 | toFormattedJSON (): VideoChangeOwnership { | ||
113 | return { | ||
114 | id: this.id, | ||
115 | status: this.status, | ||
116 | initiatorAccount: this.Initiator.toFormattedJSON(), | ||
117 | nextOwnerAccount: this.NextOwner.toFormattedJSON(), | ||
118 | video: { | ||
119 | id: this.Video.id, | ||
120 | uuid: this.Video.uuid, | ||
121 | url: this.Video.url, | ||
122 | name: this.Video.name | ||
123 | }, | ||
124 | createdAt: this.createdAt | ||
125 | } | ||
126 | } | ||
127 | } | ||