@carbonorm/carbonnode 3.0.8 → 3.0.10

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.
package/dist/index.cjs.js CHANGED
@@ -317,14 +317,14 @@ var isNode = typeof process !== 'undefined' && !!((_a = process.versions) === nu
317
317
  /**
318
318
  * Facade: routes API calls to SQL or HTTP executors based on runtime context.
319
319
  */
320
- function restRequest(configFn) {
320
+ function restRequest(configX) {
321
321
  var _this = this;
322
322
  return function (request) { return tslib.__awaiter(_this, void 0, void 0, function () {
323
323
  var config, SqlExecutor, executor, HttpExecutor, http;
324
324
  return tslib.__generator(this, function (_a) {
325
325
  switch (_a.label) {
326
326
  case 0:
327
- config = configFn();
327
+ config = typeof configX === "function" ? configX() : configX;
328
328
  if (!(isNode && config.mysqlPool)) return [3 /*break*/, 2];
329
329
  return [4 /*yield*/, Promise.resolve().then(function () { return SqlExecutor$1; })];
330
330
  case 1:
@@ -342,12 +342,11 @@ function restRequest(configFn) {
342
342
  }
343
343
 
344
344
  function restOrm(config) {
345
- return {
346
- Get: restRequest(function () { return (tslib.__assign(tslib.__assign({}, config()), { requestMethod: "GET" })); }),
347
- Put: restRequest(function () { return (tslib.__assign(tslib.__assign({}, config()), { requestMethod: "PUT" })); }),
348
- Post: restRequest(function () { return (tslib.__assign(tslib.__assign({}, config()), { requestMethod: "POST" })); }),
349
- Delete: restRequest(function () { return (tslib.__assign(tslib.__assign({}, config()), { requestMethod: "DELETE" })); }),
350
- };
345
+ var methods = ["GET", "PUT", "POST", "DELETE"];
346
+ return Object.fromEntries(methods.map(function (method) { return [
347
+ method[0] + method.slice(1).toLowerCase(), // Capitalize e.g. "Get"
348
+ restRequest(function () { return (tslib.__assign(tslib.__assign({}, config()), { requestMethod: method })); })
349
+ ]; }));
351
350
  }
352
351
 
353
352
  function timeout(shouldContinueAfterTimeout, cb, timeoutMs) {
@@ -831,458 +830,466 @@ var HttpExecutor = /** @class */ (function (_super) {
831
830
  var _a, debug, _b, cacheResults, dataInsertMultipleRows, success, _c, fetchDependencies, _d, error, querySerialized, cacheResult, cachingConfirmed, cacheCheck, cacheCheck, addBackPK, apiResponse, returnGetNextPageFunction, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKey, removedPkValue_1, axiosActiveRequest;
832
831
  var _e;
833
832
  var _this = this;
834
- var _f, _g, _h, _j, _k, _l;
835
- return tslib.__generator(this, function (_m) {
836
- _a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success, _c = _a.fetchDependencies, fetchDependencies = _c === void 0 ? exports.eFetchDependencies.NONE : _c, _d = _a.error, error = _d === void 0 ? "An unexpected API error occurred!" : _d;
837
- if (C6.GET === requestMethod
838
- && undefined !== ((_f = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _f === void 0 ? void 0 : _f[C6.PAGE])
839
- && 1 !== query[C6.PAGINATION][C6.PAGE]) {
840
- console.groupCollapsed('Request on table (' + tableName + ') is firing for page (' + query[C6.PAGINATION][C6.PAGE] + '), please wait!');
841
- console.log('Request Data (note you may see the success and/or error prompt):', this.request);
842
- console.trace();
843
- console.groupEnd();
844
- }
845
- querySerialized = sortAndSerializeQueryObject(tables, query !== null && query !== void 0 ? query : {});
846
- cacheResult = exports.apiRequestCache.find(function (cache) { return cache.requestArgumentsSerialized === querySerialized; });
847
- cachingConfirmed = false;
848
- // determine if we need to paginate.
849
- if (requestMethod === C6.GET) {
850
- if (undefined === (query === null || query === void 0 ? void 0 : query[C6.PAGINATION])) {
851
- if (undefined === query || null === query) {
852
- query = {};
833
+ var _f, _g, _h, _j, _k, _l, _m, _o;
834
+ return tslib.__generator(this, function (_p) {
835
+ switch (_p.label) {
836
+ case 0:
837
+ _a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success, _c = _a.fetchDependencies, fetchDependencies = _c === void 0 ? exports.eFetchDependencies.NONE : _c, _d = _a.error, error = _d === void 0 ? "An unexpected API error occurred!" : _d;
838
+ if (C6.GET === requestMethod
839
+ && undefined !== ((_f = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _f === void 0 ? void 0 : _f[C6.PAGE])
840
+ && 1 !== query[C6.PAGINATION][C6.PAGE]) {
841
+ console.groupCollapsed('Request on table (' + tableName + ') is firing for page (' + query[C6.PAGINATION][C6.PAGE] + '), please wait!');
842
+ console.log('Request Data (note you may see the success and/or error prompt):', this.request);
843
+ console.trace();
844
+ console.groupEnd();
853
845
  }
854
- query[C6.PAGINATION] = {};
855
- }
856
- query[C6.PAGINATION][C6.PAGE] = query[C6.PAGINATION][C6.PAGE] || 1;
857
- query[C6.PAGINATION][C6.LIMIT] = query[C6.PAGINATION][C6.LIMIT] || 100;
858
- // this will evaluate true most the time
859
- if (true === cacheResults) {
860
- // just find the next, non-fetched, page and return a function to request it
861
- if (undefined !== cacheResult) {
862
- do {
863
- cacheCheck = checkCache(cacheResult, requestMethod, tableName, this.request);
864
- if (false !== cacheCheck) {
865
- return [2 /*return*/, cacheCheck];
866
- }
867
- // this line incrementing page is why we return recursively
868
- ++query[C6.PAGINATION][C6.PAGE];
869
- // this json stringify is to capture the new page number
870
- querySerialized = sortAndSerializeQueryObject(tables, query !== null && query !== void 0 ? query : {});
871
- cacheResult = exports.apiRequestCache.find(function (cache) { return cache.requestArgumentsSerialized === querySerialized; });
872
- } while (undefined !== cacheResult);
873
- if (debug && isDevelopment) {
874
- reactToastify.toast.warning("DEVS: Request in cache. (" + exports.apiRequestCache.findIndex(function (cache) { return cache.requestArgumentsSerialized === querySerialized; }) + "). Returning function to request page (" + query[C6.PAGINATION][C6.PAGE] + ")", toastOptionsDevs);
846
+ querySerialized = sortAndSerializeQueryObject(tables, query !== null && query !== void 0 ? query : {});
847
+ cacheResult = exports.apiRequestCache.find(function (cache) { return cache.requestArgumentsSerialized === querySerialized; });
848
+ cachingConfirmed = false;
849
+ if (!(requestMethod === C6.GET)) return [3 /*break*/, 9];
850
+ if (undefined === (query === null || query === void 0 ? void 0 : query[C6.PAGINATION])) {
851
+ if (undefined === query || null === query) {
852
+ query = {};
875
853
  }
876
- // @ts-ignore - this is an incorrect warning on TS, it's well typed
877
- return [2 /*return*/, apiRequest];
854
+ query[C6.PAGINATION] = {};
855
+ }
856
+ query[C6.PAGINATION][C6.PAGE] = query[C6.PAGINATION][C6.PAGE] || 1;
857
+ query[C6.PAGINATION][C6.LIMIT] = query[C6.PAGINATION][C6.LIMIT] || 100;
858
+ if (!(true === cacheResults)) return [3 /*break*/, 7];
859
+ if (!(undefined !== cacheResult)) return [3 /*break*/, 6];
860
+ _p.label = 1;
861
+ case 1:
862
+ cacheCheck = checkCache(cacheResult, requestMethod, tableName, this.request);
863
+ if (!(false !== cacheCheck)) return [3 /*break*/, 3];
864
+ return [4 /*yield*/, cacheCheck];
865
+ case 2: return [2 /*return*/, (_g = (_p.sent())) === null || _g === void 0 ? void 0 : _g.data];
866
+ case 3:
867
+ // this line incrementing page is why we return recursively
868
+ ++query[C6.PAGINATION][C6.PAGE];
869
+ // this json stringify is to capture the new page number
870
+ querySerialized = sortAndSerializeQueryObject(tables, query !== null && query !== void 0 ? query : {});
871
+ cacheResult = exports.apiRequestCache.find(function (cache) { return cache.requestArgumentsSerialized === querySerialized; });
872
+ _p.label = 4;
873
+ case 4:
874
+ if (undefined !== cacheResult) return [3 /*break*/, 1];
875
+ _p.label = 5;
876
+ case 5:
877
+ if (debug && isDevelopment) {
878
+ reactToastify.toast.warning("DEVS: Request in cache. (" + exports.apiRequestCache.findIndex(function (cache) { return cache.requestArgumentsSerialized === querySerialized; }) + "). Returning function to request page (" + query[C6.PAGINATION][C6.PAGE] + ")", toastOptionsDevs);
878
879
  }
880
+ // @ts-ignore - this is an incorrect warning on TS, it's well typed
881
+ return [2 /*return*/, apiRequest];
882
+ case 6:
879
883
  cachingConfirmed = true;
880
- }
881
- else {
884
+ return [3 /*break*/, 8];
885
+ case 7:
882
886
  if (debug && isDevelopment) {
883
887
  reactToastify.toast.info("DEVS: Ignore cache was set to true.", toastOptionsDevs);
884
888
  }
885
- }
886
- if (debug && isDevelopment) {
887
- reactToastify.toast.success("DEVS: Request not in cache." + (requestMethod === C6.GET ? "Page (" + query[C6.PAGINATION][C6.PAGE] + ")." : '') + " Logging cache 2 console.", toastOptionsDevs);
888
- }
889
- }
890
- else if (cacheResults) { // if we are not getting, we are updating, deleting, or inserting
891
- if (cacheResult) {
892
- cacheCheck = checkCache(cacheResult, requestMethod, tableName, this.request);
893
- if (false !== cacheCheck) {
894
- return [2 /*return*/, cacheCheck];
895
- }
896
- }
897
- cachingConfirmed = true;
898
- // push to cache so we do not repeat the request
899
- }
900
- returnGetNextPageFunction = false;
901
- restRequestUri = restURL + operatingTable + '/';
902
- needsConditionOrPrimaryCheck = (PUT === requestMethod || DELETE === requestMethod)
903
- && false === skipPrimaryCheck;
904
- TABLES = C6.TABLES;
905
- primaryKey = (_k = (_j = (_h = structuredClone((_g = TABLES[operatingTable]) === null || _g === void 0 ? void 0 : _g.PRIMARY)) === null || _h === void 0 ? void 0 : _h.pop()) === null || _j === void 0 ? void 0 : _j.split('.')) === null || _k === void 0 ? void 0 : _k.pop();
906
- if (needsConditionOrPrimaryCheck) {
907
- if (undefined === primaryKey) {
908
- if (null === query
909
- || undefined === query
910
- || undefined === (query === null || query === void 0 ? void 0 : query[C6.WHERE])
911
- || (true === Array.isArray(query[C6.WHERE])
912
- || query[C6.WHERE].length === 0)
913
- || (Object.keys(query === null || query === void 0 ? void 0 : query[C6.WHERE]).length === 0)) {
914
- console.error(query);
915
- throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((_l = TABLES[operatingTable]) === null || _l === void 0 ? void 0 : _l.PRIMARY) + ') for operatingTable (' + operatingTable + ').');
889
+ _p.label = 8;
890
+ case 8:
891
+ if (debug && isDevelopment) {
892
+ reactToastify.toast.success("DEVS: Request not in cache." + (requestMethod === C6.GET ? "Page (" + query[C6.PAGINATION][C6.PAGE] + ")." : '') + " Logging cache 2 console.", toastOptionsDevs);
916
893
  }
917
- }
918
- else {
919
- if (undefined === query
920
- || null === query
921
- || false === primaryKey in query) {
922
- if (true === debug && isDevelopment) {
923
- reactToastify.toast.error('DEVS: The primary key (' + primaryKey + ') was not provided!!');
894
+ return [3 /*break*/, 12];
895
+ case 9:
896
+ if (!cacheResults) return [3 /*break*/, 12];
897
+ if (!cacheResult) return [3 /*break*/, 11];
898
+ cacheCheck = checkCache(cacheResult, requestMethod, tableName, this.request);
899
+ if (!(false !== cacheCheck)) return [3 /*break*/, 11];
900
+ return [4 /*yield*/, cacheCheck];
901
+ case 10: return [2 /*return*/, (_h = (_p.sent())) === null || _h === void 0 ? void 0 : _h.data];
902
+ case 11:
903
+ cachingConfirmed = true;
904
+ _p.label = 12;
905
+ case 12:
906
+ returnGetNextPageFunction = false;
907
+ restRequestUri = restURL + operatingTable + '/';
908
+ needsConditionOrPrimaryCheck = (PUT === requestMethod || DELETE === requestMethod)
909
+ && false === skipPrimaryCheck;
910
+ TABLES = C6.TABLES;
911
+ primaryKey = (_m = (_l = (_k = structuredClone((_j = TABLES[operatingTable]) === null || _j === void 0 ? void 0 : _j.PRIMARY)) === null || _k === void 0 ? void 0 : _k.pop()) === null || _l === void 0 ? void 0 : _l.split('.')) === null || _m === void 0 ? void 0 : _m.pop();
912
+ if (needsConditionOrPrimaryCheck) {
913
+ if (undefined === primaryKey) {
914
+ if (null === query
915
+ || undefined === query
916
+ || undefined === (query === null || query === void 0 ? void 0 : query[C6.WHERE])
917
+ || (true === Array.isArray(query[C6.WHERE])
918
+ || query[C6.WHERE].length === 0)
919
+ || (Object.keys(query === null || query === void 0 ? void 0 : query[C6.WHERE]).length === 0)) {
920
+ console.error(query);
921
+ throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((_o = TABLES[operatingTable]) === null || _o === void 0 ? void 0 : _o.PRIMARY) + ') for operatingTable (' + operatingTable + ').');
922
+ }
923
+ }
924
+ else {
925
+ if (undefined === query
926
+ || null === query
927
+ || false === primaryKey in query) {
928
+ if (true === debug && isDevelopment) {
929
+ reactToastify.toast.error('DEVS: The primary key (' + primaryKey + ') was not provided!!');
930
+ }
931
+ throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
932
+ }
933
+ if (undefined === (query === null || query === void 0 ? void 0 : query[primaryKey])
934
+ || null === (query === null || query === void 0 ? void 0 : query[primaryKey])) {
935
+ reactToastify.toast.error('The primary key (' + primaryKey + ') provided is undefined or null explicitly!!');
936
+ throw Error('The primary key (' + primaryKey + ') provided in the request was exactly equal to undefined.');
937
+ }
924
938
  }
925
- throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
926
939
  }
927
- if (undefined === (query === null || query === void 0 ? void 0 : query[primaryKey])
928
- || null === (query === null || query === void 0 ? void 0 : query[primaryKey])) {
929
- reactToastify.toast.error('The primary key (' + primaryKey + ') provided is undefined or null explicitly!!');
930
- throw Error('The primary key (' + primaryKey + ') provided in the request was exactly equal to undefined.');
940
+ // A part of me exists that wants to remove this, but it's a good feature
941
+ // this allows developers the ability to cache requests based on primary key
942
+ // for tables like `photos` this can be a huge performance boost
943
+ if (undefined !== query
944
+ && null !== query
945
+ && undefined !== primaryKey
946
+ && primaryKey in query) {
947
+ restRequestUri += query[primaryKey] + '/';
948
+ removedPkValue_1 = query[primaryKey];
949
+ addBackPK = function () {
950
+ query !== null && query !== void 0 ? query : (query = {});
951
+ query[primaryKey] = removedPkValue_1;
952
+ };
953
+ delete query[primaryKey];
954
+ console.log('query', query, 'primaryKey', primaryKey, 'removedPkValue', removedPkValue_1);
931
955
  }
932
- }
933
- }
934
- // A part of me exists that wants to remove this, but it's a good feature
935
- // this allows developers the ability to cache requests based on primary key
936
- // for tables like `photos` this can be a huge performance boost
937
- if (undefined !== query
938
- && null !== query
939
- && undefined !== primaryKey
940
- && primaryKey in query) {
941
- restRequestUri += query[primaryKey] + '/';
942
- removedPkValue_1 = query[primaryKey];
943
- addBackPK = function () {
944
- query !== null && query !== void 0 ? query : (query = {});
945
- query[primaryKey] = removedPkValue_1;
946
- };
947
- delete query[primaryKey];
948
- console.log('query', query, 'primaryKey', primaryKey, 'removedPkValue', removedPkValue_1);
949
- }
950
- else {
951
- console.log('query', query);
952
- }
953
- try {
954
- console.groupCollapsed('%c API: (' + requestMethod + ') Request Query for (' + operatingTable + ') is about to fire, will return with promise!', 'color: #A020F0');
955
- console.log(this.request);
956
- console.log('%c If this is the first request for this datatype; thus the value being set is currently undefined, please remember to update the state to null.', 'color: #A020F0');
957
- console.log('%c Remember undefined indicated the request has not fired, null indicates the request is firing, an empty array would signal no data was returned for the sql stmt.', 'color: #A020F0');
958
- console.trace();
959
- console.groupEnd();
960
- this.runLifecycleHooks("beforeExecution", {
961
- config: this.config,
962
- request: this.request
963
- });
964
- axiosActiveRequest = (_e = axios)[requestMethod.toLowerCase()].apply(_e, tslib.__spreadArray([restRequestUri], (function () {
965
- var convert = function (data) {
966
- return convertForRequestBody(data, fullTableList, C6, function (message) { return reactToastify.toast.error(message, toastOptions); });
967
- };
968
- var baseConfig = {
969
- withCredentials: withCredentials,
970
- };
971
- switch (requestMethod) {
972
- case GET:
973
- return [tslib.__assign(tslib.__assign({}, baseConfig), { params: query })];
974
- case POST:
975
- if (dataInsertMultipleRows !== undefined) {
976
- return [
977
- dataInsertMultipleRows.map(convert),
978
- baseConfig
979
- ];
980
- }
981
- return [convert(query), baseConfig];
982
- case PUT:
983
- return [convert(query), baseConfig];
984
- case DELETE:
985
- return [tslib.__assign(tslib.__assign({}, baseConfig), { data: convert(query) })];
986
- default:
987
- throw new Error("The request method (".concat(requestMethod, ") was not recognized."));
956
+ else {
957
+ console.log('query', query);
988
958
  }
989
- })(), false));
990
- if (cachingConfirmed) {
991
- // push to cache so we do not repeat the request
992
- exports.apiRequestCache.push({
993
- requestArgumentsSerialized: querySerialized,
994
- request: axiosActiveRequest
995
- });
996
- }
997
- // todo - wip verify this works
998
- // we had removed the value from the request to add to the URI.
999
- addBackPK === null || addBackPK === void 0 ? void 0 : addBackPK(); // adding back so post-processing methods work
1000
- // returning the promise with this then is important for tests. todo - we could make that optional.
1001
- // https://rapidapi.com/guides/axios-async-await
1002
- return [2 /*return*/, axiosActiveRequest.then(function (response) { return tslib.__awaiter(_this, void 0, void 0, function () {
1003
- var cacheIndex, callback, responseData_1, dependencies_1, fetchReferences_1, apiRequestPromises, _loop_1, _a, _b, _c, _i, tableToFetch;
1004
- var _this = this;
1005
- var _d, _e, _f, _g, _h, _j, _k;
1006
- return tslib.__generator(this, function (_l) {
1007
- switch (_l.label) {
1008
- case 0:
1009
- // noinspection SuspiciousTypeOfGuard
1010
- if (typeof response.data === 'string') {
1011
- if (isTest) {
1012
- console.trace();
1013
- throw new Error('The response data was a string this typically indicated html was sent. Make sure all cookies (' + JSON.stringify(response.config.headers) + ') needed are present! (' + response.data + ')');
1014
- }
1015
- return [2 /*return*/, Promise.reject(response)];
1016
- }
1017
- if (cachingConfirmed) {
1018
- cacheIndex = exports.apiRequestCache.findIndex(function (cache) { return cache.requestArgumentsSerialized === querySerialized; });
1019
- exports.apiRequestCache[cacheIndex].final = false === returnGetNextPageFunction;
1020
- // only cache get method requests
1021
- exports.apiRequestCache[cacheIndex].response = response;
1022
- }
1023
- this.runLifecycleHooks("afterExecution", {
1024
- config: this.config,
1025
- request: this.request,
1026
- response: response
1027
- });
1028
- // todo - this feels dumb now, but i digress
1029
- apiResponse = TestRestfulResponse(response, success, error);
1030
- if (false === apiResponse) {
1031
- if (debug && isDevelopment) {
1032
- reactToastify.toast.warning("DEVS: TestRestfulResponse returned false for (" + operatingTable + ").", toastOptionsDevs);
1033
- }
1034
- return [2 /*return*/, response];
1035
- }
1036
- callback = function () { return _this.runLifecycleHooks("afterCommit", {
1037
- config: _this.config,
1038
- request: _this.request,
1039
- response: response
1040
- }); };
1041
- if (undefined !== reactBootstrap && response) {
1042
- switch (requestMethod) {
1043
- case GET:
1044
- reactBootstrap.updateRestfulObjectArrays({
1045
- dataOrCallback: Array.isArray(response.data.rest) ? response.data.rest : [response.data.rest],
1046
- stateKey: this.config.restModel.TABLE_NAME,
1047
- uniqueObjectId: this.config.restModel.PRIMARY_SHORT,
1048
- callback: callback
1049
- });
1050
- break;
1051
- case POST:
1052
- this.postState(response, this.request, callback);
1053
- break;
1054
- case PUT:
1055
- this.putState(response, this.request, callback);
1056
- break;
1057
- case DELETE:
1058
- this.deleteState(response, this.request, callback);
1059
- break;
1060
- }
1061
- }
1062
- else {
1063
- callback();
1064
- }
1065
- if (!(C6.GET === requestMethod)) return [3 /*break*/, 6];
1066
- responseData_1 = response.data;
1067
- returnGetNextPageFunction = 1 !== ((_d = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _d === void 0 ? void 0 : _d[C6.LIMIT]) &&
1068
- ((_e = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _e === void 0 ? void 0 : _e[C6.LIMIT]) === responseData_1.rest.length;
1069
- if (false === isTest || true === isVerbose) {
1070
- console.groupCollapsed('%c API: Response (' + requestMethod + ' ' + tableName + ') returned length (' + ((_f = responseData_1.rest) === null || _f === void 0 ? void 0 : _f.length) + ') of possible (' + ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.LIMIT]) + ') limit!', 'color: #0c0');
1071
- console.log('%c ' + requestMethod + ' ' + tableName, 'color: #0c0');
1072
- console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #0c0', this.request);
1073
- console.log('%c Response Data:', 'color: #0c0', responseData_1.rest);
1074
- console.log('%c Will return get next page function:' + (1 !== ((_h = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _h === void 0 ? void 0 : _h[C6.LIMIT]) ? '' : ' (Will not return with explicit limit 1 set)'), 'color: #0c0', true === returnGetNextPageFunction);
1075
- console.trace();
1076
- console.groupEnd();
1077
- }
1078
- if (false === returnGetNextPageFunction
1079
- && true === debug
1080
- && isDevelopment) {
1081
- reactToastify.toast.success("DEVS: Response returned length (" + ((_j = responseData_1.rest) === null || _j === void 0 ? void 0 : _j.length) + ") less than limit (" + ((_k = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _k === void 0 ? void 0 : _k[C6.LIMIT]) + ").", toastOptionsDevs);
959
+ try {
960
+ console.groupCollapsed('%c API: (' + requestMethod + ') Request Query for (' + operatingTable + ') is about to fire, will return with promise!', 'color: #A020F0');
961
+ console.log(this.request);
962
+ console.log('%c If this is the first request for this datatype; thus the value being set is currently undefined, please remember to update the state to null.', 'color: #A020F0');
963
+ console.log('%c Remember undefined indicated the request has not fired, null indicates the request is firing, an empty array would signal no data was returned for the sql stmt.', 'color: #A020F0');
964
+ console.trace();
965
+ console.groupEnd();
966
+ this.runLifecycleHooks("beforeExecution", {
967
+ config: this.config,
968
+ request: this.request
969
+ });
970
+ axiosActiveRequest = (_e = axios)[requestMethod.toLowerCase()].apply(_e, tslib.__spreadArray([restRequestUri], (function () {
971
+ var convert = function (data) {
972
+ return convertForRequestBody(data, fullTableList, C6, function (message) { return reactToastify.toast.error(message, toastOptions); });
973
+ };
974
+ var baseConfig = {
975
+ withCredentials: withCredentials,
976
+ };
977
+ switch (requestMethod) {
978
+ case GET:
979
+ return [tslib.__assign(tslib.__assign({}, baseConfig), { params: query })];
980
+ case POST:
981
+ if (dataInsertMultipleRows !== undefined) {
982
+ return [
983
+ dataInsertMultipleRows.map(convert),
984
+ baseConfig
985
+ ];
1082
986
  }
1083
- if (!(fetchDependencies
1084
- && 'number' === typeof fetchDependencies
1085
- && responseData_1.rest.length > 0)) return [3 /*break*/, 6];
1086
- console.groupCollapsed('%c API: Fetch Dependencies segment (' + requestMethod + ' ' + tableName + ')'
1087
- + (fetchDependencies & exports.eFetchDependencies.CHILDREN ? ' | (CHILDREN|REFERENCED) ' : '')
1088
- + (fetchDependencies & exports.eFetchDependencies.PARENTS ? ' | (PARENTS|REFERENCED_BY)' : '')
1089
- + (fetchDependencies & exports.eFetchDependencies.C6ENTITY ? ' | (C6ENTITY)' : '')
1090
- + (fetchDependencies & exports.eFetchDependencies.RECURSIVE ? ' | (RECURSIVE)' : ''), 'color: #33ccff');
1091
- console.groupCollapsed('Collapsed JS Trace');
1092
- console.trace(); // hidden in collapsed group
1093
- console.groupEnd();
1094
- dependencies_1 = {};
1095
- if (fetchDependencies & exports.eFetchDependencies.C6ENTITY) {
1096
- dependencies_1 = operatingTable.endsWith("carbon_carbons")
1097
- ? tslib.__assign(tslib.__assign({}, fetchDependencies & exports.eFetchDependencies.CHILDREN // REFERENCED === CHILDREN
1098
- ? C6.TABLES[operatingTable].TABLE_REFERENCED_BY
1099
- : {}), fetchDependencies & exports.eFetchDependencies.PARENTS // REFERENCES === PARENTS
1100
- ? C6.TABLES[operatingTable].TABLE_REFERENCES
1101
- : {}) : tslib.__assign(tslib.__assign({}, fetchDependencies & exports.eFetchDependencies.CHILDREN // REFERENCED === CHILDREN
1102
- ? tslib.__assign(tslib.__assign({}, Object.keys(C6.TABLES[operatingTable].TABLE_REFERENCES).reduce(function (accumulator, columnName) {
1103
- if (!C6.TABLES[operatingTable].PRIMARY_SHORT.includes(columnName)) {
1104
- accumulator[columnName] = C6.TABLES[operatingTable].TABLE_REFERENCES[columnName];
987
+ return [convert(query), baseConfig];
988
+ case PUT:
989
+ return [convert(query), baseConfig];
990
+ case DELETE:
991
+ return [tslib.__assign(tslib.__assign({}, baseConfig), { data: convert(query) })];
992
+ default:
993
+ throw new Error("The request method (".concat(requestMethod, ") was not recognized."));
994
+ }
995
+ })(), false));
996
+ if (cachingConfirmed) {
997
+ // push to cache so we do not repeat the request
998
+ exports.apiRequestCache.push({
999
+ requestArgumentsSerialized: querySerialized,
1000
+ request: axiosActiveRequest
1001
+ });
1002
+ }
1003
+ // todo - wip verify this works
1004
+ // we had removed the value from the request to add to the URI.
1005
+ addBackPK === null || addBackPK === void 0 ? void 0 : addBackPK(); // adding back so post-processing methods work
1006
+ // returning the promise with this then is important for tests. todo - we could make that optional.
1007
+ // https://rapidapi.com/guides/axios-async-await
1008
+ return [2 /*return*/, axiosActiveRequest.then(function (response) { return tslib.__awaiter(_this, void 0, void 0, function () {
1009
+ var cacheIndex, callback, responseData_1, dependencies_1, fetchReferences_1, apiRequestPromises, _loop_1, _a, _b, _c, _i, tableToFetch;
1010
+ var _this = this;
1011
+ var _d, _e, _f, _g, _h, _j, _k;
1012
+ return tslib.__generator(this, function (_l) {
1013
+ switch (_l.label) {
1014
+ case 0:
1015
+ // noinspection SuspiciousTypeOfGuard
1016
+ if (typeof response.data === 'string') {
1017
+ if (isTest) {
1018
+ console.trace();
1019
+ throw new Error('The response data was a string this typically indicated html was sent. Make sure all cookies (' + JSON.stringify(response.config.headers) + ') needed are present! (' + response.data + ')');
1105
1020
  }
1106
- return accumulator;
1107
- }, {})), C6.TABLES[operatingTable].TABLE_REFERENCED_BY // it is unlikely that a C6 table will have any TABLE_REFERENCED_BY
1108
- ) : {}), fetchDependencies & exports.eFetchDependencies.PARENTS // REFERENCES === PARENTS
1109
- ? C6.TABLES[operatingTable].PRIMARY_SHORT.reduce(function (accumulator, primaryKey) {
1110
- if (primaryKey in C6.TABLES[operatingTable].TABLE_REFERENCES) {
1111
- accumulator[primaryKey] = C6.TABLES[operatingTable].TABLE_REFERENCES[primaryKey];
1021
+ return [2 /*return*/, Promise.reject(response)];
1022
+ }
1023
+ if (cachingConfirmed) {
1024
+ cacheIndex = exports.apiRequestCache.findIndex(function (cache) { return cache.requestArgumentsSerialized === querySerialized; });
1025
+ exports.apiRequestCache[cacheIndex].final = false === returnGetNextPageFunction;
1026
+ // only cache get method requests
1027
+ exports.apiRequestCache[cacheIndex].response = response;
1028
+ }
1029
+ this.runLifecycleHooks("afterExecution", {
1030
+ config: this.config,
1031
+ request: this.request,
1032
+ response: response
1033
+ });
1034
+ // todo - this feels dumb now, but i digress
1035
+ apiResponse = TestRestfulResponse(response, success, error);
1036
+ if (false === apiResponse) {
1037
+ if (debug && isDevelopment) {
1038
+ reactToastify.toast.warning("DEVS: TestRestfulResponse returned false for (" + operatingTable + ").", toastOptionsDevs);
1112
1039
  }
1113
- return accumulator;
1114
- }, {})
1115
- : {});
1116
- }
1117
- else {
1118
- // this is the natural mysql context
1119
- dependencies_1 = tslib.__assign(tslib.__assign({}, fetchDependencies & exports.eFetchDependencies.REFERENCED // REFERENCED === CHILDREN
1120
- ? C6.TABLES[operatingTable].TABLE_REFERENCED_BY
1121
- : {}), fetchDependencies & exports.eFetchDependencies.REFERENCES // REFERENCES === PARENTS
1122
- ? C6.TABLES[operatingTable].TABLE_REFERENCES
1123
- : {});
1124
- }
1125
- fetchReferences_1 = {};
1126
- apiRequestPromises = [];
1127
- console.log('%c Dependencies', 'color: #005555', dependencies_1);
1128
- Object.keys(dependencies_1)
1129
- .forEach(function (column) { return dependencies_1[column]
1130
- .forEach(function (constraint) {
1131
- var _a, _b, _c, _d;
1132
- var _e, _f, _g;
1133
- var columnValues = (_b = (_a = responseData_1.rest[column]) !== null && _a !== void 0 ? _a : responseData_1.rest.map(function (row) {
1134
- if (operatingTable.endsWith("carbons")
1135
- && 'entity_tag' in row
1136
- && !constraint.TABLE.endsWith(row['entity_tag'].split('\\').pop().toLowerCase())) {
1137
- return false; // map
1040
+ return [2 /*return*/, response];
1138
1041
  }
1139
- if (!(column in row)) {
1140
- return false;
1042
+ callback = function () { return _this.runLifecycleHooks("afterCommit", {
1043
+ config: _this.config,
1044
+ request: _this.request,
1045
+ response: response
1046
+ }); };
1047
+ if (undefined !== reactBootstrap && response) {
1048
+ switch (requestMethod) {
1049
+ case GET:
1050
+ reactBootstrap.updateRestfulObjectArrays({
1051
+ dataOrCallback: Array.isArray(response.data.rest) ? response.data.rest : [response.data.rest],
1052
+ stateKey: this.config.restModel.TABLE_NAME,
1053
+ uniqueObjectId: this.config.restModel.PRIMARY_SHORT,
1054
+ callback: callback
1055
+ });
1056
+ break;
1057
+ case POST:
1058
+ this.postState(response, this.request, callback);
1059
+ break;
1060
+ case PUT:
1061
+ this.putState(response, this.request, callback);
1062
+ break;
1063
+ case DELETE:
1064
+ this.deleteState(response, this.request, callback);
1065
+ break;
1066
+ }
1141
1067
  }
1142
- // todo - row[column] is a FK value, we should optionally remove values that are already in state
1143
- // this could be any column in the table constraint.TABLE, not just the primary key
1144
- return row[column];
1145
- }).filter(function (n) { return n; })) !== null && _b !== void 0 ? _b : [];
1146
- if (columnValues.length === 0) {
1147
- return; // forEach
1148
- }
1149
- (_c = fetchReferences_1[_e = constraint.TABLE]) !== null && _c !== void 0 ? _c : (fetchReferences_1[_e] = {});
1150
- (_d = (_f = fetchReferences_1[constraint.TABLE])[_g = constraint.COLUMN]) !== null && _d !== void 0 ? _d : (_f[_g] = []);
1151
- fetchReferences_1[constraint.TABLE][constraint.COLUMN].push(columnValues);
1152
- }); });
1153
- console.log('fetchReferences', fetchReferences_1);
1154
- _loop_1 = function (tableToFetch) {
1155
- var referencesTables, shouldContinue, fetchTable, RestApi, nextFetchDependencies;
1156
- var _m;
1157
- return tslib.__generator(this, function (_o) {
1158
- switch (_o.label) {
1159
- case 0:
1160
- if (fetchDependencies & exports.eFetchDependencies.C6ENTITY
1161
- && 'string' === typeof tableName
1162
- && tableName.endsWith("carbon_carbons")) {
1163
- referencesTables = responseData_1.rest.reduce(function (accumulator, row) {
1164
- if ('entity_tag' in row && !accumulator.includes(row['entity_tag'])) {
1165
- accumulator.push(row['entity_tag']);
1166
- }
1167
- return accumulator;
1168
- }, []).map(function (entityTag) { return entityTag.split('\\').pop().toLowerCase(); });
1169
- shouldContinue = referencesTables.find(function (referencesTable) { return tableToFetch.endsWith(referencesTable); });
1170
- if (!shouldContinue) {
1171
- console.log('%c C6ENTITY: The constraintTableName (' + tableToFetch + ') did not end with any value in referencesTables', 'color: #c00', referencesTables);
1172
- return [2 /*return*/, "continue"];
1068
+ else {
1069
+ callback();
1070
+ }
1071
+ if (!(C6.GET === requestMethod)) return [3 /*break*/, 6];
1072
+ responseData_1 = response.data;
1073
+ returnGetNextPageFunction = 1 !== ((_d = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _d === void 0 ? void 0 : _d[C6.LIMIT]) &&
1074
+ ((_e = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _e === void 0 ? void 0 : _e[C6.LIMIT]) === responseData_1.rest.length;
1075
+ if (false === isTest || true === isVerbose) {
1076
+ console.groupCollapsed('%c API: Response (' + requestMethod + ' ' + tableName + ') returned length (' + ((_f = responseData_1.rest) === null || _f === void 0 ? void 0 : _f.length) + ') of possible (' + ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.LIMIT]) + ') limit!', 'color: #0c0');
1077
+ console.log('%c ' + requestMethod + ' ' + tableName, 'color: #0c0');
1078
+ console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #0c0', this.request);
1079
+ console.log('%c Response Data:', 'color: #0c0', responseData_1.rest);
1080
+ console.log('%c Will return get next page function:' + (1 !== ((_h = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _h === void 0 ? void 0 : _h[C6.LIMIT]) ? '' : ' (Will not return with explicit limit 1 set)'), 'color: #0c0', true === returnGetNextPageFunction);
1081
+ console.trace();
1082
+ console.groupEnd();
1083
+ }
1084
+ if (false === returnGetNextPageFunction
1085
+ && true === debug
1086
+ && isDevelopment) {
1087
+ reactToastify.toast.success("DEVS: Response returned length (" + ((_j = responseData_1.rest) === null || _j === void 0 ? void 0 : _j.length) + ") less than limit (" + ((_k = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _k === void 0 ? void 0 : _k[C6.LIMIT]) + ").", toastOptionsDevs);
1088
+ }
1089
+ if (!(fetchDependencies
1090
+ && 'number' === typeof fetchDependencies
1091
+ && responseData_1.rest.length > 0)) return [3 /*break*/, 6];
1092
+ console.groupCollapsed('%c API: Fetch Dependencies segment (' + requestMethod + ' ' + tableName + ')'
1093
+ + (fetchDependencies & exports.eFetchDependencies.CHILDREN ? ' | (CHILDREN|REFERENCED) ' : '')
1094
+ + (fetchDependencies & exports.eFetchDependencies.PARENTS ? ' | (PARENTS|REFERENCED_BY)' : '')
1095
+ + (fetchDependencies & exports.eFetchDependencies.C6ENTITY ? ' | (C6ENTITY)' : '')
1096
+ + (fetchDependencies & exports.eFetchDependencies.RECURSIVE ? ' | (RECURSIVE)' : ''), 'color: #33ccff');
1097
+ console.groupCollapsed('Collapsed JS Trace');
1098
+ console.trace(); // hidden in collapsed group
1099
+ console.groupEnd();
1100
+ dependencies_1 = {};
1101
+ if (fetchDependencies & exports.eFetchDependencies.C6ENTITY) {
1102
+ dependencies_1 = operatingTable.endsWith("carbon_carbons")
1103
+ ? tslib.__assign(tslib.__assign({}, fetchDependencies & exports.eFetchDependencies.CHILDREN // REFERENCED === CHILDREN
1104
+ ? C6.TABLES[operatingTable].TABLE_REFERENCED_BY
1105
+ : {}), fetchDependencies & exports.eFetchDependencies.PARENTS // REFERENCES === PARENTS
1106
+ ? C6.TABLES[operatingTable].TABLE_REFERENCES
1107
+ : {}) : tslib.__assign(tslib.__assign({}, fetchDependencies & exports.eFetchDependencies.CHILDREN // REFERENCED === CHILDREN
1108
+ ? tslib.__assign(tslib.__assign({}, Object.keys(C6.TABLES[operatingTable].TABLE_REFERENCES).reduce(function (accumulator, columnName) {
1109
+ if (!C6.TABLES[operatingTable].PRIMARY_SHORT.includes(columnName)) {
1110
+ accumulator[columnName] = C6.TABLES[operatingTable].TABLE_REFERENCES[columnName];
1173
1111
  }
1174
- console.log('%c C6ENTITY: The constraintTableName (' + tableToFetch + ') will be fetched.', 'color: #0c0');
1175
- }
1176
- return [4 /*yield*/, C6.IMPORT(tableToFetch)];
1177
- case 1:
1178
- fetchTable = _o.sent();
1179
- RestApi = fetchTable.default;
1180
- console.log('%c Fetch Dependencies will select (' + tableToFetch + ') using GET request', 'color: #33ccff');
1181
- nextFetchDependencies = exports.eFetchDependencies.NONE;
1182
- if (fetchDependencies & exports.eFetchDependencies.RECURSIVE) {
1183
- if (fetchDependencies & exports.eFetchDependencies.ALL) {
1184
- throw Error('Recursive fetch dependencies with both PARENT and CHILD reference will result in an infin1ite loop. As there is not real ending condition, this is not supported.');
1112
+ return accumulator;
1113
+ }, {})), C6.TABLES[operatingTable].TABLE_REFERENCED_BY // it is unlikely that a C6 table will have any TABLE_REFERENCED_BY
1114
+ ) : {}), fetchDependencies & exports.eFetchDependencies.PARENTS // REFERENCES === PARENTS
1115
+ ? C6.TABLES[operatingTable].PRIMARY_SHORT.reduce(function (accumulator, primaryKey) {
1116
+ if (primaryKey in C6.TABLES[operatingTable].TABLE_REFERENCES) {
1117
+ accumulator[primaryKey] = C6.TABLES[operatingTable].TABLE_REFERENCES[primaryKey];
1185
1118
  }
1186
- nextFetchDependencies = fetchDependencies;
1119
+ return accumulator;
1120
+ }, {})
1121
+ : {});
1122
+ }
1123
+ else {
1124
+ // this is the natural mysql context
1125
+ dependencies_1 = tslib.__assign(tslib.__assign({}, fetchDependencies & exports.eFetchDependencies.REFERENCED // REFERENCED === CHILDREN
1126
+ ? C6.TABLES[operatingTable].TABLE_REFERENCED_BY
1127
+ : {}), fetchDependencies & exports.eFetchDependencies.REFERENCES // REFERENCES === PARENTS
1128
+ ? C6.TABLES[operatingTable].TABLE_REFERENCES
1129
+ : {});
1130
+ }
1131
+ fetchReferences_1 = {};
1132
+ apiRequestPromises = [];
1133
+ console.log('%c Dependencies', 'color: #005555', dependencies_1);
1134
+ Object.keys(dependencies_1)
1135
+ .forEach(function (column) { return dependencies_1[column]
1136
+ .forEach(function (constraint) {
1137
+ var _a, _b, _c, _d;
1138
+ var _e, _f, _g;
1139
+ var columnValues = (_b = (_a = responseData_1.rest[column]) !== null && _a !== void 0 ? _a : responseData_1.rest.map(function (row) {
1140
+ if (operatingTable.endsWith("carbons")
1141
+ && 'entity_tag' in row
1142
+ && !constraint.TABLE.endsWith(row['entity_tag'].split('\\').pop().toLowerCase())) {
1143
+ return false; // map
1187
1144
  }
1188
- else if (fetchDependencies & exports.eFetchDependencies.C6ENTITY) {
1189
- if (tableToFetch === "carbon_carbons") {
1190
- nextFetchDependencies = fetchDependencies;
1191
- }
1192
- else {
1193
- nextFetchDependencies = fetchDependencies ^ exports.eFetchDependencies.C6ENTITY;
1194
- }
1145
+ if (!(column in row)) {
1146
+ return false;
1195
1147
  }
1196
- console.log('fetchReferences', fetchReferences_1[tableToFetch], "Current fetchDependencies for (" + operatingTable + "):", fetchDependencies, "New fetchDependencies for (" + tableToFetch + "): ", nextFetchDependencies);
1197
- // todo - filter out ids that exist in state?!? note - remember that this does not necessarily mean the pk, but only known is its an FK to somewhere
1198
- // it not certain that they are using carbons' entities either
1199
- // this is a dynamic call to the rest api, any generated table may resolve with (RestApi)
1200
- // todo - using value to avoid joins.... but. maybe this should be a parameterizable option -- think race conditions; its safer to join
1201
- apiRequestPromises.push(RestApi.Get((_m = {},
1202
- _m[C6.WHERE] = {
1203
- 0: Object.keys(fetchReferences_1[tableToFetch]).reduce(function (sum, column) {
1204
- fetchReferences_1[tableToFetch][column] = fetchReferences_1[tableToFetch][column].flat(Infinity);
1205
- if (0 === fetchReferences_1[tableToFetch][column].length) {
1206
- console.warn('The column (' + column + ') was not found in the response data. We will not fetch.', responseData_1);
1207
- return false;
1148
+ // todo - row[column] is a FK value, we should optionally remove values that are already in state
1149
+ // this could be any column in the table constraint.TABLE, not just the primary key
1150
+ return row[column];
1151
+ }).filter(function (n) { return n; })) !== null && _b !== void 0 ? _b : [];
1152
+ if (columnValues.length === 0) {
1153
+ return; // forEach
1154
+ }
1155
+ (_c = fetchReferences_1[_e = constraint.TABLE]) !== null && _c !== void 0 ? _c : (fetchReferences_1[_e] = {});
1156
+ (_d = (_f = fetchReferences_1[constraint.TABLE])[_g = constraint.COLUMN]) !== null && _d !== void 0 ? _d : (_f[_g] = []);
1157
+ fetchReferences_1[constraint.TABLE][constraint.COLUMN].push(columnValues);
1158
+ }); });
1159
+ console.log('fetchReferences', fetchReferences_1);
1160
+ _loop_1 = function (tableToFetch) {
1161
+ var referencesTables, shouldContinue, fetchTable, RestApi, nextFetchDependencies;
1162
+ var _m;
1163
+ return tslib.__generator(this, function (_o) {
1164
+ switch (_o.label) {
1165
+ case 0:
1166
+ if (fetchDependencies & exports.eFetchDependencies.C6ENTITY
1167
+ && 'string' === typeof tableName
1168
+ && tableName.endsWith("carbon_carbons")) {
1169
+ referencesTables = responseData_1.rest.reduce(function (accumulator, row) {
1170
+ if ('entity_tag' in row && !accumulator.includes(row['entity_tag'])) {
1171
+ accumulator.push(row['entity_tag']);
1172
+ }
1173
+ return accumulator;
1174
+ }, []).map(function (entityTag) { return entityTag.split('\\').pop().toLowerCase(); });
1175
+ shouldContinue = referencesTables.find(function (referencesTable) { return tableToFetch.endsWith(referencesTable); });
1176
+ if (!shouldContinue) {
1177
+ console.log('%c C6ENTITY: The constraintTableName (' + tableToFetch + ') did not end with any value in referencesTables', 'color: #c00', referencesTables);
1178
+ return [2 /*return*/, "continue"];
1208
1179
  }
1209
- sum[column] = fetchReferences_1[tableToFetch][column].length === 1
1210
- ? fetchReferences_1[tableToFetch][column][0]
1211
- : [
1212
- C6.IN, fetchReferences_1[tableToFetch][column]
1213
- ];
1214
- return sum;
1215
- }, {})
1216
- },
1217
- _m.fetchDependencies = nextFetchDependencies,
1218
- _m)));
1219
- return [2 /*return*/];
1220
- }
1221
- });
1222
- };
1223
- _a = fetchReferences_1;
1224
- _b = [];
1225
- for (_c in _a)
1226
- _b.push(_c);
1227
- _i = 0;
1228
- _l.label = 1;
1229
- case 1:
1230
- if (!(_i < _b.length)) return [3 /*break*/, 4];
1231
- _c = _b[_i];
1232
- if (!(_c in _a)) return [3 /*break*/, 3];
1233
- tableToFetch = _c;
1234
- return [5 /*yield**/, _loop_1(tableToFetch)];
1235
- case 2:
1236
- _l.sent();
1237
- _l.label = 3;
1238
- case 3:
1239
- _i++;
1240
- return [3 /*break*/, 1];
1241
- case 4:
1242
- console.groupEnd();
1243
- return [4 /*yield*/, Promise.all(apiRequestPromises)];
1244
- case 5:
1245
- _l.sent();
1246
- apiRequestPromises.map(function (promise) { return tslib.__awaiter(_this, void 0, void 0, function () {
1247
- var _a, _b;
1248
- return tslib.__generator(this, function (_c) {
1249
- switch (_c.label) {
1250
- case 0:
1251
- if (!Array.isArray(this.request.fetchDependencies)) {
1252
- // to reassign value we must ref the root
1253
- this.request.fetchDependencies = [];
1180
+ console.log('%c C6ENTITY: The constraintTableName (' + tableToFetch + ') will be fetched.', 'color: #0c0');
1181
+ }
1182
+ return [4 /*yield*/, C6.IMPORT(tableToFetch)];
1183
+ case 1:
1184
+ fetchTable = _o.sent();
1185
+ RestApi = fetchTable.default;
1186
+ console.log('%c Fetch Dependencies will select (' + tableToFetch + ') using GET request', 'color: #33ccff');
1187
+ nextFetchDependencies = exports.eFetchDependencies.NONE;
1188
+ if (fetchDependencies & exports.eFetchDependencies.RECURSIVE) {
1189
+ if (fetchDependencies & exports.eFetchDependencies.ALL) {
1190
+ throw Error('Recursive fetch dependencies with both PARENT and CHILD reference will result in an infin1ite loop. As there is not real ending condition, this is not supported.');
1191
+ }
1192
+ nextFetchDependencies = fetchDependencies;
1193
+ }
1194
+ else if (fetchDependencies & exports.eFetchDependencies.C6ENTITY) {
1195
+ if (tableToFetch === "carbon_carbons") {
1196
+ nextFetchDependencies = fetchDependencies;
1197
+ }
1198
+ else {
1199
+ nextFetchDependencies = fetchDependencies ^ exports.eFetchDependencies.C6ENTITY;
1200
+ }
1201
+ }
1202
+ console.log('fetchReferences', fetchReferences_1[tableToFetch], "Current fetchDependencies for (" + operatingTable + "):", fetchDependencies, "New fetchDependencies for (" + tableToFetch + "): ", nextFetchDependencies);
1203
+ // todo - filter out ids that exist in state?!? note - remember that this does not necessarily mean the pk, but only known is its an FK to somewhere
1204
+ // it not certain that they are using carbons' entities either
1205
+ // this is a dynamic call to the rest api, any generated table may resolve with (RestApi)
1206
+ // todo - using value to avoid joins.... but. maybe this should be a parameterizable option -- think race conditions; its safer to join
1207
+ apiRequestPromises.push(RestApi.Get((_m = {},
1208
+ _m[C6.WHERE] = {
1209
+ 0: Object.keys(fetchReferences_1[tableToFetch]).reduce(function (sum, column) {
1210
+ fetchReferences_1[tableToFetch][column] = fetchReferences_1[tableToFetch][column].flat(Infinity);
1211
+ if (0 === fetchReferences_1[tableToFetch][column].length) {
1212
+ console.warn('The column (' + column + ') was not found in the response data. We will not fetch.', responseData_1);
1213
+ return false;
1214
+ }
1215
+ sum[column] = fetchReferences_1[tableToFetch][column].length === 1
1216
+ ? fetchReferences_1[tableToFetch][column][0]
1217
+ : [
1218
+ C6.IN, fetchReferences_1[tableToFetch][column]
1219
+ ];
1220
+ return sum;
1221
+ }, {})
1222
+ },
1223
+ _m.fetchDependencies = nextFetchDependencies,
1224
+ _m)));
1225
+ return [2 /*return*/];
1254
1226
  }
1255
- _b = (_a = this.request.fetchDependencies).push;
1256
- return [4 /*yield*/, promise];
1257
- case 1:
1258
- _b.apply(_a, [_c.sent()]);
1259
- return [2 /*return*/];
1227
+ });
1228
+ };
1229
+ _a = fetchReferences_1;
1230
+ _b = [];
1231
+ for (_c in _a)
1232
+ _b.push(_c);
1233
+ _i = 0;
1234
+ _l.label = 1;
1235
+ case 1:
1236
+ if (!(_i < _b.length)) return [3 /*break*/, 4];
1237
+ _c = _b[_i];
1238
+ if (!(_c in _a)) return [3 /*break*/, 3];
1239
+ tableToFetch = _c;
1240
+ return [5 /*yield**/, _loop_1(tableToFetch)];
1241
+ case 2:
1242
+ _l.sent();
1243
+ _l.label = 3;
1244
+ case 3:
1245
+ _i++;
1246
+ return [3 /*break*/, 1];
1247
+ case 4:
1248
+ console.groupEnd();
1249
+ return [4 /*yield*/, Promise.all(apiRequestPromises)];
1250
+ case 5:
1251
+ _l.sent();
1252
+ apiRequestPromises.map(function (promise) { return tslib.__awaiter(_this, void 0, void 0, function () {
1253
+ var _a, _b;
1254
+ return tslib.__generator(this, function (_c) {
1255
+ switch (_c.label) {
1256
+ case 0:
1257
+ if (!Array.isArray(this.request.fetchDependencies)) {
1258
+ // to reassign value we must ref the root
1259
+ this.request.fetchDependencies = [];
1260
+ }
1261
+ _b = (_a = this.request.fetchDependencies).push;
1262
+ return [4 /*yield*/, promise];
1263
+ case 1:
1264
+ _b.apply(_a, [_c.sent()]);
1265
+ return [2 /*return*/];
1266
+ }
1267
+ });
1268
+ }); });
1269
+ _l.label = 6;
1270
+ case 6:
1271
+ if (debug && isDevelopment) {
1272
+ reactToastify.toast.success("DEVS: (" + requestMethod + ") request complete.", toastOptionsDevs);
1260
1273
  }
1261
- });
1262
- }); });
1263
- _l.label = 6;
1264
- case 6:
1265
- if (debug && isDevelopment) {
1266
- reactToastify.toast.success("DEVS: (" + requestMethod + ") request complete.", toastOptionsDevs);
1274
+ return [2 /*return*/, response];
1267
1275
  }
1268
- return [2 /*return*/, response];
1269
- }
1270
- });
1271
- }); })];
1272
- }
1273
- catch (throwableError) {
1274
- if (isTest) {
1275
- throw new Error(JSON.stringify(throwableError));
1276
- }
1277
- console.groupCollapsed('%c API: An error occurred in the try catch block. returning null!', 'color: #ff0000');
1278
- console.log('%c ' + requestMethod + ' ' + tableName, 'color: #A020F0');
1279
- console.warn(throwableError);
1280
- console.trace();
1281
- console.groupEnd();
1282
- TestRestfulResponse(throwableError, success, error);
1283
- return [2 /*return*/, null];
1276
+ });
1277
+ }); }).then(function (response) { return response.data; })];
1278
+ }
1279
+ catch (throwableError) {
1280
+ if (isTest) {
1281
+ throw new Error(JSON.stringify(throwableError));
1282
+ }
1283
+ console.groupCollapsed('%c API: An error occurred in the try catch block. returning null!', 'color: #ff0000');
1284
+ console.log('%c ' + requestMethod + ' ' + tableName, 'color: #A020F0');
1285
+ console.warn(throwableError);
1286
+ console.trace();
1287
+ console.groupEnd();
1288
+ TestRestfulResponse(throwableError, success, error);
1289
+ return [2 /*return*/, null];
1290
+ }
1291
+ return [2 /*return*/];
1284
1292
  }
1285
- return [2 /*return*/];
1286
1293
  });
1287
1294
  }); };
1288
1295
  return [4 /*yield*/, apiRequest()];
@@ -1305,16 +1312,43 @@ var SqlExecutor = /** @class */ (function (_super) {
1305
1312
  return _super !== null && _super.apply(this, arguments) || this;
1306
1313
  }
1307
1314
  SqlExecutor.prototype.execute = function () {
1308
- switch (this.config.requestMethod) {
1309
- case 'GET':
1310
- return this.select(this.config.restModel.TABLE_NAME, undefined, this.request).then(function (rows) { return ({ rest: rows }); });
1311
- case 'POST':
1312
- return this.insert(this.config.restModel.TABLE_NAME, this.request);
1313
- case 'PUT':
1314
- return this.update(this.config.restModel.TABLE_NAME, undefined, this.request);
1315
- case 'DELETE':
1316
- return this.delete(this.config.restModel.TABLE_NAME, undefined, this.request);
1317
- }
1315
+ return tslib.__awaiter(this, void 0, void 0, function () {
1316
+ var _a, TABLE_NAME, PRIMARY, _b, rest, result, created, result, updated, result, deleted;
1317
+ return tslib.__generator(this, function (_c) {
1318
+ switch (_c.label) {
1319
+ case 0:
1320
+ _a = this.config.restModel, TABLE_NAME = _a.TABLE_NAME, PRIMARY = _a.PRIMARY;
1321
+ _b = this.config.requestMethod;
1322
+ switch (_b) {
1323
+ case 'GET': return [3 /*break*/, 1];
1324
+ case 'POST': return [3 /*break*/, 3];
1325
+ case 'PUT': return [3 /*break*/, 5];
1326
+ case 'DELETE': return [3 /*break*/, 7];
1327
+ }
1328
+ return [3 /*break*/, 9];
1329
+ case 1: return [4 /*yield*/, this.select(TABLE_NAME, undefined, this.request)];
1330
+ case 2:
1331
+ rest = _c.sent();
1332
+ return [2 /*return*/, { rest: rest }];
1333
+ case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1334
+ case 4:
1335
+ result = _c.sent();
1336
+ created = { rest: result, created: true };
1337
+ return [2 /*return*/, created];
1338
+ case 5: return [4 /*yield*/, this.update(TABLE_NAME, PRIMARY, this.request)];
1339
+ case 6:
1340
+ result = _c.sent();
1341
+ updated = { rest: result, updated: true, rowCount: result.affectedRows };
1342
+ return [2 /*return*/, updated];
1343
+ case 7: return [4 /*yield*/, this.delete(TABLE_NAME, PRIMARY, this.request)];
1344
+ case 8:
1345
+ result = _c.sent();
1346
+ deleted = { rest: result, deleted: true, rowCount: result.affectedRows };
1347
+ return [2 /*return*/, deleted];
1348
+ case 9: throw new Error("Unsupported request method: ".concat(this.config.requestMethod));
1349
+ }
1350
+ });
1351
+ });
1318
1352
  };
1319
1353
  SqlExecutor.prototype.withConnection = function (cb) {
1320
1354
  return tslib.__awaiter(this, void 0, void 0, function () {
@@ -1397,14 +1431,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1397
1431
  return tslib.__generator(this, function (_a) {
1398
1432
  switch (_a.label) {
1399
1433
  case 0:
1400
- if (!primary) {
1434
+ if (!(primary === null || primary === void 0 ? void 0 : primary.length))
1401
1435
  throw new Error('Primary key is required for update');
1402
- }
1403
1436
  keys = Object.keys(data);
1404
1437
  values = keys.map(function (k) { return data[k]; });
1405
1438
  updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1406
- sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary, "` = ?");
1407
- values.push(data[primary]);
1439
+ sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary[0], "` = ?");
1440
+ values.push(data[primary[0]]);
1408
1441
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1409
1442
  var result;
1410
1443
  return tslib.__generator(this, function (_a) {
@@ -1423,20 +1456,20 @@ var SqlExecutor = /** @class */ (function (_super) {
1423
1456
  };
1424
1457
  SqlExecutor.prototype.delete = function (table, primary, args) {
1425
1458
  return tslib.__awaiter(this, void 0, void 0, function () {
1426
- var sql;
1459
+ var key, sql;
1427
1460
  var _this = this;
1428
1461
  return tslib.__generator(this, function (_a) {
1429
1462
  switch (_a.label) {
1430
1463
  case 0:
1431
- if (!primary || !(args === null || args === void 0 ? void 0 : args[primary])) {
1464
+ key = primary === null || primary === void 0 ? void 0 : primary[0];
1465
+ if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1432
1466
  throw new Error('Primary key and value required for delete');
1433
- }
1434
- sql = "DELETE FROM `".concat(table, "` WHERE `").concat(primary, "` = ?");
1467
+ sql = "DELETE FROM `".concat(table, "` WHERE `").concat(key, "` = ?");
1435
1468
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1436
1469
  var result;
1437
1470
  return tslib.__generator(this, function (_a) {
1438
1471
  switch (_a.label) {
1439
- case 0: return [4 /*yield*/, conn.execute(sql, [args[primary]])];
1472
+ case 0: return [4 /*yield*/, conn.execute(sql, [args[key]])];
1440
1473
  case 1:
1441
1474
  result = (_a.sent())[0];
1442
1475
  return [2 /*return*/, result];
@@ -1456,6 +1489,63 @@ var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
1456
1489
  SqlExecutor: SqlExecutor
1457
1490
  });
1458
1491
 
1492
+ // TODO - WE MUST make this a generic - optional, but helpful
1493
+ // note sure how it would help anyone actually...
1494
+ function ExpressHandler(_a) {
1495
+ var _this = this;
1496
+ var C6 = _a.C6, mysqlPool = _a.mysqlPool;
1497
+ return function (req, res, next) { return tslib.__awaiter(_this, void 0, void 0, function () {
1498
+ var method, table, primary, payload, response, err_1;
1499
+ return tslib.__generator(this, function (_a) {
1500
+ switch (_a.label) {
1501
+ case 0:
1502
+ _a.trys.push([0, 2, , 3]);
1503
+ method = req.method.toUpperCase();
1504
+ table = req.params.table;
1505
+ primary = req.params.primary;
1506
+ payload = method === 'GET' ? req.query : req.body;
1507
+ if (!(table in C6.TABLES)) {
1508
+ res.status(400).json({ error: "Invalid table: ".concat(table) });
1509
+ return [2 /*return*/];
1510
+ }
1511
+ // 👇 Call restRequest for the resolved method
1512
+ // TODO - add primary conditionally based on method signature
1513
+ switch (method) {
1514
+ case 'GET':
1515
+ if (primary) {
1516
+ payload['primary'] = primary;
1517
+ }
1518
+ break;
1519
+ case 'POST':
1520
+ case 'PUT':
1521
+ case 'DELETE':
1522
+ payload['primary'] = primary;
1523
+ break;
1524
+ default:
1525
+ res.status(405).json({ error: "Method ".concat(method, " not allowed") });
1526
+ return [2 /*return*/];
1527
+ }
1528
+ return [4 /*yield*/, restRequest({
1529
+ C6: C6,
1530
+ mysqlPool: mysqlPool,
1531
+ requestMethod: method,
1532
+ restModel: C6.TABLES[table]
1533
+ })(payload)];
1534
+ case 1:
1535
+ response = _a.sent();
1536
+ console.log('response', JSON.stringify(response));
1537
+ res.status(200).json(tslib.__assign({ success: true }, response));
1538
+ return [3 /*break*/, 3];
1539
+ case 2:
1540
+ err_1 = _a.sent();
1541
+ next(err_1);
1542
+ return [3 /*break*/, 3];
1543
+ case 3: return [2 /*return*/];
1544
+ }
1545
+ });
1546
+ }); };
1547
+ }
1548
+
1459
1549
  function determineRuntimeJsType(mysqlType) {
1460
1550
  var base = mysqlType.toLowerCase().split('(')[0];
1461
1551
  if ([
@@ -1557,6 +1647,7 @@ function onError(message) {
1557
1647
  exports.C6Constants = C6Constants;
1558
1648
  exports.DELETE = DELETE;
1559
1649
  exports.Executor = Executor;
1650
+ exports.ExpressHandler = ExpressHandler;
1560
1651
  exports.GET = GET;
1561
1652
  exports.HttpExecutor = HttpExecutor;
1562
1653
  exports.POST = POST;