vtlab-generic-functions 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ #### models
2
+ each file represents the table name in the mysql database.
3
+
4
+ #### utils/querybuilder
5
+ To build the query, mostly imported in the models
6
+
7
+ #### index.js
8
+ extend the export by including the models/{table}
9
+
10
+ ### Example usage from Lambda JS:
11
+ ```
12
+ const pelMysql = require('/opt/mysql');
13
+
14
+ const db = pelMysql.connectToDatabase({
15
+ host: 'localhost',
16
+ user: 'root',
17
+ password: 'example',
18
+ database: 'pel',
19
+ port: 3306
20
+ });
21
+
22
+ let users = pelMysql.get_all_users(db, function (err, data) {
23
+ if (err) {
24
+ console.log(err);
25
+ } else {
26
+ console.log(data);
27
+ }
28
+ });
29
+ ```
@@ -0,0 +1,26 @@
1
+ const mysql = require('mysql');
2
+
3
+ const connectToDatabase = function (params) {
4
+ if (!params.host || !params.port || !params.user || !params.password || !params.database) {
5
+ throw new Error('Missing required parameters');
6
+ }
7
+
8
+ let connection = mysql.createConnection({
9
+ host: params.host,
10
+ user: params.user,
11
+ password: params.password,
12
+ database: params.database,
13
+ port: params.port,
14
+ charset: 'utf8'
15
+ });
16
+
17
+ connection.connect(function (err) {
18
+ if (err) throw (err);
19
+ });
20
+
21
+ return connection;
22
+ };
23
+
24
+ module.exports = {
25
+ connectToDatabase,
26
+ };
package/mysql/index.js ADDED
@@ -0,0 +1,8 @@
1
+ const MYSQLClient = require('./connect-to-mysqldb');
2
+ const users = require('./models/users');
3
+
4
+ module.exports = {
5
+ ...MYSQLClient,
6
+ ...users,
7
+ // ...other_table
8
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * This is just a sample/test template for you to copy for the actual table in the DB.
3
+ */
4
+
5
+ const queryBuilder = require('../utils/queryBuilder');
6
+
7
+ /**
8
+ * to get uses by ID
9
+ * @param id String
10
+ * @param callback onSuccess(error, result)
11
+ */
12
+ const get_user_by_id = function (db_connection, id, callback) {
13
+
14
+ let where = [{
15
+ key: 'id',
16
+ value: id,
17
+ }];
18
+
19
+ db_connection.query(queryBuilder.buildSelectQuery('users', where), function (err, result) {
20
+ if (err) {
21
+ callback(err, null);
22
+ } else {
23
+ callback(null, result);
24
+ }
25
+ });
26
+
27
+ }
28
+
29
+ /**
30
+ * to get all the users in the table
31
+ * @param callback onSuccess(error, result)
32
+ */
33
+ const get_all_users = function (db_connection, callback) {
34
+ db_connection.query(queryBuilder.buildSelectQuery('users'), function (err, result) {
35
+ if (err) {
36
+ callback(err, null)
37
+ } else {
38
+ callback(null, result)
39
+ }
40
+ });
41
+ }
42
+
43
+
44
+ module.exports = {
45
+ get_user_by_id,
46
+ get_all_users
47
+ }
@@ -0,0 +1,164 @@
1
+ let GLOBAL_MYSQL_LIMIT = 10;
2
+ let GLOBAL_MYSQL_OFFSET = 0;
3
+
4
+ /**
5
+ * To build LIMIT query, 10 is the default limit
6
+ * @param limit
7
+ * @returns {string}
8
+ */
9
+ const buildLimitQuery = (limit) => {
10
+ let limitQuery = '';
11
+ if (limit.length > 0) {
12
+ limitQuery += ` LIMIT ${limit}`;
13
+ } else {
14
+ limitQuery += ` LIMIT ${GLOBAL_MYSQL_LIMIT}`;
15
+ }
16
+ return limitQuery;
17
+ };
18
+
19
+ /**
20
+ * To build WHERE query
21
+ * @param where
22
+ * @returns {string}
23
+ */
24
+ const buildWhereQuery = (where) => {
25
+ let whereQuery = '';
26
+ if (where.length > 0) {
27
+ where.forEach((item, index) => {
28
+ if (index === 0) {
29
+ whereQuery += ` WHERE ${item.key} = ${item.value}`;
30
+ } else {
31
+ whereQuery += ` AND ${item.key} = ${item.value}`;
32
+ }
33
+ });
34
+ }
35
+ return whereQuery;
36
+ };
37
+
38
+ /**
39
+ * To build OFFSET query
40
+ * @param offset
41
+ * @returns {string}
42
+ */
43
+ const buildOffsetQuery = (offset) => {
44
+ let offsetQuery = '';
45
+ if (offset.length > 0) {
46
+ offsetQuery += ` OFFSET ${offset}`;
47
+ } else {
48
+ offsetQuery += ` OFFSET ${GLOBAL_MYSQL_OFFSET}`;
49
+ }
50
+ return offsetQuery;
51
+ };
52
+
53
+ /**
54
+ * To build ORDER BY query
55
+ * @param orderBy
56
+ * @returns {string}
57
+ */
58
+ const buildOrderByQuery = (orderBy) => {
59
+ let orderByQuery = '';
60
+ if (orderBy.length > 0) {
61
+ orderBy.forEach((item, index) => {
62
+ if (index === 0) {
63
+ orderByQuery += ` ORDER BY ${item.key} ${item.order}`;
64
+ } else {
65
+ orderByQuery += `, ${item.key} ${item.order}`;
66
+ }
67
+ });
68
+ }
69
+ return orderByQuery;
70
+ };
71
+
72
+ /**
73
+ * To build INSERT query
74
+ * @param tableName
75
+ * @param data
76
+ * @returns {string}
77
+ */
78
+ const buildInsertQuery = (tableName, data) => {
79
+ let insertQuery = `INSERT INTO ${tableName}`;
80
+ let keys = Object.keys(data);
81
+ let values = keys.map(key => data[key]);
82
+ insertQuery += `(${keys.join(', ')}) VALUES (${values.join(', ')})`;
83
+ return insertQuery;
84
+ };
85
+
86
+ /**
87
+ * To build UPDATE Query
88
+ * @param tableName
89
+ * @param data
90
+ * @param where
91
+ * @returns {string}
92
+ */
93
+ const buildUpdateQuery = (tableName, data, where) => {
94
+
95
+ let updateQuery = `UPDATE ${tableName} SET`;
96
+ let keys = Object.keys(data);
97
+ let values = keys.map(key => data[key]);
98
+ keys.forEach((key, index) => {
99
+ if (index === 0) {
100
+ updateQuery += ` ${key} = ${values[index]}`;
101
+ } else {
102
+ updateQuery += `, ${key} = ${values[index]}`;
103
+ }
104
+ });
105
+ updateQuery += buildWhereQuery(where);
106
+ return updateQuery;
107
+ };
108
+
109
+ /**
110
+ * to build DELETE query
111
+ * @param tableName
112
+ * @param where
113
+ * @returns {string}
114
+ */
115
+ const buildDeleteQuery = (tableName, where) => {
116
+ let deleteQuery = `DELETE FROM ${tableName}`;
117
+ deleteQuery += buildWhereQuery(where);
118
+ return deleteQuery;
119
+ };
120
+
121
+ /**
122
+ * to build SELECT query
123
+ * @param tableName
124
+ * @param where
125
+ * @param orderBy
126
+ * @param limit
127
+ * @param offset
128
+ * @returns {string}
129
+ */
130
+ const buildSelectQuery = (tableName = '', where = [], orderBy = [], limit = GLOBAL_MYSQL_LIMIT, offset = GLOBAL_MYSQL_OFFSET) => {
131
+ let selectQuery = `SELECT * FROM ${tableName}`;
132
+ selectQuery += buildWhereQuery(where);
133
+ selectQuery += buildOrderByQuery(orderBy);
134
+ selectQuery += buildLimitQuery(limit);
135
+ selectQuery += buildOffsetQuery(offset);
136
+ return selectQuery;
137
+ };
138
+
139
+ /**
140
+ * to build create table query
141
+ * @param tableName
142
+ * @param columns
143
+ * @returns {string}
144
+ */
145
+ const buildCreateTableQuery = (tableName, columns) => {
146
+ let createTableQuery = `CREATE TABLE ${tableName} (`;
147
+ let keys = Object.keys(columns);
148
+ let values = keys.map(key => columns[key]);
149
+ createTableQuery += `${keys.join(', ')}`;
150
+ createTableQuery += `) ENGINE=InnoDB DEFAULT CHARSET=utf8;`;
151
+ return createTableQuery;
152
+ };
153
+
154
+
155
+ module.exports = {
156
+ buildLimitQuery,
157
+ buildWhereQuery,
158
+ buildOffsetQuery,
159
+ buildOrderByQuery,
160
+ buildInsertQuery,
161
+ buildUpdateQuery,
162
+ buildDeleteQuery,
163
+ buildSelectQuery
164
+ };
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "vtlab-generic-functions",
3
+ "version": "1.0.4",
4
+ "scripts": {
5
+ "test": "jest"
6
+ },
7
+ "dependencies": {
8
+ "@aws-sdk/client-lambda": "^3.478.0",
9
+ "@aws-sdk/client-s3": "^3.478.0",
10
+ "@aws-sdk/client-ses": "^3.478.0",
11
+ "@aws-sdk/client-sqs": "^3.478.0",
12
+ "axios": "^1.6.2",
13
+ "countries-code": "^1.1.0",
14
+ "country-data": "0.0.31",
15
+ "csv-parse": "^4.16.0",
16
+ "dot-object": "^2.1.4",
17
+ "easy-soap-request": "^4.8.0",
18
+ "flatted": "^3.2.2",
19
+ "html-pdf": "^3.0.1",
20
+ "joi": "^17.4.1",
21
+ "jsftp": "^2.1.3",
22
+ "mongodb": "^4.0.1",
23
+ "multer": "^1.4.4",
24
+ "multer-s3": "^2.9.0",
25
+ "mysql": "^2.18.1",
26
+ "node-xlsx": "^0.17.2",
27
+ "node-zip": "^1.1.1",
28
+ "nodemailer": "^6.6.3",
29
+ "phantomjs-prebuilt": "^2.1.16",
30
+ "postal-codes-js": "^2.5.2",
31
+ "promise-ftp": "^1.3.5",
32
+ "save": "^2.4.0",
33
+ "ssh2-sftp-client": "^7.0.0",
34
+ "vtlab-timezone-utils": "^1.0.15",
35
+ "xlsx": "^0.18.5",
36
+ "xml2js": "^0.6.2"
37
+ },
38
+ "devDependencies": {
39
+ "jest": "^29.7.0",
40
+ "nodemailer-mock": "^2.0.3",
41
+ "sinon": "^17.0.1"
42
+ }
43
+ }
@@ -0,0 +1,114 @@
1
+ var fs = require('fs');
2
+ var parse = require('csv-parse');
3
+ var XLSX = require('xlsx');
4
+
5
+
6
+ const CODES_TYPE = {
7
+ EXTENSION_NOT_FOUND: 'extension_not_found',
8
+ GENERIC_ERROR: 'generic_error',
9
+ SUCCESSFULL_OP: 'succesfull_op'
10
+
11
+ }
12
+
13
+ /**
14
+ * Private functions
15
+ */
16
+ /*Transform headers is need. For example: delete blanks...etc.
17
+ const processHeadersFromFile = ({typeOp='',headers=[]}) =>{
18
+ return headers;
19
+ }
20
+
21
+ const fromArrayToObjectArray = ({headers, data}) =>{
22
+ let objArrayResult = [];
23
+ headers = processHeadersFromFile({typeOp:'',headers})
24
+ objArrayResult = data.map(dataItem => {
25
+ let objResult = {}
26
+ headers.forEach((headersItem, index) => {
27
+ objResult[headersItem] = dataItem[index] ? dataItem[index] : '';
28
+ });
29
+ return objResult;
30
+ })
31
+
32
+ return objArrayResult;
33
+ }*/
34
+
35
+ /**
36
+ * Public functions
37
+ */
38
+
39
+
40
+ const fileToJson = ({filePathWithName,delimiter=',',columns=true,params}) =>{
41
+ return new Promise ((resolve, reject)=> {
42
+ let result = null;
43
+
44
+ try{
45
+ let extension = filePathWithName.split('.')[filePathWithName.split('.').length - 1];
46
+
47
+ switch (extension.toLowerCase()) {
48
+ case 'xlsx':
49
+ var workbook = XLSX.readFile(filePathWithName);
50
+ var sheet_name_list = workbook.SheetNames;
51
+ result = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]],{defval: ""})
52
+ return resolve({
53
+ code: CODES_TYPE.SUCCESSFULL_OP,
54
+ message: 'Operación realizada correctamente',
55
+ data :result
56
+ });
57
+ break;
58
+ case 'txt':
59
+ case 'csv':
60
+ result = [];
61
+
62
+ fs.createReadStream(filePathWithName)
63
+ .pipe(
64
+ parse({
65
+ ...params,
66
+ columns: columns,
67
+ delimiter: delimiter
68
+ }))
69
+ .on('data', function(csvrow) {
70
+ result.push(csvrow);
71
+ })
72
+ .on('error',function(err) {
73
+ return reject( {code: CODES_TYPE.GENERIC_ERROR,
74
+ message: 'Error durante el procesado del fichero',
75
+ alternative: 'Revisar el error retornado',
76
+ dataError: err
77
+ })
78
+ })
79
+ .on('end',function() {
80
+ return resolve({
81
+ code: CODES_TYPE.SUCCESSFULL_OP,
82
+ message: 'Operación realizada correctamente',
83
+ data :result
84
+ })
85
+ });
86
+
87
+ break;
88
+
89
+ default:
90
+ return reject({
91
+ code : EXTENSION_NOT_FOUND,
92
+ message : `La extensión ${extension} no está prevista`,
93
+ alternative: 'Por favor, pruebe con una de las extensiones previstas',
94
+ dataError:{}
95
+ });
96
+ }
97
+ }catch(err){
98
+
99
+ return reject({
100
+ code : CODES_TYPE.GENERIC_ERROR,
101
+ message : 'Error procesando el fichero',
102
+ alternative: 'Revise la información de error',
103
+ dataError: err
104
+ })
105
+ }
106
+ })
107
+
108
+
109
+ }
110
+
111
+
112
+ module.exports = {
113
+ fileToJson
114
+ }
package/pdf/index.js ADDED
@@ -0,0 +1,34 @@
1
+ const htmlToPdf = require('html-pdf');
2
+
3
+ /**
4
+ * Convierte el contenido de un archivo en formato string a un archivo PDF.
5
+ * @param {string} content - El contenido del archivo en formato string.
6
+ * @param {Object} [options] - Opciones para personalizar la configuración de html-pdf.
7
+ * @param {string} [options.format='Letter'] - El formato de papel del PDF.
8
+ * @param {string} [options.orientation='portrait'] - La orientación de la página.
9
+ * @param {number} [options.border='10mm'] - El ancho del borde de la página.
10
+ * @param {string} [options.header] - Una cadena que especifica el encabezado de la página.
11
+ * @param {string} [options.footer] - Una cadena que especifica el pie de página de la página.
12
+ * @returns {Promise<Buffer>} - Un Buffer del archivo PDF generado.
13
+ */
14
+ const convertToPdf = (content, options = {}) => {
15
+ const {
16
+ format = 'Letter',
17
+ orientation = 'portrait',
18
+ border = '10mm',
19
+ header = '',
20
+ footer = ''
21
+ } = options;
22
+
23
+ return new Promise((resolve, reject) => {
24
+ htmlToPdf.create(content, { format, orientation, border, header, footer }).toBuffer((err, buffer) => {
25
+ if (err) {
26
+ reject(err);
27
+ } else {
28
+ resolve(buffer);
29
+ }
30
+ });
31
+ });
32
+ }
33
+
34
+ module.exports = convertToPdf;
@@ -0,0 +1,38 @@
1
+ const postalCodes = require('postal-codes-js');
2
+
3
+ /**
4
+ * This function will transform the incoming values received on data onto the outgoing mapped values, returning a JSON object.
5
+ * @param {string} countryCode ISO 3166-1 alpha-2 or alpha-3 country code as string.
6
+ * @param {string} postalCode Postal code as string or number.
7
+ * @returns {Promise} {
8
+ * isValid: true | false
9
+ * message: Indicates why it is no valid (isValid: false) or it operations was ok.
10
+ * }
11
+ * @throw error: If validate method fails.
12
+ */
13
+ const isValidPostalCode = async ({countryCode , postalCode }) => {
14
+
15
+ try{
16
+ let isValid = postalCodes.validate(countryCode, postalCode);
17
+
18
+ if(isValid === true){
19
+ return {
20
+ isValid: true,
21
+ message:'Postal code exists for the input country'
22
+ }
23
+ }else{
24
+ return {
25
+ isValid: false,
26
+ message: isValid
27
+ }
28
+ }
29
+ }catch(err){
30
+ throw err;
31
+ }
32
+
33
+ }
34
+
35
+
36
+ module.exports = {
37
+ isValidPostalCode
38
+ }
@@ -0,0 +1,33 @@
1
+ const mysql = require('mysql');
2
+
3
+ const connectToDatabase = function (params) {
4
+ return new Promise((resolve, reject) => {
5
+
6
+ if (!params.host || !params.port || !params.user || !params.password || !params.database) {
7
+ reject(new Error('Missing required parameters'));
8
+ }
9
+
10
+ let connection = mysql.createConnection({
11
+ host: params.host,
12
+ user: params.user,
13
+ password: params.password,
14
+ database: params.database,
15
+ port: params.port,
16
+ charset: 'utf8'
17
+ });
18
+
19
+ connection.connect(function (err) {
20
+ if (err) {
21
+ reject(err);
22
+ } else {
23
+ resolve(connection);
24
+ }
25
+ });
26
+
27
+ });
28
+
29
+ };
30
+
31
+ module.exports = {
32
+ connectToDatabase
33
+ };
package/rds/index.js ADDED
@@ -0,0 +1,33 @@
1
+ const config = require('../config');
2
+ const RDSConnection = require('./connect-to-rdsdb');
3
+ const queryBuilder = require('./utils/queryBuilder');
4
+ const {getValueOrNull} = require('../utils/index');
5
+ /**
6
+ * To connect RDS Database. It's always mysql present in out AWS
7
+ * @param path
8
+ * @returns db connection
9
+ */
10
+ const connectMyRDS = async (databaseName) => {
11
+ try {
12
+ const dbParams = await config.get(databaseName, 'rds');
13
+
14
+ if (!dbParams) {
15
+ throw new Error('Database name is not valid in the Secret Manager');
16
+ }
17
+
18
+ dbParams.database = databaseName;
19
+ dbParams.port = dbParams.port || 3306;
20
+
21
+ const connection = await RDSConnection.connectToDatabase(dbParams);
22
+ return connection;
23
+ } catch (error) {
24
+ throw error;
25
+ }
26
+
27
+ };
28
+
29
+ //export
30
+ module.exports = {
31
+ connectMyRDS,
32
+ ...queryBuilder
33
+ }