Automatically resize avatars
[oweals/peertube.git] / server / models / video / video-share.ts
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 }