Optimize account creation
[oweals/peertube.git] / server / models / account / account-video-rate.ts
1 /*
2   Account rates per video.
3 */
4 import { values } from 'lodash'
5 import * as Sequelize from 'sequelize'
6
7 import { VIDEO_RATE_TYPES } from '../../initializers'
8
9 import { addMethodsToModel } from '../utils'
10 import {
11   AccountVideoRateInstance,
12   AccountVideoRateAttributes,
13
14   AccountVideoRateMethods
15 } from './account-video-rate-interface'
16
17 let AccountVideoRate: Sequelize.Model<AccountVideoRateInstance, AccountVideoRateAttributes>
18 let load: AccountVideoRateMethods.Load
19
20 export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
21   AccountVideoRate = sequelize.define<AccountVideoRateInstance, AccountVideoRateAttributes>('AccountVideoRate',
22     {
23       type: {
24         type: DataTypes.ENUM(values(VIDEO_RATE_TYPES)),
25         allowNull: false
26       }
27     },
28     {
29       indexes: [
30         {
31           fields: [ 'videoId', 'accountId', 'type' ],
32           unique: true
33         }
34       ]
35     }
36   )
37
38   const classMethods = [
39     associate,
40
41     load
42   ]
43   addMethodsToModel(AccountVideoRate, classMethods)
44
45   return AccountVideoRate
46 }
47
48 // ------------------------------ STATICS ------------------------------
49
50 function associate (models) {
51   AccountVideoRate.belongsTo(models.Video, {
52     foreignKey: {
53       name: 'videoId',
54       allowNull: false
55     },
56     onDelete: 'CASCADE'
57   })
58
59   AccountVideoRate.belongsTo(models.Account, {
60     foreignKey: {
61       name: 'accountId',
62       allowNull: false
63     },
64     onDelete: 'CASCADE'
65   })
66 }
67
68 load = function (accountId: number, videoId: number, transaction: Sequelize.Transaction) {
69   const options: Sequelize.FindOptions<AccountVideoRateAttributes> = {
70     where: {
71       accountId,
72       videoId
73     }
74   }
75   if (transaction) options.transaction = transaction
76
77   return AccountVideoRate.findOne(options)
78 }