aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models
diff options
context:
space:
mode:
Diffstat (limited to 'server/models')
-rw-r--r--server/models/account/user.ts12
-rw-r--r--server/models/video/video-change-ownership.ts127
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'
39import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type' 39import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type'
40import { values } from 'lodash' 40import { values } from 'lodash'
41import { NSFW_POLICY_TYPES } from '../../initializers' 41import { NSFW_POLICY_TYPES } from '../../initializers'
42import { VideoFileModel } from '../video/video-file'
42 43
43enum ScopeNames { 44enum 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 @@
1import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
2import { AccountModel } from '../account/account'
3import { VideoModel } from './video'
4import { VideoChangeOwnership, VideoChangeOwnershipStatus } from '../../../shared/models/videos'
5import { getSort } from '../utils'
6import { VideoFileModel } from './video-file'
7
8enum 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})
47export 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}