All files / lib/feature-operations/scripts/lib function-generation.js

8.43% Statements 7/83
0% Branches 0/10
0% Functions 0/7
8.43% Lines 7/83

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115    2x 2x 2x   2x   2x                                     2x                                                                                                                                                     2x                        
"use strict";
 
var fs = require('fs-extra');
var pathLib = require('path');
var databaseOps = require('../database-ops');
 
const { spawnSync } = require('child_process');
 
exports.createLambdaFunctionFolder = (lambdaPackageFolder, functionFolder, pathKey) => {
    const filesFolder = pathLib.join(lambdaPackageFolder, 'files');
    let items = fs.readdirSync(filesFolder);
    items.forEach(file => {
        fs.writeFileSync(pathLib.join(functionFolder, file), fs.readFileSync(pathLib.join(filesFolder, file)));
    });
    var appjs = fs.readFileSync(pathLib.join(lambdaPackageFolder, 'app.vm'));
    appjs = appjs + "";
    var pathParams = pathKey + "";
    pathParams.replace(new RegExp('\/{proxy\+}', 'g'), '');
    let regPath = new RegExp('###PATH###', 'g');
    appjs = appjs.replace(regPath, pathParams);
    fs.writeFileSync(pathLib.join(functionFolder, 'app.js'), appjs);
    console.log('...');
    spawnSync('npm', ['install'], { cwd: functionFolder, env: process.env, stdio: ['pipe', 'pipe', 'ignore'] });
 
    deleteFolderRecursive(pathLib.join(functionFolder, 'node_modules', '.bin'));
}
 
exports.createLambdaFunctionCrudApi = (lambdaDynamoPackageFolder, functionFolder, cloudLogicDefinition, path, table_name, hasUserId) => {
    const filesFolder = pathLib.join(lambdaDynamoPackageFolder, 'files');
    let items = fs.readdirSync(filesFolder);
    items.forEach(file => {
      fs.writeFileSync(pathLib.join(functionFolder, file), fs.readFileSync(pathLib.join(filesFolder, file)));
    });
    var appjs = fs.readFileSync(pathLib.join(lambdaDynamoPackageFolder, 'app.vm'));
    appjs = appjs + "";
    let regTableName = new RegExp('###TABLE_NAME###', 'g');
    let regObjectPath = new RegExp('###OBJECT_PATH###', 'g');
    let regListObjectsPath = new RegExp('###LIST_OBJECTS_PATH###', 'g');
    let regPath = new RegExp('###PATH###', 'g');
 
    let regUserIdPresent = new RegExp('###USER_ID_PRESENT###', 'g');
    let regHasDynamicPrefix = new RegExp('###HAS_DYNAMIC_PREFIX###', 'g');
    let regPartitionKeyName = new RegExp('###PARTITION_KEY_NAME###', 'g');
    let regPartitionKeyType = new RegExp('###PARTITION_KEY_TYPE###', 'g');
    let regSortKeyName = new RegExp('###SORT_KEY_NAME###', 'g');
    let regSortKeyType = new RegExp('###SORT_KEY_TYPE###', 'g');
    let regHasSortKey = new RegExp('###HAS_SORT_KEY###', 'g');
 
 
    var hashKeyName = cloudLogicDefinition.projectDefinition.nosql.tables[table_name].hashKeyName;
    var hashKeyType = databaseOps.getTypeCode(cloudLogicDefinition.projectDefinition.nosql.tables[table_name].hashKeyType);
    var sortKeyName = cloudLogicDefinition.projectDefinition.nosql.tables[table_name].sortKeyName;
    var sortKeyType = databaseOps.getTypeCode(cloudLogicDefinition.projectDefinition.nosql.tables[table_name].sortKeyType);
 
    var pathParams = '/' + table_name;
 
    var objectPath = '/' + table_name + '/object';
    var listObjectsPath = '/' + table_name;
    if (!hasUserId) {
      objectPath += '/:' + hashKeyName;
      listObjectsPath += '/:' + hashKeyName;
    }
    if (sortKeyName.length > 0) {
      objectPath += '/:' + sortKeyName;
    }
 
    const hasDynamicPrefix = cloudLogicDefinition.projectDefinition.nosql.tables[table_name].hasDynamicPrefix;
 
    var jsonPut = {};
    Object.keys(cloudLogicDefinition.projectDefinition.nosql.tables[table_name].attributes).map(attrKey => {
      jsonPut[attrKey] = {}
      const attrType = databaseOps.getTypeCode(cloudLogicDefinition.projectDefinition.nosql.tables[table_name].attributes[attrKey]);
      jsonPut[attrKey] = "INSERT VALUE HERE";
    })
 
    if (hasUserId) {
      delete jsonPut[hashKeyName];
    }
 
    appjs = appjs.replace(regTableName, table_name);
    appjs = appjs.replace(regPartitionKeyName, hashKeyName);
    appjs = appjs.replace(regSortKeyName, sortKeyName);
    appjs = appjs.replace(regPartitionKeyType, hashKeyType);
    appjs = appjs.replace(regSortKeyType, sortKeyType);
    appjs = appjs.replace(regHasSortKey, sortKeyName.length > 0);
    appjs = appjs.replace(regObjectPath, objectPath);
    appjs = appjs.replace(regListObjectsPath, listObjectsPath);
    appjs = appjs.replace(regPath, pathParams);
    appjs = appjs.replace(regUserIdPresent, hasUserId);
    appjs = appjs.replace(regHasDynamicPrefix, hasDynamicPrefix);
 
    console.log('...');
    fs.writeFileSync(pathLib.join(functionFolder, 'app.js'), appjs);
    spawnSync('npm', ['install'], { cwd: functionFolder, env: process.env, stdio: ['pipe', 'pipe', 'ignore'] });
    deleteFolderRecursive(pathLib.join(functionFolder, 'node_modules', '.bin'));
 
    console.log('Path to be used on API for get and remove an object should be like:\n' + objectPath + '\n');
    console.log('Path to be used on API for list objects on get method should be like:\n' + listObjectsPath + '\n');
    console.log('JSON to be used as data on put request should be like:\n' + JSON.stringify(jsonPut, null, 2));
}
 
// symbolic links dont get zip on awsmobile backend build
var deleteFolderRecursive = function (path) {
  if (fs.existsSync(path)) {
    fs.readdirSync(path).forEach(function (file, index) {
      var curPath = path + "/" + file;
      if (fs.lstatSync(curPath).isDirectory()) { // recurse
        deleteFolderRecursive(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
};