diff options
Diffstat (limited to 'server/models/shared/model-builder.ts')
-rw-r--r-- | server/models/shared/model-builder.ts | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/server/models/shared/model-builder.ts b/server/models/shared/model-builder.ts index c015ca4f5..07f7c4038 100644 --- a/server/models/shared/model-builder.ts +++ b/server/models/shared/model-builder.ts | |||
@@ -1,7 +1,24 @@ | |||
1 | import { isPlainObject } from 'lodash' | 1 | import { isPlainObject } from 'lodash' |
2 | import { Model as SequelizeModel, Sequelize } from 'sequelize' | 2 | import { Model as SequelizeModel, ModelStatic, Sequelize } from 'sequelize' |
3 | import { logger } from '@server/helpers/logger' | 3 | import { logger } from '@server/helpers/logger' |
4 | 4 | ||
5 | /** | ||
6 | * | ||
7 | * Build Sequelize models from sequelize raw query (that must use { nest: true } options) | ||
8 | * | ||
9 | * In order to sequelize to correctly build the JSON this class will ingest, | ||
10 | * the columns selected in the raw query should be in the following form: | ||
11 | * * All tables must be Pascal Cased (for example "VideoChannel") | ||
12 | * * Root table must end with `Model` (for example "VideoCommentModel") | ||
13 | * * Joined tables must contain the origin table name + '->JoinedTable'. For example: | ||
14 | * * "Actor" is joined to "Account": "Actor" table must be renamed "Account->Actor" | ||
15 | * * "Account->Actor" is joined to "Server": "Server" table must be renamed to "Account->Actor->Server" | ||
16 | * * Selected columns must be renamed to contain the JSON path: | ||
17 | * * "videoComment"."id": "VideoCommentModel"."id" | ||
18 | * * "Account"."Actor"."Server"."id": "Account.Actor.Server.id" | ||
19 | * * All tables must contain the row id | ||
20 | */ | ||
21 | |||
5 | export class ModelBuilder <T extends SequelizeModel> { | 22 | export class ModelBuilder <T extends SequelizeModel> { |
6 | private readonly modelRegistry = new Map<string, T>() | 23 | private readonly modelRegistry = new Map<string, T>() |
7 | 24 | ||
@@ -72,18 +89,18 @@ export class ModelBuilder <T extends SequelizeModel> { | |||
72 | 'Cannot build model %s that does not exist', this.buildSequelizeModelName(modelName), | 89 | 'Cannot build model %s that does not exist', this.buildSequelizeModelName(modelName), |
73 | { existing: this.sequelize.modelManager.all.map(m => m.name) } | 90 | { existing: this.sequelize.modelManager.all.map(m => m.name) } |
74 | ) | 91 | ) |
75 | return undefined | 92 | return { created: false, model: null } |
76 | } | 93 | } |
77 | 94 | ||
78 | // FIXME: typings | 95 | const model = Model.build(json, { raw: true, isNewRecord: false }) |
79 | const model = new (Model as any)(json) | 96 | |
80 | this.modelRegistry.set(registryKey, model) | 97 | this.modelRegistry.set(registryKey, model) |
81 | 98 | ||
82 | return { created: true, model } | 99 | return { created: true, model } |
83 | } | 100 | } |
84 | 101 | ||
85 | private findModelBuilder (modelName: string) { | 102 | private findModelBuilder (modelName: string) { |
86 | return this.sequelize.modelManager.getModel(this.buildSequelizeModelName(modelName)) | 103 | return this.sequelize.modelManager.getModel(this.buildSequelizeModelName(modelName)) as ModelStatic<T> |
87 | } | 104 | } |
88 | 105 | ||
89 | private buildSequelizeModelName (modelName: string) { | 106 | private buildSequelizeModelName (modelName: string) { |