From 91cb2666c361741ad85948a102f41c183039af39 Mon Sep 17 00:00:00 2001 From: Mason Payne Date: Mon, 18 Jan 2021 23:49:43 -0700 Subject: [PATCH] add more crud operations to the mapper files --- src/systemGenService.ts | 2 +- src/views/views-creator.ts | 126 ++++++++++++++++++++++++++++++++++--- 2 files changed, 117 insertions(+), 11 deletions(-) diff --git a/src/systemGenService.ts b/src/systemGenService.ts index 4a8d3f0..451d6c6 100644 --- a/src/systemGenService.ts +++ b/src/systemGenService.ts @@ -50,7 +50,7 @@ interface ComponentDef { interface EndpointDef { component: string; table: string; - type: ('list' | 'count' | 'item' | 'distinct' | 'update' | 'create' | 'delete'); + type: ('list' | 'count' | 'item' | 'distinct' | 'update' | 'create' | 'delete' | 'search'); columns: ColumnRef[]; values?: ValueDef[]; join?: JoinDef[]; diff --git a/src/views/views-creator.ts b/src/views/views-creator.ts index 12d2f28..5825421 100644 --- a/src/views/views-creator.ts +++ b/src/views/views-creator.ts @@ -1,6 +1,4 @@ import { - BelongsToDef, - ColumnDef, ColumnRef, ComponentDef, EndpointDef, @@ -8,7 +6,6 @@ import { JoinDef, Order, SystemDef, - TableDef } from '../systemGenService'; import * as path from 'path'; import * as fs from 'fs'; @@ -99,7 +96,6 @@ function insertMapperCode(view: EndpointDef, outDir: string): Promise { let fileLocation = path.join(process.cwd(), outDir, 'src', 'components', view.component, `${view.component}Mapper.ts`); let initMapperFile: string = fs.readFileSync(fileLocation, 'utf8'); let parts = initMapperFile.split(separator); - // TODO: add mapper code here parts[0] = parts[0] + createMapperFunc(view); let newMapperFile = parts.join(separator); fs.writeFileSync(fileLocation, newMapperFile, 'utf8'); @@ -109,25 +105,92 @@ function insertMapperCode(view: EndpointDef, outDir: string): Promise { function createMapperFunc(view: EndpointDef): string { let func: string = ''; - let funcName: string = ''; if (view.type === 'list' || view.type === 'count') { func = buildGetList(view); } else if (view.type === 'item') { - funcName = buildFunctionName(view); + func = buildGetItem(view); } else if (view.type === 'update') { - funcName = buildFunctionName(view); + func = buildUpdateFunc(view); } else if (view.type === 'create') { func = buildCreateFunc(view); } else if (view.type === 'delete') { - funcName = buildFunctionName(view); + 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 funcName = buildFunctionName(view); 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) { @@ -172,7 +235,6 @@ function buildGetList(view: EndpointDef): string { 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 queryValues: string = ''; let query: string = ''; let tables: string = view.join?.length ? buildJoin(view) : `${view.table}`; let filters: string = ''; @@ -239,6 +301,49 @@ function buildGetList(view: EndpointDef): string { 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}`; @@ -284,6 +389,7 @@ function buildFunctionName(view: EndpointDef): string { '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); } \ No newline at end of file