@unchainedshop/core-warehousing 1.1.3

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 (41) hide show
  1. package/.npm/package/README +7 -0
  2. package/.npm/package/npm-shrinkwrap.json +155 -0
  3. package/.versions +54 -0
  4. package/README.md +3 -0
  5. package/lib/db/WarehousingProvidersCollection.d.ts +3 -0
  6. package/lib/db/WarehousingProvidersCollection.js +13 -0
  7. package/lib/db/WarehousingProvidersCollection.js.map +1 -0
  8. package/lib/db/WarehousingProvidersSchema.d.ts +1 -0
  9. package/lib/db/WarehousingProvidersSchema.js +13 -0
  10. package/lib/db/WarehousingProvidersSchema.js.map +1 -0
  11. package/lib/director/WarehousingAdapter.d.ts +2 -0
  12. package/lib/director/WarehousingAdapter.js +33 -0
  13. package/lib/director/WarehousingAdapter.js.map +1 -0
  14. package/lib/director/WarehousingDirector.d.ts +2 -0
  15. package/lib/director/WarehousingDirector.js +93 -0
  16. package/lib/director/WarehousingDirector.js.map +1 -0
  17. package/lib/director/WarehousingError.d.ts +6 -0
  18. package/lib/director/WarehousingError.js +8 -0
  19. package/lib/director/WarehousingError.js.map +1 -0
  20. package/lib/director/WarehousingProviderType.d.ts +3 -0
  21. package/lib/director/WarehousingProviderType.js +5 -0
  22. package/lib/director/WarehousingProviderType.js.map +1 -0
  23. package/lib/module/configureWarehousingModule.d.ts +3 -0
  24. package/lib/module/configureWarehousingModule.js +111 -0
  25. package/lib/module/configureWarehousingModule.js.map +1 -0
  26. package/lib/warehousing-index.d.ts +5 -0
  27. package/lib/warehousing-index.js +6 -0
  28. package/lib/warehousing-index.js.map +1 -0
  29. package/package.js +32 -0
  30. package/package.json +44 -0
  31. package/src/db/WarehousingProvidersCollection.ts +17 -0
  32. package/src/db/WarehousingProvidersSchema.js +16 -0
  33. package/src/director/WarehousingAdapter.ts +42 -0
  34. package/src/director/WarehousingDirector.ts +108 -0
  35. package/src/director/WarehousingError.ts +6 -0
  36. package/src/director/WarehousingProviderType.ts +3 -0
  37. package/src/module/configureWarehousingModule.ts +167 -0
  38. package/src/warehousing-index.ts +6 -0
  39. package/tests/warehousing-index.test.ts +22 -0
  40. package/tsconfig.build.json +26 -0
  41. package/tsconfig.json +8 -0
@@ -0,0 +1,7 @@
1
+ This directory and the files immediately inside it are automatically generated
2
+ when you change this package's NPM dependencies. Commit the files in this
3
+ directory (npm-shrinkwrap.json, .gitignore, and this README) to source control
4
+ so that others run the same versions of sub-dependencies.
5
+
6
+ You should NOT check in the node_modules directory that Meteor automatically
7
+ creates; if you are using git, the .gitignore file tells git to ignore it.
@@ -0,0 +1,155 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "dependencies": {
4
+ "@colors/colors": {
5
+ "version": "1.5.0",
6
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
7
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="
8
+ },
9
+ "@dabh/diagnostics": {
10
+ "version": "2.0.3",
11
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
12
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="
13
+ },
14
+ "@unchainedshop/logger": {
15
+ "version": "1.1.0",
16
+ "resolved": "https://registry.npmjs.org/@unchainedshop/logger/-/logger-1.1.0.tgz",
17
+ "integrity": "sha512-PwS2wtlwzRo1RlfRbKQN6cLCz7XEp2dGmVbXCQ1E49O9VvAYNh5mdTg2BNoWYZ1Sl7KWpLkANNYispb+X/Y4jw=="
18
+ },
19
+ "async": {
20
+ "version": "3.2.4",
21
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
22
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
23
+ },
24
+ "color": {
25
+ "version": "3.2.1",
26
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
27
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="
28
+ },
29
+ "color-convert": {
30
+ "version": "1.9.3",
31
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
32
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
33
+ },
34
+ "color-name": {
35
+ "version": "1.1.3",
36
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
37
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
38
+ },
39
+ "color-string": {
40
+ "version": "1.9.1",
41
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
42
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="
43
+ },
44
+ "colorspace": {
45
+ "version": "1.1.4",
46
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
47
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w=="
48
+ },
49
+ "enabled": {
50
+ "version": "2.0.0",
51
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
52
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
53
+ },
54
+ "fecha": {
55
+ "version": "4.2.3",
56
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
57
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
58
+ },
59
+ "fn.name": {
60
+ "version": "1.1.0",
61
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
62
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
63
+ },
64
+ "inherits": {
65
+ "version": "2.0.4",
66
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
67
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
68
+ },
69
+ "is-arrayish": {
70
+ "version": "0.3.2",
71
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
72
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
73
+ },
74
+ "is-stream": {
75
+ "version": "2.0.1",
76
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
77
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
78
+ },
79
+ "kuler": {
80
+ "version": "2.0.0",
81
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
82
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
83
+ },
84
+ "logform": {
85
+ "version": "2.4.0",
86
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz",
87
+ "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw=="
88
+ },
89
+ "ms": {
90
+ "version": "2.1.3",
91
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
92
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
93
+ },
94
+ "one-time": {
95
+ "version": "1.0.0",
96
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
97
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="
98
+ },
99
+ "readable-stream": {
100
+ "version": "3.6.0",
101
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
102
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
103
+ },
104
+ "safe-buffer": {
105
+ "version": "5.2.1",
106
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
107
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
108
+ },
109
+ "safe-stable-stringify": {
110
+ "version": "2.3.1",
111
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz",
112
+ "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg=="
113
+ },
114
+ "simple-swizzle": {
115
+ "version": "0.2.2",
116
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
117
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="
118
+ },
119
+ "stack-trace": {
120
+ "version": "0.0.10",
121
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
122
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="
123
+ },
124
+ "string_decoder": {
125
+ "version": "1.3.0",
126
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
127
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
128
+ },
129
+ "text-hex": {
130
+ "version": "1.0.0",
131
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
132
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
133
+ },
134
+ "triple-beam": {
135
+ "version": "1.3.0",
136
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
137
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
138
+ },
139
+ "util-deprecate": {
140
+ "version": "1.0.2",
141
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
142
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
143
+ },
144
+ "winston": {
145
+ "version": "3.7.2",
146
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz",
147
+ "integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng=="
148
+ },
149
+ "winston-transport": {
150
+ "version": "4.5.0",
151
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
152
+ "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q=="
153
+ }
154
+ }
155
+ }
package/.versions ADDED
@@ -0,0 +1,54 @@
1
+ allow-deny@1.1.1
2
+ babel-compiler@7.9.0
3
+ babel-runtime@1.5.1
4
+ base64@1.0.12
5
+ binary-heap@1.0.11
6
+ boilerplate-generator@1.7.1
7
+ callback-hook@1.4.0
8
+ check@1.3.1
9
+ ddp@1.4.0
10
+ ddp-client@2.5.0
11
+ ddp-common@1.4.0
12
+ ddp-server@2.5.0
13
+ diff-sequence@1.1.1
14
+ dynamic-import@0.7.2
15
+ ecmascript@0.16.2
16
+ ecmascript-runtime@0.8.0
17
+ ecmascript-runtime-client@0.12.1
18
+ ecmascript-runtime-server@0.11.0
19
+ ejson@1.1.2
20
+ fetch@0.1.1
21
+ geojson-utils@1.0.10
22
+ id-map@1.1.1
23
+ inter-process-messaging@0.1.1
24
+ local-test:unchained:core-warehousing@1.1.1
25
+ logging@1.3.1
26
+ meteor@1.10.0
27
+ meteortesting:browser-tests@0.1.2
28
+ meteortesting:mocha@0.4.4
29
+ minimongo@1.8.0
30
+ modern-browsers@0.1.8
31
+ modules@0.18.0
32
+ modules-runtime@0.13.0
33
+ mongo@1.15.0
34
+ mongo-decimal@0.1.3
35
+ mongo-dev-server@1.1.0
36
+ mongo-id@1.0.8
37
+ npm-mongo@4.3.1
38
+ ordered-dict@1.1.0
39
+ practicalmeteor:mocha-core@1.0.1
40
+ promise@0.12.0
41
+ random@1.2.0
42
+ react-fast-refresh@0.2.3
43
+ reload@1.3.1
44
+ retry@1.1.0
45
+ routepolicy@1.1.1
46
+ socket-stream-client@0.5.0
47
+ tracker@1.2.0
48
+ typescript@4.5.4
49
+ unchained:core-warehousing@1.1.1
50
+
51
+ unchained:mongodb@1.0.0
52
+ underscore@1.0.10
53
+ webapp@1.13.1
54
+ webapp-hashing@1.1.0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Warehousing (Unchained Engine)
2
+
3
+ This package contains business logic and database abstraction for warehousing in Unchained.
@@ -0,0 +1,3 @@
1
+ import { Db } from '@unchainedshop/types/common';
2
+ import { WarehousingProvider } from '@unchainedshop/types/warehousing';
3
+ export declare const WarehousingProvidersCollection: (db: Db) => Promise<import("mongodb").Collection<WarehousingProvider>>;
@@ -0,0 +1,13 @@
1
+ import { buildDbIndexes } from '@unchainedshop/utils';
2
+ export const WarehousingProvidersCollection = async (db) => {
3
+ const WarehousingProviders = db.collection('warehousing-providers');
4
+ await buildDbIndexes(WarehousingProviders, [
5
+ {
6
+ index: {
7
+ type: 1,
8
+ },
9
+ },
10
+ ]);
11
+ return WarehousingProviders;
12
+ };
13
+ //# sourceMappingURL=WarehousingProvidersCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarehousingProvidersCollection.js","sourceRoot":"","sources":["../../src/db/WarehousingProvidersCollection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,EAAM,EAAE,EAAE;IAC7D,MAAM,oBAAoB,GAAG,EAAE,CAAC,UAAU,CAAsB,uBAAuB,CAAC,CAAC;IAEzF,MAAM,cAAc,CAAsB,oBAAoB,EAAE;QAC9D;YACE,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC;aACR;SACF;KACF,CAAC,CAAC;IAEH,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export const WarehousingProvidersSchema: any;
@@ -0,0 +1,13 @@
1
+ import SimpleSchema from 'simpl-schema';
2
+ import { Schemas } from '@unchainedshop/utils';
3
+ export const WarehousingProvidersSchema = new SimpleSchema({
4
+ type: { type: String, required: true },
5
+ adapterKey: { type: String, required: true },
6
+ authorId: { type: String, required: true },
7
+ configuration: Array,
8
+ 'configuration.$': Object,
9
+ 'configuration.$.key': String,
10
+ 'configuration.$.value': String,
11
+ ...Schemas.timestampFields,
12
+ }, { requiredByDefault: false });
13
+ //# sourceMappingURL=WarehousingProvidersSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarehousingProvidersSchema.js","sourceRoot":"","sources":["../../src/db/WarehousingProvidersSchema.js"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,YAAY,CACxD;IACE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5C,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1C,aAAa,EAAE,KAAK;IACpB,iBAAiB,EAAE,MAAM;IACzB,qBAAqB,EAAE,MAAM;IAC7B,uBAAuB,EAAE,MAAM;IAC/B,GAAG,OAAO,CAAC,eAAe;CAC3B,EACD,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { IWarehousingAdapter } from '@unchainedshop/types/warehousing';
2
+ export declare const WarehousingAdapter: Omit<IWarehousingAdapter, 'key' | 'label' | 'version'>;
@@ -0,0 +1,33 @@
1
+ import { log, LogLevel } from '@unchainedshop/logger';
2
+ import { WarehousingError } from './WarehousingError';
3
+ export const WarehousingAdapter = {
4
+ orderIndex: 0,
5
+ typeSupported: () => {
6
+ return false;
7
+ },
8
+ initialConfiguration: [],
9
+ actions: () => {
10
+ return {
11
+ configurationError() {
12
+ return WarehousingError.NOT_IMPLEMENTED;
13
+ },
14
+ isActive() {
15
+ return false;
16
+ },
17
+ stock: async () => {
18
+ return 0;
19
+ },
20
+ productionTime: async () => {
21
+ return 0;
22
+ },
23
+ commissioningTime: async () => {
24
+ return 0;
25
+ },
26
+ };
27
+ },
28
+ log(message, { level = LogLevel.Debug, ...options } = {}) {
29
+ // eslint-disable-line
30
+ return log(message, { level, ...options });
31
+ },
32
+ };
33
+ //# sourceMappingURL=WarehousingAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarehousingAdapter.js","sourceRoot":"","sources":["../../src/director/WarehousingAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAA2D;IACxF,UAAU,EAAE,CAAC;IAEb,aAAa,EAAE,GAAG,EAAE;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB,EAAE,EAAE;IAExB,OAAO,EAAE,GAAG,EAAE;QACZ,OAAO;YACL,kBAAkB;gBAChB,OAAO,gBAAgB,CAAC,eAAe,CAAC;YAC1C,CAAC;YAED,QAAQ;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;YAED,KAAK,EAAE,KAAK,IAAI,EAAE;gBAChB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,cAAc,EAAE,KAAK,IAAI,EAAE;gBACzB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5B,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE;QACtD,sBAAsB;QACtB,OAAO,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { IWarehousingDirector } from '@unchainedshop/types/warehousing';
2
+ export declare const WarehousingDirector: IWarehousingDirector;
@@ -0,0 +1,93 @@
1
+ import { DeliveryDirector } from '@unchainedshop/core-delivery';
2
+ import { log, LogLevel } from '@unchainedshop/logger';
3
+ import { BaseDirector } from '@unchainedshop/utils';
4
+ import { WarehousingError } from './WarehousingError';
5
+ const getReferenceDate = (context) => {
6
+ return context && context.referenceDate ? context.referenceDate : new Date();
7
+ };
8
+ const baseDirector = BaseDirector('WarehousingDirector', {
9
+ adapterSortKey: 'orderIndex',
10
+ });
11
+ export const WarehousingDirector = {
12
+ ...baseDirector,
13
+ actions: async (warehousingProvider, warehousingContext, requestContext) => {
14
+ const Adapter = baseDirector.getAdapter(warehousingProvider.adapterKey);
15
+ if (!Adapter) {
16
+ throw new Error(`Payment Plugin ${warehousingProvider.adapterKey} not available`);
17
+ }
18
+ const context = {
19
+ warehousingProviderId: warehousingProvider._id,
20
+ ...warehousingContext,
21
+ ...requestContext,
22
+ };
23
+ const adapter = Adapter.actions(warehousingProvider.configuration, context);
24
+ const throughputTime = async () => {
25
+ try {
26
+ const { quantity } = context;
27
+ const referenceDate = getReferenceDate(context);
28
+ const stock = (await adapter.stock(referenceDate).catch(() => 0)) || 0;
29
+ const notInStockQuantity = Math.max(quantity - stock, 0);
30
+ const productionTime = await adapter.productionTime(notInStockQuantity);
31
+ const commissioningTime = await adapter.commissioningTime(quantity);
32
+ return Math.max(commissioningTime + productionTime, 0);
33
+ }
34
+ catch (error) {
35
+ log(error.message, { level: LogLevel.Error, ...error });
36
+ return 0;
37
+ }
38
+ };
39
+ return {
40
+ configurationError: () => {
41
+ try {
42
+ const error = adapter.configurationError();
43
+ return error;
44
+ }
45
+ catch (error) {
46
+ return WarehousingError.ADAPTER_NOT_FOUND;
47
+ }
48
+ },
49
+ isActive: () => {
50
+ try {
51
+ return adapter.isActive();
52
+ }
53
+ catch (error) {
54
+ log(error.message, { level: LogLevel.Error });
55
+ return false;
56
+ }
57
+ },
58
+ estimatedStock: async () => {
59
+ try {
60
+ const referenceDate = getReferenceDate(context);
61
+ const quantity = await adapter.stock(referenceDate);
62
+ return {
63
+ quantity,
64
+ };
65
+ }
66
+ catch (error) {
67
+ log(error.message, { level: LogLevel.Error, ...error });
68
+ return null;
69
+ }
70
+ },
71
+ estimatedDispatch: async () => {
72
+ try {
73
+ const { deliveryProvider } = context;
74
+ const referenceDate = getReferenceDate(context);
75
+ const warehousingThroughputTime = await throughputTime();
76
+ const actions = await DeliveryDirector.actions(deliveryProvider, context, requestContext);
77
+ const deliveryThroughputTime = await actions.estimatedDeliveryThroughput(warehousingThroughputTime);
78
+ const shippingTimestamp = referenceDate.getTime() + warehousingThroughputTime;
79
+ const earliestDeliveryTimestamp = deliveryThroughputTime !== null ? shippingTimestamp + deliveryThroughputTime : null;
80
+ return {
81
+ shipping: shippingTimestamp && new Date(shippingTimestamp),
82
+ earliestDelivery: earliestDeliveryTimestamp && new Date(earliestDeliveryTimestamp),
83
+ };
84
+ }
85
+ catch (error) {
86
+ log(error.message, { level: LogLevel.Error, ...error });
87
+ return {};
88
+ }
89
+ },
90
+ };
91
+ },
92
+ };
93
+ //# sourceMappingURL=WarehousingDirector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarehousingDirector.js","sourceRoot":"","sources":["../../src/director/WarehousingDirector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare enum WarehousingError {
2
+ ADAPTER_NOT_FOUND = "ADAPTER_NOT_FOUND",
3
+ NOT_IMPLEMENTED = "NOT_IMPLEMENTED",
4
+ INCOMPLETE_CONFIGURATION = "INCOMPLETE_CONFIGURATION",
5
+ WRONG_CREDENTIALS = "WRONG_CREDENTIALS"
6
+ }
@@ -0,0 +1,8 @@
1
+ export var WarehousingError;
2
+ (function (WarehousingError) {
3
+ WarehousingError["ADAPTER_NOT_FOUND"] = "ADAPTER_NOT_FOUND";
4
+ WarehousingError["NOT_IMPLEMENTED"] = "NOT_IMPLEMENTED";
5
+ WarehousingError["INCOMPLETE_CONFIGURATION"] = "INCOMPLETE_CONFIGURATION";
6
+ WarehousingError["WRONG_CREDENTIALS"] = "WRONG_CREDENTIALS";
7
+ })(WarehousingError || (WarehousingError = {}));
8
+ //# sourceMappingURL=WarehousingError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarehousingError.js","sourceRoot":"","sources":["../../src/director/WarehousingError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,2DAAuC,CAAA;IACvC,uDAAmC,CAAA;IACnC,yEAAqD,CAAA;IACrD,2DAAuC,CAAA;AACzC,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B"}
@@ -0,0 +1,3 @@
1
+ export declare enum WarehousingProviderType {
2
+ PHYSICAL = "PHYSICAL"
3
+ }
@@ -0,0 +1,5 @@
1
+ export var WarehousingProviderType;
2
+ (function (WarehousingProviderType) {
3
+ WarehousingProviderType["PHYSICAL"] = "PHYSICAL";
4
+ })(WarehousingProviderType || (WarehousingProviderType = {}));
5
+ //# sourceMappingURL=WarehousingProviderType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarehousingProviderType.js","sourceRoot":"","sources":["../../src/director/WarehousingProviderType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,uBAEX;AAFD,WAAY,uBAAuB;IACjC,gDAAqB,CAAA;AACvB,CAAC,EAFW,uBAAuB,KAAvB,uBAAuB,QAElC"}
@@ -0,0 +1,3 @@
1
+ import { ModuleInput } from '@unchainedshop/types/common';
2
+ import { WarehousingModule } from '@unchainedshop/types/warehousing';
3
+ export declare const configureWarehousingModule: ({ db, }: ModuleInput<Record<string, never>>) => Promise<WarehousingModule>;
@@ -0,0 +1,111 @@
1
+ import { emit, registerEvents } from '@unchainedshop/events';
2
+ import { generateDbFilterById, generateDbMutations } from '@unchainedshop/utils';
3
+ import { WarehousingProvidersCollection } from '../db/WarehousingProvidersCollection';
4
+ import { WarehousingProvidersSchema } from '../db/WarehousingProvidersSchema';
5
+ import { WarehousingDirector } from '../director/WarehousingDirector';
6
+ const WAREHOUSING_PROVIDER_EVENTS = [
7
+ 'WAREHOUSING_PROVIDER_CREATE',
8
+ 'WAREHOUSING_PROVIDER_UPDATE',
9
+ 'WAREHOUSING_PROVIDER_REMOVE',
10
+ ];
11
+ const buildFindSelector = ({ type } = {}) => {
12
+ const query = type ? { type, deleted: null } : { deleted: null };
13
+ return query;
14
+ };
15
+ const asyncFilter = async (arr, predicate) => {
16
+ const results = await Promise.all(arr.map(predicate));
17
+ return arr.filter((_v, index) => results[index]);
18
+ };
19
+ export const configureWarehousingModule = async ({ db, }) => {
20
+ registerEvents(WAREHOUSING_PROVIDER_EVENTS);
21
+ const WarehousingProviders = await WarehousingProvidersCollection(db);
22
+ const mutations = generateDbMutations(WarehousingProviders, WarehousingProvidersSchema);
23
+ return {
24
+ // Queries
25
+ ...mutations,
26
+ count: async (query) => {
27
+ const providerCount = await WarehousingProviders.countDocuments(buildFindSelector(query));
28
+ return providerCount;
29
+ },
30
+ findProvider: async ({ warehousingProviderId }, options) => {
31
+ return WarehousingProviders.findOne(generateDbFilterById(warehousingProviderId), options);
32
+ },
33
+ findProviders: async (query, options) => {
34
+ const providers = WarehousingProviders.find(buildFindSelector(query), options);
35
+ return providers.toArray();
36
+ },
37
+ providerExists: async ({ warehousingProviderId }) => {
38
+ const providerCount = await WarehousingProviders.countDocuments(generateDbFilterById(warehousingProviderId, { deleted: null }), { limit: 1 });
39
+ return !!providerCount;
40
+ },
41
+ // Adapter
42
+ findInterface: (warehousingProvider) => {
43
+ const Adapter = WarehousingDirector.getAdapter(warehousingProvider.adapterKey);
44
+ if (!Adapter)
45
+ return null;
46
+ return {
47
+ _id: Adapter.key,
48
+ label: Adapter.label,
49
+ version: Adapter.version,
50
+ };
51
+ },
52
+ findInterfaces: ({ type }) => {
53
+ return WarehousingDirector.getAdapters({
54
+ adapterFilter: (Adapter) => Adapter.typeSupported(type),
55
+ }).map((Adapter) => ({
56
+ _id: Adapter.key,
57
+ label: Adapter.label,
58
+ version: Adapter.version,
59
+ }));
60
+ },
61
+ findSupported: async (warehousingContext, requestContext) => {
62
+ const allProviders = await WarehousingProviders.find(buildFindSelector({})).toArray();
63
+ const providers = asyncFilter(allProviders, async (provider) => {
64
+ const director = await WarehousingDirector.actions(provider, warehousingContext, requestContext);
65
+ return director.isActive();
66
+ });
67
+ return providers;
68
+ },
69
+ configurationError: async (warehousingProvider, requestContext) => {
70
+ const actions = await WarehousingDirector.actions(warehousingProvider, {}, requestContext);
71
+ return actions.configurationError();
72
+ },
73
+ estimatedDispatch: async (warehousingProvider, warehousingContext, requestContext) => {
74
+ const director = await WarehousingDirector.actions(warehousingProvider, warehousingContext, requestContext);
75
+ return director.estimatedDispatch();
76
+ },
77
+ estimatedStock: async (warehousingProvider, warehousingContext, requestContext) => {
78
+ const director = await WarehousingDirector.actions(warehousingProvider, warehousingContext, requestContext);
79
+ return director.estimatedStock();
80
+ },
81
+ isActive: async (warehousingProvider, requestContext) => {
82
+ const actions = await WarehousingDirector.actions(warehousingProvider, {}, requestContext);
83
+ return actions.isActive();
84
+ },
85
+ // Mutations
86
+ create: async (doc, userId) => {
87
+ const Adapter = WarehousingDirector.getAdapter(doc.adapterKey);
88
+ if (!Adapter)
89
+ return null;
90
+ const warehousingProviderId = await mutations.create({ configuration: Adapter.initialConfiguration, ...doc }, userId);
91
+ const warehousingProvider = await WarehousingProviders.findOne(generateDbFilterById(warehousingProviderId));
92
+ emit('WAREHOUSING_PROVIDER_CREATE', { warehousingProvider });
93
+ return warehousingProviderId;
94
+ },
95
+ update: async (_id, doc, userId) => {
96
+ const warehousingProviderId = await mutations.update(_id, doc, userId);
97
+ const warehousingProvider = await WarehousingProviders.findOne(generateDbFilterById(_id), {});
98
+ if (!warehousingProvider)
99
+ return null;
100
+ emit('WAREHOUSING_PROVIDER_UPDATE', { warehousingProvider });
101
+ return warehousingProviderId;
102
+ },
103
+ delete: async (providerId, userId) => {
104
+ await mutations.delete(providerId, userId);
105
+ const warehousingProvider = await WarehousingProviders.findOne(generateDbFilterById(providerId), {});
106
+ emit('WAREHOUSING_PROVIDER_REMOVE', { warehousingProvider });
107
+ return warehousingProvider;
108
+ },
109
+ };
110
+ };
111
+ //# sourceMappingURL=configureWarehousingModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureWarehousingModule.js","sourceRoot":"","sources":["../../src/module/configureWarehousingModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { configureWarehousingModule } from './module/configureWarehousingModule';
2
+ export { WarehousingDirector } from './director/WarehousingDirector';
3
+ export { WarehousingAdapter } from './director/WarehousingAdapter';
4
+ export { WarehousingError } from './director/WarehousingError';
5
+ export { WarehousingProviderType } from './director/WarehousingProviderType';
@@ -0,0 +1,6 @@
1
+ export { configureWarehousingModule } from './module/configureWarehousingModule';
2
+ export { WarehousingDirector } from './director/WarehousingDirector';
3
+ export { WarehousingAdapter } from './director/WarehousingAdapter';
4
+ export { WarehousingError } from './director/WarehousingError';
5
+ export { WarehousingProviderType } from './director/WarehousingProviderType';
6
+ //# sourceMappingURL=warehousing-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warehousing-index.js","sourceRoot":"","sources":["../src/warehousing-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
package/package.js ADDED
@@ -0,0 +1,32 @@
1
+ Package.describe({
2
+ name: 'unchained:core-warehousing',
3
+ version: '1.1.3',
4
+ summary: 'Unchained Engine Core: Warehousing',
5
+ git: 'https://github.com/unchainedshop/unchained',
6
+ documentation: 'README.md',
7
+ });
8
+
9
+ Npm.depends({
10
+ '@unchainedshop/logger': '1.1.3',
11
+ '@unchainedshop/utils': '1.1.3',
12
+ // '@unchainedshop/events': '1.1.4', // PEER
13
+ });
14
+
15
+ Package.onUse((api) => {
16
+ api.versionsFrom('2.7.3');
17
+ api.use('ecmascript');
18
+ api.use('typescript');
19
+
20
+ api.mainModule('src/warehousing-index.ts', 'server');
21
+ });
22
+
23
+ Package.onTest((api) => {
24
+ api.use('meteortesting:mocha');
25
+ api.use('ecmascript');
26
+ api.use('typescript');
27
+
28
+ api.use('unchained:mongodb');
29
+ api.use('unchained:core-warehousing');
30
+
31
+ api.mainModule('tests/warehousing-index.test.ts');
32
+ });
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@unchainedshop/core-warehousing",
3
+ "version": "1.1.3",
4
+ "main": "lib/warehousing-index.js",
5
+ "types": "lib/warehousing-index.d.ts",
6
+ "type": "module",
7
+ "scripts": {
8
+ "clean": "rm -rf lib",
9
+ "build": "npm run clean && tsc -p tsconfig.build.json",
10
+ "watch": "tsc --watch",
11
+ "link:core": "npm link @unchainedshop/types",
12
+ "test": "cross-env METEOR_PACKAGE_DIRS=../ TEST_CLIENT=0 TEST_WATCH=1 meteor test-packages ./ --driver-package meteortesting:mocha --port 4200"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/unchainedshop/unchained.git"
17
+ },
18
+ "keywords": [
19
+ "unchained",
20
+ "ecommerce",
21
+ "core"
22
+ ],
23
+ "author": "Joël Meiller",
24
+ "license": "EUPL-1.2",
25
+ "bugs": {
26
+ "url": "https://github.com/unchainedshop/unchained/issues"
27
+ },
28
+ "homepage": "https://github.com/unchainedshop/unchained#readme",
29
+ "dependencies": {
30
+ "@unchainedshop/events": "latest",
31
+ "@unchainedshop/logger": "latest",
32
+ "@unchainedshop/utils": "latest",
33
+ "lru-cache": "^7.10.2",
34
+ "simpl-schema": "^1.12.2"
35
+ },
36
+ "devDependencies": {
37
+ "@types/chai": "^4.3.1",
38
+ "@types/mocha": "^9.1.1",
39
+ "@unchainedshop/types": "latest",
40
+ "chai": "^4.3.6",
41
+ "cross-env": "^7.0.3",
42
+ "typescript": "^4.7.4"
43
+ }
44
+ }
@@ -0,0 +1,17 @@
1
+ import { Db } from '@unchainedshop/types/common';
2
+ import { WarehousingProvider } from '@unchainedshop/types/warehousing';
3
+ import { buildDbIndexes } from '@unchainedshop/utils';
4
+
5
+ export const WarehousingProvidersCollection = async (db: Db) => {
6
+ const WarehousingProviders = db.collection<WarehousingProvider>('warehousing-providers');
7
+
8
+ await buildDbIndexes<WarehousingProvider>(WarehousingProviders, [
9
+ {
10
+ index: {
11
+ type: 1,
12
+ },
13
+ },
14
+ ]);
15
+
16
+ return WarehousingProviders;
17
+ };
@@ -0,0 +1,16 @@
1
+ import SimpleSchema from 'simpl-schema';
2
+ import { Schemas } from '@unchainedshop/utils';
3
+
4
+ export const WarehousingProvidersSchema = new SimpleSchema(
5
+ {
6
+ type: { type: String, required: true },
7
+ adapterKey: { type: String, required: true },
8
+ authorId: { type: String, required: true },
9
+ configuration: Array,
10
+ 'configuration.$': Object,
11
+ 'configuration.$.key': String,
12
+ 'configuration.$.value': String,
13
+ ...Schemas.timestampFields,
14
+ },
15
+ { requiredByDefault: false },
16
+ );
@@ -0,0 +1,42 @@
1
+ import { IWarehousingAdapter } from '@unchainedshop/types/warehousing';
2
+ import { log, LogLevel } from '@unchainedshop/logger';
3
+ import { WarehousingError } from './WarehousingError';
4
+
5
+ export const WarehousingAdapter: Omit<IWarehousingAdapter, 'key' | 'label' | 'version'> = {
6
+ orderIndex: 0,
7
+
8
+ typeSupported: () => {
9
+ return false;
10
+ },
11
+
12
+ initialConfiguration: [],
13
+
14
+ actions: () => {
15
+ return {
16
+ configurationError() {
17
+ return WarehousingError.NOT_IMPLEMENTED;
18
+ },
19
+
20
+ isActive() {
21
+ return false;
22
+ },
23
+
24
+ stock: async () => {
25
+ return 0;
26
+ },
27
+
28
+ productionTime: async () => {
29
+ return 0;
30
+ },
31
+
32
+ commissioningTime: async () => {
33
+ return 0;
34
+ },
35
+ };
36
+ },
37
+
38
+ log(message, { level = LogLevel.Debug, ...options } = {}) {
39
+ // eslint-disable-line
40
+ return log(message, { level, ...options });
41
+ },
42
+ };
@@ -0,0 +1,108 @@
1
+ import {
2
+ IWarehousingAdapter,
3
+ IWarehousingDirector,
4
+ WarehousingContext,
5
+ } from '@unchainedshop/types/warehousing';
6
+ import { DeliveryDirector } from '@unchainedshop/core-delivery';
7
+ import { log, LogLevel } from '@unchainedshop/logger';
8
+ import { BaseDirector } from '@unchainedshop/utils';
9
+ import { WarehousingError } from './WarehousingError';
10
+
11
+ const getReferenceDate = (context: WarehousingContext) => {
12
+ return context && context.referenceDate ? context.referenceDate : new Date();
13
+ };
14
+
15
+ const baseDirector = BaseDirector<IWarehousingAdapter>('WarehousingDirector', {
16
+ adapterSortKey: 'orderIndex',
17
+ });
18
+
19
+ export const WarehousingDirector: IWarehousingDirector = {
20
+ ...baseDirector,
21
+
22
+ actions: async (warehousingProvider, warehousingContext, requestContext) => {
23
+ const Adapter = baseDirector.getAdapter(warehousingProvider.adapterKey);
24
+
25
+ if (!Adapter) {
26
+ throw new Error(`Payment Plugin ${warehousingProvider.adapterKey} not available`);
27
+ }
28
+ const context = {
29
+ warehousingProviderId: warehousingProvider._id,
30
+ ...warehousingContext,
31
+ ...requestContext,
32
+ };
33
+ const adapter = Adapter.actions(warehousingProvider.configuration, context);
34
+
35
+ const throughputTime = async () => {
36
+ try {
37
+ const { quantity } = context;
38
+ const referenceDate = getReferenceDate(context);
39
+ const stock = (await adapter.stock(referenceDate).catch(() => 0)) || 0;
40
+ const notInStockQuantity = Math.max(quantity - stock, 0);
41
+ const productionTime = await adapter.productionTime(notInStockQuantity);
42
+ const commissioningTime = await adapter.commissioningTime(quantity);
43
+ return Math.max(commissioningTime + productionTime, 0);
44
+ } catch (error) {
45
+ log(error.message, { level: LogLevel.Error, ...error });
46
+ return 0;
47
+ }
48
+ };
49
+
50
+ return {
51
+ configurationError: () => {
52
+ try {
53
+ const error = adapter.configurationError();
54
+ return error;
55
+ } catch (error) {
56
+ return WarehousingError.ADAPTER_NOT_FOUND;
57
+ }
58
+ },
59
+
60
+ isActive: () => {
61
+ try {
62
+ return adapter.isActive();
63
+ } catch (error) {
64
+ log(error.message, { level: LogLevel.Error });
65
+ return false;
66
+ }
67
+ },
68
+
69
+ estimatedStock: async () => {
70
+ try {
71
+ const referenceDate = getReferenceDate(context);
72
+ const quantity = await adapter.stock(referenceDate);
73
+ return {
74
+ quantity,
75
+ };
76
+ } catch (error) {
77
+ log(error.message, { level: LogLevel.Error, ...error });
78
+ return null;
79
+ }
80
+ },
81
+
82
+ estimatedDispatch: async () => {
83
+ try {
84
+ const { deliveryProvider } = context;
85
+ const referenceDate = getReferenceDate(context);
86
+ const warehousingThroughputTime = await throughputTime();
87
+
88
+ const actions = await DeliveryDirector.actions(deliveryProvider, context, requestContext);
89
+ const deliveryThroughputTime = await actions.estimatedDeliveryThroughput(
90
+ warehousingThroughputTime,
91
+ );
92
+
93
+ const shippingTimestamp = referenceDate.getTime() + warehousingThroughputTime;
94
+ const earliestDeliveryTimestamp =
95
+ deliveryThroughputTime !== null ? shippingTimestamp + deliveryThroughputTime : null;
96
+
97
+ return {
98
+ shipping: shippingTimestamp && new Date(shippingTimestamp),
99
+ earliestDelivery: earliestDeliveryTimestamp && new Date(earliestDeliveryTimestamp),
100
+ };
101
+ } catch (error) {
102
+ log(error.message, { level: LogLevel.Error, ...error });
103
+ return {};
104
+ }
105
+ },
106
+ };
107
+ },
108
+ };
@@ -0,0 +1,6 @@
1
+ export enum WarehousingError {
2
+ ADAPTER_NOT_FOUND = 'ADAPTER_NOT_FOUND',
3
+ NOT_IMPLEMENTED = 'NOT_IMPLEMENTED',
4
+ INCOMPLETE_CONFIGURATION = 'INCOMPLETE_CONFIGURATION',
5
+ WRONG_CREDENTIALS = 'WRONG_CREDENTIALS',
6
+ }
@@ -0,0 +1,3 @@
1
+ export enum WarehousingProviderType {
2
+ PHYSICAL = 'PHYSICAL',
3
+ }
@@ -0,0 +1,167 @@
1
+ import { ModuleInput, ModuleMutations } from '@unchainedshop/types/common';
2
+ import {
3
+ WarehousingModule,
4
+ WarehousingProvider,
5
+ WarehousingProviderQuery,
6
+ } from '@unchainedshop/types/warehousing';
7
+ import { emit, registerEvents } from '@unchainedshop/events';
8
+ import { generateDbFilterById, generateDbMutations } from '@unchainedshop/utils';
9
+ import { WarehousingProvidersCollection } from '../db/WarehousingProvidersCollection';
10
+ import { WarehousingProvidersSchema } from '../db/WarehousingProvidersSchema';
11
+ import { WarehousingDirector } from '../director/WarehousingDirector';
12
+
13
+ const WAREHOUSING_PROVIDER_EVENTS: string[] = [
14
+ 'WAREHOUSING_PROVIDER_CREATE',
15
+ 'WAREHOUSING_PROVIDER_UPDATE',
16
+ 'WAREHOUSING_PROVIDER_REMOVE',
17
+ ];
18
+
19
+ const buildFindSelector = ({ type }: WarehousingProviderQuery = {}) => {
20
+ const query = type ? { type, deleted: null } : { deleted: null };
21
+ return query;
22
+ };
23
+
24
+ const asyncFilter = async (arr, predicate) => {
25
+ const results = await Promise.all(arr.map(predicate));
26
+
27
+ return arr.filter((_v, index) => results[index]);
28
+ };
29
+
30
+ export const configureWarehousingModule = async ({
31
+ db,
32
+ }: ModuleInput<Record<string, never>>): Promise<WarehousingModule> => {
33
+ registerEvents(WAREHOUSING_PROVIDER_EVENTS);
34
+
35
+ const WarehousingProviders = await WarehousingProvidersCollection(db);
36
+
37
+ const mutations = generateDbMutations<WarehousingProvider>(
38
+ WarehousingProviders,
39
+ WarehousingProvidersSchema,
40
+ ) as ModuleMutations<WarehousingProvider>;
41
+
42
+ return {
43
+ // Queries
44
+ ...mutations,
45
+ count: async (query) => {
46
+ const providerCount = await WarehousingProviders.countDocuments(buildFindSelector(query));
47
+ return providerCount;
48
+ },
49
+
50
+ findProvider: async ({ warehousingProviderId }, options) => {
51
+ return WarehousingProviders.findOne(generateDbFilterById(warehousingProviderId), options);
52
+ },
53
+
54
+ findProviders: async (query, options) => {
55
+ const providers = WarehousingProviders.find(buildFindSelector(query), options);
56
+ return providers.toArray();
57
+ },
58
+
59
+ providerExists: async ({ warehousingProviderId }) => {
60
+ const providerCount = await WarehousingProviders.countDocuments(
61
+ generateDbFilterById(warehousingProviderId, { deleted: null }),
62
+ { limit: 1 },
63
+ );
64
+ return !!providerCount;
65
+ },
66
+
67
+ // Adapter
68
+
69
+ findInterface: (warehousingProvider) => {
70
+ const Adapter = WarehousingDirector.getAdapter(warehousingProvider.adapterKey);
71
+ if (!Adapter) return null;
72
+ return {
73
+ _id: Adapter.key,
74
+ label: Adapter.label,
75
+ version: Adapter.version,
76
+ };
77
+ },
78
+
79
+ findInterfaces: ({ type }) => {
80
+ return WarehousingDirector.getAdapters({
81
+ adapterFilter: (Adapter) => Adapter.typeSupported(type),
82
+ }).map((Adapter) => ({
83
+ _id: Adapter.key,
84
+ label: Adapter.label,
85
+ version: Adapter.version,
86
+ }));
87
+ },
88
+
89
+ findSupported: async (warehousingContext, requestContext) => {
90
+ const allProviders = await WarehousingProviders.find(buildFindSelector({})).toArray();
91
+
92
+ const providers = asyncFilter(allProviders, async (provider) => {
93
+ const director = await WarehousingDirector.actions(provider, warehousingContext, requestContext);
94
+ return director.isActive();
95
+ });
96
+
97
+ return providers;
98
+ },
99
+
100
+ configurationError: async (warehousingProvider, requestContext) => {
101
+ const actions = await WarehousingDirector.actions(warehousingProvider, {}, requestContext);
102
+ return actions.configurationError();
103
+ },
104
+
105
+ estimatedDispatch: async (warehousingProvider, warehousingContext, requestContext) => {
106
+ const director = await WarehousingDirector.actions(
107
+ warehousingProvider,
108
+ warehousingContext,
109
+ requestContext,
110
+ );
111
+ return director.estimatedDispatch();
112
+ },
113
+
114
+ estimatedStock: async (warehousingProvider, warehousingContext, requestContext) => {
115
+ const director = await WarehousingDirector.actions(
116
+ warehousingProvider,
117
+ warehousingContext,
118
+ requestContext,
119
+ );
120
+ return director.estimatedStock();
121
+ },
122
+
123
+ isActive: async (warehousingProvider, requestContext) => {
124
+ const actions = await WarehousingDirector.actions(warehousingProvider, {}, requestContext);
125
+ return actions.isActive();
126
+ },
127
+
128
+ // Mutations
129
+ create: async (doc, userId) => {
130
+ const Adapter = WarehousingDirector.getAdapter(doc.adapterKey);
131
+ if (!Adapter) return null;
132
+
133
+ const warehousingProviderId = await mutations.create(
134
+ { configuration: Adapter.initialConfiguration, ...doc },
135
+ userId,
136
+ );
137
+
138
+ const warehousingProvider = await WarehousingProviders.findOne(
139
+ generateDbFilterById(warehousingProviderId),
140
+ );
141
+ emit('WAREHOUSING_PROVIDER_CREATE', { warehousingProvider });
142
+ return warehousingProviderId;
143
+ },
144
+
145
+ update: async (_id: string, doc: WarehousingProvider, userId: string) => {
146
+ const warehousingProviderId = await mutations.update(_id, doc, userId);
147
+ const warehousingProvider = await WarehousingProviders.findOne(generateDbFilterById(_id), {});
148
+
149
+ if (!warehousingProvider) return null;
150
+
151
+ emit('WAREHOUSING_PROVIDER_UPDATE', { warehousingProvider });
152
+ return warehousingProviderId;
153
+ },
154
+
155
+ delete: async (providerId, userId) => {
156
+ await mutations.delete(providerId, userId);
157
+ const warehousingProvider = await WarehousingProviders.findOne(
158
+ generateDbFilterById(providerId),
159
+ {},
160
+ );
161
+
162
+ emit('WAREHOUSING_PROVIDER_REMOVE', { warehousingProvider });
163
+
164
+ return warehousingProvider;
165
+ },
166
+ };
167
+ };
@@ -0,0 +1,6 @@
1
+ export { configureWarehousingModule } from './module/configureWarehousingModule';
2
+
3
+ export { WarehousingDirector } from './director/WarehousingDirector';
4
+ export { WarehousingAdapter } from './director/WarehousingAdapter';
5
+ export { WarehousingError } from './director/WarehousingError';
6
+ export { WarehousingProviderType } from './director/WarehousingProviderType';
@@ -0,0 +1,22 @@
1
+ import { Db } from '@unchainedshop/types/common';
2
+ import { WarehousingModule } from '@unchainedshop/types/warehousing';
3
+ import { assert } from 'chai';
4
+ import { configureWarehousingModule } from 'meteor/unchained:core-warehousing';
5
+ import { initDb } from 'meteor/unchained:mongodb';
6
+
7
+ describe('Test exports', () => {
8
+ let module: WarehousingModule;
9
+ let db: Db;
10
+
11
+ before(async () => {
12
+ db = await initDb();
13
+ module = await configureWarehousingModule({ db });
14
+ assert.ok(module);
15
+ });
16
+
17
+
18
+ it('Check queries', async () => {
19
+ assert.isFunction(await module.providerExists);
20
+ });
21
+
22
+ });
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "allowSyntheticDefaultImports": true,
5
+ "declaration": true,
6
+ "esModuleInterop": true,
7
+ "experimentalDecorators": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "lib": ["esnext"],
10
+ "module": "esnext",
11
+ "moduleResolution": "node",
12
+ "noImplicitReturns": true,
13
+ "noUnusedLocals": false,
14
+ "outDir": "lib",
15
+ "preserveWatchOutput": true,
16
+ "skipLibCheck": true,
17
+ "sourceMap": true,
18
+ "target": "esnext",
19
+ "types": ["node"],
20
+ "baseUrl": ".", // This must be specified if "paths" is.
21
+ "paths": {
22
+ "meteor/unchained:*": ["node_modules/@unchainedshop/types/index.d.ts"]
23
+ }
24
+ },
25
+ "include": ["src"]
26
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.build.json",
3
+ "compilerOptions": {
4
+ "noEmit": true,
5
+ "types": ["node", "mocha"]
6
+ },
7
+ "include": ["src", "tests", "plugins"]
8
+ }