@foxtware/mineral 0.1.9 → 0.1.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.
Files changed (157) hide show
  1. package/.creds.yml.sample +27 -6
  2. package/AGENTS.md +6 -1
  3. package/README.md +1 -1
  4. package/api/bleckmann/.gitkeep +0 -0
  5. package/api/bleckmann/bleckmann.constants.js +8 -0
  6. package/api/bleckmann/bleckmann.utils.js +32 -0
  7. package/api/bleckmann/bleckmannAsnGet.js +52 -0
  8. package/api/bleckmann/bleckmannAsnsGet.js +65 -0
  9. package/api/constants.js +2 -1
  10. package/api/github/github.constants.js +11 -0
  11. package/api/github/github.utils.js +65 -0
  12. package/api/github/githubGet.js +144 -0
  13. package/api/github/githubIssueCreate.js +71 -0
  14. package/api/github/githubIssueGet.js +65 -0
  15. package/api/github/githubIssueUpdate.js +71 -0
  16. package/api/github/githubIssuesGet.js +74 -0
  17. package/api/github/githubPullRequestCreate.js +74 -0
  18. package/api/github/githubPullRequestGet.js +65 -0
  19. package/api/github/githubPullRequestMerge.js +77 -0
  20. package/api/github/githubPullRequestUpdate.js +72 -0
  21. package/api/github/githubPullRequestsGet.js +74 -0
  22. package/api/github/githubRepoCreate.js +80 -0
  23. package/api/github/githubRepoDelete.js +60 -0
  24. package/api/github/githubRepoGet.js +61 -0
  25. package/api/github/githubRepoUpdate.js +68 -0
  26. package/api/github/githubReposGet.js +69 -0
  27. package/api/github/githubUserGet.js +64 -0
  28. package/api/linear/linear.utils.js +9 -14
  29. package/api/linear/linearIssuesGet.js +9 -9
  30. package/api/logiwa/logiwa.utils.js +27 -25
  31. package/api/logiwa/logiwaInventoriesGet.js +5 -3
  32. package/api/logiwa/logiwaOrderGet.js +4 -2
  33. package/api/logiwa/logiwaOrdersGet.js +5 -3
  34. package/api/logiwa/logiwaProductGet.js +4 -2
  35. package/api/logiwa/logiwaProductsGet.js +5 -3
  36. package/api/logiwa/logiwaReportGetAvailableToPromise.js +5 -3
  37. package/api/logiwa/logiwaReportGetInventoryCalculation.js +5 -3
  38. package/api/logiwa/logiwaReportGetInventorySnapshot.js +5 -3
  39. package/api/logiwa/logiwaReportGetTotalInventory.js +5 -3
  40. package/api/logiwa/logiwaWebhookStatusGet.js +4 -2
  41. package/api/logiwa/logiwaWebhookSubscribe.js +8 -6
  42. package/api/logiwa/logiwaWebhookUnsubscribe.js +4 -2
  43. package/api/logiwa/logiwaWebhooksGet.js +4 -2
  44. package/api/loop/loop.utils.js +9 -15
  45. package/api/loop/loopGet.js +20 -24
  46. package/api/loop/loopReturnGet.js +6 -6
  47. package/api/peoplevox/peoplevox.constants.js +1 -1
  48. package/api/peoplevox/peoplevox.sessions.js +0 -33
  49. package/api/peoplevox/peoplevox.utils.js +63 -19
  50. package/api/peoplevox/peoplevoxGetSingle.js +7 -5
  51. package/api/peoplevox/peoplevoxOrderEdit.js +7 -5
  52. package/api/peoplevox/peoplevoxReportGet.js +11 -9
  53. package/api/pipelineSteps.js +49 -0
  54. package/api/shopify/shopify.utils.js +18 -24
  55. package/api/shopify/shopifyBulkMutationDo.js +211 -0
  56. package/api/shopify/shopifyBulkOperationGet.js +86 -0
  57. package/api/shopify/shopifyBulkOperationRunMutation.js +83 -0
  58. package/api/shopify/shopifyCheckoutAndAccountsConfigurationUpdate.js +79 -0
  59. package/api/shopify/shopifyCollectionGet.js +6 -6
  60. package/api/shopify/shopifyCustomerGet.js +6 -6
  61. package/api/shopify/shopifyGet.js +18 -13
  62. package/api/shopify/shopifyGetSingle.js +9 -9
  63. package/api/shopify/shopifyMutationDo.js +6 -6
  64. package/api/shopify/shopifyOrdersGet.js +11 -11
  65. package/api/shopify/shopifyStagedUploadCreate.js +96 -0
  66. package/api/shopify/shopifyTagsAddBulk.js +90 -0
  67. package/api/slack/slack.utils.js +10 -19
  68. package/api/slack/slackMessagePost.js +11 -11
  69. package/api/starshipit/starshipit.constants.js +8 -0
  70. package/api/starshipit/starshipit.utils.js +71 -0
  71. package/api/starshipit/starshipitAddressCreate.js +77 -0
  72. package/api/starshipit/starshipitAddressDelete.js +55 -0
  73. package/api/starshipit/starshipitAddressUpdate.js +69 -0
  74. package/api/starshipit/starshipitAddressesGet.js +52 -0
  75. package/api/starshipit/starshipitGet.js +146 -0
  76. package/api/starshipit/starshipitOrderDelete.js +102 -0
  77. package/api/starshipit/starshipitOrderGet.js +74 -0
  78. package/api/starshipit/starshipitOrderUpdate.js +109 -0
  79. package/api/starshipit/starshipitOrdersListShipped.js +64 -0
  80. package/api/starshipit/starshipitProductAdd.js +100 -0
  81. package/api/starshipit/starshipitProductsDelete.js +57 -0
  82. package/api/starshipit/starshipitProductsGet.js +49 -0
  83. package/api/starshipit/starshipitTrackingGet.js +69 -0
  84. package/api/stripe/_example.js +7 -7
  85. package/api/stripe/stripe.utils.js +9 -14
  86. package/api/stripe/stripeCardTokenCreate.js +11 -11
  87. package/api/stripe/stripeChargeCapture.js +11 -11
  88. package/api/stripe/stripeChargeCreate.js +11 -11
  89. package/api/stripe/stripeChargeGet.js +5 -5
  90. package/api/stripe/stripeChargesGet.js +6 -6
  91. package/api/stripe/stripeRefundCreate.js +10 -10
  92. package/api/stripe/stripeRefundGet.js +5 -5
  93. package/api/stripe/stripeRefundsGet.js +6 -6
  94. package/api/stripe/stripeTokenGet.js +5 -5
  95. package/api/stylearcade/stylearcade.constants.js +5 -0
  96. package/api/stylearcade/stylearcade.utils.js +40 -0
  97. package/api/stylearcade/stylearcadeDataGet.js +62 -0
  98. package/api/stylearcade/stylearcadeGet.js +133 -0
  99. package/api/stylearcade/stylearcadeMetadataGet.js +47 -0
  100. package/api/threeclicks/threeclicks.constants.js +8 -0
  101. package/api/threeclicks/threeclicks.utils.js +119 -0
  102. package/api/threeclicks/threeclicksCollectionsGet.js +40 -0
  103. package/api/threeclicks/threeclicksGet.js +138 -0
  104. package/api/threeclicks/threeclicksKeycodeCreate.js +55 -0
  105. package/api/threeclicks/threeclicksKeycodeGet.js +47 -0
  106. package/api/threeclicks/threeclicksPurchaseOrderCreate.js +34 -0
  107. package/api/threeclicks/threeclicksPurchaseOrderCreateBulk.js +34 -0
  108. package/api/threeclicks/threeclicksPurchaseOrderGet.js +33 -0
  109. package/api/threeclicks/threeclicksPurchaseOrderQuantitiesGet.js +33 -0
  110. package/api/threeclicks/threeclicksPurchaseOrderQuantityCreate.js +34 -0
  111. package/api/threeclicks/threeclicksPurchaseOrderQuantityCreateBulk.js +34 -0
  112. package/api/threeclicks/threeclicksPurchaseOrderQuantityUpdate.js +46 -0
  113. package/api/threeclicks/threeclicksPurchaseOrderQuantityUpdateBulk.js +46 -0
  114. package/api/threeclicks/threeclicksPurchaseOrderUpdate.js +35 -0
  115. package/api/threeclicks/threeclicksPurchaseOrdersGet.js +30 -0
  116. package/api/threeclicks/threeclicksShipmentCreate.js +34 -0
  117. package/api/threeclicks/threeclicksShipmentGet.js +33 -0
  118. package/api/threeclicks/threeclicksShipmentOrderAdd.js +38 -0
  119. package/api/threeclicks/threeclicksShipmentOrderQuantityCreate.js +35 -0
  120. package/api/threeclicks/threeclicksShipmentQuantityUpdate.js +35 -0
  121. package/api/threeclicks/threeclicksShipmentStatusUpdate.js +45 -0
  122. package/api/threeclicks/threeclicksShipmentsGet.js +52 -0
  123. package/api/threeclicks/threeclicksSignatureCalculate.js +73 -0
  124. package/api/threeclicks/threeclicksStyleCodesGet.js +46 -0
  125. package/api/threeclicks/threeclicksStyleColourCreate.js +47 -0
  126. package/api/threeclicks/threeclicksStyleColourDelete.js +34 -0
  127. package/api/threeclicks/threeclicksStyleCreate.js +44 -0
  128. package/api/threeclicks/threeclicksStyleDelete.js +33 -0
  129. package/api/threeclicks/threeclicksStyleGet.js +43 -0
  130. package/api/threeclicks/threeclicksStylePriceUpdate.js +70 -0
  131. package/api/threeclicks/threeclicksStyleUpdate.js +47 -0
  132. package/api/threeclicks/threeclicksStylesGet.js +45 -0
  133. package/api/utils.js +85 -117
  134. package/api/validators.js +1 -1
  135. package/api/workable/workable.utils.js +8 -13
  136. package/api/workable/workableGet.js +16 -11
  137. package/api/workable/workableJobCandidateCreate.js +10 -10
  138. package/api/workable/workableJobGet.js +5 -5
  139. package/api/workable/workableJobMembersGet.js +5 -5
  140. package/api/workable/workableJobStagesGet.js +5 -5
  141. package/api/yotpo/yotpo.utils.js +17 -22
  142. package/api/yotpo/yotpoCampaignsGet.js +6 -6
  143. package/api/yotpo/yotpoCustomerActionRecord.js +7 -7
  144. package/api/yotpo/yotpoCustomerAnniversaryGet.js +7 -7
  145. package/api/yotpo/yotpoCustomerAnniversarySet.js +7 -7
  146. package/api/yotpo/yotpoCustomerBirthdaySet.js +7 -7
  147. package/api/yotpo/yotpoCustomerGet.js +6 -6
  148. package/api/yotpo/yotpoCustomerPointsAdjust.js +7 -7
  149. package/api/yotpo/yotpoCustomerUpsert.js +7 -7
  150. package/api/yotpo/yotpoCustomersRecentGet.js +6 -6
  151. package/api/yotpo/yotpoRedemptionCreate.js +7 -7
  152. package/api/yotpo/yotpoRedemptionOptionsGet.js +6 -6
  153. package/api/yotpo/yotpoVipTiersGet.js +5 -5
  154. package/api/youtube/youtube.constants.js +5 -0
  155. package/api/youtube/youtube.utils.js +77 -0
  156. package/api/youtube/youtubeChannelVideosGet.js +25 -70
  157. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  // https://docs.stripe.com/api/refunds/create
2
2
 
3
- const { credsFromPayload, ArgsWarden } = require('../utils');
3
+ const { ArgsWarden } = require('../utils');
4
4
  const { credsValidator } = require('../validators');
5
5
  const { stripeClient } = require('../stripe/stripe.utils');
6
6
 
@@ -26,17 +26,17 @@ const stripeRefundCreate = async (
26
26
  return rejectResponse;
27
27
  }
28
28
 
29
- const creds = await credsFromPayload(credsPayload);
30
-
31
29
  const response = await stripeClient.fetch({
32
- url: '/refunds',
33
- method: 'post',
34
- body: {
35
- charge: chargeId,
36
- ...amountCents && { amount: amountCents },
37
- ...reason && { reason },
30
+ requestPayload: {
31
+ url: '/refunds',
32
+ method: 'post',
33
+ body: {
34
+ charge: chargeId,
35
+ ...amountCents && { amount: amountCents },
36
+ ...reason && { reason },
37
+ },
38
38
  },
39
- context: { creds },
39
+ context: { credsPayload },
40
40
  });
41
41
 
42
42
  return response;
@@ -1,6 +1,6 @@
1
1
  // https://docs.stripe.com/api/refunds/retrieve
2
2
 
3
- const { credsFromPayload, ArgsWarden } = require('../utils');
3
+ const { ArgsWarden } = require('../utils');
4
4
  const { credsValidator } = require('../validators');
5
5
  const { stripeClient } = require('../stripe/stripe.utils');
6
6
 
@@ -22,11 +22,11 @@ const stripeRefundGet = async (
22
22
  return rejectResponse;
23
23
  }
24
24
 
25
- const creds = await credsFromPayload(credsPayload);
26
-
27
25
  const response = await stripeClient.fetch({
28
- url: `/refunds/${ refundId }`,
29
- context: { creds },
26
+ requestPayload: {
27
+ url: `/refunds/${ refundId }`,
28
+ },
29
+ context: { credsPayload },
30
30
  });
31
31
 
32
32
  return response;
@@ -1,6 +1,6 @@
1
1
  // https://docs.stripe.com/api/refunds/list
2
2
 
3
- const { credsFromPayload, ArgsWarden } = require('../utils');
3
+ const { ArgsWarden } = require('../utils');
4
4
  const { credsValidator } = require('../validators');
5
5
  const { stripeClient } = require('../stripe/stripe.utils');
6
6
 
@@ -20,12 +20,12 @@ const stripeRefundsGet = async (
20
20
  return rejectResponse;
21
21
  }
22
22
 
23
- const creds = await credsFromPayload(credsPayload);
24
-
25
23
  const response = await stripeClient.fetch({
26
- url: '/refunds',
27
- params,
28
- context: { creds },
24
+ requestPayload: {
25
+ url: '/refunds',
26
+ params,
27
+ },
28
+ context: { credsPayload },
29
29
  });
30
30
 
31
31
  return response;
@@ -1,6 +1,6 @@
1
1
  // https://docs.stripe.com/api/tokens/retrieve
2
2
 
3
- const { credsFromPayload, ArgsWarden } = require('../utils');
3
+ const { ArgsWarden } = require('../utils');
4
4
  const { credsValidator } = require('../validators');
5
5
  const { stripeClient } = require('../stripe/stripe.utils');
6
6
 
@@ -22,11 +22,11 @@ const stripeTokenGet = async (
22
22
  return rejectResponse;
23
23
  }
24
24
 
25
- const creds = await credsFromPayload(credsPayload);
26
-
27
25
  const response = await stripeClient.fetch({
28
- url: `/tokens/${ tokenId }`,
29
- context: { creds },
26
+ requestPayload: {
27
+ url: `/tokens/${ tokenId }`,
28
+ },
29
+ context: { credsPayload },
30
30
  });
31
31
 
32
32
  return response;
@@ -0,0 +1,5 @@
1
+ const MAX_PER_PAGE = 100;
2
+
3
+ module.exports = {
4
+ MAX_PER_PAGE,
5
+ };
@@ -0,0 +1,40 @@
1
+ const { resolveCreds, useBaseUrl } = require('../pipelineSteps');
2
+ const {
3
+ FetchClient,
4
+ fetchClientCommonSteps,
5
+ } = require('../utils');
6
+
7
+ const useStylearcadeBaseUrl = async (state) => {
8
+ const { creds } = state.context;
9
+ return useBaseUrl(creds.BASE_URL)(state);
10
+ };
11
+
12
+ const useAuthHeaders = async (state) => {
13
+ const { requestPayload, context } = state;
14
+ const { creds } = context;
15
+ const { API_KEY } = creds;
16
+
17
+ return {
18
+ requestPayload: {
19
+ ...requestPayload,
20
+ headers: {
21
+ 'Api-Key': API_KEY,
22
+ ...requestPayload.headers,
23
+ },
24
+ },
25
+ };
26
+ };
27
+
28
+ const stylearcadeClient = new FetchClient({
29
+ pipeline: [
30
+ resolveCreds,
31
+ useStylearcadeBaseUrl,
32
+ useAuthHeaders,
33
+ 'fetch',
34
+ fetchClientCommonSteps.exitEarlyOnNotOk,
35
+ ],
36
+ });
37
+
38
+ module.exports = {
39
+ stylearcadeClient,
40
+ };
@@ -0,0 +1,62 @@
1
+ // https://stylearcade.gitlab.io/api-docs/range-plan
2
+
3
+ const { ArgsWarden } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { stylearcadeGet, stylearcadeGetter } = require('../stylearcade/stylearcadeGet');
6
+
7
+ const argsWarden = new ArgsWarden([
8
+ ['credsPayload', credsValidator],
9
+ ]);
10
+
11
+ const stylearcadeDataGet = async (
12
+ credsPayload,
13
+ options = {},
14
+ ) => {
15
+
16
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({ credsPayload });
17
+ if (rejectResponse) {
18
+ return rejectResponse;
19
+ }
20
+
21
+ return stylearcadeGet(credsPayload, {
22
+ nodeName: 'records',
23
+ ...options,
24
+ });
25
+ };
26
+
27
+ const stylearcadeDataGetter = async (
28
+ credsPayload,
29
+ options = {},
30
+ ) => {
31
+
32
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({ credsPayload });
33
+ if (rejectResponse) {
34
+ return rejectResponse;
35
+ }
36
+
37
+ return stylearcadeGetter(credsPayload, {
38
+ nodeName: 'records',
39
+ ...options,
40
+ });
41
+ };
42
+
43
+ const funcApiConfig = {
44
+ argsWarden,
45
+ };
46
+
47
+ module.exports = {
48
+ stylearcadeDataGet,
49
+ stylearcadeDataGetter,
50
+ funcApiConfig,
51
+ };
52
+
53
+ /*
54
+ curl -X POST "http://localhost:8000/stylearcadeDataGet" \
55
+ -H "Content-Type: application/json" \
56
+ -d '{
57
+ "credsPayload": { "credsPath": "stylearcade" },
58
+ "options": {
59
+ "limit": 2000
60
+ }
61
+ }'
62
+ */
@@ -0,0 +1,133 @@
1
+ const { ArgsWarden, Getter } = require('../utils');
2
+ const { credsValidator } = require('../validators');
3
+ const { stylearcadeClient } = require('../stylearcade/stylearcade.utils');
4
+ const { MAX_PER_PAGE } = require('../stylearcade/stylearcade.constants');
5
+
6
+ const argsWarden = new ArgsWarden([
7
+ ['credsPayload', credsValidator],
8
+ ]);
9
+
10
+ const stylearcadeGetPacket = async (
11
+ credsPayload,
12
+ {
13
+ params,
14
+ perPage = MAX_PER_PAGE,
15
+ url = '/export',
16
+ } = {},
17
+ ) => {
18
+ return stylearcadeClient.fetch({
19
+ requestPayload: {
20
+ url,
21
+ params: {
22
+ limit: perPage,
23
+ ...params,
24
+ },
25
+ },
26
+ context: {
27
+ credsPayload,
28
+ },
29
+ });
30
+ };
31
+
32
+ const stylearcadeGetPaginator = async (currentParams, response) => {
33
+ if (!response?.ok) {
34
+ return [true];
35
+ }
36
+
37
+ const { nextCursor } = response.data || {};
38
+
39
+ if (!nextCursor) {
40
+ return [true];
41
+ }
42
+
43
+ const { args, options } = currentParams;
44
+
45
+ return [false, {
46
+ args,
47
+ options: {
48
+ ...options,
49
+ params: {
50
+ ...options.params,
51
+ cursor: nextCursor,
52
+ },
53
+ },
54
+ }];
55
+ };
56
+
57
+ const stylearcadeGetDigester = (response, nodeName) => {
58
+ if (!response?.ok) {
59
+ return [];
60
+ }
61
+
62
+ return response?.data?.[nodeName] ?? [];
63
+ };
64
+
65
+ const stylearcadeGet = async (
66
+ returnGetter,
67
+
68
+ credsPayload,
69
+ {
70
+ params,
71
+ perPage = MAX_PER_PAGE,
72
+ nodeName = 'records',
73
+ url = '/export',
74
+ ...getterOptions
75
+ } = {},
76
+ ) => {
77
+
78
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
79
+ credsPayload,
80
+ });
81
+ if (rejectResponse) {
82
+ return rejectResponse;
83
+ }
84
+
85
+ const getter = new Getter(
86
+ {
87
+ args: [credsPayload],
88
+ options: {
89
+ params,
90
+ perPage,
91
+ url,
92
+ },
93
+ },
94
+ {
95
+ func: stylearcadeGetPacket,
96
+ digester: (response) => stylearcadeGetDigester(response, nodeName),
97
+ paginator: stylearcadeGetPaginator,
98
+ ...getterOptions,
99
+ },
100
+ );
101
+
102
+ if (returnGetter) {
103
+ return getter;
104
+ }
105
+
106
+ const data = await getter.run({ returnAll: true });
107
+
108
+ return {
109
+ ok: true,
110
+ data,
111
+ };
112
+ };
113
+
114
+ const funcApiConfig = {
115
+ argsWarden,
116
+ };
117
+
118
+ module.exports = {
119
+ stylearcadeGet: (...args) => stylearcadeGet(false, ...args),
120
+ stylearcadeGetter: (...args) => stylearcadeGet(true, ...args),
121
+ funcApiConfig,
122
+ };
123
+
124
+ /*
125
+ curl -X POST "http://localhost:8000/stylearcadeGet" \
126
+ -H "Content-Type: application/json" \
127
+ -d '{
128
+ "credsPayload": { "credsPath": "stylearcade" },
129
+ "options": {
130
+ "limit": 10
131
+ }
132
+ }'
133
+ */
@@ -0,0 +1,47 @@
1
+ // https://stylearcade.gitlab.io/api-docs/range-plan
2
+
3
+ const { ArgsWarden } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { stylearcadeClient } = require('../stylearcade/stylearcade.utils');
6
+
7
+ const argsWarden = new ArgsWarden([
8
+ ['credsPayload', credsValidator],
9
+ ]);
10
+
11
+ const stylearcadeMetadataGet = async (
12
+ credsPayload,
13
+ options = {},
14
+ ) => {
15
+
16
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({ credsPayload });
17
+ if (rejectResponse) {
18
+ return rejectResponse;
19
+ }
20
+
21
+ return stylearcadeClient.fetch({
22
+ requestPayload: {
23
+ url: '/metadata',
24
+ ...options.params && { params: options.params },
25
+ },
26
+ context: {
27
+ credsPayload,
28
+ },
29
+ });
30
+ };
31
+
32
+ const funcApiConfig = {
33
+ argsWarden,
34
+ };
35
+
36
+ module.exports = {
37
+ stylearcadeMetadataGet,
38
+ funcApiConfig,
39
+ };
40
+
41
+ /*
42
+ curl -X POST "http://localhost:8000/stylearcadeMetadataGet" \
43
+ -H "Content-Type: application/json" \
44
+ -d '{
45
+ "credsPayload": { "credsPath": "stylearcade" }
46
+ }'
47
+ */
@@ -0,0 +1,8 @@
1
+ const API_BASE_PATH = '/api-user/v1';
2
+
3
+ const API_REFERENCE_URL = 'https://g40-server.instance.3clickscloud.com/swagger-ui/index.html';
4
+
5
+ module.exports = {
6
+ API_BASE_PATH,
7
+ API_REFERENCE_URL,
8
+ };
@@ -0,0 +1,119 @@
1
+ const crypto = require('crypto');
2
+ const { API_BASE_PATH } = require('../threeclicks/threeclicks.constants');
3
+ const { resolveCreds } = require('../pipelineSteps');
4
+ const {
5
+ FetchClient,
6
+ appendUrlToBase,
7
+ fetchClientCommonSteps,
8
+ } = require('../utils');
9
+
10
+ const nowAsUnixTimestamp = () => Math.floor(Date.now() / 1000);
11
+
12
+ const threeclicksSignatureCalculate = ({
13
+ creds,
14
+ method,
15
+ data,
16
+ }) => {
17
+ const {
18
+ API_KEY,
19
+ API_SECRET,
20
+ } = creds;
21
+
22
+ const timestamp = nowAsUnixTimestamp();
23
+ const stitchedString = `${ API_KEY }${ API_SECRET }${ method }${
24
+ data ? JSON.stringify(data) : ''
25
+ }${ timestamp }`;
26
+
27
+ const signature = crypto
28
+ .createHmac('sha256', API_SECRET)
29
+ .update(stitchedString)
30
+ .digest('hex');
31
+
32
+ return {
33
+ signature,
34
+ timestamp,
35
+ };
36
+ };
37
+
38
+ const getSignatureData = (requestPayload) => {
39
+ const method = (requestPayload.method || 'get').toLowerCase();
40
+
41
+ if (method === 'get') {
42
+ return requestPayload.params ?? {};
43
+ }
44
+
45
+ return requestPayload.body ?? {};
46
+ };
47
+
48
+ const useThreeclicksUrlAndAuth = async (state) => {
49
+ const { requestPayload, context } = state;
50
+ const { creds } = context;
51
+ const {
52
+ API_KEY,
53
+ API_DOMAIN,
54
+ } = creds;
55
+
56
+ const method = (requestPayload.method || 'get').toLowerCase();
57
+ const signatureData = getSignatureData({
58
+ ...requestPayload,
59
+ method,
60
+ });
61
+
62
+ const { signature, timestamp } = threeclicksSignatureCalculate({
63
+ creds,
64
+ method,
65
+ data: signatureData,
66
+ });
67
+
68
+ const baseUrl = `https://${ API_DOMAIN }${ API_BASE_PATH }`;
69
+
70
+ return {
71
+ requestPayload: {
72
+ ...requestPayload,
73
+ method,
74
+ url: appendUrlToBase(baseUrl, requestPayload.url),
75
+ headers: {
76
+ 'X-Api-Key': API_KEY,
77
+ 'X-Api-Signature': signature,
78
+ 'X-Api-Timestamp': String(timestamp),
79
+ ...requestPayload.headers,
80
+ },
81
+ },
82
+ };
83
+ };
84
+
85
+ const interpretThreeclicksResponse = async (state) => {
86
+ const { response } = state;
87
+ const { success, message } = response?.data?.result ?? {};
88
+
89
+ if (response?.ok && success === false) {
90
+ return {
91
+ response: {
92
+ ok: false,
93
+ error: {
94
+ message,
95
+ details: response.data?.result,
96
+ },
97
+ },
98
+ breakChain: true,
99
+ };
100
+ }
101
+
102
+ return {};
103
+ };
104
+
105
+ const threeclicksClient = new FetchClient({
106
+ pipeline: [
107
+ resolveCreds,
108
+ useThreeclicksUrlAndAuth,
109
+ 'fetch',
110
+ fetchClientCommonSteps.exitEarlyOnNotOk,
111
+ interpretThreeclicksResponse,
112
+ ],
113
+ });
114
+
115
+ module.exports = {
116
+ threeclicksClient,
117
+ threeclicksSignatureCalculate,
118
+ getSignatureData,
119
+ };
@@ -0,0 +1,40 @@
1
+ // https://g40-server.instance.3clickscloud.com/swagger-ui/index.html#operations-v1_-_Site_Settings_>_Style-list_5
2
+
3
+ const { ArgsWarden } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { threeclicksClient } = require('../threeclicks/threeclicks.utils');
6
+
7
+ const argsWarden = new ArgsWarden([
8
+ ['credsPayload', credsValidator],
9
+ ]);
10
+
11
+ const threeclicksCollectionsGet = async (credsPayload) => {
12
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({ credsPayload });
13
+ if (rejectResponse) return rejectResponse;
14
+ return threeclicksClient.fetch({
15
+ requestPayload: {
16
+ url: '/site-settings/style/collection',
17
+ method: 'get',
18
+ },
19
+ context: {
20
+ credsPayload,
21
+ },
22
+ });
23
+ };
24
+
25
+ const funcApiConfig = {
26
+ argsWarden,
27
+ };
28
+
29
+ module.exports = {
30
+ threeclicksCollectionsGet,
31
+ funcApiConfig,
32
+ };
33
+
34
+ /*
35
+ curl -X POST "http://localhost:8000/threeclicksCollectionsGet" \
36
+ -H "Content-Type: application/json" \
37
+ -d '{
38
+ "credsPayload": { "credsPath": "threeclicks" }
39
+ }'
40
+ */
@@ -0,0 +1,138 @@
1
+ // https://g40-server.instance.3clickscloud.com/swagger-ui/index.html#operations-tag-v1_-_Search_>_Advanced
2
+
3
+ const { ArgsWarden, Getter } = require('../utils');
4
+ const { credsValidator } = require('../validators');
5
+ const { threeclicksClient } = require('../threeclicks/threeclicks.utils');
6
+
7
+ const argsWarden = new ArgsWarden([
8
+ ['credsPayload', credsValidator],
9
+ ['url'],
10
+ ]);
11
+
12
+ const threeclicksGetPacket = async (
13
+ credsPayload,
14
+ url,
15
+ {
16
+ params,
17
+ page = '1',
18
+ } = {},
19
+ ) => {
20
+ const paramsWithPage = {
21
+ ...params,
22
+ page: String(page),
23
+ };
24
+
25
+ return threeclicksClient.fetch({
26
+ requestPayload: {
27
+ url,
28
+ method: 'get',
29
+ params: paramsWithPage,
30
+ },
31
+ context: {
32
+ credsPayload,
33
+ },
34
+ });
35
+ };
36
+
37
+ const threeclicksGetPaginator = async (currentParams, response) => {
38
+ if (!response?.ok) {
39
+ return [true];
40
+ }
41
+
42
+ const pageCount = response?.data?.content?.pagination_data?.page_count;
43
+ const currentPage = parseInt(currentParams.options.page, 10);
44
+
45
+ if (!pageCount || currentPage >= pageCount) {
46
+ return [true];
47
+ }
48
+
49
+ const { args, options } = currentParams;
50
+
51
+ return [false, {
52
+ args,
53
+ options: {
54
+ ...options,
55
+ page: String(currentPage + 1),
56
+ },
57
+ }];
58
+ };
59
+
60
+ const threeclicksGetDigester = (response) => {
61
+ if (!response?.ok) {
62
+ return [];
63
+ }
64
+
65
+ return response?.data?.content?.pagination_data?.result_data ?? [];
66
+ };
67
+
68
+ const threeclicksGet = async (
69
+ returnGetter,
70
+
71
+ credsPayload,
72
+ url,
73
+ {
74
+ params,
75
+ page = '1',
76
+ ...getterOptions
77
+ } = {},
78
+ ) => {
79
+
80
+ const rejectResponse = await argsWarden.responseIfRejectingArgs({
81
+ credsPayload,
82
+ url,
83
+ });
84
+ if (rejectResponse) {
85
+ return rejectResponse;
86
+ }
87
+
88
+ const getter = new Getter(
89
+ {
90
+ args: [credsPayload, url],
91
+ options: {
92
+ params,
93
+ page,
94
+ },
95
+ },
96
+ {
97
+ func: threeclicksGetPacket,
98
+ digester: threeclicksGetDigester,
99
+ paginator: threeclicksGetPaginator,
100
+ ...getterOptions,
101
+ },
102
+ );
103
+
104
+ if (returnGetter) {
105
+ return getter;
106
+ }
107
+
108
+ const data = await getter.run({ returnAll: true });
109
+
110
+ return {
111
+ ok: true,
112
+ data,
113
+ };
114
+ };
115
+
116
+ const funcApiConfig = {
117
+ argsWarden,
118
+ };
119
+
120
+ module.exports = {
121
+ threeclicksGet: (...args) => threeclicksGet(false, ...args),
122
+ threeclicksGetter: (...args) => threeclicksGet(true, ...args),
123
+ funcApiConfig,
124
+ };
125
+
126
+ /*
127
+ curl -X POST "http://localhost:8000/threeclicksGet" \
128
+ -H "Content-Type: application/json" \
129
+ -d '{
130
+ "credsPayload": { "credsPath": "threeclicks" },
131
+ "url": "/search/advanced/style",
132
+ "options": {
133
+ "params": {
134
+ "mode": "all"
135
+ }
136
+ }
137
+ }'
138
+ */