1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const change_case = require("change-case");
|
4 | const handlebars = require("handlebars");
|
5 | const TEMPLATE = `/**
|
6 | * Auto generated, do not modify!
|
7 | */
|
8 | /* eslint-disable */
|
9 | import Knex = require("knex");
|
10 | import { IDatabaseSchema } from "typescript-mysql-model/lib/mysql-database-definition";
|
11 | import { SchemaOperator } from "typescript-mysql-model";
|
12 | {{#each imports}}{{{this}}}
|
13 | {{/each}}
|
14 |
|
15 | export default class Updater extends SchemaOperator {
|
16 |
|
17 | public constructor(private knex: Knex, definition: IDatabaseSchema) {
|
18 | super();
|
19 | this.definition = definition;
|
20 | }
|
21 |
|
22 | protected async runQuery(q: Knex.QueryBuilder) {
|
23 | await q;
|
24 | }
|
25 |
|
26 | protected async update<T extends { [key: string]: any }>(tableName: string,
|
27 | data: T, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder): Promise<T> {
|
28 | const criterions: { [key: string]: any } = this.retainPrimaryKeys(tableName, data);
|
29 | data = this.removePrimaryKeys(tableName, data);
|
30 | if (Object.keys(data).length > 0) {
|
31 | let query = this.knex(tableName).where(criterions).update(data);
|
32 | if (fn) {
|
33 | query = fn(query);
|
34 | }
|
35 | await this.runQuery(query);
|
36 | }
|
37 | return data;
|
38 | }
|
39 | {{#each updaters}}{{{this}}}{{/each}}
|
40 | }`;
|
41 | const UPDATE_TEMPLATE = `
|
42 | public update{{fnName}}(item: {{prefixedClassName}}, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder): Promise<{{prefixedClassName}}> {
|
43 | return this.update("{{tableName}}", item, fn);
|
44 | }
|
45 | `;
|
46 | class UpdateBuilder {
|
47 | constructor() {
|
48 | this.compiledTemplate = handlebars.compile(TEMPLATE);
|
49 | this.compiledUpdateTemplate = handlebars.compile(UPDATE_TEMPLATE);
|
50 | }
|
51 | renderUpdater(tables, relativePath = "./") {
|
52 | tables = JSON.parse(JSON.stringify(tables));
|
53 | tables.forEach(t => {
|
54 | t.fnName = change_case.upperCaseFirst(t.fnName);
|
55 | t.fnPlural = change_case.upperCaseFirst(t.fnPlural);
|
56 | });
|
57 | const input = {
|
58 | updaters: tables.map(t => this.compiledUpdateTemplate(t)),
|
59 | imports: tables.map(t => this.renderImportRow(t, relativePath))
|
60 | };
|
61 | return this.compiledTemplate(input);
|
62 | }
|
63 | renderImportRow(table, relativePath) {
|
64 | table = JSON.parse(JSON.stringify(table));
|
65 | table.filename = table.filename.replace(".ts", "");
|
66 | return `import {${table.prefixedClassName}} from "${relativePath}${table.filename}"`;
|
67 | }
|
68 | }
|
69 | exports.UpdateBuilder = UpdateBuilder;
|
70 |
|
\ | No newline at end of file |