refactor mapper-creator to its own file
This commit is contained in:
14
src/views/helpers.ts
Normal file
14
src/views/helpers.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
function uppercaseFirstLetter(input: string)
|
||||||
|
{
|
||||||
|
return input.charAt(0).toUpperCase() + input.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function lowercaseFirstLetter(input: string)
|
||||||
|
{
|
||||||
|
return input.charAt(0).toLowerCase() + input.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
uppercaseFirstLetter,
|
||||||
|
lowercaseFirstLetter
|
||||||
|
}
|
288
src/views/mapper-creator.ts
Normal file
288
src/views/mapper-creator.ts
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
import {ColumnRef, EndpointDef, Filter, JoinDef, Order} from "../systemGenService";
|
||||||
|
import pluralize from "pluralize";
|
||||||
|
import {uppercaseFirstLetter, lowercaseFirstLetter} from "./helpers";
|
||||||
|
|
||||||
|
function createMapperFunc(view: EndpointDef): string {
|
||||||
|
let func: string = '';
|
||||||
|
if (view.type === 'list' || view.type === 'count') {
|
||||||
|
func = buildGetList(view);
|
||||||
|
} else if (view.type === 'item') {
|
||||||
|
func = buildGetItem(view);
|
||||||
|
} else if (view.type === 'update') {
|
||||||
|
func = buildUpdateFunc(view);
|
||||||
|
} else if (view.type === 'create') {
|
||||||
|
func = buildCreateFunc(view);
|
||||||
|
} else if (view.type === 'delete') {
|
||||||
|
func = buildDeleteItem(view);
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildDeleteItem(view: EndpointDef): string {
|
||||||
|
let func: string = '';
|
||||||
|
let funcName = buildFunctionName(view);
|
||||||
|
let tables: string = `${view.table}`;
|
||||||
|
let filtersObj = buildFilters(view);
|
||||||
|
let filters: string = filtersObj.filters;
|
||||||
|
let requiredFilterValues: string = filtersObj.requiredFilterValues;
|
||||||
|
let optionalFilterParts = filtersObj.optionalFiltersCode;
|
||||||
|
let query: string = `DELETE FROM ${tables}${filters}`;
|
||||||
|
let funcParams = 'params: {[key: string]: string}';
|
||||||
|
|
||||||
|
func = `
|
||||||
|
public ${funcName}(${funcParams}) {
|
||||||
|
|
||||||
|
let query: string = '${query}';
|
||||||
|
let queryValues: string[] = [${requiredFilterValues}];
|
||||||
|
|
||||||
|
// optional params?
|
||||||
|
${optionalFilterParts}
|
||||||
|
return super.runQuery(query, [...queryValues]);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildGetItem(view: EndpointDef): string {
|
||||||
|
let func: string = '';
|
||||||
|
let funcName = buildFunctionName(view);
|
||||||
|
let columns: string = `${view.component}.${view.component}_id, ${view.columns.map(c => `${c.table}.${c.name}`).join(', ')}`;
|
||||||
|
let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`;
|
||||||
|
let filtersObj = buildFilters(view);
|
||||||
|
let filters: string = filtersObj.filters;
|
||||||
|
let requiredFilterValues: string = filtersObj.requiredFilterValues;
|
||||||
|
let optionalFilterParts = filtersObj.optionalFiltersCode;
|
||||||
|
let query: string = `SELECT ${columns} FROM ${tables}${filters} LIMIT 1`;
|
||||||
|
let funcParams = 'params: {[key: string]: string}';
|
||||||
|
|
||||||
|
func = `
|
||||||
|
public ${funcName}(${funcParams}) {
|
||||||
|
|
||||||
|
let query: string = '${query}';
|
||||||
|
let queryValues: string[] = [${requiredFilterValues}];
|
||||||
|
|
||||||
|
// optional params?
|
||||||
|
${optionalFilterParts}
|
||||||
|
return super.runQuery(query, [...queryValues]);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCreateFunc(view: EndpointDef): string {
|
||||||
|
let func: string = '';
|
||||||
|
let query: string = `INSERT INTO ${view.table} SET `;
|
||||||
|
func = getCreateOrUpdateFunc(query, view);
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildUpdateFunc(view: EndpointDef): string {
|
||||||
|
let func: string = '';
|
||||||
|
let query: string = `UPDATE ${view.table} SET `;
|
||||||
|
func = getCreateOrUpdateFunc(query, view);
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCreateOrUpdateFunc(query: string, view: EndpointDef): string {
|
||||||
|
let func: string = '';
|
||||||
|
let funcName = buildFunctionName(view);
|
||||||
|
let requiredQueryValues: string = '';
|
||||||
|
let optionalValuesCode: string = '';
|
||||||
|
for (let i in view.columns) {
|
||||||
|
let c: ColumnRef = view.columns[i];
|
||||||
|
if (c.required) {
|
||||||
|
if (!query.endsWith('SET ')) {
|
||||||
|
query = query + `, `;
|
||||||
|
}
|
||||||
|
query = query + `${c.table}.${c.name} = ?`;
|
||||||
|
if (requiredQueryValues.length) {
|
||||||
|
requiredQueryValues = requiredQueryValues + `, `;
|
||||||
|
}
|
||||||
|
requiredQueryValues = requiredQueryValues + `params.${c.param}`;
|
||||||
|
} else {
|
||||||
|
optionalValuesCode = optionalValuesCode + `
|
||||||
|
if (params.${c.param}) {
|
||||||
|
query = query + ', ${c.table}.${c.name} = ?';
|
||||||
|
queryValues.push(params.${c.param});
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func = `
|
||||||
|
public ${funcName}(params: {[key: string]: string}) {
|
||||||
|
|
||||||
|
let query: string = '${query}';
|
||||||
|
let queryValues: string[] = [${requiredQueryValues}];
|
||||||
|
|
||||||
|
// optional params?
|
||||||
|
${optionalValuesCode}
|
||||||
|
return super.runQuery(query, [...queryValues]);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildGetList(view: EndpointDef): string {
|
||||||
|
// TODO: optionally allow a raw query definition with predefined params
|
||||||
|
// This would be so much simpler and easy if it were just the queries wanted
|
||||||
|
let func: string = '';
|
||||||
|
let funcName: string = '';
|
||||||
|
let columns: string = view.type === 'count' ? `count(*)` : `${view.component}.${view.component}_id, ${view.columns.map(c => `${c.table}.${c.name}`).join(', ')}`;
|
||||||
|
let query: string = '';
|
||||||
|
let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`;
|
||||||
|
let filters: string = '';
|
||||||
|
funcName = buildFunctionName(view);
|
||||||
|
|
||||||
|
let requiredFilterStrings = [];
|
||||||
|
let requiredQueryValues = '';
|
||||||
|
let optionalFilterParts = '';
|
||||||
|
if (view.filters) {
|
||||||
|
for (let i in view.filters) {
|
||||||
|
let f: Filter = view.filters[i];
|
||||||
|
if (f.required) {
|
||||||
|
requiredFilterStrings.push(`${f.column.table}.${f.column.name} ${f.comparison} ?`); // e.g. 'table.id = ?'
|
||||||
|
if (requiredQueryValues.length) {
|
||||||
|
requiredQueryValues = requiredQueryValues + `, `;
|
||||||
|
}
|
||||||
|
requiredQueryValues = requiredQueryValues + `params.${f.param}`;
|
||||||
|
} else {
|
||||||
|
/* e.g.
|
||||||
|
if (eventLog.app) {
|
||||||
|
query = query + ', app = ?';
|
||||||
|
queryValues.push(eventLog.app);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
optionalFilterParts = optionalFilterParts + `
|
||||||
|
if (params.${f.param}) {
|
||||||
|
query = query + ' AND ${f.column.table}.${f.column.name} ${f.comparison} ?';
|
||||||
|
queryValues.push(params.${f.param});
|
||||||
|
}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filters = ` WHERE ${requiredFilterStrings.join(' AND ')}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = `SELECT ${columns} FROM ${tables}${filters}`;
|
||||||
|
let orderByCode = '';
|
||||||
|
if (view.orderBy) {
|
||||||
|
orderByCode = `
|
||||||
|
query = query + '${buildOrderBy(view)}';
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
let funcParams = 'params: {[key: string]: string}, offset: number, limit: number';
|
||||||
|
let limitOrderCode = `query = query + ' LIMIT ?, ?';
|
||||||
|
queryValues.push(offset.toString(10));
|
||||||
|
queryValues.push(limit.toString(10));
|
||||||
|
${orderByCode}`;
|
||||||
|
if (view.type === 'count') {
|
||||||
|
funcParams = 'params: {[key: string]: string}';
|
||||||
|
limitOrderCode = ``;
|
||||||
|
}
|
||||||
|
|
||||||
|
func = `
|
||||||
|
public ${funcName}(${funcParams}) {
|
||||||
|
|
||||||
|
let query: string = '${query}';
|
||||||
|
let queryValues: string[] = [${requiredQueryValues}];
|
||||||
|
|
||||||
|
// optional params?
|
||||||
|
${optionalFilterParts}
|
||||||
|
${limitOrderCode}
|
||||||
|
return super.runQuery(query, [...queryValues]);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildFilters(view: EndpointDef): {filters: string, requiredFilterValues: string, optionalFiltersCode: string} {
|
||||||
|
let filtersObj: {filters: string, requiredFilterValues: string, optionalFiltersCode: string} = {
|
||||||
|
filters: '',
|
||||||
|
requiredFilterValues: '',
|
||||||
|
optionalFiltersCode: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
let filters: string = '';
|
||||||
|
let requiredFilterStrings = [];
|
||||||
|
let requiredQueryValues = '';
|
||||||
|
let optionalFilterParts = '';
|
||||||
|
if (view.filters) {
|
||||||
|
for (let i in view.filters) {
|
||||||
|
let f: Filter = view.filters[i];
|
||||||
|
if (f.required) {
|
||||||
|
requiredFilterStrings.push(`${f.column.table}.${f.column.name} ${f.comparison} ?`); // e.g. 'table.id = ?'
|
||||||
|
if (requiredQueryValues.length) {
|
||||||
|
requiredQueryValues = requiredQueryValues + `, `;
|
||||||
|
}
|
||||||
|
requiredQueryValues = requiredQueryValues + `params.${f.param}`;
|
||||||
|
} else {
|
||||||
|
/* e.g.
|
||||||
|
if (eventLog.app) {
|
||||||
|
query = query + ', app = ?';
|
||||||
|
queryValues.push(eventLog.app);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
optionalFilterParts = optionalFilterParts + `
|
||||||
|
if (params.${f.param}) {
|
||||||
|
query = query + ' AND ${f.column.table}.${f.column.name} ${f.comparison} ?';
|
||||||
|
queryValues.push(params.${f.param});
|
||||||
|
}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filters = ` WHERE ${requiredFilterStrings.join(' AND ')}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
filtersObj.filters = filters;
|
||||||
|
filtersObj.requiredFilterValues = requiredQueryValues;
|
||||||
|
filtersObj.optionalFiltersCode = optionalFilterParts;
|
||||||
|
return filtersObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildJoin(view: EndpointDef): string {
|
||||||
|
if (view.join?.length) {
|
||||||
|
let join = `${view.table}`;
|
||||||
|
for (let i in view.join) {
|
||||||
|
let j: JoinDef = view.join[i];
|
||||||
|
join = join + ` JOIN ${j.table} ON ${j.on.left.table}.${j.on.left.name} = ${j.on.right.table}.${j.on.right.name}`;
|
||||||
|
}
|
||||||
|
return join;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildOrderBy(view: EndpointDef): string {
|
||||||
|
let orderBy: string = '';
|
||||||
|
if (view.orderBy?.length) {
|
||||||
|
orderBy = orderBy + ' ORDER BY ';
|
||||||
|
for (let i in view.orderBy) {
|
||||||
|
let order: Order = view.orderBy[i];
|
||||||
|
if (parseInt(i) !== 0) {
|
||||||
|
orderBy = orderBy + ', ';
|
||||||
|
}
|
||||||
|
orderBy = orderBy + `${order.column.table}.${order.column.name} ${order.direction}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return orderBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildFunctionName(view: EndpointDef): string {
|
||||||
|
let selector: {[type: string]: (view: EndpointDef) => string} = {
|
||||||
|
'list': (view: EndpointDef) => `get${pluralize(uppercaseFirstLetter(view.component))}` + (view.type === 'count' ? 'Count' : ''),
|
||||||
|
'count': (view: EndpointDef) => `get${pluralize(uppercaseFirstLetter(view.component))}` + (view.type === 'count' ? 'Count' : ''),
|
||||||
|
'item': (view: EndpointDef) => `get${uppercaseFirstLetter(view.component)}`,
|
||||||
|
'update': (view: EndpointDef) => `update${uppercaseFirstLetter(view.component)}`,
|
||||||
|
'create': (view: EndpointDef) => `create${uppercaseFirstLetter(view.component)}`,
|
||||||
|
'delete': (view: EndpointDef) => `delete${uppercaseFirstLetter(view.component)}`,
|
||||||
|
'search': (view: EndpointDef) => `search${uppercaseFirstLetter(view.component)}`,
|
||||||
|
};
|
||||||
|
return selector[view.type](view);
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
createMapperFunc
|
||||||
|
}
|
@ -1,15 +1,12 @@
|
|||||||
import {
|
import {
|
||||||
ColumnRef,
|
|
||||||
ComponentDef,
|
ComponentDef,
|
||||||
EndpointDef,
|
EndpointDef,
|
||||||
Filter,
|
|
||||||
JoinDef,
|
|
||||||
Order,
|
|
||||||
SystemDef,
|
SystemDef,
|
||||||
} from '../systemGenService';
|
} from '../systemGenService';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import pluralize from 'pluralize';
|
import {createMapperFunc} from "./mapper-creator";
|
||||||
|
import {uppercaseFirstLetter, lowercaseFirstLetter} from "./helpers";
|
||||||
|
|
||||||
const ncp = require('ncp').ncp;
|
const ncp = require('ncp').ncp;
|
||||||
|
|
||||||
@ -102,294 +99,3 @@ function insertMapperCode(view: EndpointDef, outDir: string): Promise<void> {
|
|||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function createMapperFunc(view: EndpointDef): string {
|
|
||||||
let func: string = '';
|
|
||||||
if (view.type === 'list' || view.type === 'count') {
|
|
||||||
func = buildGetList(view);
|
|
||||||
} else if (view.type === 'item') {
|
|
||||||
func = buildGetItem(view);
|
|
||||||
} else if (view.type === 'update') {
|
|
||||||
func = buildUpdateFunc(view);
|
|
||||||
} else if (view.type === 'create') {
|
|
||||||
func = buildCreateFunc(view);
|
|
||||||
} else if (view.type === 'delete') {
|
|
||||||
func = buildDeleteItem(view);
|
|
||||||
}
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildDeleteItem(view: EndpointDef): string {
|
|
||||||
let func: string = '';
|
|
||||||
let funcName = buildFunctionName(view);
|
|
||||||
let tables: string = `${view.table}`;
|
|
||||||
let filtersObj = buildFilters(view);
|
|
||||||
let filters: string = filtersObj.filters;
|
|
||||||
let requiredFilterValues: string = filtersObj.requiredFilterValues;
|
|
||||||
let optionalFilterParts = filtersObj.optionalFiltersCode;
|
|
||||||
let query: string = `DELETE FROM ${tables}${filters}`;
|
|
||||||
let funcParams = 'params: {[key: string]: string}';
|
|
||||||
|
|
||||||
func = `
|
|
||||||
public ${funcName}(${funcParams}) {
|
|
||||||
|
|
||||||
let query: string = '${query}';
|
|
||||||
let queryValues: string[] = [${requiredFilterValues}];
|
|
||||||
|
|
||||||
// optional params?
|
|
||||||
${optionalFilterParts}
|
|
||||||
return super.runQuery(query, [...queryValues]);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildGetItem(view: EndpointDef): string {
|
|
||||||
let func: string = '';
|
|
||||||
let funcName = buildFunctionName(view);
|
|
||||||
let columns: string = `${view.component}.${view.component}_id, ${view.columns.map(c => `${c.table}.${c.name}`).join(', ')}`;
|
|
||||||
let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`;
|
|
||||||
let filtersObj = buildFilters(view);
|
|
||||||
let filters: string = filtersObj.filters;
|
|
||||||
let requiredFilterValues: string = filtersObj.requiredFilterValues;
|
|
||||||
let optionalFilterParts = filtersObj.optionalFiltersCode;
|
|
||||||
let query: string = `SELECT ${columns} FROM ${tables}${filters} LIMIT 1`;
|
|
||||||
let funcParams = 'params: {[key: string]: string}';
|
|
||||||
|
|
||||||
func = `
|
|
||||||
public ${funcName}(${funcParams}) {
|
|
||||||
|
|
||||||
let query: string = '${query}';
|
|
||||||
let queryValues: string[] = [${requiredFilterValues}];
|
|
||||||
|
|
||||||
// optional params?
|
|
||||||
${optionalFilterParts}
|
|
||||||
return super.runQuery(query, [...queryValues]);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildCreateFunc(view: EndpointDef): string {
|
|
||||||
let func: string = '';
|
|
||||||
let query: string = `INSERT INTO ${view.table} SET `;
|
|
||||||
func = getCreateOrUpdateFunc(query, view);
|
|
||||||
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildUpdateFunc(view: EndpointDef): string {
|
|
||||||
let func: string = '';
|
|
||||||
let query: string = `UPDATE ${view.table} SET `;
|
|
||||||
func = getCreateOrUpdateFunc(query, view);
|
|
||||||
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCreateOrUpdateFunc(query: string, view: EndpointDef): string {
|
|
||||||
let func: string = '';
|
|
||||||
let funcName = buildFunctionName(view);
|
|
||||||
let requiredQueryValues: string = '';
|
|
||||||
let optionalValuesCode: string = '';
|
|
||||||
for (let i in view.columns) {
|
|
||||||
let c: ColumnRef = view.columns[i];
|
|
||||||
if (c.required) {
|
|
||||||
if (!query.endsWith('SET ')) {
|
|
||||||
query = query + `, `;
|
|
||||||
}
|
|
||||||
query = query + `${c.table}.${c.name} = ?`;
|
|
||||||
if (requiredQueryValues.length) {
|
|
||||||
requiredQueryValues = requiredQueryValues + `, `;
|
|
||||||
}
|
|
||||||
requiredQueryValues = requiredQueryValues + `params.${c.param}`;
|
|
||||||
} else {
|
|
||||||
optionalValuesCode = optionalValuesCode + `
|
|
||||||
if (params.${c.param}) {
|
|
||||||
query = query + ', ${c.table}.${c.name} = ?';
|
|
||||||
queryValues.push(params.${c.param});
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func = `
|
|
||||||
public ${funcName}(params: {[key: string]: string}) {
|
|
||||||
|
|
||||||
let query: string = '${query}';
|
|
||||||
let queryValues: string[] = [${requiredQueryValues}];
|
|
||||||
|
|
||||||
// optional params?
|
|
||||||
${optionalValuesCode}
|
|
||||||
return super.runQuery(query, [...queryValues]);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildGetList(view: EndpointDef): string {
|
|
||||||
// TODO: optionally allow a raw query definition with predefined params
|
|
||||||
// This would be so much simpler and easy if it were just the queries wanted
|
|
||||||
let func: string = '';
|
|
||||||
let funcName: string = '';
|
|
||||||
let columns: string = view.type === 'count' ? `count(*)` : `${view.component}.${view.component}_id, ${view.columns.map(c => `${c.table}.${c.name}`).join(', ')}`;
|
|
||||||
let query: string = '';
|
|
||||||
let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`;
|
|
||||||
let filters: string = '';
|
|
||||||
funcName = buildFunctionName(view);
|
|
||||||
|
|
||||||
let requiredFilterStrings = [];
|
|
||||||
let requiredQueryValues = '';
|
|
||||||
let optionalFilterParts = '';
|
|
||||||
if (view.filters) {
|
|
||||||
for (let i in view.filters) {
|
|
||||||
let f: Filter = view.filters[i];
|
|
||||||
if (f.required) {
|
|
||||||
requiredFilterStrings.push(`${f.column.table}.${f.column.name} ${f.comparison} ?`); // e.g. 'table.id = ?'
|
|
||||||
if (requiredQueryValues.length) {
|
|
||||||
requiredQueryValues = requiredQueryValues + `, `;
|
|
||||||
}
|
|
||||||
requiredQueryValues = requiredQueryValues + `params.${f.param}`;
|
|
||||||
} else {
|
|
||||||
/* e.g.
|
|
||||||
if (eventLog.app) {
|
|
||||||
query = query + ', app = ?';
|
|
||||||
queryValues.push(eventLog.app);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
optionalFilterParts = optionalFilterParts + `
|
|
||||||
if (params.${f.param}) {
|
|
||||||
query = query + ' AND ${f.column.table}.${f.column.name} ${f.comparison} ?';
|
|
||||||
queryValues.push(params.${f.param});
|
|
||||||
}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
filters = ` WHERE ${requiredFilterStrings.join(' AND ')}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
query = `SELECT ${columns} FROM ${tables}${filters}`;
|
|
||||||
let orderByCode = '';
|
|
||||||
if (view.orderBy) {
|
|
||||||
orderByCode = `
|
|
||||||
query = query + '${buildOrderBy(view)}';
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
let funcParams = 'params: {[key: string]: string}, offset: number, limit: number';
|
|
||||||
let limitOrderCode = `query = query + ' LIMIT ?, ?';
|
|
||||||
queryValues.push(offset.toString(10));
|
|
||||||
queryValues.push(limit.toString(10));
|
|
||||||
${orderByCode}`;
|
|
||||||
if (view.type === 'count') {
|
|
||||||
funcParams = 'params: {[key: string]: string}';
|
|
||||||
limitOrderCode = ``;
|
|
||||||
}
|
|
||||||
|
|
||||||
func = `
|
|
||||||
public ${funcName}(${funcParams}) {
|
|
||||||
|
|
||||||
let query: string = '${query}';
|
|
||||||
let queryValues: string[] = [${requiredQueryValues}];
|
|
||||||
|
|
||||||
// optional params?
|
|
||||||
${optionalFilterParts}
|
|
||||||
${limitOrderCode}
|
|
||||||
return super.runQuery(query, [...queryValues]);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildFilters(view: EndpointDef): {filters: string, requiredFilterValues: string, optionalFiltersCode: string} {
|
|
||||||
let filtersObj: {filters: string, requiredFilterValues: string, optionalFiltersCode: string} = {
|
|
||||||
filters: '',
|
|
||||||
requiredFilterValues: '',
|
|
||||||
optionalFiltersCode: ''
|
|
||||||
};
|
|
||||||
|
|
||||||
let filters: string = '';
|
|
||||||
let requiredFilterStrings = [];
|
|
||||||
let requiredQueryValues = '';
|
|
||||||
let optionalFilterParts = '';
|
|
||||||
if (view.filters) {
|
|
||||||
for (let i in view.filters) {
|
|
||||||
let f: Filter = view.filters[i];
|
|
||||||
if (f.required) {
|
|
||||||
requiredFilterStrings.push(`${f.column.table}.${f.column.name} ${f.comparison} ?`); // e.g. 'table.id = ?'
|
|
||||||
if (requiredQueryValues.length) {
|
|
||||||
requiredQueryValues = requiredQueryValues + `, `;
|
|
||||||
}
|
|
||||||
requiredQueryValues = requiredQueryValues + `params.${f.param}`;
|
|
||||||
} else {
|
|
||||||
/* e.g.
|
|
||||||
if (eventLog.app) {
|
|
||||||
query = query + ', app = ?';
|
|
||||||
queryValues.push(eventLog.app);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
optionalFilterParts = optionalFilterParts + `
|
|
||||||
if (params.${f.param}) {
|
|
||||||
query = query + ' AND ${f.column.table}.${f.column.name} ${f.comparison} ?';
|
|
||||||
queryValues.push(params.${f.param});
|
|
||||||
}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
filters = ` WHERE ${requiredFilterStrings.join(' AND ')}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
filtersObj.filters = filters;
|
|
||||||
filtersObj.requiredFilterValues = requiredQueryValues;
|
|
||||||
filtersObj.optionalFiltersCode = optionalFilterParts;
|
|
||||||
return filtersObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildJoin(view: EndpointDef): string {
|
|
||||||
if (view.join?.length) {
|
|
||||||
let join = `${view.table}`;
|
|
||||||
for (let i in view.join) {
|
|
||||||
let j: JoinDef = view.join[i];
|
|
||||||
join = join + ` JOIN ${j.table} ON ${j.on.left.table}.${j.on.left.name} = ${j.on.right.table}.${j.on.right.name}`;
|
|
||||||
}
|
|
||||||
return join;
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildOrderBy(view: EndpointDef): string {
|
|
||||||
let orderBy: string = '';
|
|
||||||
if (view.orderBy?.length) {
|
|
||||||
orderBy = orderBy + ' ORDER BY ';
|
|
||||||
for (let i in view.orderBy) {
|
|
||||||
let order: Order = view.orderBy[i];
|
|
||||||
if (parseInt(i) !== 0) {
|
|
||||||
orderBy = orderBy + ', ';
|
|
||||||
}
|
|
||||||
orderBy = orderBy + `${order.column.table}.${order.column.name} ${order.direction}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return orderBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
function uppercaseFirstLetter(input: string)
|
|
||||||
{
|
|
||||||
return input.charAt(0).toUpperCase() + input.slice(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function lowercaseFirstLetter(input: string)
|
|
||||||
{
|
|
||||||
return input.charAt(0).toLowerCase() + input.slice(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildFunctionName(view: EndpointDef): string {
|
|
||||||
let selector: {[type: string]: (view: EndpointDef) => string} = {
|
|
||||||
'list': (view: EndpointDef) => `get${pluralize(uppercaseFirstLetter(view.component))}` + (view.type === 'count' ? 'Count' : ''),
|
|
||||||
'count': (view: EndpointDef) => `get${pluralize(uppercaseFirstLetter(view.component))}` + (view.type === 'count' ? 'Count' : ''),
|
|
||||||
'item': (view: EndpointDef) => `get${uppercaseFirstLetter(view.component)}`,
|
|
||||||
'update': (view: EndpointDef) => `update${uppercaseFirstLetter(view.component)}`,
|
|
||||||
'create': (view: EndpointDef) => `create${uppercaseFirstLetter(view.component)}`,
|
|
||||||
'delete': (view: EndpointDef) => `delete${uppercaseFirstLetter(view.component)}`,
|
|
||||||
'search': (view: EndpointDef) => `search${uppercaseFirstLetter(view.component)}`,
|
|
||||||
};
|
|
||||||
return selector[view.type](view);
|
|
||||||
}
|
|
Reference in New Issue
Block a user