add more crud operations to the mapper files
This commit is contained in:
@ -50,7 +50,7 @@ interface ComponentDef {
|
|||||||
interface EndpointDef {
|
interface EndpointDef {
|
||||||
component: string;
|
component: string;
|
||||||
table: string;
|
table: string;
|
||||||
type: ('list' | 'count' | 'item' | 'distinct' | 'update' | 'create' | 'delete');
|
type: ('list' | 'count' | 'item' | 'distinct' | 'update' | 'create' | 'delete' | 'search');
|
||||||
columns: ColumnRef[];
|
columns: ColumnRef[];
|
||||||
values?: ValueDef[];
|
values?: ValueDef[];
|
||||||
join?: JoinDef[];
|
join?: JoinDef[];
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
import {
|
import {
|
||||||
BelongsToDef,
|
|
||||||
ColumnDef,
|
|
||||||
ColumnRef,
|
ColumnRef,
|
||||||
ComponentDef,
|
ComponentDef,
|
||||||
EndpointDef,
|
EndpointDef,
|
||||||
@ -8,7 +6,6 @@ import {
|
|||||||
JoinDef,
|
JoinDef,
|
||||||
Order,
|
Order,
|
||||||
SystemDef,
|
SystemDef,
|
||||||
TableDef
|
|
||||||
} from '../systemGenService';
|
} from '../systemGenService';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
@ -99,7 +96,6 @@ function insertMapperCode(view: EndpointDef, outDir: string): Promise<void> {
|
|||||||
let fileLocation = path.join(process.cwd(), outDir, 'src', 'components', view.component, `${view.component}Mapper.ts`);
|
let fileLocation = path.join(process.cwd(), outDir, 'src', 'components', view.component, `${view.component}Mapper.ts`);
|
||||||
let initMapperFile: string = fs.readFileSync(fileLocation, 'utf8');
|
let initMapperFile: string = fs.readFileSync(fileLocation, 'utf8');
|
||||||
let parts = initMapperFile.split(separator);
|
let parts = initMapperFile.split(separator);
|
||||||
// TODO: add mapper code here
|
|
||||||
parts[0] = parts[0] + createMapperFunc(view);
|
parts[0] = parts[0] + createMapperFunc(view);
|
||||||
let newMapperFile = parts.join(separator);
|
let newMapperFile = parts.join(separator);
|
||||||
fs.writeFileSync(fileLocation, newMapperFile, 'utf8');
|
fs.writeFileSync(fileLocation, newMapperFile, 'utf8');
|
||||||
@ -109,25 +105,92 @@ function insertMapperCode(view: EndpointDef, outDir: string): Promise<void> {
|
|||||||
|
|
||||||
function createMapperFunc(view: EndpointDef): string {
|
function createMapperFunc(view: EndpointDef): string {
|
||||||
let func: string = '';
|
let func: string = '';
|
||||||
let funcName: string = '';
|
|
||||||
if (view.type === 'list' || view.type === 'count') {
|
if (view.type === 'list' || view.type === 'count') {
|
||||||
func = buildGetList(view);
|
func = buildGetList(view);
|
||||||
} else if (view.type === 'item') {
|
} else if (view.type === 'item') {
|
||||||
funcName = buildFunctionName(view);
|
func = buildGetItem(view);
|
||||||
} else if (view.type === 'update') {
|
} else if (view.type === 'update') {
|
||||||
funcName = buildFunctionName(view);
|
func = buildUpdateFunc(view);
|
||||||
} else if (view.type === 'create') {
|
} else if (view.type === 'create') {
|
||||||
func = buildCreateFunc(view);
|
func = buildCreateFunc(view);
|
||||||
} else if (view.type === 'delete') {
|
} else if (view.type === 'delete') {
|
||||||
funcName = buildFunctionName(view);
|
func = buildDeleteItem(view);
|
||||||
}
|
}
|
||||||
return func;
|
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 {
|
function buildCreateFunc(view: EndpointDef): string {
|
||||||
let func: string = '';
|
let func: string = '';
|
||||||
let funcName = buildFunctionName(view);
|
|
||||||
let query: string = `INSERT INTO ${view.table} SET `;
|
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 requiredQueryValues: string = '';
|
||||||
let optionalValuesCode: string = '';
|
let optionalValuesCode: string = '';
|
||||||
for (let i in view.columns) {
|
for (let i in view.columns) {
|
||||||
@ -172,7 +235,6 @@ function buildGetList(view: EndpointDef): string {
|
|||||||
let func: string = '';
|
let func: string = '';
|
||||||
let funcName: 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 columns: string = view.type === 'count' ? `count(*)` : `${view.component}.${view.component}_id, ${view.columns.map(c => `${c.table}.${c.name}`).join(', ')}`;
|
||||||
let queryValues: string = '';
|
|
||||||
let query: string = '';
|
let query: string = '';
|
||||||
let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`;
|
let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`;
|
||||||
let filters: string = '';
|
let filters: string = '';
|
||||||
@ -239,6 +301,49 @@ function buildGetList(view: EndpointDef): string {
|
|||||||
return func;
|
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 {
|
function buildJoin(view: EndpointDef): string {
|
||||||
if (view.join?.length) {
|
if (view.join?.length) {
|
||||||
let join = `${view.table}`;
|
let join = `${view.table}`;
|
||||||
@ -284,6 +389,7 @@ function buildFunctionName(view: EndpointDef): string {
|
|||||||
'update': (view: EndpointDef) => `update${uppercaseFirstLetter(view.component)}`,
|
'update': (view: EndpointDef) => `update${uppercaseFirstLetter(view.component)}`,
|
||||||
'create': (view: EndpointDef) => `create${uppercaseFirstLetter(view.component)}`,
|
'create': (view: EndpointDef) => `create${uppercaseFirstLetter(view.component)}`,
|
||||||
'delete': (view: EndpointDef) => `delete${uppercaseFirstLetter(view.component)}`,
|
'delete': (view: EndpointDef) => `delete${uppercaseFirstLetter(view.component)}`,
|
||||||
|
'search': (view: EndpointDef) => `search${uppercaseFirstLetter(view.component)}`,
|
||||||
};
|
};
|
||||||
return selector[view.type](view);
|
return selector[view.type](view);
|
||||||
}
|
}
|
Reference in New Issue
Block a user