]>
Commit | Line | Data |
---|---|---|
1 | import * as Sequelize from 'sequelize' | |
2 | import { BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' | |
3 | import { ActorModel } from '../activitypub/actor' | |
4 | import { VideoModel } from './video' | |
5 | ||
6 | enum ScopeNames { | |
7 | FULL = 'FULL', | |
8 | WITH_ACTOR = 'WITH_ACTOR' | |
9 | } | |
10 | ||
11 | @Scopes({ | |
12 | [ScopeNames.FULL]: { | |
13 | include: [ | |
14 | { | |
15 | model: () => ActorModel, | |
16 | required: true | |
17 | }, | |
18 | { | |
19 | model: () => VideoModel, | |
20 | required: true | |
21 | } | |
22 | ] | |
23 | }, | |
24 | [ScopeNames.WITH_ACTOR]: { | |
25 | include: [ | |
26 | { | |
27 | model: () => ActorModel, | |
28 | required: true | |
29 | } | |
30 | ] | |
31 | } | |
32 | }) | |
33 | @Table({ | |
34 | tableName: 'videoShare', | |
35 | indexes: [ | |
36 | { | |
37 | fields: [ 'actorId' ] | |
38 | }, | |
39 | { | |
40 | fields: [ 'videoId' ] | |
41 | } | |
42 | ] | |
43 | }) | |
44 | export class VideoShareModel extends Model<VideoShareModel> { | |
45 | @CreatedAt | |
46 | createdAt: Date | |
47 | ||
48 | @UpdatedAt | |
49 | updatedAt: Date | |
50 | ||
51 | @ForeignKey(() => ActorModel) | |
52 | @Column | |
53 | actorId: number | |
54 | ||
55 | @BelongsTo(() => ActorModel, { | |
56 | foreignKey: { | |
57 | allowNull: false | |
58 | }, | |
59 | onDelete: 'cascade' | |
60 | }) | |
61 | Actor: ActorModel | |
62 | ||
63 | @ForeignKey(() => VideoModel) | |
64 | @Column | |
65 | videoId: number | |
66 | ||
67 | @BelongsTo(() => VideoModel, { | |
68 | foreignKey: { | |
69 | allowNull: false | |
70 | }, | |
71 | onDelete: 'cascade' | |
72 | }) | |
73 | Video: VideoModel | |
74 | ||
75 | static load (actorId: number, videoId: number, t: Sequelize.Transaction) { | |
76 | return VideoShareModel.scope(ScopeNames.WITH_ACTOR).findOne({ | |
77 | where: { | |
78 | actorId, | |
79 | videoId | |
80 | }, | |
81 | transaction: t | |
82 | }) | |
83 | } | |
84 | ||
85 | static loadActorsByShare (videoId: number, t: Sequelize.Transaction) { | |
86 | const query = { | |
87 | where: { | |
88 | videoId | |
89 | }, | |
90 | include: [ | |
91 | { | |
92 | model: ActorModel, | |
93 | required: true | |
94 | } | |
95 | ], | |
96 | transaction: t | |
97 | } | |
98 | ||
99 | return VideoShareModel.scope(ScopeNames.FULL).findAll(query) | |
100 | .then(res => res.map(r => r.Actor)) | |
101 | } | |
102 | } |