diff options
Diffstat (limited to 'server/models')
33 files changed, 429 insertions, 216 deletions
diff --git a/server/models/application-interface.ts b/server/models/application-interface.ts index 826d25df0..c03513db1 100644 --- a/server/models/application-interface.ts +++ b/server/models/application-interface.ts | |||
@@ -1,8 +1,11 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | export namespace ApplicationMethods { | 3 | export namespace ApplicationMethods { |
4 | export type LoadMigrationVersion = (callback: (err: Error, version: number) => void) => void | 4 | export type LoadMigrationVersionCallback = (err: Error, version: number) => void |
5 | export type UpdateMigrationVersion = (newVersion: number, transaction: any, callback: any) => void | 5 | export type LoadMigrationVersion = (callback: LoadMigrationVersionCallback) => void |
6 | |||
7 | export type UpdateMigrationVersionCallback = (err: Error, applicationInstance: ApplicationAttributes) => void | ||
8 | export type UpdateMigrationVersion = (newVersion: number, transaction: Sequelize.Transaction, callback: UpdateMigrationVersionCallback) => void | ||
6 | } | 9 | } |
7 | 10 | ||
8 | export interface ApplicationClass { | 11 | export interface ApplicationClass { |
diff --git a/server/models/application.ts b/server/models/application.ts index acd0dfbf2..14b87777a 100644 --- a/server/models/application.ts +++ b/server/models/application.ts | |||
@@ -35,7 +35,7 @@ export default function defineApplication (sequelize: Sequelize.Sequelize, DataT | |||
35 | 35 | ||
36 | // --------------------------------------------------------------------------- | 36 | // --------------------------------------------------------------------------- |
37 | 37 | ||
38 | loadMigrationVersion = function (callback: (err: Error, version: number) => void) { | 38 | loadMigrationVersion = function (callback: ApplicationMethods.LoadMigrationVersionCallback) { |
39 | const query = { | 39 | const query = { |
40 | attributes: [ 'migrationVersion' ] | 40 | attributes: [ 'migrationVersion' ] |
41 | } | 41 | } |
@@ -47,15 +47,10 @@ loadMigrationVersion = function (callback: (err: Error, version: number) => void | |||
47 | }) | 47 | }) |
48 | } | 48 | } |
49 | 49 | ||
50 | updateMigrationVersion = function (newVersion: number, transaction: any, callback: any) { | 50 | updateMigrationVersion = function (newVersion: number, transaction: Sequelize.Transaction, callback: ApplicationMethods.UpdateMigrationVersionCallback) { |
51 | const options: Sequelize.UpdateOptions = { | 51 | const options: Sequelize.UpdateOptions = { |
52 | where: {} | 52 | where: {}, |
53 | } | 53 | transaction: transaction |
54 | |||
55 | if (!callback) { | ||
56 | transaction = callback | ||
57 | } else { | ||
58 | options.transaction = transaction | ||
59 | } | 54 | } |
60 | 55 | ||
61 | return Application.update({ migrationVersion: newVersion }, options).asCallback(callback) | 56 | return Application.update({ migrationVersion: newVersion }, options).asCallback(callback) |
diff --git a/server/models/author-interface.ts b/server/models/author-interface.ts index d2475c3bd..b57ce2a6b 100644 --- a/server/models/author-interface.ts +++ b/server/models/author-interface.ts | |||
@@ -1,7 +1,10 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { PodInstance } from './pod-interface' | ||
4 | |||
3 | export namespace AuthorMethods { | 5 | export namespace AuthorMethods { |
4 | export type FindOrCreateAuthor = (name, podId, userId, transaction, callback) => void | 6 | export type FindOrCreateAuthorCallback = (err: Error, authorInstance?: AuthorInstance) => void |
7 | export type FindOrCreateAuthor = (name: string, podId: number, userId: number, transaction: Sequelize.Transaction, callback: FindOrCreateAuthorCallback) => void | ||
5 | } | 8 | } |
6 | 9 | ||
7 | export interface AuthorClass { | 10 | export interface AuthorClass { |
@@ -16,6 +19,9 @@ export interface AuthorInstance extends AuthorClass, AuthorAttributes, Sequelize | |||
16 | id: number | 19 | id: number |
17 | createdAt: Date | 20 | createdAt: Date |
18 | updatedAt: Date | 21 | updatedAt: Date |
22 | |||
23 | podId: number | ||
24 | Pod: PodInstance | ||
19 | } | 25 | } |
20 | 26 | ||
21 | export interface AuthorModel extends AuthorClass, Sequelize.Model<AuthorInstance, AuthorAttributes> {} | 27 | export interface AuthorModel extends AuthorClass, Sequelize.Model<AuthorInstance, AuthorAttributes> {} |
diff --git a/server/models/author.ts b/server/models/author.ts index b543d17a0..3264d3a88 100644 --- a/server/models/author.ts +++ b/server/models/author.ts | |||
@@ -74,12 +74,13 @@ function associate (models) { | |||
74 | }) | 74 | }) |
75 | } | 75 | } |
76 | 76 | ||
77 | findOrCreateAuthor = function (name, podId, userId, transaction, callback) { | 77 | findOrCreateAuthor = function ( |
78 | if (!callback) { | 78 | name: string, |
79 | callback = transaction | 79 | podId: number, |
80 | transaction = null | 80 | userId: number, |
81 | } | 81 | transaction: Sequelize.Transaction, |
82 | 82 | callback: AuthorMethods.FindOrCreateAuthorCallback | |
83 | ) { | ||
83 | const author = { | 84 | const author = { |
84 | name, | 85 | name, |
85 | podId, | 86 | podId, |
@@ -91,7 +92,7 @@ findOrCreateAuthor = function (name, podId, userId, transaction, callback) { | |||
91 | defaults: author | 92 | defaults: author |
92 | } | 93 | } |
93 | 94 | ||
94 | if (transaction) query.transaction = transaction | 95 | if (transaction !== null) query.transaction = transaction |
95 | 96 | ||
96 | Author.findOrCreate(query).asCallback(function (err, result) { | 97 | Author.findOrCreate(query).asCallback(function (err, result) { |
97 | if (err) return callback(err) | 98 | if (err) return callback(err) |
diff --git a/server/models/job-interface.ts b/server/models/job-interface.ts index ad4e2d2b0..ab6678257 100644 --- a/server/models/job-interface.ts +++ b/server/models/job-interface.ts | |||
@@ -1,7 +1,8 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | export namespace JobMethods { | 3 | export namespace JobMethods { |
4 | export type ListWithLimit = (limit, state, callback) => void | 4 | export type ListWithLimitCallback = (err: Error, jobInstances: JobInstance[]) => void |
5 | export type ListWithLimit = (limit: number, state: string, callback: ListWithLimitCallback) => void | ||
5 | } | 6 | } |
6 | 7 | ||
7 | export interface JobClass { | 8 | export interface JobClass { |
diff --git a/server/models/job.ts b/server/models/job.ts index 982b51499..1afae8f08 100644 --- a/server/models/job.ts +++ b/server/models/job.ts | |||
@@ -48,7 +48,7 @@ export default function defineJob (sequelize: Sequelize.Sequelize, DataTypes) { | |||
48 | 48 | ||
49 | // --------------------------------------------------------------------------- | 49 | // --------------------------------------------------------------------------- |
50 | 50 | ||
51 | listWithLimit = function (limit, state, callback) { | 51 | listWithLimit = function (limit: number, state: string, callback: JobMethods.ListWithLimitCallback) { |
52 | const query = { | 52 | const query = { |
53 | order: [ | 53 | order: [ |
54 | [ 'id', 'ASC' ] | 54 | [ 'id', 'ASC' ] |
diff --git a/server/models/oauth-client-interface.ts b/server/models/oauth-client-interface.ts index 4efd6212a..3b4325740 100644 --- a/server/models/oauth-client-interface.ts +++ b/server/models/oauth-client-interface.ts | |||
@@ -1,8 +1,12 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | export namespace OAuthClientMethods { | 3 | export namespace OAuthClientMethods { |
4 | export type CountTotal = (callback) => void | 4 | export type CountTotalCallback = (err: Error, total: number) => void |
5 | export type LoadFirstClient = (callback) => void | 5 | export type CountTotal = (callback: CountTotalCallback) => void |
6 | |||
7 | export type LoadFirstClientCallback = (err: Error, client: OAuthClientInstance) => void | ||
8 | export type LoadFirstClient = (callback: LoadFirstClientCallback) => void | ||
9 | |||
6 | export type GetByIdAndSecret = (clientId, clientSecret) => void | 10 | export type GetByIdAndSecret = (clientId, clientSecret) => void |
7 | } | 11 | } |
8 | 12 | ||
diff --git a/server/models/oauth-client.ts b/server/models/oauth-client.ts index 2cefb5cb9..22fae2842 100644 --- a/server/models/oauth-client.ts +++ b/server/models/oauth-client.ts | |||
@@ -67,15 +67,15 @@ function associate (models) { | |||
67 | }) | 67 | }) |
68 | } | 68 | } |
69 | 69 | ||
70 | countTotal = function (callback) { | 70 | countTotal = function (callback: OAuthClientMethods.CountTotalCallback) { |
71 | return OAuthClient.count().asCallback(callback) | 71 | return OAuthClient.count().asCallback(callback) |
72 | } | 72 | } |
73 | 73 | ||
74 | loadFirstClient = function (callback) { | 74 | loadFirstClient = function (callback: OAuthClientMethods.LoadFirstClientCallback) { |
75 | return OAuthClient.findOne().asCallback(callback) | 75 | return OAuthClient.findOne().asCallback(callback) |
76 | } | 76 | } |
77 | 77 | ||
78 | getByIdAndSecret = function (clientId, clientSecret) { | 78 | getByIdAndSecret = function (clientId: string, clientSecret: string) { |
79 | const query = { | 79 | const query = { |
80 | where: { | 80 | where: { |
81 | clientId: clientId, | 81 | clientId: clientId, |
diff --git a/server/models/oauth-token-interface.ts b/server/models/oauth-token-interface.ts index a0cd1ffe7..88526697e 100644 --- a/server/models/oauth-token-interface.ts +++ b/server/models/oauth-token-interface.ts | |||
@@ -1,11 +1,25 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import * as Bluebird from 'bluebird' | ||
2 | 3 | ||
3 | import { UserModel } from './user-interface' | 4 | import { UserModel } from './user-interface' |
4 | 5 | ||
6 | export type OAuthTokenInfo = { | ||
7 | refreshToken: string | ||
8 | refreshTokenExpiresAt: Date, | ||
9 | client: { | ||
10 | id: number | ||
11 | }, | ||
12 | user: { | ||
13 | id: number | ||
14 | } | ||
15 | } | ||
16 | |||
5 | export namespace OAuthTokenMethods { | 17 | export namespace OAuthTokenMethods { |
6 | export type GetByRefreshTokenAndPopulateClient = (refreshToken) => void | 18 | export type GetByRefreshTokenAndPopulateClient = (refreshToken: string) => Bluebird<OAuthTokenInfo> |
7 | export type GetByTokenAndPopulateUser = (bearerToken) => void | 19 | export type GetByTokenAndPopulateUser = (bearerToken: string) => Bluebird<OAuthTokenInstance> |
8 | export type GetByRefreshTokenAndPopulateUser = (refreshToken) => any | 20 | export type GetByRefreshTokenAndPopulateUser = (refreshToken: string) => Bluebird<OAuthTokenInstance> |
21 | |||
22 | export type RemoveByUserIdCallback = (err: Error) => void | ||
9 | export type RemoveByUserId = (userId, callback) => void | 23 | export type RemoveByUserId = (userId, callback) => void |
10 | } | 24 | } |
11 | 25 | ||
diff --git a/server/models/oauth-token.ts b/server/models/oauth-token.ts index 567df1c12..d70bd2bce 100644 --- a/server/models/oauth-token.ts +++ b/server/models/oauth-token.ts | |||
@@ -8,7 +8,8 @@ import { | |||
8 | OAuthTokenInstance, | 8 | OAuthTokenInstance, |
9 | OAuthTokenAttributes, | 9 | OAuthTokenAttributes, |
10 | 10 | ||
11 | OAuthTokenMethods | 11 | OAuthTokenMethods, |
12 | OAuthTokenInfo | ||
12 | } from './oauth-token-interface' | 13 | } from './oauth-token-interface' |
13 | 14 | ||
14 | let OAuthToken: Sequelize.Model<OAuthTokenInstance, OAuthTokenAttributes> | 15 | let OAuthToken: Sequelize.Model<OAuthTokenInstance, OAuthTokenAttributes> |
@@ -90,7 +91,7 @@ function associate (models) { | |||
90 | }) | 91 | }) |
91 | } | 92 | } |
92 | 93 | ||
93 | getByRefreshTokenAndPopulateClient = function (refreshToken) { | 94 | getByRefreshTokenAndPopulateClient = function (refreshToken: string) { |
94 | const query = { | 95 | const query = { |
95 | where: { | 96 | where: { |
96 | refreshToken: refreshToken | 97 | refreshToken: refreshToken |
@@ -99,9 +100,9 @@ getByRefreshTokenAndPopulateClient = function (refreshToken) { | |||
99 | } | 100 | } |
100 | 101 | ||
101 | return OAuthToken.findOne(query).then(function (token) { | 102 | return OAuthToken.findOne(query).then(function (token) { |
102 | if (!token) return token | 103 | if (!token) return null |
103 | 104 | ||
104 | const tokenInfos = { | 105 | const tokenInfos: OAuthTokenInfo = { |
105 | refreshToken: token.refreshToken, | 106 | refreshToken: token.refreshToken, |
106 | refreshTokenExpiresAt: token.refreshTokenExpiresAt, | 107 | refreshTokenExpiresAt: token.refreshTokenExpiresAt, |
107 | client: { | 108 | client: { |
@@ -118,7 +119,7 @@ getByRefreshTokenAndPopulateClient = function (refreshToken) { | |||
118 | }) | 119 | }) |
119 | } | 120 | } |
120 | 121 | ||
121 | getByTokenAndPopulateUser = function (bearerToken) { | 122 | getByTokenAndPopulateUser = function (bearerToken: string) { |
122 | const query = { | 123 | const query = { |
123 | where: { | 124 | where: { |
124 | accessToken: bearerToken | 125 | accessToken: bearerToken |
@@ -133,7 +134,7 @@ getByTokenAndPopulateUser = function (bearerToken) { | |||
133 | }) | 134 | }) |
134 | } | 135 | } |
135 | 136 | ||
136 | getByRefreshTokenAndPopulateUser = function (refreshToken) { | 137 | getByRefreshTokenAndPopulateUser = function (refreshToken: string) { |
137 | const query = { | 138 | const query = { |
138 | where: { | 139 | where: { |
139 | refreshToken: refreshToken | 140 | refreshToken: refreshToken |
diff --git a/server/models/pod-interface.ts b/server/models/pod-interface.ts index 14c88bec6..8f362bd5c 100644 --- a/server/models/pod-interface.ts +++ b/server/models/pod-interface.ts | |||
@@ -1,18 +1,39 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | // Don't use barrel, import just what we need | ||
4 | import { Pod as FormatedPod } from '../../shared/models/pod.model' | ||
5 | |||
3 | export namespace PodMethods { | 6 | export namespace PodMethods { |
4 | export type ToFormatedJSON = () => void | 7 | export type ToFormatedJSON = () => FormatedPod |
5 | 8 | ||
9 | export type CountAllCallback = (err: Error, total: number) => void | ||
6 | export type CountAll = (callback) => void | 10 | export type CountAll = (callback) => void |
7 | export type IncrementScores = (ids, value, callback) => void | 11 | |
8 | export type List = (callback) => void | 12 | export type IncrementScoresCallback = (err: Error) => void |
9 | export type ListAllIds = (transaction, callback) => void | 13 | export type IncrementScores = (ids: number[], value: number, callback?: IncrementScoresCallback) => void |
10 | export type ListRandomPodIdsWithRequest = (limit, tableWithPods, tableWithPodsJoins, callback) => void | 14 | |
11 | export type ListBadPods = (callback) => void | 15 | export type ListCallback = (err: Error, podInstances?: PodInstance[]) => void |
12 | export type Load = (id, callback) => void | 16 | export type List = (callback: ListCallback) => void |
13 | export type LoadByHost = (host, callback) => void | 17 | |
14 | export type RemoveAll = (callback) => void | 18 | export type ListAllIdsCallback = (err: Error, ids?: number[]) => void |
15 | export type UpdatePodsScore = (goodPods, badPods) => void | 19 | export type ListAllIds = (transaction: Sequelize.Transaction, callback: ListAllIdsCallback) => void |
20 | |||
21 | export type ListRandomPodIdsWithRequestCallback = (err: Error, podInstanceIds?: number[]) => void | ||
22 | export type ListRandomPodIdsWithRequest = (limit: number, tableWithPods: string, tableWithPodsJoins: string, callback: ListRandomPodIdsWithRequestCallback) => void | ||
23 | |||
24 | export type ListBadPodsCallback = (err: Error, podInstances?: PodInstance[]) => void | ||
25 | export type ListBadPods = (callback: ListBadPodsCallback) => void | ||
26 | |||
27 | export type LoadCallback = (err: Error, podInstance: PodInstance) => void | ||
28 | export type Load = (id: number, callback: LoadCallback) => void | ||
29 | |||
30 | export type LoadByHostCallback = (err: Error, podInstance: PodInstance) => void | ||
31 | export type LoadByHost = (host: string, callback: LoadByHostCallback) => void | ||
32 | |||
33 | export type RemoveAllCallback = (err: Error) => void | ||
34 | export type RemoveAll = (callback: RemoveAllCallback) => void | ||
35 | |||
36 | export type UpdatePodsScore = (goodPods: number[], badPods: number[]) => void | ||
16 | } | 37 | } |
17 | 38 | ||
18 | export interface PodClass { | 39 | export interface PodClass { |
diff --git a/server/models/pod.ts b/server/models/pod.ts index 2df32e4a4..107744c43 100644 --- a/server/models/pod.ts +++ b/server/models/pod.ts | |||
@@ -118,11 +118,11 @@ function associate (models) { | |||
118 | }) | 118 | }) |
119 | } | 119 | } |
120 | 120 | ||
121 | countAll = function (callback) { | 121 | countAll = function (callback: PodMethods.CountAllCallback) { |
122 | return Pod.count().asCallback(callback) | 122 | return Pod.count().asCallback(callback) |
123 | } | 123 | } |
124 | 124 | ||
125 | incrementScores = function (ids, value, callback) { | 125 | incrementScores = function (ids: number[], value: number, callback?: PodMethods.IncrementScoresCallback) { |
126 | if (!callback) callback = function () { /* empty */ } | 126 | if (!callback) callback = function () { /* empty */ } |
127 | 127 | ||
128 | const update = { | 128 | const update = { |
@@ -142,35 +142,25 @@ incrementScores = function (ids, value, callback) { | |||
142 | return Pod.update(update, options).asCallback(callback) | 142 | return Pod.update(update, options).asCallback(callback) |
143 | } | 143 | } |
144 | 144 | ||
145 | list = function (callback) { | 145 | list = function (callback: PodMethods.ListCallback) { |
146 | return Pod.findAll().asCallback(callback) | 146 | return Pod.findAll().asCallback(callback) |
147 | } | 147 | } |
148 | 148 | ||
149 | listAllIds = function (transaction, callback) { | 149 | listAllIds = function (transaction: Sequelize.Transaction, callback: PodMethods.ListAllIdsCallback) { |
150 | if (!callback) { | ||
151 | callback = transaction | ||
152 | transaction = null | ||
153 | } | ||
154 | |||
155 | const query: any = { | 150 | const query: any = { |
156 | attributes: [ 'id' ] | 151 | attributes: [ 'id' ] |
157 | } | 152 | } |
158 | 153 | ||
159 | if (transaction) query.transaction = transaction | 154 | if (transaction !== null) query.transaction = transaction |
160 | 155 | ||
161 | return Pod.findAll(query).asCallback(function (err, pods) { | 156 | return Pod.findAll(query).asCallback(function (err: Error, pods) { |
162 | if (err) return callback(err) | 157 | if (err) return callback(err) |
163 | 158 | ||
164 | return callback(null, map(pods, 'id')) | 159 | return callback(null, map(pods, 'id')) |
165 | }) | 160 | }) |
166 | } | 161 | } |
167 | 162 | ||
168 | listRandomPodIdsWithRequest = function (limit, tableWithPods, tableWithPodsJoins, callback) { | 163 | listRandomPodIdsWithRequest = function (limit: number, tableWithPods: string, tableWithPodsJoins: string, callback: PodMethods.ListRandomPodIdsWithRequestCallback) { |
169 | if (!callback) { | ||
170 | callback = tableWithPodsJoins | ||
171 | tableWithPodsJoins = '' | ||
172 | } | ||
173 | |||
174 | Pod.count().asCallback(function (err, count) { | 164 | Pod.count().asCallback(function (err, count) { |
175 | if (err) return callback(err) | 165 | if (err) return callback(err) |
176 | 166 | ||
@@ -204,7 +194,7 @@ listRandomPodIdsWithRequest = function (limit, tableWithPods, tableWithPodsJoins | |||
204 | }) | 194 | }) |
205 | } | 195 | } |
206 | 196 | ||
207 | listBadPods = function (callback) { | 197 | listBadPods = function (callback: PodMethods.ListBadPodsCallback) { |
208 | const query = { | 198 | const query = { |
209 | where: { | 199 | where: { |
210 | score: { $lte: 0 } | 200 | score: { $lte: 0 } |
@@ -214,11 +204,11 @@ listBadPods = function (callback) { | |||
214 | return Pod.findAll(query).asCallback(callback) | 204 | return Pod.findAll(query).asCallback(callback) |
215 | } | 205 | } |
216 | 206 | ||
217 | load = function (id, callback) { | 207 | load = function (id: number, callback: PodMethods.LoadCallback) { |
218 | return Pod.findById(id).asCallback(callback) | 208 | return Pod.findById(id).asCallback(callback) |
219 | } | 209 | } |
220 | 210 | ||
221 | loadByHost = function (host, callback) { | 211 | loadByHost = function (host: string, callback: PodMethods.LoadByHostCallback) { |
222 | const query = { | 212 | const query = { |
223 | where: { | 213 | where: { |
224 | host: host | 214 | host: host |
@@ -228,11 +218,11 @@ loadByHost = function (host, callback) { | |||
228 | return Pod.findOne(query).asCallback(callback) | 218 | return Pod.findOne(query).asCallback(callback) |
229 | } | 219 | } |
230 | 220 | ||
231 | removeAll = function (callback) { | 221 | removeAll = function (callback: PodMethods.RemoveAllCallback) { |
232 | return Pod.destroy().asCallback(callback) | 222 | return Pod.destroy().asCallback(callback) |
233 | } | 223 | } |
234 | 224 | ||
235 | updatePodsScore = function (goodPods, badPods) { | 225 | updatePodsScore = function (goodPods: number[], badPods: number[]) { |
236 | logger.info('Updating %d good pods and %d bad pods scores.', goodPods.length, badPods.length) | 226 | logger.info('Updating %d good pods and %d bad pods scores.', goodPods.length, badPods.length) |
237 | 227 | ||
238 | if (goodPods.length !== 0) { | 228 | if (goodPods.length !== 0) { |
diff --git a/server/models/request-interface.ts b/server/models/request-interface.ts index 2bba8ce7f..4bbd79966 100644 --- a/server/models/request-interface.ts +++ b/server/models/request-interface.ts | |||
@@ -1,12 +1,26 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { PodAttributes } from './pod-interface' | 3 | import { PodInstance, PodAttributes } from './pod-interface' |
4 | |||
5 | export type RequestsGrouped = { | ||
6 | [ podId: number ]: { | ||
7 | request: RequestInstance, | ||
8 | pod: PodInstance | ||
9 | }[] | ||
10 | } | ||
4 | 11 | ||
5 | export namespace RequestMethods { | 12 | export namespace RequestMethods { |
6 | export type CountTotalRequests = (callback) => void | 13 | export type CountTotalRequestsCallback = (err: Error, total: number) => void |
7 | export type ListWithLimitAndRandom = (limitPods, limitRequestsPerPod, callback) => void | 14 | export type CountTotalRequests = (callback: CountTotalRequestsCallback) => void |
8 | export type RemoveWithEmptyTo = (callback) => void | 15 | |
9 | export type RemoveAll = (callback) => void | 16 | export type ListWithLimitAndRandomCallback = (err: Error, requestsGrouped?: RequestsGrouped) => void |
17 | export type ListWithLimitAndRandom = (limitPods, limitRequestsPerPod, callback: ListWithLimitAndRandomCallback) => void | ||
18 | |||
19 | export type RemoveWithEmptyToCallback = (err: Error) => void | ||
20 | export type RemoveWithEmptyTo = (callback: RemoveWithEmptyToCallback) => void | ||
21 | |||
22 | export type RemoveAllCallback = (err: Error) => void | ||
23 | export type RemoveAll = (callback: RemoveAllCallback) => void | ||
10 | } | 24 | } |
11 | 25 | ||
12 | export interface RequestClass { | 26 | export interface RequestClass { |
@@ -21,12 +35,13 @@ export interface RequestAttributes { | |||
21 | endpoint: string | 35 | endpoint: string |
22 | } | 36 | } |
23 | 37 | ||
24 | export interface RequestInstance extends Sequelize.Instance<RequestAttributes> { | 38 | export interface RequestInstance extends RequestClass, RequestAttributes, Sequelize.Instance<RequestAttributes> { |
25 | id: number | 39 | id: number |
26 | createdAt: Date | 40 | createdAt: Date |
27 | updatedAt: Date | 41 | updatedAt: Date |
28 | 42 | ||
29 | setPods: Sequelize.HasManySetAssociationsMixin<PodAttributes, number> | 43 | setPods: Sequelize.HasManySetAssociationsMixin<PodAttributes, number> |
44 | Pods: PodInstance[] | ||
30 | } | 45 | } |
31 | 46 | ||
32 | export interface RequestModel extends RequestClass, Sequelize.Model<RequestInstance, RequestAttributes> {} | 47 | export interface RequestModel extends RequestClass, Sequelize.Model<RequestInstance, RequestAttributes> {} |
diff --git a/server/models/request-to-pod-interface.ts b/server/models/request-to-pod-interface.ts index 52116d6c4..6d75ca6e5 100644 --- a/server/models/request-to-pod-interface.ts +++ b/server/models/request-to-pod-interface.ts | |||
@@ -1,7 +1,8 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | export namespace RequestToPodMethods { | 3 | export namespace RequestToPodMethods { |
4 | export type RemoveByRequestIdsAndPod = (requestsIds, podId, callback) => void | 4 | export type RemoveByRequestIdsAndPodCallback = (err: Error) => void |
5 | export type RemoveByRequestIdsAndPod = (requestsIds: number[], podId: number, callback?: RemoveByRequestIdsAndPodCallback) => void | ||
5 | } | 6 | } |
6 | 7 | ||
7 | export interface RequestToPodClass { | 8 | export interface RequestToPodClass { |
@@ -11,7 +12,7 @@ export interface RequestToPodClass { | |||
11 | export interface RequestToPodAttributes { | 12 | export interface RequestToPodAttributes { |
12 | } | 13 | } |
13 | 14 | ||
14 | export interface RequestToPodInstance extends Sequelize.Instance<RequestToPodAttributes> { | 15 | export interface RequestToPodInstance extends RequestToPodClass, RequestToPodAttributes, Sequelize.Instance<RequestToPodAttributes> { |
15 | id: number | 16 | id: number |
16 | createdAt: Date | 17 | createdAt: Date |
17 | updatedAt: Date | 18 | updatedAt: Date |
diff --git a/server/models/request-to-pod.ts b/server/models/request-to-pod.ts index 681f808b7..3562069cc 100644 --- a/server/models/request-to-pod.ts +++ b/server/models/request-to-pod.ts | |||
@@ -38,7 +38,7 @@ export default function (sequelize, DataTypes) { | |||
38 | 38 | ||
39 | // --------------------------------------------------------------------------- | 39 | // --------------------------------------------------------------------------- |
40 | 40 | ||
41 | removeByRequestIdsAndPod = function (requestsIds, podId, callback) { | 41 | removeByRequestIdsAndPod = function (requestsIds: number[], podId: number, callback?: RequestToPodMethods.RemoveByRequestIdsAndPodCallback) { |
42 | if (!callback) callback = function () { /* empty */ } | 42 | if (!callback) callback = function () { /* empty */ } |
43 | 43 | ||
44 | const query = { | 44 | const query = { |
diff --git a/server/models/request-video-event-interface.ts b/server/models/request-video-event-interface.ts index a31c7108f..ad576a2b1 100644 --- a/server/models/request-video-event-interface.ts +++ b/server/models/request-video-event-interface.ts | |||
@@ -1,10 +1,30 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { VideoInstance } from './video-interface' | ||
4 | import { PodInstance } from './pod-interface' | ||
5 | |||
6 | export type RequestsVideoEventGrouped = { | ||
7 | [ podId: number ]: { | ||
8 | id: number | ||
9 | type: string | ||
10 | count: number | ||
11 | video: VideoInstance | ||
12 | pod: PodInstance | ||
13 | }[] | ||
14 | } | ||
15 | |||
3 | export namespace RequestVideoEventMethods { | 16 | export namespace RequestVideoEventMethods { |
4 | export type CountTotalRequests = (callback) => void | 17 | export type CountTotalRequestsCallback = (err: Error, total: number) => void |
5 | export type ListWithLimitAndRandom = (limitPods, limitRequestsPerPod, callback) => void | 18 | export type CountTotalRequests = (callback: CountTotalRequestsCallback) => void |
6 | export type RemoveByRequestIdsAndPod = (ids, podId, callback) => void | 19 | |
7 | export type RemoveAll = (callback) => void | 20 | export type ListWithLimitAndRandomCallback = (err: Error, requestsGrouped?: RequestsVideoEventGrouped) => void |
21 | export type ListWithLimitAndRandom = (limitPods: number, limitRequestsPerPod: number, callback: ListWithLimitAndRandomCallback) => void | ||
22 | |||
23 | export type RemoveByRequestIdsAndPodCallback = () => void | ||
24 | export type RemoveByRequestIdsAndPod = (ids: number[], podId: number, callback: RemoveByRequestIdsAndPodCallback) => void | ||
25 | |||
26 | export type RemoveAllCallback = () => void | ||
27 | export type RemoveAll = (callback: RemoveAllCallback) => void | ||
8 | } | 28 | } |
9 | 29 | ||
10 | export interface RequestVideoEventClass { | 30 | export interface RequestVideoEventClass { |
@@ -19,8 +39,10 @@ export interface RequestVideoEventAttributes { | |||
19 | count: number | 39 | count: number |
20 | } | 40 | } |
21 | 41 | ||
22 | export interface RequestVideoEventInstance extends Sequelize.Instance<RequestVideoEventAttributes> { | 42 | export interface RequestVideoEventInstance extends RequestVideoEventClass, RequestVideoEventAttributes, Sequelize.Instance<RequestVideoEventAttributes> { |
23 | id: number | 43 | id: number |
44 | |||
45 | Video: VideoInstance | ||
24 | } | 46 | } |
25 | 47 | ||
26 | export interface RequestVideoEventModel extends RequestVideoEventClass, Sequelize.Model<RequestVideoEventInstance, RequestVideoEventAttributes> {} | 48 | export interface RequestVideoEventModel extends RequestVideoEventClass, Sequelize.Model<RequestVideoEventInstance, RequestVideoEventAttributes> {} |
diff --git a/server/models/request-video-event.ts b/server/models/request-video-event.ts index 234e2a8a9..e422649af 100644 --- a/server/models/request-video-event.ts +++ b/server/models/request-video-event.ts | |||
@@ -5,16 +5,17 @@ | |||
5 | import { values } from 'lodash' | 5 | import { values } from 'lodash' |
6 | import * as Sequelize from 'sequelize' | 6 | import * as Sequelize from 'sequelize' |
7 | 7 | ||
8 | import { database as db } from '../initializers/database' | ||
8 | import { REQUEST_VIDEO_EVENT_TYPES } from '../initializers' | 9 | import { REQUEST_VIDEO_EVENT_TYPES } from '../initializers' |
9 | import { isVideoEventCountValid } from '../helpers' | 10 | import { isVideoEventCountValid } from '../helpers' |
10 | |||
11 | import { addMethodsToModel } from './utils' | 11 | import { addMethodsToModel } from './utils' |
12 | import { | 12 | import { |
13 | RequestVideoEventClass, | 13 | RequestVideoEventClass, |
14 | RequestVideoEventInstance, | 14 | RequestVideoEventInstance, |
15 | RequestVideoEventAttributes, | 15 | RequestVideoEventAttributes, |
16 | 16 | ||
17 | RequestVideoEventMethods | 17 | RequestVideoEventMethods, |
18 | RequestsVideoEventGrouped | ||
18 | } from './request-video-event-interface' | 19 | } from './request-video-event-interface' |
19 | 20 | ||
20 | let RequestVideoEvent: Sequelize.Model<RequestVideoEventInstance, RequestVideoEventAttributes> | 21 | let RequestVideoEvent: Sequelize.Model<RequestVideoEventInstance, RequestVideoEventAttributes> |
@@ -76,13 +77,13 @@ function associate (models) { | |||
76 | }) | 77 | }) |
77 | } | 78 | } |
78 | 79 | ||
79 | countTotalRequests = function (callback) { | 80 | countTotalRequests = function (callback: RequestVideoEventMethods.CountTotalRequestsCallback) { |
80 | const query = {} | 81 | const query = {} |
81 | return RequestVideoEvent.count(query).asCallback(callback) | 82 | return RequestVideoEvent.count(query).asCallback(callback) |
82 | } | 83 | } |
83 | 84 | ||
84 | listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) { | 85 | listWithLimitAndRandom = function (limitPods: number, limitRequestsPerPod: number, callback: RequestVideoEventMethods.ListWithLimitAndRandomCallback) { |
85 | const Pod = RequestVideoEvent['sequelize'].models.Pod | 86 | const Pod = db.Pod |
86 | 87 | ||
87 | // We make a join between videos and authors to find the podId of our video event requests | 88 | // We make a join between videos and authors to find the podId of our video event requests |
88 | const podJoins = 'INNER JOIN "Videos" ON "Videos"."authorId" = "Authors"."id" ' + | 89 | const podJoins = 'INNER JOIN "Videos" ON "Videos"."authorId" = "Authors"."id" ' + |
@@ -129,7 +130,7 @@ listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) { | |||
129 | }) | 130 | }) |
130 | } | 131 | } |
131 | 132 | ||
132 | removeByRequestIdsAndPod = function (ids, podId, callback) { | 133 | removeByRequestIdsAndPod = function (ids: number[], podId: number, callback: RequestVideoEventMethods.RemoveByRequestIdsAndPodCallback) { |
133 | const query = { | 134 | const query = { |
134 | where: { | 135 | where: { |
135 | id: { | 136 | id: { |
@@ -154,15 +155,15 @@ removeByRequestIdsAndPod = function (ids, podId, callback) { | |||
154 | RequestVideoEvent.destroy(query).asCallback(callback) | 155 | RequestVideoEvent.destroy(query).asCallback(callback) |
155 | } | 156 | } |
156 | 157 | ||
157 | removeAll = function (callback) { | 158 | removeAll = function (callback: RequestVideoEventMethods.RemoveAllCallback) { |
158 | // Delete all requests | 159 | // Delete all requests |
159 | RequestVideoEvent.truncate({ cascade: true }).asCallback(callback) | 160 | RequestVideoEvent.truncate({ cascade: true }).asCallback(callback) |
160 | } | 161 | } |
161 | 162 | ||
162 | // --------------------------------------------------------------------------- | 163 | // --------------------------------------------------------------------------- |
163 | 164 | ||
164 | function groupAndTruncateRequests (events, limitRequestsPerPod) { | 165 | function groupAndTruncateRequests (events: RequestVideoEventInstance[], limitRequestsPerPod: number) { |
165 | const eventsGrouped = {} | 166 | const eventsGrouped: RequestsVideoEventGrouped = {} |
166 | 167 | ||
167 | events.forEach(function (event) { | 168 | events.forEach(function (event) { |
168 | const pod = event.Video.Author.Pod | 169 | const pod = event.Video.Author.Pod |
diff --git a/server/models/request-video-qadu-interface.ts b/server/models/request-video-qadu-interface.ts index 6fe34ee91..04de7f159 100644 --- a/server/models/request-video-qadu-interface.ts +++ b/server/models/request-video-qadu-interface.ts | |||
@@ -1,10 +1,28 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { VideoInstance } from './video-interface' | ||
4 | import { PodInstance } from './pod-interface' | ||
5 | |||
6 | export type RequestsVideoQaduGrouped = { | ||
7 | [ podId: number ]: { | ||
8 | request: RequestVideoQaduInstance | ||
9 | video: VideoInstance | ||
10 | pod: PodInstance | ||
11 | } | ||
12 | } | ||
13 | |||
3 | export namespace RequestVideoQaduMethods { | 14 | export namespace RequestVideoQaduMethods { |
4 | export type CountTotalRequests = (callback) => void | 15 | export type CountTotalRequestsCallback = (err: Error, total: number) => void |
5 | export type ListWithLimitAndRandom = (limitPods, limitRequestsPerPod, callback) => void | 16 | export type CountTotalRequests = (callback: CountTotalRequestsCallback) => void |
6 | export type RemoveByRequestIdsAndPod = (ids, podId, callback) => void | 17 | |
7 | export type RemoveAll = (callback) => void | 18 | export type ListWithLimitAndRandomCallback = (err: Error, requestsGrouped?: RequestsVideoQaduGrouped) => void |
19 | export type ListWithLimitAndRandom = (limitPods: number, limitRequestsPerPod: number, callback: ListWithLimitAndRandomCallback) => void | ||
20 | |||
21 | export type RemoveByRequestIdsAndPodCallback = () => void | ||
22 | export type RemoveByRequestIdsAndPod = (ids: number[], podId: number, callback: RemoveByRequestIdsAndPodCallback) => void | ||
23 | |||
24 | export type RemoveAllCallback = () => void | ||
25 | export type RemoveAll = (callback: RemoveAllCallback) => void | ||
8 | } | 26 | } |
9 | 27 | ||
10 | export interface RequestVideoQaduClass { | 28 | export interface RequestVideoQaduClass { |
@@ -18,8 +36,11 @@ export interface RequestVideoQaduAttributes { | |||
18 | type: string | 36 | type: string |
19 | } | 37 | } |
20 | 38 | ||
21 | export interface RequestVideoQaduInstance extends Sequelize.Instance<RequestVideoQaduAttributes> { | 39 | export interface RequestVideoQaduInstance extends RequestVideoQaduClass, RequestVideoQaduAttributes, Sequelize.Instance<RequestVideoQaduAttributes> { |
22 | id: number | 40 | id: number |
41 | |||
42 | Pod: PodInstance | ||
43 | Video: VideoInstance | ||
23 | } | 44 | } |
24 | 45 | ||
25 | export interface RequestVideoQaduModel extends RequestVideoQaduClass, Sequelize.Model<RequestVideoQaduInstance, RequestVideoQaduAttributes> {} | 46 | export interface RequestVideoQaduModel extends RequestVideoQaduClass, Sequelize.Model<RequestVideoQaduInstance, RequestVideoQaduAttributes> {} |
diff --git a/server/models/request-video-qadu.ts b/server/models/request-video-qadu.ts index e914e06cd..38627ad55 100644 --- a/server/models/request-video-qadu.ts +++ b/server/models/request-video-qadu.ts | |||
@@ -12,8 +12,8 @@ | |||
12 | import { values } from 'lodash' | 12 | import { values } from 'lodash' |
13 | import * as Sequelize from 'sequelize' | 13 | import * as Sequelize from 'sequelize' |
14 | 14 | ||
15 | import { database as db } from '../initializers/database' | ||
15 | import { REQUEST_VIDEO_QADU_TYPES } from '../initializers' | 16 | import { REQUEST_VIDEO_QADU_TYPES } from '../initializers' |
16 | |||
17 | import { addMethodsToModel } from './utils' | 17 | import { addMethodsToModel } from './utils' |
18 | import { | 18 | import { |
19 | RequestVideoQaduClass, | 19 | RequestVideoQaduClass, |
@@ -83,15 +83,16 @@ function associate (models) { | |||
83 | }) | 83 | }) |
84 | } | 84 | } |
85 | 85 | ||
86 | countTotalRequests = function (callback) { | 86 | countTotalRequests = function (callback: RequestVideoQaduMethods.CountTotalRequestsCallback) { |
87 | const query = {} | 87 | const query = {} |
88 | return RequestVideoQadu.count(query).asCallback(callback) | 88 | return RequestVideoQadu.count(query).asCallback(callback) |
89 | } | 89 | } |
90 | 90 | ||
91 | listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) { | 91 | listWithLimitAndRandom = function (limitPods: number, limitRequestsPerPod: number, callback: RequestVideoQaduMethods.ListWithLimitAndRandomCallback) { |
92 | const Pod = RequestVideoQadu['sequelize'].models.Pod | 92 | const Pod = db.Pod |
93 | const tableJoin = '' | ||
93 | 94 | ||
94 | Pod.listRandomPodIdsWithRequest(limitPods, 'RequestVideoQadus', function (err, podIds) { | 95 | Pod.listRandomPodIdsWithRequest(limitPods, 'RequestVideoQadus', tableJoin, function (err, podIds) { |
95 | if (err) return callback(err) | 96 | if (err) return callback(err) |
96 | 97 | ||
97 | // We don't have friends that have requests | 98 | // We don't have friends that have requests |
@@ -122,7 +123,7 @@ listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) { | |||
122 | }) | 123 | }) |
123 | } | 124 | } |
124 | 125 | ||
125 | removeByRequestIdsAndPod = function (ids, podId, callback) { | 126 | removeByRequestIdsAndPod = function (ids: number[], podId: number, callback: RequestVideoQaduMethods.RemoveByRequestIdsAndPodCallback) { |
126 | const query = { | 127 | const query = { |
127 | where: { | 128 | where: { |
128 | id: { | 129 | id: { |
@@ -135,14 +136,14 @@ removeByRequestIdsAndPod = function (ids, podId, callback) { | |||
135 | RequestVideoQadu.destroy(query).asCallback(callback) | 136 | RequestVideoQadu.destroy(query).asCallback(callback) |
136 | } | 137 | } |
137 | 138 | ||
138 | removeAll = function (callback) { | 139 | removeAll = function (callback: RequestVideoQaduMethods.RemoveAllCallback) { |
139 | // Delete all requests | 140 | // Delete all requests |
140 | RequestVideoQadu.truncate({ cascade: true }).asCallback(callback) | 141 | RequestVideoQadu.truncate({ cascade: true }).asCallback(callback) |
141 | } | 142 | } |
142 | 143 | ||
143 | // --------------------------------------------------------------------------- | 144 | // --------------------------------------------------------------------------- |
144 | 145 | ||
145 | function groupAndTruncateRequests (requests, limitRequestsPerPod) { | 146 | function groupAndTruncateRequests (requests: RequestVideoQaduInstance[], limitRequestsPerPod: number) { |
146 | const requestsGrouped = {} | 147 | const requestsGrouped = {} |
147 | 148 | ||
148 | requests.forEach(function (request) { | 149 | requests.forEach(function (request) { |
diff --git a/server/models/request.ts b/server/models/request.ts index 18fa291fa..71f81ae66 100644 --- a/server/models/request.ts +++ b/server/models/request.ts | |||
@@ -1,15 +1,16 @@ | |||
1 | import { values } from 'lodash' | 1 | import { values } from 'lodash' |
2 | import * as Sequelize from 'sequelize' | 2 | import * as Sequelize from 'sequelize' |
3 | 3 | ||
4 | import { database as db } from '../initializers/database' | ||
4 | import { REQUEST_ENDPOINTS } from '../initializers' | 5 | import { REQUEST_ENDPOINTS } from '../initializers' |
5 | |||
6 | import { addMethodsToModel } from './utils' | 6 | import { addMethodsToModel } from './utils' |
7 | import { | 7 | import { |
8 | RequestClass, | 8 | RequestClass, |
9 | RequestInstance, | 9 | RequestInstance, |
10 | RequestAttributes, | 10 | RequestAttributes, |
11 | 11 | ||
12 | RequestMethods | 12 | RequestMethods, |
13 | RequestsGrouped | ||
13 | } from './request-interface' | 14 | } from './request-interface' |
14 | 15 | ||
15 | let Request: Sequelize.Model<RequestInstance, RequestAttributes> | 16 | let Request: Sequelize.Model<RequestInstance, RequestAttributes> |
@@ -59,7 +60,7 @@ function associate (models) { | |||
59 | }) | 60 | }) |
60 | } | 61 | } |
61 | 62 | ||
62 | countTotalRequests = function (callback) { | 63 | countTotalRequests = function (callback: RequestMethods.CountTotalRequestsCallback) { |
63 | // We need to include Pod because there are no cascade delete when a pod is removed | 64 | // We need to include Pod because there are no cascade delete when a pod is removed |
64 | // So we could count requests that do not have existing pod anymore | 65 | // So we could count requests that do not have existing pod anymore |
65 | const query = { | 66 | const query = { |
@@ -69,10 +70,11 @@ countTotalRequests = function (callback) { | |||
69 | return Request.count(query).asCallback(callback) | 70 | return Request.count(query).asCallback(callback) |
70 | } | 71 | } |
71 | 72 | ||
72 | listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) { | 73 | listWithLimitAndRandom = function (limitPods: number, limitRequestsPerPod: number, callback: RequestMethods.ListWithLimitAndRandomCallback) { |
73 | const Pod = Request['sequelize'].models.Pod | 74 | const Pod = db.Pod |
75 | const tableJoin = '' | ||
74 | 76 | ||
75 | Pod.listRandomPodIdsWithRequest(limitPods, 'RequestToPods', function (err, podIds) { | 77 | Pod.listRandomPodIdsWithRequest(limitPods, 'RequestToPods', '', function (err, podIds) { |
76 | if (err) return callback(err) | 78 | if (err) return callback(err) |
77 | 79 | ||
78 | // We don't have friends that have requests | 80 | // We don't have friends that have requests |
@@ -105,12 +107,12 @@ listWithLimitAndRandom = function (limitPods, limitRequestsPerPod, callback) { | |||
105 | }) | 107 | }) |
106 | } | 108 | } |
107 | 109 | ||
108 | removeAll = function (callback) { | 110 | removeAll = function (callback: RequestMethods.RemoveAllCallback) { |
109 | // Delete all requests | 111 | // Delete all requests |
110 | Request.truncate({ cascade: true }).asCallback(callback) | 112 | Request.truncate({ cascade: true }).asCallback(callback) |
111 | } | 113 | } |
112 | 114 | ||
113 | removeWithEmptyTo = function (callback) { | 115 | removeWithEmptyTo = function (callback?: RequestMethods.RemoveWithEmptyToCallback) { |
114 | if (!callback) callback = function () { /* empty */ } | 116 | if (!callback) callback = function () { /* empty */ } |
115 | 117 | ||
116 | const query = { | 118 | const query = { |
@@ -128,8 +130,8 @@ removeWithEmptyTo = function (callback) { | |||
128 | 130 | ||
129 | // --------------------------------------------------------------------------- | 131 | // --------------------------------------------------------------------------- |
130 | 132 | ||
131 | function groupAndTruncateRequests (requests, limitRequestsPerPod) { | 133 | function groupAndTruncateRequests (requests: RequestInstance[], limitRequestsPerPod: number) { |
132 | const requestsGrouped = {} | 134 | const requestsGrouped: RequestsGrouped = {} |
133 | 135 | ||
134 | requests.forEach(function (request) { | 136 | requests.forEach(function (request) { |
135 | request.Pods.forEach(function (pod) { | 137 | request.Pods.forEach(function (pod) { |
diff --git a/server/models/tag-interface.ts b/server/models/tag-interface.ts index f96e1e9c5..e045e7ca5 100644 --- a/server/models/tag-interface.ts +++ b/server/models/tag-interface.ts | |||
@@ -1,7 +1,8 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | export namespace TagMethods { | 3 | export namespace TagMethods { |
4 | export type FindOrCreateTags = (tags, transaction, callback) => void | 4 | export type FindOrCreateTagsCallback = (err: Error, tagInstances: TagInstance[]) => void |
5 | export type FindOrCreateTags = (tags: string[], transaction: Sequelize.Transaction, callback: FindOrCreateTagsCallback) => void | ||
5 | } | 6 | } |
6 | 7 | ||
7 | export interface TagClass { | 8 | export interface TagClass { |
diff --git a/server/models/tag.ts b/server/models/tag.ts index b2a9c9f81..c4402e83c 100644 --- a/server/models/tag.ts +++ b/server/models/tag.ts | |||
@@ -52,15 +52,10 @@ function associate (models) { | |||
52 | }) | 52 | }) |
53 | } | 53 | } |
54 | 54 | ||
55 | findOrCreateTags = function (tags, transaction, callback) { | 55 | findOrCreateTags = function (tags: string[], transaction: Sequelize.Transaction, callback: TagMethods.FindOrCreateTagsCallback) { |
56 | if (!callback) { | ||
57 | callback = transaction | ||
58 | transaction = null | ||
59 | } | ||
60 | |||
61 | const tagInstances = [] | 56 | const tagInstances = [] |
62 | 57 | ||
63 | each(tags, function (tag, callbackEach) { | 58 | each<string, Error>(tags, function (tag, callbackEach) { |
64 | const query: any = { | 59 | const query: any = { |
65 | where: { | 60 | where: { |
66 | name: tag | 61 | name: tag |
diff --git a/server/models/user-interface.ts b/server/models/user-interface.ts index a504f42a1..98963b743 100644 --- a/server/models/user-interface.ts +++ b/server/models/user-interface.ts | |||
@@ -1,17 +1,35 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import * as Bluebird from 'bluebird' | ||
3 | |||
4 | // Don't use barrel, import just what we need | ||
5 | import { User as FormatedUser } from '../../shared/models/user.model' | ||
2 | 6 | ||
3 | export namespace UserMethods { | 7 | export namespace UserMethods { |
4 | export type IsPasswordMatch = (password, callback) => void | 8 | export type IsPasswordMatchCallback = (err: Error, same: boolean) => void |
5 | export type ToFormatedJSON = () => void | 9 | export type IsPasswordMatch = (password: string, callback: IsPasswordMatchCallback) => void |
10 | |||
11 | export type ToFormatedJSON = () => FormatedUser | ||
6 | export type IsAdmin = () => boolean | 12 | export type IsAdmin = () => boolean |
7 | 13 | ||
8 | export type CountTotal = (callback) => void | 14 | export type CountTotalCallback = (err: Error, total: number) => void |
9 | export type GetByUsername = (username) => any | 15 | export type CountTotal = (callback: CountTotalCallback) => void |
10 | export type List = (callback) => void | 16 | |
11 | export type ListForApi = (start, count, sort, callback) => void | 17 | export type GetByUsername = (username: string) => Bluebird<UserInstance> |
12 | export type LoadById = (id, callback) => void | 18 | |
13 | export type LoadByUsername = (username, callback) => void | 19 | export type ListCallback = (err: Error, userInstances: UserInstance[]) => void |
14 | export type LoadByUsernameOrEmail = (username, email, callback) => void | 20 | export type List = (callback: ListCallback) => void |
21 | |||
22 | export type ListForApiCallback = (err: Error, userInstances?: UserInstance[], total?: number) => void | ||
23 | export type ListForApi = (start: number, count: number, sort: string, callback: ListForApiCallback) => void | ||
24 | |||
25 | export type LoadByIdCallback = (err: Error, userInstance: UserInstance) => void | ||
26 | export type LoadById = (id: number, callback: LoadByIdCallback) => void | ||
27 | |||
28 | export type LoadByUsernameCallback = (err: Error, userInstance: UserInstance) => void | ||
29 | export type LoadByUsername = (username: string, callback: LoadByUsernameCallback) => void | ||
30 | |||
31 | export type LoadByUsernameOrEmailCallback = (err: Error, userInstance: UserInstance) => void | ||
32 | export type LoadByUsernameOrEmail = (username: string, email: string, callback: LoadByUsernameOrEmailCallback) => void | ||
15 | } | 33 | } |
16 | 34 | ||
17 | export interface UserClass { | 35 | export interface UserClass { |
diff --git a/server/models/user-video-rate-interface.ts b/server/models/user-video-rate-interface.ts index 57d2e2b91..e48869fd2 100644 --- a/server/models/user-video-rate-interface.ts +++ b/server/models/user-video-rate-interface.ts | |||
@@ -1,6 +1,7 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | export namespace UserVideoRateMethods { | 3 | export namespace UserVideoRateMethods { |
4 | export type LoadCallback = (err: Error, userVideoRateInstance: UserVideoRateInstance) => void | ||
4 | export type Load = (userId, videoId, transaction, callback) => void | 5 | export type Load = (userId, videoId, transaction, callback) => void |
5 | } | 6 | } |
6 | 7 | ||
@@ -12,7 +13,7 @@ export interface UserVideoRateAttributes { | |||
12 | type: string | 13 | type: string |
13 | } | 14 | } |
14 | 15 | ||
15 | export interface UserVideoRateInstance extends Sequelize.Instance<UserVideoRateAttributes> { | 16 | export interface UserVideoRateInstance extends UserVideoRateClass, UserVideoRateAttributes, Sequelize.Instance<UserVideoRateAttributes> { |
16 | id: number | 17 | id: number |
17 | createdAt: Date | 18 | createdAt: Date |
18 | updatedAt: Date | 19 | updatedAt: Date |
diff --git a/server/models/user-video-rate.ts b/server/models/user-video-rate.ts index 87886d8d0..6b71e8412 100644 --- a/server/models/user-video-rate.ts +++ b/server/models/user-video-rate.ts | |||
@@ -67,7 +67,7 @@ function associate (models) { | |||
67 | }) | 67 | }) |
68 | } | 68 | } |
69 | 69 | ||
70 | load = function (userId, videoId, transaction, callback) { | 70 | load = function (userId: number, videoId: number, transaction: Sequelize.Transaction, callback: UserVideoRateMethods.LoadCallback) { |
71 | const options: Sequelize.FindOptions = { | 71 | const options: Sequelize.FindOptions = { |
72 | where: { | 72 | where: { |
73 | userId, | 73 | userId, |
diff --git a/server/models/user.ts b/server/models/user.ts index 12ddaaeb7..0fbfdda50 100644 --- a/server/models/user.ts +++ b/server/models/user.ts | |||
@@ -117,7 +117,7 @@ export default function (sequelize, DataTypes) { | |||
117 | return User | 117 | return User |
118 | } | 118 | } |
119 | 119 | ||
120 | function beforeCreateOrUpdate (user, options) { | 120 | function beforeCreateOrUpdate (user: UserInstance) { |
121 | return new Promise(function (resolve, reject) { | 121 | return new Promise(function (resolve, reject) { |
122 | cryptPassword(user.password, function (err, hash) { | 122 | cryptPassword(user.password, function (err, hash) { |
123 | if (err) return reject(err) | 123 | if (err) return reject(err) |
@@ -131,7 +131,7 @@ function beforeCreateOrUpdate (user, options) { | |||
131 | 131 | ||
132 | // ------------------------------ METHODS ------------------------------ | 132 | // ------------------------------ METHODS ------------------------------ |
133 | 133 | ||
134 | isPasswordMatch = function (password, callback) { | 134 | isPasswordMatch = function (password: string, callback: UserMethods.IsPasswordMatchCallback) { |
135 | return comparePassword(password, this.password, callback) | 135 | return comparePassword(password, this.password, callback) |
136 | } | 136 | } |
137 | 137 | ||
@@ -164,11 +164,11 @@ function associate (models) { | |||
164 | }) | 164 | }) |
165 | } | 165 | } |
166 | 166 | ||
167 | countTotal = function (callback) { | 167 | countTotal = function (callback: UserMethods.CountTotalCallback) { |
168 | return this.count().asCallback(callback) | 168 | return this.count().asCallback(callback) |
169 | } | 169 | } |
170 | 170 | ||
171 | getByUsername = function (username) { | 171 | getByUsername = function (username: string) { |
172 | const query = { | 172 | const query = { |
173 | where: { | 173 | where: { |
174 | username: username | 174 | username: username |
@@ -178,11 +178,11 @@ getByUsername = function (username) { | |||
178 | return User.findOne(query) | 178 | return User.findOne(query) |
179 | } | 179 | } |
180 | 180 | ||
181 | list = function (callback) { | 181 | list = function (callback: UserMethods.ListCallback) { |
182 | return User.find().asCallback(callback) | 182 | return User.find().asCallback(callback) |
183 | } | 183 | } |
184 | 184 | ||
185 | listForApi = function (start, count, sort, callback) { | 185 | listForApi = function (start: number, count: number, sort: string, callback: UserMethods.ListForApiCallback) { |
186 | const query = { | 186 | const query = { |
187 | offset: start, | 187 | offset: start, |
188 | limit: count, | 188 | limit: count, |
@@ -196,11 +196,11 @@ listForApi = function (start, count, sort, callback) { | |||
196 | }) | 196 | }) |
197 | } | 197 | } |
198 | 198 | ||
199 | loadById = function (id, callback) { | 199 | loadById = function (id: number, callback: UserMethods.LoadByIdCallback) { |
200 | return User.findById(id).asCallback(callback) | 200 | return User.findById(id).asCallback(callback) |
201 | } | 201 | } |
202 | 202 | ||
203 | loadByUsername = function (username, callback) { | 203 | loadByUsername = function (username: string, callback: UserMethods.LoadByUsernameCallback) { |
204 | const query = { | 204 | const query = { |
205 | where: { | 205 | where: { |
206 | username: username | 206 | username: username |
@@ -210,7 +210,7 @@ loadByUsername = function (username, callback) { | |||
210 | return User.findOne(query).asCallback(callback) | 210 | return User.findOne(query).asCallback(callback) |
211 | } | 211 | } |
212 | 212 | ||
213 | loadByUsernameOrEmail = function (username, email, callback) { | 213 | loadByUsernameOrEmail = function (username: string, email: string, callback: UserMethods.LoadByUsernameOrEmailCallback) { |
214 | const query = { | 214 | const query = { |
215 | where: { | 215 | where: { |
216 | $or: [ { username }, { email } ] | 216 | $or: [ { username }, { email } ] |
diff --git a/server/models/utils.ts b/server/models/utils.ts index fd84a9239..7ba96815e 100644 --- a/server/models/utils.ts +++ b/server/models/utils.ts | |||
@@ -1,7 +1,7 @@ | |||
1 | // Translate for example "-name" to [ 'name', 'DESC' ] | 1 | // Translate for example "-name" to [ 'name', 'DESC' ] |
2 | function getSort (value) { | 2 | function getSort (value: string) { |
3 | let field | 3 | let field: string |
4 | let direction | 4 | let direction: 'ASC' | 'DESC' |
5 | 5 | ||
6 | if (value.substring(0, 1) === '-') { | 6 | if (value.substring(0, 1) === '-') { |
7 | direction = 'DESC' | 7 | direction = 'DESC' |
diff --git a/server/models/video-abuse-interface.ts b/server/models/video-abuse-interface.ts index 9b77fc6f5..d9cb93b42 100644 --- a/server/models/video-abuse-interface.ts +++ b/server/models/video-abuse-interface.ts | |||
@@ -1,9 +1,13 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | // Don't use barrel, import just what we need | ||
4 | import { VideoAbuse as FormatedVideoAbuse } from '../../shared/models/video-abuse.model' | ||
5 | |||
3 | export namespace VideoAbuseMethods { | 6 | export namespace VideoAbuseMethods { |
4 | export type toFormatedJSON = () => void | 7 | export type toFormatedJSON = () => FormatedVideoAbuse |
5 | 8 | ||
6 | export type ListForApi = (start, count, sort, callback) => void | 9 | export type ListForApiCallback = (err: Error, videoAbuseInstances?: VideoAbuseInstance[], total?: number) => void |
10 | export type ListForApi = (start: number, count: number, sort: string, callback: ListForApiCallback) => void | ||
7 | } | 11 | } |
8 | 12 | ||
9 | export interface VideoAbuseClass { | 13 | export interface VideoAbuseClass { |
@@ -15,7 +19,7 @@ export interface VideoAbuseAttributes { | |||
15 | reason: string | 19 | reason: string |
16 | } | 20 | } |
17 | 21 | ||
18 | export interface VideoAbuseInstance extends Sequelize.Instance<VideoAbuseAttributes> { | 22 | export interface VideoAbuseInstance extends VideoAbuseClass, VideoAbuseAttributes, Sequelize.Instance<VideoAbuseAttributes> { |
19 | id: number | 23 | id: number |
20 | createdAt: Date | 24 | createdAt: Date |
21 | updatedAt: Date | 25 | updatedAt: Date |
diff --git a/server/models/video-blacklist-interface.ts b/server/models/video-blacklist-interface.ts index ae2cd6748..974718192 100644 --- a/server/models/video-blacklist-interface.ts +++ b/server/models/video-blacklist-interface.ts | |||
@@ -1,13 +1,25 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | // Don't use barrel, import just what we need | ||
4 | import { BlacklistedVideo as FormatedBlacklistedVideo } from '../../shared/models/video-blacklist.model' | ||
5 | |||
3 | export namespace BlacklistedVideoMethods { | 6 | export namespace BlacklistedVideoMethods { |
4 | export type ToFormatedJSON = () => void | 7 | export type ToFormatedJSON = () => FormatedBlacklistedVideo |
8 | |||
9 | export type CountTotalCallback = (err: Error, total: number) => void | ||
10 | export type CountTotal = (callback: CountTotalCallback) => void | ||
11 | |||
12 | export type ListCallback = (err: Error, backlistedVideoInstances: BlacklistedVideoInstance[]) => void | ||
13 | export type List = (callback: ListCallback) => void | ||
14 | |||
15 | export type ListForApiCallback = (err: Error, blacklistedVIdeoInstances?: BlacklistedVideoInstance[], total?: number) => void | ||
16 | export type ListForApi = (start: number, count: number, sort: string, callback: ListForApiCallback) => void | ||
17 | |||
18 | export type LoadByIdCallback = (err: Error, blacklistedVideoInstance: BlacklistedVideoInstance) => void | ||
19 | export type LoadById = (id: number, callback: LoadByIdCallback) => void | ||
5 | 20 | ||
6 | export type CountTotal = (callback) => void | 21 | export type LoadByVideoIdCallback = (err: Error, blacklistedVideoInstance: BlacklistedVideoInstance) => void |
7 | export type List = (callback) => void | 22 | export type LoadByVideoId = (id: string, callback: LoadByVideoIdCallback) => void |
8 | export type ListForApi = (start, count, sort, callback) => void | ||
9 | export type LoadById = (id, callback) => void | ||
10 | export type LoadByVideoId = (id, callback) => void | ||
11 | } | 23 | } |
12 | 24 | ||
13 | export interface BlacklistedVideoClass { | 25 | export interface BlacklistedVideoClass { |
diff --git a/server/models/video-blacklist.ts b/server/models/video-blacklist.ts index fe72d5d46..f36756085 100644 --- a/server/models/video-blacklist.ts +++ b/server/models/video-blacklist.ts | |||
@@ -66,15 +66,15 @@ function associate (models) { | |||
66 | }) | 66 | }) |
67 | } | 67 | } |
68 | 68 | ||
69 | countTotal = function (callback) { | 69 | countTotal = function (callback: BlacklistedVideoMethods.CountTotalCallback) { |
70 | return BlacklistedVideo.count().asCallback(callback) | 70 | return BlacklistedVideo.count().asCallback(callback) |
71 | } | 71 | } |
72 | 72 | ||
73 | list = function (callback) { | 73 | list = function (callback: BlacklistedVideoMethods.ListCallback) { |
74 | return BlacklistedVideo.findAll().asCallback(callback) | 74 | return BlacklistedVideo.findAll().asCallback(callback) |
75 | } | 75 | } |
76 | 76 | ||
77 | listForApi = function (start, count, sort, callback) { | 77 | listForApi = function (start: number, count: number, sort: string, callback: BlacklistedVideoMethods.ListForApiCallback) { |
78 | const query = { | 78 | const query = { |
79 | offset: start, | 79 | offset: start, |
80 | limit: count, | 80 | limit: count, |
@@ -88,11 +88,11 @@ listForApi = function (start, count, sort, callback) { | |||
88 | }) | 88 | }) |
89 | } | 89 | } |
90 | 90 | ||
91 | loadById = function (id, callback) { | 91 | loadById = function (id: number, callback: BlacklistedVideoMethods.LoadByIdCallback) { |
92 | return BlacklistedVideo.findById(id).asCallback(callback) | 92 | return BlacklistedVideo.findById(id).asCallback(callback) |
93 | } | 93 | } |
94 | 94 | ||
95 | loadByVideoId = function (id, callback) { | 95 | loadByVideoId = function (id: string, callback: BlacklistedVideoMethods.LoadByIdCallback) { |
96 | const query = { | 96 | const query = { |
97 | where: { | 97 | where: { |
98 | videoId: id | 98 | videoId: id |
diff --git a/server/models/video-interface.ts b/server/models/video-interface.ts index b8dbeea35..7005f213c 100644 --- a/server/models/video-interface.ts +++ b/server/models/video-interface.ts | |||
@@ -1,28 +1,101 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | 2 | ||
3 | import { AuthorInstance } from './author-interface' | ||
4 | import { VideoTagInstance } from './video-tag-interface' | ||
5 | |||
6 | // Don't use barrel, import just what we need | ||
7 | import { Video as FormatedVideo } from '../../shared/models/video.model' | ||
8 | |||
9 | export type FormatedAddRemoteVideo = { | ||
10 | name: string | ||
11 | category: number | ||
12 | licence: number | ||
13 | language: number | ||
14 | nsfw: boolean | ||
15 | description: string | ||
16 | infoHash: string | ||
17 | remoteId: string | ||
18 | author: string | ||
19 | duration: number | ||
20 | thumbnailData: string | ||
21 | tags: string[] | ||
22 | createdAt: Date | ||
23 | updatedAt: Date | ||
24 | extname: string | ||
25 | views: number | ||
26 | likes: number | ||
27 | dislikes: number | ||
28 | } | ||
29 | |||
30 | export type FormatedUpdateRemoteVideo = { | ||
31 | name: string | ||
32 | category: number | ||
33 | licence: number | ||
34 | language: number | ||
35 | nsfw: boolean | ||
36 | description: string | ||
37 | infoHash: string | ||
38 | remoteId: string | ||
39 | author: string | ||
40 | duration: number | ||
41 | tags: string[] | ||
42 | createdAt: Date | ||
43 | updatedAt: Date | ||
44 | extname: string | ||
45 | views: number | ||
46 | likes: number | ||
47 | dislikes: number | ||
48 | } | ||
49 | |||
3 | export namespace VideoMethods { | 50 | export namespace VideoMethods { |
4 | export type GenerateMagnetUri = () => void | 51 | export type GenerateMagnetUri = () => string |
5 | export type GetVideoFilename = () => void | 52 | export type GetVideoFilename = () => string |
6 | export type GetThumbnailName = () => void | 53 | export type GetThumbnailName = () => string |
7 | export type GetPreviewName = () => void | 54 | export type GetPreviewName = () => string |
8 | export type GetTorrentName = () => void | 55 | export type GetTorrentName = () => string |
9 | export type IsOwned = () => void | 56 | export type IsOwned = () => boolean |
10 | export type ToFormatedJSON = () => void | 57 | export type ToFormatedJSON = () => FormatedVideo |
11 | export type ToAddRemoteJSON = (callback) => void | 58 | |
12 | export type ToUpdateRemoteJSON = (callback) => void | 59 | export type ToAddRemoteJSONCallback = (err: Error, videoFormated?: FormatedAddRemoteVideo) => void |
13 | export type TranscodeVideofile = (callback) => void | 60 | export type ToAddRemoteJSON = (callback: ToAddRemoteJSONCallback) => void |
14 | 61 | ||
15 | export type GenerateThumbnailFromData = (video, thumbnailData, callback) => void | 62 | export type ToUpdateRemoteJSON = () => FormatedUpdateRemoteVideo |
63 | |||
64 | export type TranscodeVideofileCallback = (err: Error) => void | ||
65 | export type TranscodeVideofile = (callback: TranscodeVideofileCallback) => void | ||
66 | |||
67 | export type GenerateThumbnailFromDataCallback = (err: Error, thumbnailName?: string) => void | ||
68 | export type GenerateThumbnailFromData = (video: VideoInstance, thumbnailData: string, callback: GenerateThumbnailFromDataCallback) => void | ||
69 | |||
70 | export type GetDurationFromFileCallback = (err: Error, duration?: number) => void | ||
16 | export type GetDurationFromFile = (videoPath, callback) => void | 71 | export type GetDurationFromFile = (videoPath, callback) => void |
17 | export type List = (callback) => void | 72 | |
18 | export type ListForApi = (start, count, sort, callback) => void | 73 | export type ListCallback = () => void |
19 | export type LoadByHostAndRemoteId = (fromHost, remoteId, callback) => void | 74 | export type List = (callback: ListCallback) => void |
20 | export type ListOwnedAndPopulateAuthorAndTags = (callback) => void | 75 | |
21 | export type ListOwnedByAuthor = (author, callback) => void | 76 | export type ListForApiCallback = (err: Error, videoInstances?: VideoInstance[], total?: number) => void |
22 | export type Load = (id, callback) => void | 77 | export type ListForApi = (start: number, count: number, sort: string, callback: ListForApiCallback) => void |
23 | export type LoadAndPopulateAuthor = (id, callback) => void | 78 | |
24 | export type LoadAndPopulateAuthorAndPodAndTags = (id, callback) => void | 79 | export type LoadByHostAndRemoteIdCallback = (err: Error, videoInstance: VideoInstance) => void |
25 | export type SearchAndPopulateAuthorAndPodAndTags = (value, field, start, count, sort, callback) => void | 80 | export type LoadByHostAndRemoteId = (fromHost: string, remoteId: string, callback: LoadByHostAndRemoteIdCallback) => void |
81 | |||
82 | export type ListOwnedAndPopulateAuthorAndTagsCallback = (err: Error, videoInstances: VideoInstance[]) => void | ||
83 | export type ListOwnedAndPopulateAuthorAndTags = (callback: ListOwnedAndPopulateAuthorAndTagsCallback) => void | ||
84 | |||
85 | export type ListOwnedByAuthorCallback = (err: Error, videoInstances: VideoInstance[]) => void | ||
86 | export type ListOwnedByAuthor = (author: string, callback: ListOwnedByAuthorCallback) => void | ||
87 | |||
88 | export type LoadCallback = (err: Error, videoInstance: VideoInstance) => void | ||
89 | export type Load = (id: string, callback: LoadCallback) => void | ||
90 | |||
91 | export type LoadAndPopulateAuthorCallback = (err: Error, videoInstance: VideoInstance) => void | ||
92 | export type LoadAndPopulateAuthor = (id: string, callback: LoadAndPopulateAuthorCallback) => void | ||
93 | |||
94 | export type LoadAndPopulateAuthorAndPodAndTagsCallback = (err: Error, videoInstance: VideoInstance) => void | ||
95 | export type LoadAndPopulateAuthorAndPodAndTags = (id: string, callback: LoadAndPopulateAuthorAndPodAndTagsCallback) => void | ||
96 | |||
97 | export type SearchAndPopulateAuthorAndPodAndTagsCallback = (err: Error, videoInstances?: VideoInstance[], total?: number) => void | ||
98 | export type SearchAndPopulateAuthorAndPodAndTags = (value: string, field: string, start: number, count: number, sort: string, callback: SearchAndPopulateAuthorAndPodAndTagsCallback) => void | ||
26 | } | 99 | } |
27 | 100 | ||
28 | export interface VideoClass { | 101 | export interface VideoClass { |
@@ -64,6 +137,9 @@ export interface VideoAttributes { | |||
64 | views?: number | 137 | views?: number |
65 | likes?: number | 138 | likes?: number |
66 | dislikes?: number | 139 | dislikes?: number |
140 | |||
141 | Author?: AuthorInstance | ||
142 | Tags?: VideoTagInstance[] | ||
67 | } | 143 | } |
68 | 144 | ||
69 | export interface VideoInstance extends VideoClass, VideoAttributes, Sequelize.Instance<VideoAttributes> { | 145 | export interface VideoInstance extends VideoClass, VideoAttributes, Sequelize.Instance<VideoAttributes> { |
diff --git a/server/models/video-tag-interface.ts b/server/models/video-tag-interface.ts index 468827b8c..f928cecff 100644 --- a/server/models/video-tag-interface.ts +++ b/server/models/video-tag-interface.ts | |||
@@ -9,7 +9,7 @@ export interface VideoTagClass { | |||
9 | export interface VideoTagAttributes { | 9 | export interface VideoTagAttributes { |
10 | } | 10 | } |
11 | 11 | ||
12 | export interface VideoTagInstance extends Sequelize.Instance<VideoTagAttributes> { | 12 | export interface VideoTagInstance extends VideoTagClass, VideoTagAttributes, Sequelize.Instance<VideoTagAttributes> { |
13 | id: number | 13 | id: number |
14 | createdAt: Date | 14 | createdAt: Date |
15 | updatedAt: Date | 15 | updatedAt: Date |
diff --git a/server/models/video.ts b/server/models/video.ts index 5558a7c3b..3f808b811 100644 --- a/server/models/video.ts +++ b/server/models/video.ts | |||
@@ -11,6 +11,7 @@ import { join } from 'path' | |||
11 | import * as Sequelize from 'sequelize' | 11 | import * as Sequelize from 'sequelize' |
12 | 12 | ||
13 | import { database as db } from '../initializers/database' | 13 | import { database as db } from '../initializers/database' |
14 | import { VideoTagInstance } from './video-tag-interface' | ||
14 | import { | 15 | import { |
15 | logger, | 16 | logger, |
16 | isVideoNameValid, | 17 | isVideoNameValid, |
@@ -266,7 +267,7 @@ export default function (sequelize, DataTypes) { | |||
266 | return Video | 267 | return Video |
267 | } | 268 | } |
268 | 269 | ||
269 | function beforeValidate (video, options) { | 270 | function beforeValidate (video: VideoInstance) { |
270 | // Put a fake infoHash if it does not exists yet | 271 | // Put a fake infoHash if it does not exists yet |
271 | if (video.isOwned() && !video.infoHash) { | 272 | if (video.isOwned() && !video.infoHash) { |
272 | // 40 hexa length | 273 | // 40 hexa length |
@@ -274,7 +275,7 @@ function beforeValidate (video, options) { | |||
274 | } | 275 | } |
275 | } | 276 | } |
276 | 277 | ||
277 | function beforeCreate (video, options) { | 278 | function beforeCreate (video: VideoInstance, options: { transaction: Sequelize.Transaction }) { |
278 | return new Promise(function (resolve, reject) { | 279 | return new Promise(function (resolve, reject) { |
279 | const tasks = [] | 280 | const tasks = [] |
280 | 281 | ||
@@ -318,7 +319,7 @@ function beforeCreate (video, options) { | |||
318 | }) | 319 | }) |
319 | } | 320 | } |
320 | 321 | ||
321 | function afterDestroy (video, options) { | 322 | function afterDestroy (video: VideoInstance) { |
322 | return new Promise(function (resolve, reject) { | 323 | return new Promise(function (resolve, reject) { |
323 | const tasks = [] | 324 | const tasks = [] |
324 | 325 | ||
@@ -401,7 +402,7 @@ generateMagnetUri = function () { | |||
401 | } | 402 | } |
402 | 403 | ||
403 | const xs = baseUrlHttp + STATIC_PATHS.TORRENTS + this.getTorrentName() | 404 | const xs = baseUrlHttp + STATIC_PATHS.TORRENTS + this.getTorrentName() |
404 | const announce = baseUrlWs + '/tracker/socket' | 405 | const announce = [ baseUrlWs + '/tracker/socket' ] |
405 | const urlList = [ baseUrlHttp + STATIC_PATHS.WEBSEED + this.getVideoFilename() ] | 406 | const urlList = [ baseUrlHttp + STATIC_PATHS.WEBSEED + this.getVideoFilename() ] |
406 | 407 | ||
407 | const magnetHash = { | 408 | const magnetHash = { |
@@ -496,7 +497,7 @@ toFormatedJSON = function () { | |||
496 | return json | 497 | return json |
497 | } | 498 | } |
498 | 499 | ||
499 | toAddRemoteJSON = function (callback) { | 500 | toAddRemoteJSON = function (callback: VideoMethods.ToAddRemoteJSONCallback) { |
500 | // Get thumbnail data to send to the other pod | 501 | // Get thumbnail data to send to the other pod |
501 | const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, this.getThumbnailName()) | 502 | const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, this.getThumbnailName()) |
502 | fs.readFile(thumbnailPath, (err, thumbnailData) => { | 503 | fs.readFile(thumbnailPath, (err, thumbnailData) => { |
@@ -517,7 +518,7 @@ toAddRemoteJSON = function (callback) { | |||
517 | author: this.Author.name, | 518 | author: this.Author.name, |
518 | duration: this.duration, | 519 | duration: this.duration, |
519 | thumbnailData: thumbnailData.toString('binary'), | 520 | thumbnailData: thumbnailData.toString('binary'), |
520 | tags: map(this.Tags, 'name'), | 521 | tags: map<VideoTagInstance, string>(this.Tags, 'name'), |
521 | createdAt: this.createdAt, | 522 | createdAt: this.createdAt, |
522 | updatedAt: this.updatedAt, | 523 | updatedAt: this.updatedAt, |
523 | extname: this.extname, | 524 | extname: this.extname, |
@@ -530,7 +531,7 @@ toAddRemoteJSON = function (callback) { | |||
530 | }) | 531 | }) |
531 | } | 532 | } |
532 | 533 | ||
533 | toUpdateRemoteJSON = function (callback) { | 534 | toUpdateRemoteJSON = function () { |
534 | const json = { | 535 | const json = { |
535 | name: this.name, | 536 | name: this.name, |
536 | category: this.category, | 537 | category: this.category, |
@@ -542,7 +543,7 @@ toUpdateRemoteJSON = function (callback) { | |||
542 | remoteId: this.id, | 543 | remoteId: this.id, |
543 | author: this.Author.name, | 544 | author: this.Author.name, |
544 | duration: this.duration, | 545 | duration: this.duration, |
545 | tags: map(this.Tags, 'name'), | 546 | tags: map<VideoTagInstance, string>(this.Tags, 'name'), |
546 | createdAt: this.createdAt, | 547 | createdAt: this.createdAt, |
547 | updatedAt: this.updatedAt, | 548 | updatedAt: this.updatedAt, |
548 | extname: this.extname, | 549 | extname: this.extname, |
@@ -554,7 +555,7 @@ toUpdateRemoteJSON = function (callback) { | |||
554 | return json | 555 | return json |
555 | } | 556 | } |
556 | 557 | ||
557 | transcodeVideofile = function (finalCallback) { | 558 | transcodeVideofile = function (finalCallback: VideoMethods.TranscodeVideofileCallback) { |
558 | const video = this | 559 | const video = this |
559 | 560 | ||
560 | const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR | 561 | const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR |
@@ -591,9 +592,9 @@ transcodeVideofile = function (finalCallback) { | |||
591 | video.save().asCallback(callback) | 592 | video.save().asCallback(callback) |
592 | } | 593 | } |
593 | 594 | ||
594 | ], function (err) { | 595 | ], function (err: Error) { |
595 | if (err) { | 596 | if (err) { |
596 | // Autodescruction... | 597 | // Autodesctruction... |
597 | video.destroy().asCallback(function (err) { | 598 | video.destroy().asCallback(function (err) { |
598 | if (err) logger.error('Cannot destruct video after transcoding failure.', { error: err }) | 599 | if (err) logger.error('Cannot destruct video after transcoding failure.', { error: err }) |
599 | }) | 600 | }) |
@@ -609,7 +610,7 @@ transcodeVideofile = function (finalCallback) { | |||
609 | 610 | ||
610 | // ------------------------------ STATICS ------------------------------ | 611 | // ------------------------------ STATICS ------------------------------ |
611 | 612 | ||
612 | generateThumbnailFromData = function (video, thumbnailData, callback) { | 613 | generateThumbnailFromData = function (video: VideoInstance, thumbnailData: string, callback: VideoMethods.GenerateThumbnailFromDataCallback) { |
613 | // Creating the thumbnail for a remote video | 614 | // Creating the thumbnail for a remote video |
614 | 615 | ||
615 | const thumbnailName = video.getThumbnailName() | 616 | const thumbnailName = video.getThumbnailName() |
@@ -621,7 +622,7 @@ generateThumbnailFromData = function (video, thumbnailData, callback) { | |||
621 | }) | 622 | }) |
622 | } | 623 | } |
623 | 624 | ||
624 | getDurationFromFile = function (videoPath, callback) { | 625 | getDurationFromFile = function (videoPath: string, callback: VideoMethods.GetDurationFromFileCallback) { |
625 | ffmpeg.ffprobe(videoPath, function (err, metadata) { | 626 | ffmpeg.ffprobe(videoPath, function (err, metadata) { |
626 | if (err) return callback(err) | 627 | if (err) return callback(err) |
627 | 628 | ||
@@ -629,11 +630,11 @@ getDurationFromFile = function (videoPath, callback) { | |||
629 | }) | 630 | }) |
630 | } | 631 | } |
631 | 632 | ||
632 | list = function (callback) { | 633 | list = function (callback: VideoMethods.ListCallback) { |
633 | return Video.findAll().asCallback(callback) | 634 | return Video.findAll().asCallback(callback) |
634 | } | 635 | } |
635 | 636 | ||
636 | listForApi = function (start, count, sort, callback) { | 637 | listForApi = function (start: number, count: number, sort: string, callback: VideoMethods.ListForApiCallback) { |
637 | // Exclude Blakclisted videos from the list | 638 | // Exclude Blakclisted videos from the list |
638 | const query = { | 639 | const query = { |
639 | distinct: true, | 640 | distinct: true, |
@@ -658,7 +659,7 @@ listForApi = function (start, count, sort, callback) { | |||
658 | }) | 659 | }) |
659 | } | 660 | } |
660 | 661 | ||
661 | loadByHostAndRemoteId = function (fromHost, remoteId, callback) { | 662 | loadByHostAndRemoteId = function (fromHost: string, remoteId: string, callback: VideoMethods.LoadByHostAndRemoteIdCallback) { |
662 | const query = { | 663 | const query = { |
663 | where: { | 664 | where: { |
664 | remoteId: remoteId | 665 | remoteId: remoteId |
@@ -682,7 +683,7 @@ loadByHostAndRemoteId = function (fromHost, remoteId, callback) { | |||
682 | return Video.findOne(query).asCallback(callback) | 683 | return Video.findOne(query).asCallback(callback) |
683 | } | 684 | } |
684 | 685 | ||
685 | listOwnedAndPopulateAuthorAndTags = function (callback) { | 686 | listOwnedAndPopulateAuthorAndTags = function (callback: VideoMethods.ListOwnedAndPopulateAuthorAndTagsCallback) { |
686 | // If remoteId is null this is *our* video | 687 | // If remoteId is null this is *our* video |
687 | const query = { | 688 | const query = { |
688 | where: { | 689 | where: { |
@@ -694,7 +695,7 @@ listOwnedAndPopulateAuthorAndTags = function (callback) { | |||
694 | return Video.findAll(query).asCallback(callback) | 695 | return Video.findAll(query).asCallback(callback) |
695 | } | 696 | } |
696 | 697 | ||
697 | listOwnedByAuthor = function (author, callback) { | 698 | listOwnedByAuthor = function (author: string, callback: VideoMethods.ListOwnedByAuthorCallback) { |
698 | const query = { | 699 | const query = { |
699 | where: { | 700 | where: { |
700 | remoteId: null | 701 | remoteId: null |
@@ -712,11 +713,11 @@ listOwnedByAuthor = function (author, callback) { | |||
712 | return Video.findAll(query).asCallback(callback) | 713 | return Video.findAll(query).asCallback(callback) |
713 | } | 714 | } |
714 | 715 | ||
715 | load = function (id, callback) { | 716 | load = function (id: string, callback: VideoMethods.LoadCallback) { |
716 | return Video.findById(id).asCallback(callback) | 717 | return Video.findById(id).asCallback(callback) |
717 | } | 718 | } |
718 | 719 | ||
719 | loadAndPopulateAuthor = function (id, callback) { | 720 | loadAndPopulateAuthor = function (id: string, callback: VideoMethods.LoadAndPopulateAuthorCallback) { |
720 | const options = { | 721 | const options = { |
721 | include: [ Video['sequelize'].models.Author ] | 722 | include: [ Video['sequelize'].models.Author ] |
722 | } | 723 | } |
@@ -724,7 +725,7 @@ loadAndPopulateAuthor = function (id, callback) { | |||
724 | return Video.findById(id, options).asCallback(callback) | 725 | return Video.findById(id, options).asCallback(callback) |
725 | } | 726 | } |
726 | 727 | ||
727 | loadAndPopulateAuthorAndPodAndTags = function (id, callback) { | 728 | loadAndPopulateAuthorAndPodAndTags = function (id: string, callback: VideoMethods.LoadAndPopulateAuthorAndPodAndTagsCallback) { |
728 | const options = { | 729 | const options = { |
729 | include: [ | 730 | include: [ |
730 | { | 731 | { |
@@ -738,7 +739,14 @@ loadAndPopulateAuthorAndPodAndTags = function (id, callback) { | |||
738 | return Video.findById(id, options).asCallback(callback) | 739 | return Video.findById(id, options).asCallback(callback) |
739 | } | 740 | } |
740 | 741 | ||
741 | searchAndPopulateAuthorAndPodAndTags = function (value, field, start, count, sort, callback) { | 742 | searchAndPopulateAuthorAndPodAndTags = function ( |
743 | value: string, | ||
744 | field: string, | ||
745 | start: number, | ||
746 | count: number, | ||
747 | sort: string, | ||
748 | callback: VideoMethods.SearchAndPopulateAuthorAndPodAndTagsCallback | ||
749 | ) { | ||
742 | const podInclude: any = { | 750 | const podInclude: any = { |
743 | model: Video['sequelize'].models.Pod, | 751 | model: Video['sequelize'].models.Pod, |
744 | required: false | 752 | required: false |
@@ -821,27 +829,27 @@ function createBaseVideosWhere () { | |||
821 | } | 829 | } |
822 | } | 830 | } |
823 | 831 | ||
824 | function removeThumbnail (video, callback) { | 832 | function removeThumbnail (video: VideoInstance, callback: (err: Error) => void) { |
825 | const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, video.getThumbnailName()) | 833 | const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, video.getThumbnailName()) |
826 | fs.unlink(thumbnailPath, callback) | 834 | fs.unlink(thumbnailPath, callback) |
827 | } | 835 | } |
828 | 836 | ||
829 | function removeFile (video, callback) { | 837 | function removeFile (video: VideoInstance, callback: (err: Error) => void) { |
830 | const filePath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename()) | 838 | const filePath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename()) |
831 | fs.unlink(filePath, callback) | 839 | fs.unlink(filePath, callback) |
832 | } | 840 | } |
833 | 841 | ||
834 | function removeTorrent (video, callback) { | 842 | function removeTorrent (video: VideoInstance, callback: (err: Error) => void) { |
835 | const torrenPath = join(CONFIG.STORAGE.TORRENTS_DIR, video.getTorrentName()) | 843 | const torrenPath = join(CONFIG.STORAGE.TORRENTS_DIR, video.getTorrentName()) |
836 | fs.unlink(torrenPath, callback) | 844 | fs.unlink(torrenPath, callback) |
837 | } | 845 | } |
838 | 846 | ||
839 | function removePreview (video, callback) { | 847 | function removePreview (video: VideoInstance, callback: (err: Error) => void) { |
840 | // Same name than video thumnail | 848 | // Same name than video thumnail |
841 | fs.unlink(CONFIG.STORAGE.PREVIEWS_DIR + video.getPreviewName(), callback) | 849 | fs.unlink(CONFIG.STORAGE.PREVIEWS_DIR + video.getPreviewName(), callback) |
842 | } | 850 | } |
843 | 851 | ||
844 | function createTorrentFromVideo (video, videoPath, callback) { | 852 | function createTorrentFromVideo (video: VideoInstance, videoPath: string, callback: (err: Error) => void) { |
845 | const options = { | 853 | const options = { |
846 | announceList: [ | 854 | announceList: [ |
847 | [ CONFIG.WEBSERVER.WS + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT + '/tracker/socket' ] | 855 | [ CONFIG.WEBSERVER.WS + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT + '/tracker/socket' ] |
@@ -865,24 +873,23 @@ function createTorrentFromVideo (video, videoPath, callback) { | |||
865 | }) | 873 | }) |
866 | } | 874 | } |
867 | 875 | ||
868 | function createPreview (video, videoPath, callback) { | 876 | function createPreview (video: VideoInstance, videoPath: string, callback: (err: Error) => void) { |
869 | generateImage(video, videoPath, CONFIG.STORAGE.PREVIEWS_DIR, video.getPreviewName(), callback) | 877 | generateImage(video, videoPath, CONFIG.STORAGE.PREVIEWS_DIR, video.getPreviewName(), null, callback) |
870 | } | 878 | } |
871 | 879 | ||
872 | function createThumbnail (video, videoPath, callback) { | 880 | function createThumbnail (video: VideoInstance, videoPath: string, callback: (err: Error) => void) { |
873 | generateImage(video, videoPath, CONFIG.STORAGE.THUMBNAILS_DIR, video.getThumbnailName(), THUMBNAILS_SIZE, callback) | 881 | generateImage(video, videoPath, CONFIG.STORAGE.THUMBNAILS_DIR, video.getThumbnailName(), THUMBNAILS_SIZE, callback) |
874 | } | 882 | } |
875 | 883 | ||
876 | function generateImage (video, videoPath, folder, imageName, size, callback?) { | 884 | type GenerateImageCallback = (err: Error, imageName: string) => void |
885 | function generateImage (video: VideoInstance, videoPath: string, folder: string, imageName: string, size: string, callback?: GenerateImageCallback) { | ||
877 | const options: any = { | 886 | const options: any = { |
878 | filename: imageName, | 887 | filename: imageName, |
879 | count: 1, | 888 | count: 1, |
880 | folder | 889 | folder |
881 | } | 890 | } |
882 | 891 | ||
883 | if (!callback) { | 892 | if (size) { |
884 | callback = size | ||
885 | } else { | ||
886 | options.size = size | 893 | options.size = size |
887 | } | 894 | } |
888 | 895 | ||
@@ -894,7 +901,7 @@ function generateImage (video, videoPath, folder, imageName, size, callback?) { | |||
894 | .thumbnail(options) | 901 | .thumbnail(options) |
895 | } | 902 | } |
896 | 903 | ||
897 | function removeFromBlacklist (video, callback) { | 904 | function removeFromBlacklist (video: VideoInstance, callback: (err: Error) => void) { |
898 | // Find the blacklisted video | 905 | // Find the blacklisted video |
899 | db.BlacklistedVideo.loadByVideoId(video.id, function (err, video) { | 906 | db.BlacklistedVideo.loadByVideoId(video.id, function (err, video) { |
900 | // If an error occured, stop here | 907 | // If an error occured, stop here |
@@ -908,7 +915,7 @@ function removeFromBlacklist (video, callback) { | |||
908 | video.destroy().asCallback(callback) | 915 | video.destroy().asCallback(callback) |
909 | } else { | 916 | } else { |
910 | // If haven't found it, simply ignore it and do nothing | 917 | // If haven't found it, simply ignore it and do nothing |
911 | return callback() | 918 | return callback(null) |
912 | } | 919 | } |
913 | }) | 920 | }) |
914 | } | 921 | } |