minimonolith 0.21.2 → 0.22.1

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.
Files changed (74) hide show
  1. package/README.md +57 -32
  2. package/index.js +14 -5
  3. package/package.json +2 -1
  4. package/src/api/get/index.js +19 -0
  5. package/src/api/getNewAPI/index.js +13 -0
  6. package/src/api/getSyncedHandler/index.js +24 -0
  7. package/src/api/index.js +3 -3
  8. package/src/api/postService/index.js +32 -0
  9. package/src/autotest/getMethodTest/back.index.js +29 -0
  10. package/src/autotest/getMethodTest/index.js +12 -0
  11. package/src/autotest/getTestServerResponse/index.js +14 -0
  12. package/src/autotest/index.js +3 -0
  13. package/src/control/get/index.js +3 -0
  14. package/src/control/index.js +3 -0
  15. package/src/database/index.js +3 -3
  16. package/src/database/post/index.js +28 -0
  17. package/src/database/postConnection/index.js +25 -0
  18. package/src/environment/getDBEnvVars/index.js +4 -0
  19. package/src/environment/getENVEnvVars/index.js +4 -0
  20. package/src/environment/index.js +4 -0
  21. package/src/{development/loadEnvFile.js → environment/postEnvFile/index.js} +4 -5
  22. package/src/environment/postTestEnvironment/index.js +6 -0
  23. package/src/error/index.js +4 -0
  24. package/src/error/postCompiletime/index.js +13 -0
  25. package/src/error/postRuntime/index.js +7 -0
  26. package/src/event/getParsedEvent/index.js +9 -0
  27. package/src/event/index.js +3 -0
  28. package/src/health/index.js +2 -2
  29. package/src/health/post/index.js +10 -0
  30. package/src/log/index.js +5 -0
  31. package/src/log/post/index.js +3 -0
  32. package/src/log/postError/index.js +3 -0
  33. package/src/log/postQA/index.js +3 -0
  34. package/src/{service/parseMethodCode.js → method/getParsedCode/index.js} +1 -1
  35. package/src/method/getResponseCode/index.js +9 -0
  36. package/src/{service/getMethodRouteCode.js → method/getRouteCode/index.js} +2 -4
  37. package/src/{service/getMethodType.js → method/getType/index.js} +1 -3
  38. package/src/method/index.js +7 -0
  39. package/src/method/post/index.js +48 -0
  40. package/src/method/postResponse/index.js +13 -0
  41. package/src/middleware/index.js +4 -0
  42. package/src/middleware/postCors/index.js +21 -0
  43. package/src/middleware/postError/index.js +10 -0
  44. package/src/model/getSynced/index.js +22 -0
  45. package/src/model/index.js +3 -2
  46. package/src/model/post/index.js +11 -0
  47. package/src/path/{getProjectRoot.js → getProjectRoot/index.js} +1 -3
  48. package/src/path/index.js +2 -2
  49. package/src/{development/serverHandler.js → server/getNodejsServerHandler/index.js} +19 -22
  50. package/src/server/getServerFactory/index.js +13 -0
  51. package/src/server/index.js +3 -0
  52. package/src/{database/validation.js → validation/dbValidation.js} +1 -3
  53. package/src/validation/get/index.js +19 -0
  54. package/src/{zod/optionalZObject.js → validation/getOptionalObject/index.js} +1 -1
  55. package/src/validation/index.js +8 -0
  56. package/src/validation/postError/index.js +15 -0
  57. package/src/api/apiHandler.js +0 -13
  58. package/src/api/createAPI.js +0 -51
  59. package/src/crasher/crasher.js +0 -1
  60. package/src/crasher/index.js +0 -3
  61. package/src/database/databaseService.js +0 -49
  62. package/src/development/createDevEnvironment.js +0 -10
  63. package/src/development/createTestEnvironment.js +0 -9
  64. package/src/development/index.js +0 -4
  65. package/src/development/lambdaServer.js +0 -11
  66. package/src/health/healthService.js +0 -15
  67. package/src/logger/index.js +0 -3
  68. package/src/logger/logger.js +0 -5
  69. package/src/model/loadModels.js +0 -33
  70. package/src/service/index.js +0 -4
  71. package/src/service/methodHandler.js +0 -25
  72. package/src/service/registerMethod.js +0 -36
  73. package/src/service/registerService.js +0 -70
  74. package/src/zod/index.js +0 -5
@@ -0,0 +1,48 @@
1
+ import API_SERVICE from '../../api/index.js';
2
+ import LOG_SERVICE from '../../log/index.js';
3
+ import CONTROL_SERVICE from '../../control/index.js';
4
+ import EVENT_SERVICE from '../../event/index.js';
5
+ import VALIDATION_SERVICE from '../../validation/index.js';
6
+ import ERROR_SERVICE from '../../error/index.js';
7
+
8
+ import getParsedCode from '../getParsedCode/index.js';
9
+ import getRouteCode from '../getRouteCode/index.js';
10
+ import getType from '../getType/index.js';
11
+ import postResponse from '../postResponse/index.js';
12
+
13
+ const META_SERVICE_NAME='METHOD', META_METHOD_NAME='POST';
14
+
15
+ export default async (SERVICE_NAME, SERVICE_URL, METHOD_CODE) => {
16
+ const { METHOD_NAME, METHOD_ROUTE } = getParsedCode(SERVICE_NAME, METHOD_CODE);
17
+ const ROUTE_CODE = getRouteCode(SERVICE_NAME, METHOD_NAME);
18
+ LOG_SERVICE.post(' FOUND_METHOD', METHOD_NAME);
19
+
20
+ try {
21
+
22
+ const METHOD = {
23
+ CONTROLLER: await CONTROL_SERVICE.get(METHOD_NAME, SERVICE_URL),
24
+ VALIDATOR: await VALIDATION_SERVICE.get(METHOD_NAME, SERVICE_URL),
25
+ };
26
+
27
+ API_SERVICE.get().SERVICES[SERVICE_NAME][METHOD_NAME] = async (body, claims=undefined) => {
28
+ const { MODELS, SERVICES } = API_SERVICE.get();
29
+ return await METHOD.CONTROLLER({ MODELS, SERVICES, ROUTE_CODE, body, claims });
30
+ }
31
+
32
+ const METHOD_TYPE = getType(METHOD_NAME);
33
+
34
+ LOG_SERVICE.post('POSTING_ROUTE', METHOD_ROUTE);
35
+ API_SERVICE.get()[METHOD_TYPE](METHOD_ROUTE, async (event, res) => {
36
+ const { body, claims } = EVENT_SERVICE.getParsedEvent(event);
37
+
38
+ try {
39
+ if (await VALIDATION_SERVICE.postError(res, ROUTE_CODE, METHOD.VALIDATOR, body)) return;
40
+ await postResponse(res, ROUTE_CODE, METHOD.CONTROLLER, METHOD_TYPE, body, claims);
41
+ }
42
+ catch (METHOD_ERROR) { ERROR_SERVICE.postRuntime(res, ROUTE_CODE, METHOD_ERROR); }
43
+ });
44
+
45
+ } catch (META_METHOD_ERROR) {
46
+ ERROR_SERVICE.postCompiletime({ META_SERVICE_NAME, META_METHOD_NAME, ROUTE_CODE, META_METHOD_ERROR });
47
+ }
48
+ };
@@ -0,0 +1,13 @@
1
+ import API_SERVICE from '../../api/index.js';
2
+ import LOG_SERVICE from '../../log/index.js';
3
+
4
+ import getResponseCode from '../getResponseCode/index.js';
5
+
6
+ export default async (res, ROUTE_CODE, CONTROLLER, METHOD_TYPE, body, claims) => {
7
+
8
+ const { MODELS, SERVICES } = API_SERVICE.get();
9
+ const METHOD_RESPONSE = await CONTROLLER({ MODELS, SERVICES, body, claims });
10
+ const METHOD_RESPONSE_CODE = getResponseCode(METHOD_TYPE);
11
+ LOG_SERVICE.post({ ROUTE_CODE, METHOD_RESPONSE });
12
+ res.status(METHOD_RESPONSE_CODE).json(METHOD_RESPONSE);
13
+ };
@@ -0,0 +1,4 @@
1
+ import postCors from './postCors/index.js';
2
+ import postError from './postError/index.js';
3
+
4
+ export default { postCors, postError };
@@ -0,0 +1,21 @@
1
+ import API_SERVICE from '../../api/index.js';
2
+ import LOG_SERVICE from '../../log/index.js';
3
+
4
+ export default () => {
5
+
6
+ API_SERVICE.get().use((req, res, next) => {
7
+ if (req.headers['x-trigger-error']) {
8
+ LOG_SERVICE.post({ ROUTE_CODE: 'LAMBDA_API', MESSAGE: 'X_TRIGGER_ERROR_HEADER' });
9
+ throw new Error('X_TRIGGER_ERROR_HEADER');
10
+ }
11
+ res.cors(); next();
12
+ });
13
+
14
+ API_SERVICE.get().options('/*', (req, res) => {
15
+ res.header('Access-Control-Allow-Origin', '*');
16
+ res.header('Access-Control-Allow-Methods', 'OPTIONS, POST, GET, PUT, PATCH, DELETE');
17
+ res.header('Access-Control-Allow-Headers', '*');
18
+ res.header('Access-Control-Allow-Credentials', true);
19
+ res.status(200).send({})
20
+ });
21
+ };
@@ -0,0 +1,10 @@
1
+ import API_SERVICE from '../../api/index.js';
2
+ import LOG_SERVICE from '../../log/index.js';
3
+
4
+ export default () => {
5
+ API_SERVICE.get().use((err, req, res, next) => {
6
+ LOG_SERVICE.postError({ ROUTE_CODE: 'LAMBDA_API', ERROR: err });
7
+ res.cors(); //next();
8
+ res.status(500).send({ ROUTE_CODE: 'LAMBDA_API', ERROR: err.message });
9
+ });
10
+ };
@@ -0,0 +1,22 @@
1
+ import { DataTypes } from 'sequelize';
2
+
3
+ import API_SERVICE from '../../api/index.js';
4
+ import LOG_SERVICE from '../../log/index.js';
5
+
6
+ const META_SERVICE='MODEL', META_METHOD='GET_SYNCED', META_ROUTE=META_SERVICE+'_'+META_METHOD;
7
+
8
+ export default async () => {
9
+ for (const SERVICE_NAME of Object.keys(API_SERVICE.get().SCHEMAS)) {
10
+ LOG_SERVICE.post({ META_ROUTE, LOADING: SERVICE_NAME });
11
+ API_SERVICE.get().MODELS[SERVICE_NAME] = API_SERVICE.get().SCHEMAS[SERVICE_NAME](API_SERVICE.get().ORM, DataTypes);
12
+ }
13
+
14
+ for (const [SERVICE_NAME, MODEL] of Object.entries(API_SERVICE.get().MODELS)) {
15
+ LOG_SERVICE.post({ META_ROUTE, ASSOCIATING: SERVICE_NAME });
16
+ MODEL.associate(API_SERVICE.get().MODELS);
17
+ }
18
+
19
+ LOG_SERVICE.post({ META_ROUTE, SYNCING_ORM: 'WAITING_ORM_SYNCING' });
20
+ await API_SERVICE.get().ORM.sync({ alter: process.env.MM_API_DEV_ENV==='TRUE' ? true : false });
21
+ LOG_SERVICE.post({ META_ROUTE, SYNCING_ORM: 'DONE_ORM_SYNCING' });
22
+ };
@@ -1,3 +1,4 @@
1
- import { registerModel, loadAndSyncModels } from './loadModels.js';
1
+ import getSynced from './getSynced/index.js';
2
+ import post from './post/index.js';
2
3
 
3
- export { registerModel, loadAndSyncModels };
4
+ export default { getSynced, post };
@@ -0,0 +1,11 @@
1
+ import fs from 'fs';
2
+ import url from 'url';
3
+
4
+ import API_SERVICE from '../../api/index.js';
5
+ import LOG_SERVICE from '../../log/index.js';
6
+
7
+ export default async (SERVICE_NAME, SERVICE_URL) => {
8
+ if (!fs.existsSync(url.fileURLToPath(`${SERVICE_URL}model.js`))) return;
9
+ LOG_SERVICE.post(' FOUND_MODEL')
10
+ API_SERVICE.get().SCHEMAS[SERVICE_NAME] = (await import(`${SERVICE_URL}model.js`)).default(SERVICE_NAME);
11
+ }
@@ -2,7 +2,7 @@ import path from 'path';
2
2
  import url from 'url';
3
3
 
4
4
  // Function to find the project root from any nested directory inside node_modules/
5
- const getProjectRoot = (currentFileUrl, MODULE_FOLDER) => {
5
+ export default (currentFileUrl, MODULE_FOLDER) => {
6
6
  const currentPath = path.dirname(url.fileURLToPath(currentFileUrl));
7
7
  const nodeModulesIndex = currentPath.indexOf(MODULE_FOLDER);
8
8
  if (nodeModulesIndex === -1) {
@@ -12,5 +12,3 @@ const getProjectRoot = (currentFileUrl, MODULE_FOLDER) => {
12
12
  const nodeModulesPath = currentPath.substring(0, nodeModulesIndex);
13
13
  return url.pathToFileURL(nodeModulesPath);
14
14
  }
15
-
16
- export { getProjectRoot };
package/src/path/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { getProjectRoot } from './getProjectRoot.js';
1
+ import getProjectRoot from './getProjectRoot/index.js';
2
2
 
3
- export { getProjectRoot };
3
+ export default { getProjectRoot };
@@ -2,9 +2,9 @@
2
2
 
3
3
  import url from 'url';
4
4
 
5
- import { logger } from '../logger/index.js';
5
+ import LOG_SERVICE from '../../log/index.js';
6
6
 
7
- const loadBody = req => {
7
+ const getBody = req => {
8
8
  return new Promise((resolve, reject) => {
9
9
  let body = '';
10
10
  req.on('data', chunk => { body += chunk; });
@@ -18,41 +18,36 @@ const getJWTClaims = authHeader => {
18
18
  return JSON.parse(Buffer.from(b64Claims, 'base64').toString());
19
19
  }
20
20
 
21
- const putCORS = res => {
22
- res.setHeader('Access-Control-Allow-Origin', '*');
23
- res.setHeader('Access-Control-Request-Method', '*');
24
- res.setHeader('Access-Control-Allow-Methods', 'OPTIONS,GET,POST,PUT,PATCH,DELETE');
25
- res.setHeader('Access-Control-Allow-Headers', '*');
26
- };
27
-
28
21
  const getLambdaEvent = (req, queryString, jwtClaims, body) => {
29
- return {
22
+ const event = {
30
23
  path: req.url,
31
24
  httpMethod: req.method,
32
25
  queryStringParameters: queryString,
33
26
  requestContext: {
34
27
  authorizer: { jwt: { claims: jwtClaims }, },
28
+ http: { method: req.method, path: req.url },
35
29
  },
36
- headers: {
37
- accept: req.headers.accept,
38
- 'User-Agent': req.headers['user-agent']
39
- },
30
+ headers: {},
40
31
  body,
41
32
  };
33
+
34
+ if (req.headers['content-type']) event.headers['Content-Type'] = req.headers['content-type'];
35
+ if (req.headers['x-trigger-error']) event.headers['x-trigger-error'] = 'TRUE';
36
+ if (req.headers.accept) event.headers.accept = req.headers.accept;
37
+ if (req.headers['user-agent']) event.headers['User-Agent'] = req.headers['user-agent'];
38
+ console.log(event);
39
+ return event;
42
40
  };
43
41
 
44
- const getServerHandler = lambdaHandler => async (req, res) => {
42
+ export default lambdaHandler => async (req, res) => {
45
43
  try {
46
- putCORS(res);
47
- if (req.method === 'OPTIONS') { res.writeHead(200); res.end(); return; }
48
-
49
44
  const authHeader = req.headers.authorization;
50
45
  const jwtClaims = authHeader?.startsWith('Bearer ') ? getJWTClaims(authHeader) : null;
51
46
 
52
47
  const tempQueryString = url.parse(req.url, true).query;
53
48
  const queryString = tempQueryString ? tempQueryString : undefined;
54
49
 
55
- const tempBody = await loadBody(req);
50
+ const tempBody = await getBody(req);
56
51
  const body = tempBody ? tempBody : undefined;
57
52
 
58
53
  const lambdaEvent = getLambdaEvent(req, queryString, jwtClaims, body);
@@ -61,7 +56,9 @@ const getServerHandler = lambdaHandler => async (req, res) => {
61
56
  res.statusCode = lambdaRes.statusCode;
62
57
  res.end(lambdaRes.body);
63
58
 
64
- } catch(SERVER_ERROR) { logger.log({ SERVER_ERROR }); }
59
+ } catch(SERVER_ERROR) {
60
+ LOG_SERVICE.post({ SERVER_ERROR });
61
+ res.statusCode = 500;
62
+ res.end(JSON.stringify({ REQUEST_PARSING_ERROR: SERVER_ERROR.toString() }));
63
+ }
65
64
  }
66
-
67
- export { getServerHandler };
@@ -0,0 +1,13 @@
1
+ import http from 'http';
2
+
3
+ import getNodejsServerHandler from '../getNodejsServerHandler/index.js';
4
+
5
+ export default async (ENV_FILE='.env', MODULE_FOLDER='node_modules/') => {
6
+ (await import('../../environment/postEnvFile/index.js')).default(ENV_FILE, MODULE_FOLDER);
7
+
8
+ return (lambdaHandler) => {
9
+ const serverHandler = getNodejsServerHandler(lambdaHandler);
10
+ const server = http.createServer(serverHandler);
11
+ return server;
12
+ }
13
+ }
@@ -0,0 +1,3 @@
1
+ import getServerFactory from './getServerFactory/index.js';
2
+
3
+ export default { getServerFactory };
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
- const DB_VALIDATION = {
3
+ export default {
4
4
  exists: (model, field) => async (value, ctx) => {
5
5
  const valueCount = await model.count({ where: { [field]: value } });
6
6
  if (valueCount == 0) {
@@ -31,5 +31,3 @@ const DB_VALIDATION = {
31
31
  }
32
32
  },
33
33
  };
34
-
35
- export { DB_VALIDATION };
@@ -0,0 +1,19 @@
1
+ import fs from 'fs';
2
+ import url from 'url';
3
+ import { z } from 'zod';
4
+
5
+ import LOG_SERVICE from '../../log/index.js';
6
+
7
+ import getOptionalObject from '../getOptionalObject/index.js';
8
+
9
+ export default async (METHOD_NAME, SERVICE_URL) => {
10
+ const VALIDATION_URL = new URL(`${METHOD_NAME}/valid.js`, SERVICE_URL);
11
+
12
+ if (!fs.existsSync(url.fileURLToPath(VALIDATION_URL)))
13
+ return EVENT_CONTEXT => z.undefined();
14
+
15
+ LOG_SERVICE.post(' FOUND_VALIDATOR');
16
+ const Z_ELEMENTS = (await import(VALIDATION_URL)).default;
17
+
18
+ return EVENT_CONTEXT => getOptionalObject(Z_ELEMENTS(EVENT_CONTEXT));
19
+ };
@@ -4,5 +4,5 @@ export default zElements => {
4
4
  const zObject = z.object(zElements).strict();
5
5
  if (!Object.values(zElements).every(zElement => zElement.isOptional())) return zObject;
6
6
 
7
- return z.custom(inputBody => inputBody===undefined ? true : zObject.parse(inputBody));
7
+ return z.custom(unifiedBody => unifiedBody===undefined ? true : zObject.parse(unifiedBody));
8
8
  }
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+
3
+ import getOptionalObject from './getOptionalObject/index.js';
4
+ import get from './get/index.js';
5
+ import postError from './postError/index.js';
6
+ import zdb from './dbValidation.js';
7
+
8
+ export default { z, get, postError, zdb, getOptionalObject };
@@ -0,0 +1,15 @@
1
+ import API_SERVICE from '../../api/index.js';
2
+ import LOG_SERVICE from '../../log/index.js';
3
+
4
+ export default async (res, ROUTE_CODE, VALIDATOR, input) => {
5
+ const { MODELS, SERVICES } = API_SERVICE.get(), EVENT_CONTEXT = { MODELS, SERVICES };
6
+ const VALIDATION_ERROR = (await VALIDATOR(EVENT_CONTEXT).safeParseAsync(input)).error?.format();
7
+
8
+ if (!VALIDATION_ERROR) return false;
9
+
10
+ const MESSAGE = { ROUTE_CODE, VALIDATION_ERROR };
11
+ LOG_SERVICE.postError(MESSAGE);
12
+ res.status(400).json(MESSAGE);
13
+
14
+ return true;
15
+ }
@@ -1,13 +0,0 @@
1
- import { logger } from '../logger/index.js';
2
-
3
- const apiHandler = API => async (event, context) => {
4
- logger.log({
5
- ROUTE_CODE: 'LAMBDA_EVENT',
6
- EVENT_PATH: event.path,
7
- EVENT_METHOD: event.httpMethod,
8
- });
9
-
10
- return await API.run(event, context);
11
- };
12
-
13
- export { apiHandler };
@@ -1,51 +0,0 @@
1
- import lambdaAPICreateAPI from 'lambda-api';
2
-
3
- import { registerHealthService } from '../health/index.js';
4
- import { registerDatabaseService } from '../database/index.js';
5
- import { loadAndSyncModels } from '../model/index.js';
6
- import { registerService } from '../service/index.js';
7
- import { logger } from '../logger/index.js';
8
- import { apiHandler } from './apiHandler.js';
9
-
10
- const ROUTE_CODE = 'CREATE_API';
11
-
12
- const addCORS = API => {
13
- API.use((req, res, next) => { res.cors(); next(); });
14
- API.use((err, req, res, next) => { res.cors(); next(); });
15
- API.options('/*', (req, res) => {
16
- res.header('Access-Control-Allow-Origin', '*');
17
- res.header('Access-Control-Allow-Methods', 'OPTIONS, POST, GET, PUT, PATCH, DELETE');
18
- res.header('Access-Control-Allow-Headers', '*');
19
- res.header('Access-Control-Allow-Credentials', true);
20
- //logger.log('OPTIONS_SUCCESS');
21
- res.status(200).send({})
22
- });
23
- };
24
-
25
- const createAPI = () => {
26
- const API = lambdaAPICreateAPI();
27
-
28
- addCORS(API);
29
-
30
- API.registerService = (SERVICE_NAME, SRC_FOLDER='', MODULE_FOLDER='node_modules/') =>
31
- registerService(API, SERVICE_NAME, SRC_FOLDER, MODULE_FOLDER);
32
-
33
- API.registerHealthService = () => registerHealthService(API);
34
-
35
- API.registerDatabaseService = async () => { await registerDatabaseService(API) };
36
-
37
- API.handler = async () => {
38
- if (API.ORM) API.MODELS = await loadAndSyncModels(API);
39
- else logger.log({ ROUTE_CODE, INFO: 'NO_DATABASE_REGISTERED' });
40
-
41
- logger.log({ ROUTE_CODE, INFO: 'LISTENING' });
42
- return apiHandler(API);
43
- }
44
-
45
- API.SERVICES = {};
46
-
47
-
48
- return API;
49
- }
50
-
51
- export { createAPI };
@@ -1 +0,0 @@
1
- export default ERROR => { if (process.env.MM_API_DEV_ENV==='TRUE') throw ERROR; };
@@ -1,3 +0,0 @@
1
- import crasher from './crasher.js';
2
-
3
- export { crasher };
@@ -1,49 +0,0 @@
1
- import Sequelize from 'sequelize';
2
- //import SequelizeDynamo from 'dynamo-sequelize';
3
-
4
- import { logger } from '../logger/index.js';
5
- import { crasher } from '../crasher/index.js';
6
-
7
- const ROUTE_CODE = 'DB_CONNECTION';
8
-
9
- const establishConnection = async ORM => {
10
- const MAX_RETRIES = 5, INITIAL_WAIT = 100;
11
- let connectionRetries = 0, waitTime = INITIAL_WAIT;
12
-
13
- while (connectionRetries < MAX_RETRIES) {
14
- try {
15
- logger.log({ ROUTE_CODE, AUTH_INTENT: connectionRetries });
16
- await ORM.authenticate();
17
- break;
18
-
19
- } catch (DATABASE_CONNECTION_ERROR) {
20
- await new Promise(resolve => setTimeout(resolve, waitTime));
21
-
22
- connectionRetries += 1;
23
- const jitter = Math.random() * 0.3 + 0.7;
24
- waitTime = Math.min(2 * waitTime * jitter, INITIAL_WAIT * Math.pow(2, MAX_RETRIES));
25
- }
26
- }
27
-
28
- return connectionRetries;
29
- };
30
-
31
- const registerDatabaseService = async API => {
32
- try {
33
- const { MM_API_DB_DIALECT, MM_API_DB_DB, MM_API_DB_USER,
34
- MM_API_DB_PASS, MM_API_DB_HOST, MM_API_DB_PORT, MM_API_DB_STORAGE } = process.env;
35
- const SEQUELIZE_OPTIONS = { dialect: MM_API_DB_DIALECT, host: MM_API_DB_HOST,
36
- port: MM_API_DB_PORT, storage: MM_API_DB_STORAGE, logging: false };
37
-
38
- logger.qa({ ROUTE_CODE, MM_API_DB_VARS: { MM_API_DB_DIALECT,
39
- MM_API_DB_USER, MM_API_DB_PASS, MM_API_DB_HOST, MM_API_DB_PORT, MM_API_DB_DB, MM_API_DB_STORAGE }});
40
- API.ORM = new Sequelize(MM_API_DB_DB, MM_API_DB_USER, MM_API_DB_PASS, SEQUELIZE_OPTIONS);
41
- establishConnection(API.ORM);
42
-
43
- } catch (REGISTER_DB_ERROR) {
44
- logger.error({ ROUTE_CODE, REGISTER_DB_ERROR });
45
- crasher(REGISTER_DB_ERROR);
46
- }
47
- };
48
-
49
- export { establishConnection, registerDatabaseService };
@@ -1,10 +0,0 @@
1
- import lambdaServer from './lambdaServer.js';
2
-
3
- const createDevEnvironment = async (ENV_FILE='.env', MODULE_FOLDER='node_modules/') => {
4
- const { loadEnvFile } = await import('./loadEnvFile.js');
5
- loadEnvFile(ENV_FILE, MODULE_FOLDER);
6
-
7
- return lambdaServer;
8
- }
9
-
10
- export default createDevEnvironment;
@@ -1,9 +0,0 @@
1
- const createTestEnvironment = async () => {
2
- process.env.MM_API_DEV_ENV = 'TRUE';
3
- process.env.MM_API_PROD_ENV = 'FALSE';
4
- process.env.MM_API_TEST_ENV = 'TRUE';
5
- process.env.MM_API_DB_DIALECT = 'sqlite';
6
- process.env.MM_API_DB_STORAGE = ':memory:';
7
- }
8
-
9
- export default createTestEnvironment;
@@ -1,4 +0,0 @@
1
- import createDevEnvironment from './createDevEnvironment.js';
2
- import createTestEnvironment from './createTestEnvironment.js';
3
-
4
- export { createTestEnvironment, createDevEnvironment };
@@ -1,11 +0,0 @@
1
- import http from 'http';
2
-
3
- import { getServerHandler } from './serverHandler.js';
4
-
5
- const lambdaServer = (lambdaHandler, port) => {
6
- const serverHandler = getServerHandler(lambdaHandler);
7
- const server = http.createServer(serverHandler);
8
- server.listen(port);
9
- }
10
-
11
- export default lambdaServer;
@@ -1,15 +0,0 @@
1
- import { logger } from '../logger/index.js';
2
-
3
- const healthHandler = () => {
4
- return "API_RUNNING";
5
- }
6
-
7
- const registerHealthService = API => {
8
- API.get('/', async (req, res) => {
9
- const SERVICE_RESPONSE = healthHandler();
10
- logger.log({ SERVICE_RESPONSE });
11
- return { SERVICE_RESPONSE };
12
- });
13
- }
14
-
15
- export { registerHealthService };
@@ -1,3 +0,0 @@
1
- import logger from './logger.js';
2
-
3
- export { logger };
@@ -1,5 +0,0 @@
1
- export default {
2
- error: (...ERROR) => { console.error(...ERROR) },
3
- log: (...MESSAGE) => { console.log(...MESSAGE) },
4
- qa: (...MESSAGE) => { if (process.env.MM_API_PROD_ENV==='FALSE') console.log(...MESSAGE) }
5
- };
@@ -1,33 +0,0 @@
1
- import { DataTypes } from 'sequelize';
2
-
3
- import { logger } from '../logger/index.js';
4
-
5
- const ROUTE_CODE = 'LOAD_MODELS';
6
-
7
- const modelSchemas = {};
8
-
9
- const registerModel = async (SERVICE_NAME, SERVICE_URL) => {
10
- const SERVICE_MODEL_MODULE = await import(`${SERVICE_URL}model.js`);
11
- modelSchemas[SERVICE_NAME] = SERVICE_MODEL_MODULE.default(SERVICE_NAME);
12
- }
13
-
14
- const loadAndSyncModels = async API => {
15
- const MODELS = Object.keys(modelSchemas).reduce((loadedModels, serviceName) => {
16
- logger.log({ ROUTE_CODE, LOADING_MODEL: serviceName });
17
- loadedModels[serviceName] = modelSchemas[serviceName](API.ORM, DataTypes);
18
- return loadedModels;
19
- }, {});
20
-
21
- Object.entries(MODELS).forEach(([serviceName, model]) => {
22
- logger.log({ ROUTE_CODE, ASSOCIATING_MODEL: serviceName });
23
- model.associate(MODELS);
24
- });
25
-
26
- logger.log({ ROUTE_CODE, SYNCING_ORM: 'WAITING_FOR_ORM_SYNCING' });
27
- await API.ORM.sync({ alter: process.env.MM_API_DEV_ENV==='TRUE' ? true : false });
28
- logger.log({ ROUTE_CODE, SYNCING_ORM: 'DONE_ORM_SYNCING' });
29
-
30
- return MODELS;
31
- };
32
-
33
- export { registerModel, loadAndSyncModels };
@@ -1,4 +0,0 @@
1
- import { registerService } from './registerService.js';
2
-
3
- export { registerService };
4
-
@@ -1,25 +0,0 @@
1
- import { logger } from '../logger/index.js';
2
-
3
- const methodHandler = async (res, METHOD, EVENT_CONTEXT) => {
4
- const { body, ROUTE_CODE } = EVENT_CONTEXT;
5
-
6
- try {
7
-
8
- const validation = await METHOD.VALIDATOR(EVENT_CONTEXT).safeParseAsync(body);
9
- if (validation.success) {
10
- const METHOD_RESPONSE = await METHOD.handler(EVENT_CONTEXT);
11
- logger.log({ ROUTE_CODE, METHOD_RESPONSE: METHOD_RESPONSE ? METHOD_RESPONSE.toString(): METHOD_RESPONSE });
12
- res.status(200).json(METHOD_RESPONSE); return;
13
- }
14
-
15
- const VALIDATION_ERROR = validation.error.format();
16
- logger.error({ ROUTE_CODE, VALIDATION_ERROR });
17
- res.status(400).json({ ROUTE_CODE, VALIDATION_ERROR });
18
- }
19
- catch (METHOD_ERROR) {
20
- logger.error({ ROUTE_CODE, METHOD_ERROR: METHOD_ERROR.stack });
21
- res.status(500).json({ ROUTE_CODE, METHOD_ERROR: METHOD_ERROR.stack.toString() });
22
- }
23
- };
24
-
25
- export { methodHandler };
@@ -1,36 +0,0 @@
1
- import fs from 'fs';
2
- import url from 'url';
3
- import path from 'path';
4
-
5
- import { z, optionalZObject } from '../zod/index.js';
6
- import { logger } from '../logger/index.js';
7
- import { crasher } from '../crasher/index.js';
8
-
9
- const registerMethod = async (SERVICE_NAME, SERVICE_URL, METHOD_NAME, METHOD_ROUTE_CODE) => {
10
-
11
- const ROUTE_CODE = 'REGISTER_METHOD_' + METHOD_ROUTE_CODE;
12
- const method = { VALIDATOR: EVENT_CONTEXT => z.undefined() };
13
-
14
- try {
15
- logger.log(' FOUND_METHOD', METHOD_NAME);
16
-
17
- method.handler = (await import(new URL(`${METHOD_NAME}/index.js`, SERVICE_URL))).default;
18
-
19
- const VALIDATOR_URL = new URL(`${METHOD_NAME}/valid.js`, SERVICE_URL);
20
- if (fs.existsSync(url.fileURLToPath(VALIDATOR_URL))) {
21
-
22
- logger.log(' FOUND_VALIDATOR');
23
-
24
- const Z_ELEMENTS = (await import(VALIDATOR_URL)).default;
25
- method.VALIDATOR = EVENT_CONTEXT => optionalZObject(Z_ELEMENTS(EVENT_CONTEXT));
26
- }
27
-
28
- return method;
29
-
30
- } catch (REGISTER_METHOD_ERROR) {
31
- logger.error({ ROUTE_CODE, REGISTER_METHOD_ERROR, STACK_TRASE: REGISTER_METHOD_ERROR.stack });
32
- crasher(REGISTER_METHOD_ERROR);
33
- }
34
- };
35
-
36
- export { registerMethod };