chore: Remove legacy MWH modules (#7213)
* chore: Remove legacy MWH modules * chore: Add stock-location deps
This commit is contained in:
@@ -132,6 +132,7 @@ module.exports = {
|
||||
"./packages/modules/workflow-engine-inmemory/tsconfig.spec.json",
|
||||
"./packages/modules/workflow-engine-redis/tsconfig.spec.json",
|
||||
"./packages/modules/link-modules/tsconfig.spec.json",
|
||||
"./packages/modules/user/tsconfig.spec.json",
|
||||
],
|
||||
},
|
||||
rules: {
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"@medusajs/cache-inmemory": "workspace:*",
|
||||
"@medusajs/customer": "workspace:^",
|
||||
"@medusajs/event-bus-local": "workspace:*",
|
||||
"@medusajs/inventory": "workspace:^",
|
||||
"@medusajs/inventory": "latest",
|
||||
"@medusajs/medusa": "workspace:*",
|
||||
"@medusajs/modules-sdk": "workspace:^",
|
||||
"@medusajs/pricing": "workspace:^",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"@medusajs/currency": "workspace:^",
|
||||
"@medusajs/customer": "workspace:^",
|
||||
"@medusajs/event-bus-local": "workspace:*",
|
||||
"@medusajs/inventory": "workspace:^",
|
||||
"@medusajs/inventory": "latest",
|
||||
"@medusajs/inventory-next": "workspace:^",
|
||||
"@medusajs/medusa": "workspace:*",
|
||||
"@medusajs/modules-sdk": "workspace:^",
|
||||
@@ -23,6 +23,7 @@
|
||||
"@medusajs/product": "workspace:^",
|
||||
"@medusajs/promotion": "workspace:^",
|
||||
"@medusajs/region": "workspace:^",
|
||||
"@medusajs/stock-location": "latest",
|
||||
"@medusajs/store": "workspace:^",
|
||||
"@medusajs/tax": "workspace:^",
|
||||
"@medusajs/user": "workspace:^",
|
||||
|
||||
@@ -1,424 +0,0 @@
|
||||
# @medusajs/inventory
|
||||
|
||||
## 1.11.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#6263](https://github.com/medusajs/medusa/pull/6263) [`45134e4d1`](https://github.com/medusajs/medusa/commit/45134e4d11cfcdc08dbd10aae687bfbe9e848ab9) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Workflows passing MedusaContext as argument
|
||||
|
||||
- [#6218](https://github.com/medusajs/medusa/pull/6218) [`884428a1b`](https://github.com/medusajs/medusa/commit/884428a1b573e499d7659aefed639bf797147428) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Feat: Event Aggregator
|
||||
|
||||
- Updated dependencies [[`12054f5c0`](https://github.com/medusajs/medusa/commit/12054f5c01915899223ddc6da734151b31fbb23b), [`3db2f95e65`](https://github.com/medusajs/medusa/commit/3db2f95e65909f4fff432990b48be74509052e83), [`96ba49329`](https://github.com/medusajs/medusa/commit/96ba49329b6b05922c90f0c55f16455cb40aa5ca), [`45134e4d1`](https://github.com/medusajs/medusa/commit/45134e4d11cfcdc08dbd10aae687bfbe9e848ab9), [`884428a1b`](https://github.com/medusajs/medusa/commit/884428a1b573e499d7659aefed639bf797147428), [`882aa549b`](https://github.com/medusajs/medusa/commit/882aa549bdcc6f378934eab2a7c485df354f46aa)]:
|
||||
- @medusajs/utils@1.11.5
|
||||
- @medusajs/modules-sdk@1.12.8
|
||||
|
||||
## 1.11.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5763](https://github.com/medusajs/medusa/pull/5763) [`d85fee42e`](https://github.com/medusajs/medusa/commit/d85fee42ee7f661310584dfee5741d6c53b989bb) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Medusa App loading modules reference
|
||||
|
||||
- [#6012](https://github.com/medusajs/medusa/pull/6012) [`192bc336cc`](https://github.com/medusajs/medusa/commit/192bc336cc2b6ec3820d94524c046dcd3c4ac7d9) Thanks [@olivermrbl](https://github.com/olivermrbl)! - feat(cart): Partial module service implementation
|
||||
|
||||
- Updated dependencies [[`68ddd866a5`](https://github.com/medusajs/medusa/commit/68ddd866a5ff9414e2db5b80d75acc5e81948540), [`72bc52231c`](https://github.com/medusajs/medusa/commit/72bc52231ca3a72fa6d197a248fe07a938ed0d85), [`99045848f`](https://github.com/medusajs/medusa/commit/99045848fd3e863359c7878d9bc05271ed083a0e), [`a9b4214503`](https://github.com/medusajs/medusa/commit/a9b42145032ee88aa922a11fe03e777b140c68f4), [`d85fee42e`](https://github.com/medusajs/medusa/commit/d85fee42ee7f661310584dfee5741d6c53b989bb), [`5e655dd59`](https://github.com/medusajs/medusa/commit/5e655dd59bda4ffface28db38021ba71cae6de10), [`b782d3bcb7`](https://github.com/medusajs/medusa/commit/b782d3bcb7e8088a962584b9a55200dd29c2161c), [`2b9f98895e`](https://github.com/medusajs/medusa/commit/2b9f98895eaca255e01278674b11cd7cb69b388f), [`302323916`](https://github.com/medusajs/medusa/commit/302323916b6d8eaf571cd59b5fc92a913af207de), [`da5cc4cf7`](https://github.com/medusajs/medusa/commit/da5cc4cf7f7f0ef40d409704a95b025ce95477f4), [`daecd82a7`](https://github.com/medusajs/medusa/commit/daecd82a7cdf7315599f464999690414c20d6748), [`06b33a9b4`](https://github.com/medusajs/medusa/commit/06b33a9b4525b77b1b14b35b973209700945654e), [`b6ac768698`](https://github.com/medusajs/medusa/commit/b6ac768698a3b49d0162cb49e628386f3352d034), [`130c641e5c`](https://github.com/medusajs/medusa/commit/130c641e5c91cf831de64fb87aebbfdc4d23530d), [`fade8ea7bf`](https://github.com/medusajs/medusa/commit/fade8ea7bf560343ecbde116d226ac44053cdb8e), [`8472460f53`](https://github.com/medusajs/medusa/commit/8472460f533322cc4535199aa768ac163021bc79)]:
|
||||
- @medusajs/utils@1.11.4
|
||||
- @medusajs/modules-sdk@1.12.7
|
||||
|
||||
## 1.11.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5713](https://github.com/medusajs/medusa/pull/5713) [`18afe0b9a`](https://github.com/medusajs/medusa/commit/18afe0b9addb33ec2e3b285651b4eb1ef8065845) Thanks [@pKorsholm](https://github.com/pKorsholm)! - fix(stock-location, inventory, medusa, types, utils): allow buildQuery to take null as an argument in order to prevent default pagination
|
||||
|
||||
- Updated dependencies [[`18afe0b9a`](https://github.com/medusajs/medusa/commit/18afe0b9addb33ec2e3b285651b4eb1ef8065845), [`de8f74867`](https://github.com/medusajs/medusa/commit/de8f748674bfd19b3dbadb9695d9080aa91940de), [`dc5750dd6`](https://github.com/medusajs/medusa/commit/dc5750dd665a91d35c0246ba83c7f90ec74907f4)]:
|
||||
- @medusajs/utils@1.11.1
|
||||
- @medusajs/modules-sdk@1.12.4
|
||||
|
||||
# @medusajs/inventory
|
||||
|
||||
## 1.11.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`c39bf69a5`](https://github.com/medusajs/medusa/commit/c39bf69a5e5cae75d7fa12aa6022b10903557a32) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Add missing version bumps
|
||||
|
||||
- [#5543](https://github.com/medusajs/medusa/pull/5543) [`f90ba0208`](https://github.com/medusajs/medusa/commit/f90ba02087778d8131aed3a59a6dc9c8ca3c95f4) Thanks [@adrien2p](https://github.com/adrien2p)! - feat(utils): Introduce promiseAll util
|
||||
|
||||
- Updated dependencies [[`c39bf69a5`](https://github.com/medusajs/medusa/commit/c39bf69a5e5cae75d7fa12aa6022b10903557a32), [`154c9b43b`](https://github.com/medusajs/medusa/commit/154c9b43bde1fdff562aba9da8a79af2660b29b3)]:
|
||||
- @medusajs/modules-sdk@1.12.3
|
||||
- @medusajs/utils@1.10.5
|
||||
|
||||
## 1.11.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5468](https://github.com/medusajs/medusa/pull/5468) [`a45da9215`](https://github.com/medusajs/medusa/commit/a45da9215d2a7834c368037726aaa3961caadaf9) Thanks [@adrien2p](https://github.com/adrien2p)! - fix(medusa, modules-sdk, modules): Module loading was missing the expected dependencies and remote query reference fix
|
||||
|
||||
- Updated dependencies [[`a45da9215`](https://github.com/medusajs/medusa/commit/a45da9215d2a7834c368037726aaa3961caadaf9)]:
|
||||
- @medusajs/modules-sdk@1.12.2
|
||||
|
||||
## 1.11.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5301](https://github.com/medusajs/medusa/pull/5301) [`66413d094`](https://github.com/medusajs/medusa/commit/66413d094e916debbdb74b68800c96ca2c9302c9) Thanks [@srindom](https://github.com/srindom)! - fix: move create inventory workflow to @medusajs/workflows
|
||||
|
||||
- Updated dependencies [[`378ca1b36`](https://github.com/medusajs/medusa/commit/378ca1b36e909a67e39c69ea5ca94ec58a345878), [`b62af612c`](https://github.com/medusajs/medusa/commit/b62af612c7baa244075e546c949b89c4589bd2cf), [`e47461d95`](https://github.com/medusajs/medusa/commit/e47461d95caecf3a447ee9fa0b0950340b93f282), [`66413d094`](https://github.com/medusajs/medusa/commit/66413d094e916debbdb74b68800c96ca2c9302c9)]:
|
||||
- @medusajs/utils@1.10.4
|
||||
- @medusajs/modules-sdk@1.12.1
|
||||
|
||||
## 1.11.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#5242](https://github.com/medusajs/medusa/pull/5242) [`130cbc1f4`](https://github.com/medusajs/medusa/commit/130cbc1f437af211b6d05f80128d90138abcd38d) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Modules exporting schema with entities and fields
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`eeceec791`](https://github.com/medusajs/medusa/commit/eeceec791c141996cf7fd06555afb6e738b52840), [`130cbc1f4`](https://github.com/medusajs/medusa/commit/130cbc1f437af211b6d05f80128d90138abcd38d), [`cb569c2df`](https://github.com/medusajs/medusa/commit/cb569c2dfe2d83e1ff72a49f2331450a83b73325)]:
|
||||
- @medusajs/utils@1.10.3
|
||||
- @medusajs/modules-sdk@1.12.0
|
||||
|
||||
## 1.10.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#4695](https://github.com/medusajs/medusa/pull/4695) [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - introduce @medusajs/link-modules
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`c3dba0694`](https://github.com/medusajs/medusa/commit/c3dba069488952945150117a30b1306a2e0bb3ce), [`460161a69`](https://github.com/medusajs/medusa/commit/460161a69f22cf6d561952e92e7d9b56912113e6), [`fcb6b4f51`](https://github.com/medusajs/medusa/commit/fcb6b4f510dba2757570625acb5da9476b7544fd), [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef), [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef), [`87bade096`](https://github.com/medusajs/medusa/commit/87bade096e3d536f29ddc57dbc4c04e5d7a46e4b), [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef), [`a4906d0ac`](https://github.com/medusajs/medusa/commit/a4906d0ac0af36b1382d3befe64281b404387bd7)]:
|
||||
- @medusajs/modules-sdk@1.10.0
|
||||
- @medusajs/utils@1.10.0
|
||||
|
||||
## 1.9.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#4503](https://github.com/medusajs/medusa/pull/4503) [`d184d23c6`](https://github.com/medusajs/medusa/commit/d184d23c6384d5f8bf52827826b62c6bef37f884) Thanks [@pKorsholm](https://github.com/pKorsholm)! - feat(medusa,inventory,types,brightpearl): update some inventory methods to be bulk-operation enabled
|
||||
|
||||
## 1.9.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#4211](https://github.com/medusajs/medusa/pull/4211) [`d76ba0cd2`](https://github.com/medusajs/medusa/commit/d76ba0cd29694c2e31f9f89992a9fbc14659c1ae) Thanks [@adrien2p](https://github.com/adrien2p)! - fix(medusa): Order edit missing transaction when consuming the inventory module
|
||||
|
||||
- [#4232](https://github.com/medusajs/medusa/pull/4232) [`af2dc4f75`](https://github.com/medusajs/medusa/commit/af2dc4f75a2ed109495ca83b1bc6ae6941c2f716) Thanks [@adrien2p](https://github.com/adrien2p)! - feat(medusa, inventory, stock-location): Remove unnecessary transaction usage in the modules and list products end points
|
||||
|
||||
- [#4276](https://github.com/medusajs/medusa/pull/4276) [`afd1b67f1`](https://github.com/medusajs/medusa/commit/afd1b67f1c7de8cf07fd9fcbdde599a37914e9b5) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Use caret range
|
||||
|
||||
- Updated dependencies [[`f98ba5bde`](https://github.com/medusajs/medusa/commit/f98ba5bde83ba785eead31b0c9eb9f135d664178), [`14c0f62f8`](https://github.com/medusajs/medusa/commit/14c0f62f84704a4c87beff3daaff60a52f5c88b8)]:
|
||||
- @medusajs/utils@1.9.1
|
||||
- @medusajs/modules-sdk@1.8.8
|
||||
|
||||
## 1.9.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#4146](https://github.com/medusajs/medusa/pull/4146) [`db4199530`](https://github.com/medusajs/medusa/commit/db419953075e0907b8c4d27ab5188e9bd3e3d72b) Thanks [@fPolic](https://github.com/fPolic)! - chore(medusa, utils, inventory, stock-location): clear deps in the utils package
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#4154](https://github.com/medusajs/medusa/pull/4154) [`0a35f21af`](https://github.com/medusajs/medusa/commit/0a35f21af7ac8b6cdc1af12a403e95f9bf6142fe) Thanks [@pKorsholm](https://github.com/pKorsholm)! - Feat(medusa,inventory): search inventory items based on title and description
|
||||
|
||||
- [#3979](https://github.com/medusajs/medusa/pull/3979) [`3a38c84f8`](https://github.com/medusajs/medusa/commit/3a38c84f88b05f74ee0a172af3e3f78b2ec8c2d2) Thanks [@pKorsholm](https://github.com/pKorsholm)! - feat(client-types, inventory, medusa, types): add additional filtering capabilities to list-reservations
|
||||
|
||||
- [#4155](https://github.com/medusajs/medusa/pull/4155) [`5c01b4e6b`](https://github.com/medusajs/medusa/commit/5c01b4e6b66f2e6d6be12fc1e75940236ebbcb08) Thanks [@pKorsholm](https://github.com/pKorsholm)! - fix(inventory): update revert migration
|
||||
|
||||
- Updated dependencies [[`a91987fab`](https://github.com/medusajs/medusa/commit/a91987fab33745f9864eab21bd1c27e8e3e24571), [`e73c3e51c`](https://github.com/medusajs/medusa/commit/e73c3e51c9cd192eeae7a57b24b07bd466214145), [`db4199530`](https://github.com/medusajs/medusa/commit/db419953075e0907b8c4d27ab5188e9bd3e3d72b), [`c0e527d6e`](https://github.com/medusajs/medusa/commit/c0e527d6e0a67d0c53577a0b9c3d16ee8dc5740f)]:
|
||||
- @medusajs/utils@1.9.0
|
||||
- @medusajs/modules-sdk@1.8.7
|
||||
|
||||
## 1.8.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#4072](https://github.com/medusajs/medusa/pull/4072) [`6511959e2`](https://github.com/medusajs/medusa/commit/6511959e23177f3b4831915db0e8e788bc9047fa) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Revert to official Typeorm package
|
||||
|
||||
- Updated dependencies [[`cdbac2c84`](https://github.com/medusajs/medusa/commit/cdbac2c8403a3c15c0e11993f6b7dab268fa5c08), [`6511959e2`](https://github.com/medusajs/medusa/commit/6511959e23177f3b4831915db0e8e788bc9047fa)]:
|
||||
- @medusajs/utils@1.8.5
|
||||
- @medusajs/modules-sdk@1.8.6
|
||||
|
||||
## 1.8.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3971](https://github.com/medusajs/medusa/pull/3971) [`7fd22ecb4`](https://github.com/medusajs/medusa/commit/7fd22ecb4d5190e92c6750a9fbf2d8534bb9f4ab) Thanks [@pKorsholm](https://github.com/pKorsholm)! - Feat(client-types, inventory, medusa, types): add `title`, `thumbnail` and `description to inventory item and `description` to reservation item.
|
||||
|
||||
- Updated dependencies [[`1ea57c3a6`](https://github.com/medusajs/medusa/commit/1ea57c3a69a5377a8dd0821df819743ded4a222b)]:
|
||||
- @medusajs/utils@1.8.4
|
||||
- @medusajs/modules-sdk@1.8.5
|
||||
|
||||
## 1.8.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3981](https://github.com/medusajs/medusa/pull/3981) [`d539c6fee`](https://github.com/medusajs/medusa/commit/d539c6feeba8ee431f9a655b6cd4e9102cba2b25) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Bump Typeorm to Medusa fork
|
||||
|
||||
- Updated dependencies [[`0e488e71b`](https://github.com/medusajs/medusa/commit/0e488e71b186f7d08b18c4c6ba409ef3cadb8152), [`d539c6fee`](https://github.com/medusajs/medusa/commit/d539c6feeba8ee431f9a655b6cd4e9102cba2b25)]:
|
||||
- @medusajs/utils@1.8.3
|
||||
- @medusajs/modules-sdk@1.8.4
|
||||
|
||||
## 1.8.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3863](https://github.com/medusajs/medusa/pull/3863) [`cd2d4f645`](https://github.com/medusajs/medusa/commit/cd2d4f6455e7db2f9aa4f7aec72baa25fad786ff) Thanks [@olivermrbl](https://github.com/olivermrbl)! - fix(inventory): Add missing context arguments
|
||||
|
||||
- [#3835](https://github.com/medusajs/medusa/pull/3835) [`af710f1b4`](https://github.com/medusajs/medusa/commit/af710f1b48a4545a5064029a557013af34c4c100) Thanks [@adrien2p](https://github.com/adrien2p)! - fix(medusa): Bulk create variant and pass transaction to the inventory service context methods
|
||||
|
||||
- [#3192](https://github.com/medusajs/medusa/pull/3192) [`4a8562743`](https://github.com/medusajs/medusa/commit/4a8562743569f5bbb7bd0894b025a74725726529) Thanks [@pKorsholm](https://github.com/pKorsholm)! - feat(medusa-plugin-brightpearl, inventory, medusa): Multiwarehouse integration for brightpearl
|
||||
|
||||
- Updated dependencies [[`af710f1b4`](https://github.com/medusajs/medusa/commit/af710f1b48a4545a5064029a557013af34c4c100), [`491566df6`](https://github.com/medusajs/medusa/commit/491566df6b7ced35f655f810961422945e10ecd0)]:
|
||||
- @medusajs/utils@1.8.2
|
||||
- @medusajs/modules-sdk@1.8.3
|
||||
|
||||
## 1.8.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @medusajs/modules-sdk@1.8.2
|
||||
|
||||
## 1.8.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3778](https://github.com/medusajs/medusa/pull/3778) [`654a54622`](https://github.com/medusajs/medusa/commit/654a54622303139e7180538bd686630ad9a46cfd) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Bump Typeorm
|
||||
|
||||
- Updated dependencies [[`654a54622`](https://github.com/medusajs/medusa/commit/654a54622303139e7180538bd686630ad9a46cfd), [`abdb74d99`](https://github.com/medusajs/medusa/commit/abdb74d997f49f994bff49787a396179982843b0)]:
|
||||
- @medusajs/utils@1.8.1
|
||||
- @medusajs/modules-sdk@1.8.1
|
||||
|
||||
## 1.8.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#3329](https://github.com/medusajs/medusa/pull/3329) [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Inventory and Stock location modules supporting isolated connection
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3319](https://github.com/medusajs/medusa/pull/3319) [`08c8aa46c`](https://github.com/medusajs/medusa/commit/08c8aa46c55453cf741a97d06547ae85fee6e985) Thanks [@pKorsholm](https://github.com/pKorsholm)! - List inventory items based on locations
|
||||
|
||||
- [#3041](https://github.com/medusajs/medusa/pull/3041) [`121b42acf`](https://github.com/medusajs/medusa/commit/121b42acfe98c12dd593f9b1f2072ff0f3b61724) Thanks [@riqwan](https://github.com/riqwan)! - chore(medusa): Typeorm fixes / enhancements
|
||||
|
||||
- upgrade typeorm from 0.2.51 to 0.3.11
|
||||
- Plugin repository loader to work with Typeorm update
|
||||
|
||||
- [#3685](https://github.com/medusajs/medusa/pull/3685) [`8ddb3952c`](https://github.com/medusajs/medusa/commit/8ddb3952c045e6c05c8d0f6922f0d4ba30cf3bd4) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Fix RC package versions
|
||||
|
||||
- [#3352](https://github.com/medusajs/medusa/pull/3352) [`aa690beed`](https://github.com/medusajs/medusa/commit/aa690beed775646cbc86b445fb5dc90dcac087d5) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - feat(medusa): Modules initializer
|
||||
|
||||
### Loading modules in a project
|
||||
|
||||
Example
|
||||
|
||||
```typescript
|
||||
import {
|
||||
InventoryServiceInitializeOptions,
|
||||
initialize,
|
||||
} from "@medusajs/inventory"
|
||||
|
||||
const options: InventoryServiceInitializeOptions = {
|
||||
database: {
|
||||
type: "postgres",
|
||||
url: DB_URL,
|
||||
},
|
||||
}
|
||||
|
||||
const inventoryService = await initialize(options)
|
||||
const newInventoryItem = await inventoryService.createInventoryItem({
|
||||
sku: "sku_123",
|
||||
})
|
||||
```
|
||||
|
||||
- [#3460](https://github.com/medusajs/medusa/pull/3460) [`10bf05c14`](https://github.com/medusajs/medusa/commit/10bf05c147cb65a263465129790edd44a6d8948b) Thanks [@pKorsholm](https://github.com/pKorsholm)! - Fix(inventory, medusa): ensure no orphaned reservations and invenotry levels on location removal
|
||||
|
||||
- [#3649](https://github.com/medusajs/medusa/pull/3649) [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Export initialize method for all modules
|
||||
|
||||
- [#3531](https://github.com/medusajs/medusa/pull/3531) [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Remove dependency on @medusajs/medusa from Inventory and Stock-Location Modules
|
||||
|
||||
- Updated dependencies [[`8ddb3952c`](https://github.com/medusajs/medusa/commit/8ddb3952c045e6c05c8d0f6922f0d4ba30cf3bd4), [`a0c919a8d`](https://github.com/medusajs/medusa/commit/a0c919a8d01ca5edf62336de48e9a112e3822f38), [`55e94d0b4`](https://github.com/medusajs/medusa/commit/55e94d0b45776776639d3970d4264b8f5c5385dd), [`74bc4b16a`](https://github.com/medusajs/medusa/commit/74bc4b16a07f78668003ca930bf2a0d928897ceb), [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b), [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73), [`bca1f80dd`](https://github.com/medusajs/medusa/commit/bca1f80dd501d878455e1ad4f5091cf20ef900ea), [`271844aed`](https://github.com/medusajs/medusa/commit/271844aedbe45c369e188b5d06458dbd6984cd39), [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def)]:
|
||||
- @medusajs/modules-sdk@1.8.0
|
||||
- @medusajs/utils@1.8.0
|
||||
|
||||
## 1.8.0-rc.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3649](https://github.com/medusajs/medusa/pull/3649) [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Export initialize method for all modules
|
||||
|
||||
- Updated dependencies [[`a0c919a8d`](https://github.com/medusajs/medusa/commit/a0c919a8d01ca5edf62336de48e9a112e3822f38), [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b)]:
|
||||
- @medusajs/utils@0.0.2-rc.2
|
||||
- @medusajs/modules-sdk@0.1.0-rc.4
|
||||
|
||||
## 1.8.0-rc.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`55e94d0b4`](https://github.com/medusajs/medusa/commit/55e94d0b45776776639d3970d4264b8f5c5385dd)]:
|
||||
- @medusajs/modules-sdk@0.1.0-rc.3
|
||||
|
||||
## 1.8.0-rc.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- chore: Fix RC package versions
|
||||
|
||||
- Updated dependencies []:
|
||||
- @medusajs/modules-sdk@0.1.0-rc.2
|
||||
- @medusajs/utils@0.0.2-rc.1
|
||||
|
||||
## 1.8.0-rc.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`bca1f80dd`](https://github.com/medusajs/medusa/commit/bca1f80dd501d878455e1ad4f5091cf20ef900ea)]:
|
||||
- @medusajs/modules-sdk@0.1.0-rc.1
|
||||
|
||||
## 1.8.0-rc.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#3329](https://github.com/medusajs/medusa/pull/3329) [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Inventory and Stock location modules supporting isolated connection
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3319](https://github.com/medusajs/medusa/pull/3319) [`08c8aa46c`](https://github.com/medusajs/medusa/commit/08c8aa46c55453cf741a97d06547ae85fee6e985) Thanks [@pKorsholm](https://github.com/pKorsholm)! - List inventory items based on locations
|
||||
|
||||
- [#3041](https://github.com/medusajs/medusa/pull/3041) [`121b42acf`](https://github.com/medusajs/medusa/commit/121b42acfe98c12dd593f9b1f2072ff0f3b61724) Thanks [@riqwan](https://github.com/riqwan)! - chore(medusa): Typeorm fixes / enhancements
|
||||
|
||||
- upgrade typeorm from 0.2.51 to 0.3.11
|
||||
- Plugin repository loader to work with Typeorm update
|
||||
|
||||
- [#3352](https://github.com/medusajs/medusa/pull/3352) [`aa690beed`](https://github.com/medusajs/medusa/commit/aa690beed775646cbc86b445fb5dc90dcac087d5) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - feat(medusa): Modules initializer
|
||||
|
||||
### Loading modules in a project
|
||||
|
||||
Example
|
||||
|
||||
```typescript
|
||||
import {
|
||||
InventoryServiceInitializeOptions,
|
||||
initialize,
|
||||
} from "@medusajs/inventory"
|
||||
|
||||
const options: InventoryServiceInitializeOptions = {
|
||||
database: {
|
||||
type: "postgres",
|
||||
url: DB_URL,
|
||||
},
|
||||
}
|
||||
|
||||
const inventoryService = await initialize(options)
|
||||
const newInventoryItem = await inventoryService.createInventoryItem({
|
||||
sku: "sku_123",
|
||||
})
|
||||
```
|
||||
|
||||
- [#3460](https://github.com/medusajs/medusa/pull/3460) [`10bf05c14`](https://github.com/medusajs/medusa/commit/10bf05c147cb65a263465129790edd44a6d8948b) Thanks [@pKorsholm](https://github.com/pKorsholm)! - Fix(inventory, medusa): ensure no orphaned reservations and invenotry levels on location removal
|
||||
|
||||
- [#3531](https://github.com/medusajs/medusa/pull/3531) [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Remove dependency on @medusajs/medusa from Inventory and Stock-Location Modules
|
||||
|
||||
- Updated dependencies [[`74bc4b16a`](https://github.com/medusajs/medusa/commit/74bc4b16a07f78668003ca930bf2a0d928897ceb), [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73), [`271844aed`](https://github.com/medusajs/medusa/commit/271844aedbe45c369e188b5d06458dbd6984cd39), [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def)]:
|
||||
- @medusajs/utils@0.0.2-rc.0
|
||||
- @medusajs/modules-sdk@0.1.0-rc.0
|
||||
|
||||
## 1.0.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`98fe8fd00`](https://github.com/medusajs/medusa/commit/98fe8fd00a1912fde1d2a93b434bda500a213c14), [`2869763ea`](https://github.com/medusajs/medusa/commit/2869763ea9673cf5c5a3aa10b58f61b8e830ce21)]:
|
||||
- @medusajs/medusa@1.7.15
|
||||
|
||||
## 1.0.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`902ed3c0b`](https://github.com/medusajs/medusa/commit/902ed3c0b21cd525d9975e59b7a8120ae5f7a895), [`fa4049cb5`](https://github.com/medusajs/medusa/commit/fa4049cb51232b2ed7091b1322c3fc14cd23e451)]:
|
||||
- @medusajs/medusa@1.7.14
|
||||
|
||||
## 1.0.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3407](https://github.com/medusajs/medusa/pull/3407) [`f0a1355fe`](https://github.com/medusajs/medusa/commit/f0a1355feb5160ff7de1f3d3da769efe29d0d8ed) Thanks [@adrien2p](https://github.com/adrien2p)! - feat(medusa): Bulk emit events
|
||||
|
||||
- Updated dependencies [[`601d20e7a`](https://github.com/medusajs/medusa/commit/601d20e7ab293728cd81f0723805841016812120), [`f0a1355fe`](https://github.com/medusajs/medusa/commit/f0a1355feb5160ff7de1f3d3da769efe29d0d8ed)]:
|
||||
- @medusajs/medusa@1.7.13
|
||||
|
||||
## 1.0.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`ce577f269`](https://github.com/medusajs/medusa/commit/ce577f2696aa2181bef8f3096b1a639feabe2714), [`aa0d1f321`](https://github.com/medusajs/medusa/commit/aa0d1f32153f82c6219efe5cfc08862db5e5a129), [`9f508c8bd`](https://github.com/medusajs/medusa/commit/9f508c8bd8bee63677504cc8b86f1643579945d8)]:
|
||||
- @medusajs/medusa@1.7.12
|
||||
|
||||
## 1.0.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`c43248131`](https://github.com/medusajs/medusa/commit/c432481319cc205938081c3fcf60e75053b659ca)]:
|
||||
- @medusajs/medusa@1.7.11
|
||||
|
||||
## 1.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`b458615ed`](https://github.com/medusajs/medusa/commit/b458615ed50a7c637e9e77f29f21c7ab300ed5d8), [`4b114cc41`](https://github.com/medusajs/medusa/commit/4b114cc4191ba20832b66072ec82386b22a3533c)]:
|
||||
- @medusajs/medusa@1.7.10
|
||||
|
||||
## 1.0.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`370bd472e`](https://github.com/medusajs/medusa/commit/370bd472ed8c9038f66defd012a886e0f83c32cf)]:
|
||||
- @medusajs/medusa@1.7.9
|
||||
|
||||
## 1.0.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`9690f07bc`](https://github.com/medusajs/medusa/commit/9690f07bc062c85fcf8b7f0f35a162b930944183), [`5301a1e9d`](https://github.com/medusajs/medusa/commit/5301a1e9d632ddac94e7864fecfdc860a4c2a66d), [`d11ab924b`](https://github.com/medusajs/medusa/commit/d11ab924b88211bc18ed019ca300f6d452972167), [`f88af0c28`](https://github.com/medusajs/medusa/commit/f88af0c28d3fa574cdeea3694607d4df563cb88d)]:
|
||||
- @medusajs/medusa@1.7.8
|
||||
|
||||
## 1.0.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3217](https://github.com/medusajs/medusa/pull/3217) [`8c5219a31`](https://github.com/medusajs/medusa/commit/8c5219a31ef76ee571fbce84d7d57a63abe56eb0) Thanks [@adrien2p](https://github.com/adrien2p)! - chore: Fix npm packages files included
|
||||
|
||||
- Updated dependencies [[`507ad00be`](https://github.com/medusajs/medusa/commit/507ad00bec74bb63b17eae8a4a3313eb6e0d2503), [`6e443dc70`](https://github.com/medusajs/medusa/commit/6e443dc708ffe20bf96d45ddc207ed274c28e344), [`eee928381`](https://github.com/medusajs/medusa/commit/eee9283818b1717f37f084c319201ea7144fdf8a), [`4cb44a3a2`](https://github.com/medusajs/medusa/commit/4cb44a3a2ec5bcf3d90e3b6a0e1f6bb9ff45e2b6), [`472f96d7f`](https://github.com/medusajs/medusa/commit/472f96d7fb8668a15df6e6f9ea31291891b3e688), [`61b0b2f3a`](https://github.com/medusajs/medusa/commit/61b0b2f3aa1d54d539b216a99032549485136a82), [`80452332d`](https://github.com/medusajs/medusa/commit/80452332d852ad7d33d74e1f08f12f45d7a35503), [`bbbb3d888`](https://github.com/medusajs/medusa/commit/bbbb3d888292391976355c88ecb0fcf8a7c115bc), [`10ff72c30`](https://github.com/medusajs/medusa/commit/10ff72c30ae59d2174d876b0c4141aad135d9a1c), [`968eb8fc6`](https://github.com/medusajs/medusa/commit/968eb8fc6b7ccd7221f88f42d75717f3a0547861), [`a59bd84e4`](https://github.com/medusajs/medusa/commit/a59bd84e41fb5d8fc2edc7bdc43d3cbf74d9d7dc), [`8c5219a31`](https://github.com/medusajs/medusa/commit/8c5219a31ef76ee571fbce84d7d57a63abe56eb0), [`cac13a88d`](https://github.com/medusajs/medusa/commit/cac13a88da42fa986bd7352fbc12a318b566d98f), [`a2cc084db`](https://github.com/medusajs/medusa/commit/a2cc084db817f8f7699e9b0daceda274b5f0e0c0), [`8194d19b0`](https://github.com/medusajs/medusa/commit/8194d19b0e933310fdc65af25300da5dd185e669)]:
|
||||
- @medusajs/medusa@1.7.7
|
||||
- medusa-interfaces@1.3.6
|
||||
|
||||
## 1.0.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2971](https://github.com/medusajs/medusa/pull/2971) [`f65f590a2`](https://github.com/medusajs/medusa/commit/f65f590a2771d6e526d7dfc7ca721be74c8f79a9) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Adding inventory items api
|
||||
|
||||
- [#3185](https://github.com/medusajs/medusa/pull/3185) [`08324355a`](https://github.com/medusajs/medusa/commit/08324355a4466b017a0bc7ab1d333ee3cd27b8c4) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Patches all dependencies + minor bumps `winston` to include a [fix for a significant memory leak](https://github.com/winstonjs/winston/pull/2057)
|
||||
|
||||
- Updated dependencies [[`ce866475b`](https://github.com/medusajs/medusa/commit/ce866475b4b6c8b453638000f7b1df7a27daf45d), [`53532df8d`](https://github.com/medusajs/medusa/commit/53532df8d597ed5471c07296981b6959cba4ddc3), [`d8ffbe25b`](https://github.com/medusajs/medusa/commit/d8ffbe25b047fda0f644240c9f518f95e74f03cb), [`2d525237b`](https://github.com/medusajs/medusa/commit/2d525237b682e89495b6cc8e3aa677bfad4d0726), [`5b63533c7`](https://github.com/medusajs/medusa/commit/5b63533c77528cab31755cedab9e768f7461f373), [`09dc9c667`](https://github.com/medusajs/medusa/commit/09dc9c6677c0d64cf765b27290e707ea75edd4aa), [`4105405f2`](https://github.com/medusajs/medusa/commit/4105405f28c3f3e54a6077c95a575a268fb5569f), [`ee42b60a2`](https://github.com/medusajs/medusa/commit/ee42b60a20db2afc5e9b6b958502f9e86ec37d80), [`d0adaf57e`](https://github.com/medusajs/medusa/commit/d0adaf57ed1018f29bebf01e5cffde5f7192f89f), [`f65f590a2`](https://github.com/medusajs/medusa/commit/f65f590a2771d6e526d7dfc7ca721be74c8f79a9), [`5ec6d438f`](https://github.com/medusajs/medusa/commit/5ec6d438fb1f909be925461c788f3a3a958528e4), [`5c1d2a5e8`](https://github.com/medusajs/medusa/commit/5c1d2a5e83c3654ae468d17c900892c32ef76060), [`8e41c6996`](https://github.com/medusajs/medusa/commit/8e41c6996601142661bde877b9ee1d80b8325f5f), [`d50db84a3`](https://github.com/medusajs/medusa/commit/d50db84a336da2de9c06a59aa79f2a5e9aa558f1), [`82da3605f`](https://github.com/medusajs/medusa/commit/82da3605fb50cef182699900552109ad654f0df2), [`b242e2232`](https://github.com/medusajs/medusa/commit/b242e22326ce74d5437d0da6863f22facbb5964c), [`4339d47e1`](https://github.com/medusajs/medusa/commit/4339d47e1f6c9f6c8f100b3ac72c8a394b6dd44d), [`2e7e16b91`](https://github.com/medusajs/medusa/commit/2e7e16b9173e2779946776b9b07ce7232c683f36), [`9ebb50104`](https://github.com/medusajs/medusa/commit/9ebb50104cc1f6c8ef1cea446ae595fb2eb532a2), [`08324355a`](https://github.com/medusajs/medusa/commit/08324355a4466b017a0bc7ab1d333ee3cd27b8c4), [`e22a383f4`](https://github.com/medusajs/medusa/commit/e22a383f4738e8bc80394ccaba3ac9a4ae678955), [`dc156861d`](https://github.com/medusajs/medusa/commit/dc156861d413ecfe3fd264bcd5ad736d83d8a08e), [`8f4c84121`](https://github.com/medusajs/medusa/commit/8f4c84121bd9b8c7067d72f03125e13afe4d2571), [`bfa33f444`](https://github.com/medusajs/medusa/commit/bfa33f444cd225906149777c5c6e842685f3dd7c), [`f776ed234`](https://github.com/medusajs/medusa/commit/f776ed234fcfccf23041ffebecbae6c9a8b7e922), [`4d6e63d68`](https://github.com/medusajs/medusa/commit/4d6e63d68f4e64c365ecbba133876d95e6528763), [`fcba70570`](https://github.com/medusajs/medusa/commit/fcba705701b8013183fafb39e8dda4a85718080a), [`4f0d8992a`](https://github.com/medusajs/medusa/commit/4f0d8992a091a05e93dd5be3762dfa47f074610e), [`d25a53104`](https://github.com/medusajs/medusa/commit/d25a531045143d3be68d3cd3b5764bbbc792ee3a), [`86c87c7b1`](https://github.com/medusajs/medusa/commit/86c87c7b1020ab6bb02f931e1ee113f2857cf527), [`78650ea66`](https://github.com/medusajs/medusa/commit/78650ea66517b0a77100228615d8122f84ad235b), [`b9bda3bf4`](https://github.com/medusajs/medusa/commit/b9bda3bf4e0f95675041085cea5008268c37edd5), [`e581d3bd9`](https://github.com/medusajs/medusa/commit/e581d3bd90f9bc40105e7eaf34e0c94d4f657f7a), [`4d3210bfb`](https://github.com/medusajs/medusa/commit/4d3210bfbb84877d951f7319d2e87c1acbdd6aad)]:
|
||||
- @medusajs/medusa@1.7.6
|
||||
- medusa-interfaces@1.3.5
|
||||
|
||||
## 1.0.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`9c2169422`](https://github.com/medusajs/medusa/commit/9c2169422dd51be727118fa4830dadc58c24568a), [`9427bc7f2`](https://github.com/medusajs/medusa/commit/9427bc7f256c563befe3035bc3d67380066f304b)]:
|
||||
- @medusajs/medusa@1.7.5
|
||||
|
||||
## 1.0.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2997](https://github.com/medusajs/medusa/pull/2997) [`9dbccd9ca`](https://github.com/medusajs/medusa/commit/9dbccd9ca78b8b66f9a21947bb863622e7ff326b) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - feat(medusa, stock-location, inventory): Allow modules to integrate with core
|
||||
|
||||
- [#3033](https://github.com/medusajs/medusa/pull/3033) [`1547dd814`](https://github.com/medusajs/medusa/commit/1547dd8143889fc30045fc3d0241de8e69acb76e) Thanks [@olivermrbl](https://github.com/olivermrbl)! - fix(medusa): Add module options to transaction base service to use in modules
|
||||
|
||||
- Updated dependencies [[`9dbccd9ca`](https://github.com/medusajs/medusa/commit/9dbccd9ca78b8b66f9a21947bb863622e7ff326b), [`542daeead`](https://github.com/medusajs/medusa/commit/542daeeadd78d939f5144c690e8907374da6d085), [`8c08d0031`](https://github.com/medusajs/medusa/commit/8c08d003198b94c00f8428a51c0e79d2ca9d1dc7), [`017538883`](https://github.com/medusajs/medusa/commit/017538883588792e1ff37abcab0fd2872c9af932), [`b2839e2e4`](https://github.com/medusajs/medusa/commit/b2839e2e4dc0d9344fa2ac8d4d16b796def4c56d), [`76d175231`](https://github.com/medusajs/medusa/commit/76d17523105d3860028a90a45b6038a64040e5ce), [`9e3beaf53`](https://github.com/medusajs/medusa/commit/9e3beaf5319dc785cf84b856cfcc8193df90c3a4), [`7d4b8b9cc`](https://github.com/medusajs/medusa/commit/7d4b8b9cc59672d01cdf0c6f331bc3d1eeec9bee), [`aab163bab`](https://github.com/medusajs/medusa/commit/aab163babb91759a05b852d34c299cdfac96d800), [`a0c4cfe0f`](https://github.com/medusajs/medusa/commit/a0c4cfe0f74cf30c45956c32c2fb22bf833bea68), [`27a29ef24`](https://github.com/medusajs/medusa/commit/27a29ef24e5ea1ba2bc0be8ecb7dd747d4c7c65b), [`aef842123`](https://github.com/medusajs/medusa/commit/aef8421235d8fff68d7d4f8b73f77484073311a5), [`1dc79590b`](https://github.com/medusajs/medusa/commit/1dc79590b3539af09dbc8fbf931d9b5ee225fb0d), [`9c4647383`](https://github.com/medusajs/medusa/commit/9c4647383ebf0a183ccc566636bcf7af06409060), [`a0c4cfe0f`](https://github.com/medusajs/medusa/commit/a0c4cfe0f74cf30c45956c32c2fb22bf833bea68), [`b80124d32`](https://github.com/medusajs/medusa/commit/b80124d32d950790c2a01b49e8c34d562b1d57f4), [`cb1ec0076`](https://github.com/medusajs/medusa/commit/cb1ec0076b4fd932c686d6027e8b060ceded3a64), [`142c8aa70`](https://github.com/medusajs/medusa/commit/142c8aa70f583d9b11a6add2b8f988e9ba4cf979), [`1547dd814`](https://github.com/medusajs/medusa/commit/1547dd8143889fc30045fc3d0241de8e69acb76e), [`d2c692aa9`](https://github.com/medusajs/medusa/commit/d2c692aa96ea89c053f9a694a9ae6dba77e89b14), [`150696de9`](https://github.com/medusajs/medusa/commit/150696de99fc852c5d72a746f168b6f62b2086ed), [`93d0dc1bd`](https://github.com/medusajs/medusa/commit/93d0dc1bdcb54cf6e87428a7bb9b0dac196b4de2), [`b3e4be720`](https://github.com/medusajs/medusa/commit/b3e4be72087d0b528c3cce322edf9325b855c8ae)]:
|
||||
- @medusajs/medusa@1.7.4
|
||||
- medusa-interfaces@1.3.4
|
||||
@@ -1,13 +0,0 @@
|
||||
module.exports = {
|
||||
transform: {
|
||||
"^.+\\.[jt]s?$": [
|
||||
"ts-jest",
|
||||
{
|
||||
tsconfig: "tsconfig.json",
|
||||
isolatedModules: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
testEnvironment: `node`,
|
||||
moduleFileExtensions: [`js`, `ts`],
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"name": "@medusajs/inventory",
|
||||
"version": "1.11.6",
|
||||
"description": "Inventory Module for Medusa",
|
||||
"main": "dist/index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/medusajs/medusa",
|
||||
"directory": "packages/inventory"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"author": "Medusa",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@medusajs/types": "^1.11.12",
|
||||
"cross-env": "^5.2.1",
|
||||
"jest": "^29.6.3",
|
||||
"rimraf": "^5.0.1",
|
||||
"ts-jest": "^29.1.1",
|
||||
"typescript": "^5.1.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"@medusajs/modules-sdk": "^1.12.8",
|
||||
"@medusajs/utils": "^1.11.5",
|
||||
"awilix": "^8.0.0",
|
||||
"typeorm": "^0.3.16"
|
||||
},
|
||||
"scripts": {
|
||||
"watch": "tsc --build --watch",
|
||||
"prepublishOnly": "cross-env NODE_ENV=production tsc --build",
|
||||
"build": "rimraf dist && tsc --build",
|
||||
"test": "jest --passWithNoTests"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import { moduleDefinition } from "./module-definition"
|
||||
|
||||
export default moduleDefinition
|
||||
|
||||
export * from "./initialize"
|
||||
export { revertMigration, runMigrations } from "./migrations/run-migration"
|
||||
@@ -1,30 +0,0 @@
|
||||
import {
|
||||
ExternalModuleDeclaration,
|
||||
InternalModuleDeclaration,
|
||||
MedusaModule,
|
||||
MODULE_PACKAGE_NAMES,
|
||||
Modules,
|
||||
} from "@medusajs/modules-sdk"
|
||||
import { IEventBusService, IInventoryService } from "@medusajs/types"
|
||||
import { moduleDefinition } from "../module-definition"
|
||||
import { InventoryServiceInitializeOptions } from "../types"
|
||||
|
||||
export const initialize = async (
|
||||
options: InventoryServiceInitializeOptions | ExternalModuleDeclaration,
|
||||
injectedDependencies?: {
|
||||
eventBusService: IEventBusService
|
||||
}
|
||||
): Promise<IInventoryService> => {
|
||||
const serviceKey = Modules.INVENTORY
|
||||
const loaded = await MedusaModule.bootstrap<IInventoryService>({
|
||||
moduleKey: serviceKey,
|
||||
defaultPath: MODULE_PACKAGE_NAMES[Modules.INVENTORY],
|
||||
declaration: options as
|
||||
| InternalModuleDeclaration
|
||||
| ExternalModuleDeclaration,
|
||||
injectedDependencies,
|
||||
moduleExports: moduleDefinition,
|
||||
})
|
||||
|
||||
return loaded[serviceKey]
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
import { Modules } from "@medusajs/modules-sdk"
|
||||
import { ModuleJoinerConfig } from "@medusajs/types"
|
||||
import { InventoryItem, InventoryLevel, ReservationItem } from "./models"
|
||||
import moduleSchema from "./schema"
|
||||
|
||||
export const joinerConfig: ModuleJoinerConfig = {
|
||||
serviceName: Modules.INVENTORY,
|
||||
primaryKeys: ["id"],
|
||||
linkableKeys: {
|
||||
inventory_item_id: InventoryItem.name,
|
||||
inventory_level_id: InventoryLevel.name,
|
||||
reservation_item_id: ReservationItem.name,
|
||||
},
|
||||
schema: moduleSchema,
|
||||
alias: [
|
||||
{
|
||||
name: ["inventory_items", "inventory"],
|
||||
args: {
|
||||
entity: "InventoryItem",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: ["inventory_level", "inventory_levels"],
|
||||
args: {
|
||||
entity: "InventoryLevel",
|
||||
methodSuffix: "InventoryLevels",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: [
|
||||
"reservation",
|
||||
"reservations",
|
||||
"reservation_item",
|
||||
"reservation_items",
|
||||
],
|
||||
args: {
|
||||
entity: "ReservationItem",
|
||||
methodSuffix: "ReservationItems",
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
import {
|
||||
InternalModuleDeclaration,
|
||||
LoaderOptions,
|
||||
MODULE_RESOURCE_TYPE,
|
||||
MODULE_SCOPE,
|
||||
} from "@medusajs/modules-sdk"
|
||||
import { DataSource, DataSourceOptions } from "typeorm"
|
||||
|
||||
import { MedusaError } from "@medusajs/utils"
|
||||
import { asValue } from "awilix"
|
||||
import * as InventoryModels from "../models"
|
||||
import { InventoryServiceInitializeOptions } from "../types"
|
||||
|
||||
export default async (
|
||||
{ options, container }: LoaderOptions,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
): Promise<void> => {
|
||||
if (
|
||||
moduleDeclaration?.scope === MODULE_SCOPE.INTERNAL &&
|
||||
moduleDeclaration.resources === MODULE_RESOURCE_TYPE.SHARED
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
const dbData =
|
||||
options?.database as InventoryServiceInitializeOptions["database"]
|
||||
|
||||
if (!dbData) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_ARGUMENT,
|
||||
`Database config is not present at module config "options.database"`
|
||||
)
|
||||
}
|
||||
|
||||
const entities = Object.values(InventoryModels)
|
||||
const dataSource = new DataSource({
|
||||
type: dbData.type,
|
||||
url: dbData.url,
|
||||
database: dbData.database,
|
||||
extra: dbData.extra || {},
|
||||
schema: dbData.schema,
|
||||
entities,
|
||||
logging: dbData.logging,
|
||||
} as DataSourceOptions)
|
||||
|
||||
await dataSource.initialize()
|
||||
|
||||
container.register({
|
||||
manager: asValue(dataSource.manager),
|
||||
})
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
import { InternalModuleDeclaration, LoaderOptions } from "@medusajs/modules-sdk"
|
||||
|
||||
import {
|
||||
InventoryItemService,
|
||||
InventoryLevelService,
|
||||
ReservationItemService,
|
||||
} from "../services"
|
||||
|
||||
import { asClass } from "awilix"
|
||||
|
||||
export default async (
|
||||
{ container }: LoaderOptions,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
): Promise<void> => {
|
||||
container.register({
|
||||
inventoryItemService: asClass(InventoryItemService).singleton(),
|
||||
inventoryLevelService: asClass(InventoryLevelService).singleton(),
|
||||
reservationItemService: asClass(ReservationItemService).singleton(),
|
||||
})
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
import * as addExternalId from "./schema-migrations/1675761451145-add_reservation_external_id"
|
||||
import * as descriptionsAndThumbnail from "./schema-migrations/1682927363119-item_descriptions_and_thumbnail"
|
||||
import * as setup from "./schema-migrations/1665748086258-inventory_setup"
|
||||
|
||||
export default [setup, addExternalId, descriptionsAndThumbnail]
|
||||
@@ -1,63 +0,0 @@
|
||||
import { InternalModuleDeclaration, LoaderOptions } from "@medusajs/modules-sdk"
|
||||
import { DataSource, DataSourceOptions } from "typeorm"
|
||||
import { InventoryServiceInitializeOptions } from "../types"
|
||||
|
||||
import migrations from "./index"
|
||||
|
||||
function getDataSource(
|
||||
dbData: InventoryServiceInitializeOptions["database"]
|
||||
): DataSource {
|
||||
return new DataSource({
|
||||
type: dbData!.type,
|
||||
url: dbData!.url,
|
||||
database: dbData!.database,
|
||||
extra: dbData!.extra || {},
|
||||
migrations: migrations
|
||||
.map((migration: any): Function[] => {
|
||||
return Object.values(migration).filter(
|
||||
(fn) => typeof fn === "function"
|
||||
) as Function[]
|
||||
})
|
||||
.flat(),
|
||||
schema: dbData!.schema,
|
||||
logging: dbData!.logging,
|
||||
} as DataSourceOptions)
|
||||
}
|
||||
|
||||
export async function runMigrations(
|
||||
{ options, logger }: Omit<LoaderOptions, "container">,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
) {
|
||||
const dbData =
|
||||
options?.database as InventoryServiceInitializeOptions["database"]
|
||||
|
||||
try {
|
||||
const dataSource = getDataSource(dbData)
|
||||
await dataSource.initialize()
|
||||
await dataSource.runMigrations()
|
||||
|
||||
logger?.info("Inventory module migration executed")
|
||||
} catch (error) {
|
||||
logger?.error(`Inventory module migration failed to run - Error: ${error}`)
|
||||
}
|
||||
}
|
||||
|
||||
export async function revertMigration(
|
||||
{ options, logger }: Omit<LoaderOptions, "container">,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
) {
|
||||
const dbData =
|
||||
options?.database as InventoryServiceInitializeOptions["database"]
|
||||
|
||||
try {
|
||||
const dataSource = getDataSource(dbData)
|
||||
await dataSource.initialize()
|
||||
await dataSource.undoLastMigration()
|
||||
|
||||
logger?.info("Inventory module migration reverted")
|
||||
} catch (error) {
|
||||
logger?.error(
|
||||
`Inventory module migration failed to revert - Error: ${error}`
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
|
||||
export class inventorySetup1665748086258 implements MigrationInterface {
|
||||
name = "inventorySetup1665748086258"
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
CREATE TABLE "inventory_item" (
|
||||
"id" character varying NOT NULL,
|
||||
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
"updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
"deleted_at" TIMESTAMP WITH TIME ZONE,
|
||||
"sku" text,
|
||||
"origin_country" text,
|
||||
"hs_code" text,
|
||||
"mid_code" text,
|
||||
"material" text,
|
||||
"weight" integer,
|
||||
"length" integer,
|
||||
"height" integer,
|
||||
"width" integer,
|
||||
"requires_shipping" boolean NOT NULL DEFAULT true,
|
||||
"metadata" jsonb,
|
||||
CONSTRAINT "PK_inventory_item_id" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "IDX_inventory_item_sku" ON "inventory_item" ("sku") WHERE deleted_at IS NULL;
|
||||
|
||||
CREATE TABLE "reservation_item" (
|
||||
"id" character varying NOT NULL,
|
||||
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
"updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
"deleted_at" TIMESTAMP WITH TIME ZONE,
|
||||
"line_item_id" text,
|
||||
"inventory_item_id" text NOT NULL,
|
||||
"location_id" text NOT NULL,
|
||||
"quantity" integer NOT NULL,
|
||||
"metadata" jsonb,
|
||||
CONSTRAINT "PK_reservation_item_id" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX "IDX_reservation_item_line_item_id" ON "reservation_item" ("line_item_id") WHERE deleted_at IS NULL;
|
||||
CREATE INDEX "IDX_reservation_item_inventory_item_id" ON "reservation_item" ("inventory_item_id") WHERE deleted_at IS NULL;
|
||||
CREATE INDEX "IDX_reservation_item_location_id" ON "reservation_item" ("location_id") WHERE deleted_at IS NULL;
|
||||
|
||||
|
||||
CREATE TABLE "inventory_level" (
|
||||
"id" character varying NOT NULL,
|
||||
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
"updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
"deleted_at" TIMESTAMP WITH TIME ZONE,
|
||||
"inventory_item_id" text NOT NULL,
|
||||
"location_id" text NOT NULL,
|
||||
"stocked_quantity" integer NOT NULL DEFAULT 0,
|
||||
"reserved_quantity" integer NOT NULL DEFAULT 0,
|
||||
"incoming_quantity" integer NOT NULL DEFAULT 0,
|
||||
"metadata" jsonb,
|
||||
CONSTRAINT "PK_inventory_level_id" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "UQ_inventory_level_inventory_item_id_location_id" ON "inventory_level" ("inventory_item_id", "location_id");
|
||||
CREATE INDEX "IDX_inventory_level_inventory_item_id" ON "inventory_level" ("inventory_item_id");
|
||||
CREATE INDEX "IDX_inventory_level_location_id" ON "inventory_level" ("location_id");
|
||||
`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
DROP INDEX "IDX_inventory_level_location_id";
|
||||
DROP INDEX "IDX_inventory_level_inventory_item_id";
|
||||
DROP INDEX "UQ_inventory_level_inventory_item_id_location_id";
|
||||
DROP TABLE "inventory_level";
|
||||
|
||||
DROP INDEX "IDX_reservation_item_location_id";
|
||||
DROP INDEX "IDX_reservation_item_inventory_item_id";
|
||||
DROP INDEX "IDX_reservation_item_line_item_id";
|
||||
DROP TABLE "reservation_item";
|
||||
|
||||
DROP INDEX "IDX_inventory_item_sku";
|
||||
DROP TABLE "inventory_item";
|
||||
`)
|
||||
}
|
||||
}
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
|
||||
export class addReservationType1675761451145 implements MigrationInterface {
|
||||
name = "addReservationType1675761451145"
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "reservation_item" ADD "external_id" character varying
|
||||
`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "reservation_item" DROP COLUMN "external_id";
|
||||
`)
|
||||
}
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
|
||||
export class itemDescriptionsAndThumbnail1682927363119
|
||||
implements MigrationInterface
|
||||
{
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inventory_item
|
||||
ADD "title" character varying,
|
||||
ADD "description" character varying,
|
||||
ADD "thumbnail" character varying;
|
||||
`)
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "reservation_item"
|
||||
ADD "description" character varying,
|
||||
ADD "created_by" character varying;
|
||||
`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inventory_item
|
||||
DROP COLUMN "title",
|
||||
DROP COLUMN "description",
|
||||
DROP COLUMN "thumbnail";
|
||||
`)
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE "reservation_item"
|
||||
DROP COLUMN "description",
|
||||
DROP COLUMN "created_by";
|
||||
`)
|
||||
}
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
|
||||
export class ScopeLevelUnique1697708391459 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`DROP INDEX "UQ_inventory_level_inventory_item_id_location_id"`
|
||||
)
|
||||
|
||||
await queryRunner.query(`
|
||||
CREATE UNIQUE INDEX "UQ_inventory_level_inventory_item_id_location_id" ON "inventory_level" ("inventory_item_id", "location_id") WHERE deleted_at IS NULL;
|
||||
`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
CREATE UNIQUE INDEX "UQ_inventory_level_inventory_item_id_location_id" ON "inventory_level" ("inventory_item_id", "location_id");
|
||||
`)
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export {ReservationItem} from "./reservation-item"
|
||||
export * from "./inventory-item"
|
||||
export * from "./inventory-level"
|
||||
@@ -1,82 +0,0 @@
|
||||
import { generateEntityId } from "@medusajs/utils"
|
||||
import {
|
||||
BeforeInsert,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
DeleteDateColumn,
|
||||
Entity,
|
||||
Index,
|
||||
OneToMany,
|
||||
PrimaryColumn,
|
||||
UpdateDateColumn,
|
||||
} from "typeorm"
|
||||
import { InventoryLevel } from "./inventory-level"
|
||||
|
||||
@Entity()
|
||||
export class InventoryItem {
|
||||
@PrimaryColumn()
|
||||
id: string
|
||||
|
||||
@CreateDateColumn({ type: "timestamptz" })
|
||||
created_at: Date
|
||||
|
||||
@UpdateDateColumn({ type: "timestamptz" })
|
||||
updated_at: Date
|
||||
|
||||
@DeleteDateColumn({ type: "timestamptz" })
|
||||
deleted_at: Date | null
|
||||
|
||||
@Index({ unique: true })
|
||||
@Column({ type: "text", nullable: true })
|
||||
sku: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
origin_country: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
hs_code: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
mid_code: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
material: string | null
|
||||
|
||||
@Column({ type: "int", nullable: true })
|
||||
weight: number | null
|
||||
|
||||
@Column({ type: "int", nullable: true })
|
||||
length: number | null
|
||||
|
||||
@Column({ type: "int", nullable: true })
|
||||
height: number | null
|
||||
|
||||
@Column({ type: "int", nullable: true })
|
||||
width: number | null
|
||||
|
||||
@Column({ default: true })
|
||||
requires_shipping: boolean
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
description: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
title: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
thumbnail: string | null
|
||||
|
||||
@Column({ type: "jsonb", nullable: true })
|
||||
metadata: Record<string, unknown> | null
|
||||
|
||||
@OneToMany(
|
||||
() => InventoryLevel,
|
||||
(inventoryLevel) => inventoryLevel.inventory_item
|
||||
)
|
||||
inventory_levels!: InventoryLevel[]
|
||||
|
||||
@BeforeInsert()
|
||||
private beforeInsert(): void {
|
||||
this.id = generateEntityId(this.id, "iitem")
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
import { generateEntityId } from "@medusajs/utils"
|
||||
import {
|
||||
BeforeInsert,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
DeleteDateColumn,
|
||||
Entity,
|
||||
Index,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
PrimaryColumn,
|
||||
UpdateDateColumn,
|
||||
} from "typeorm"
|
||||
import { InventoryItem } from "./inventory-item"
|
||||
|
||||
@Entity()
|
||||
@Index(["inventory_item_id", "location_id"], { unique: true })
|
||||
export class InventoryLevel {
|
||||
@PrimaryColumn()
|
||||
id: string
|
||||
|
||||
@CreateDateColumn({ type: "timestamptz" })
|
||||
created_at: Date
|
||||
|
||||
@UpdateDateColumn({ type: "timestamptz" })
|
||||
updated_at: Date
|
||||
|
||||
@DeleteDateColumn({ type: "timestamptz" })
|
||||
deleted_at: Date | null
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text" })
|
||||
inventory_item_id: string
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text" })
|
||||
location_id: string
|
||||
|
||||
@Column({ default: 0 })
|
||||
stocked_quantity: number
|
||||
|
||||
@Column({ default: 0 })
|
||||
reserved_quantity: number
|
||||
|
||||
@Column({ default: 0 })
|
||||
incoming_quantity: number
|
||||
|
||||
@Column({ type: "jsonb", nullable: true })
|
||||
metadata: Record<string, unknown> | null
|
||||
|
||||
@ManyToOne(() => InventoryItem)
|
||||
@JoinColumn({ name: "inventory_item_id" })
|
||||
inventory_item: InventoryItem
|
||||
|
||||
@BeforeInsert()
|
||||
private beforeInsert(): void {
|
||||
this.id = generateEntityId(this.id, "ilev")
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
import { generateEntityId } from "@medusajs/utils"
|
||||
import {
|
||||
BeforeInsert,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
DeleteDateColumn,
|
||||
Entity,
|
||||
Index,
|
||||
PrimaryColumn,
|
||||
UpdateDateColumn,
|
||||
} from "typeorm"
|
||||
|
||||
@Entity()
|
||||
export class ReservationItem {
|
||||
@PrimaryColumn()
|
||||
id: string
|
||||
|
||||
@CreateDateColumn({ type: "timestamptz" })
|
||||
created_at: Date
|
||||
|
||||
@UpdateDateColumn({ type: "timestamptz" })
|
||||
updated_at: Date
|
||||
|
||||
@DeleteDateColumn({ type: "timestamptz" })
|
||||
deleted_at: Date | null
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text", nullable: true })
|
||||
line_item_id: string | null
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text" })
|
||||
inventory_item_id: string
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text" })
|
||||
location_id: string
|
||||
|
||||
@Column()
|
||||
quantity: number
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
external_id: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
description: string | null
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
created_by: string | null
|
||||
|
||||
@Column({ type: "jsonb", nullable: true })
|
||||
metadata: Record<string, unknown> | null
|
||||
|
||||
@BeforeInsert()
|
||||
private beforeInsert(): void {
|
||||
this.id = generateEntityId(this.id, "resitem")
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
import InventoryService from "./services/inventory"
|
||||
import loadContainer from "./loaders/container"
|
||||
import loadConnection from "./loaders/connection"
|
||||
import * as InventoryModels from "./models"
|
||||
import { ModuleExports } from "@medusajs/types"
|
||||
import migrations from "./migrations"
|
||||
import { revertMigration, runMigrations } from "./migrations/run-migration"
|
||||
|
||||
const service = InventoryService
|
||||
const loaders = [loadContainer, loadConnection]
|
||||
const models = Object.values(InventoryModels)
|
||||
|
||||
export const moduleDefinition: ModuleExports = {
|
||||
service,
|
||||
migrations,
|
||||
loaders,
|
||||
models,
|
||||
runMigrations,
|
||||
revertMigration,
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
export default `
|
||||
scalar DateTime
|
||||
scalar JSON
|
||||
|
||||
type InventoryItem {
|
||||
id: ID!
|
||||
created_at: DateTime!
|
||||
updated_at: DateTime!
|
||||
deleted_at: DateTime
|
||||
sku: String
|
||||
origin_country: String
|
||||
hs_code: String
|
||||
mid_code: String
|
||||
material: String
|
||||
weight: Int
|
||||
length: Int
|
||||
height: Int
|
||||
width: Int
|
||||
requires_shipping: Boolean!
|
||||
description: String
|
||||
title: String
|
||||
thumbnail: String
|
||||
metadata: JSON
|
||||
|
||||
inventory_levels: [InventoryLevel]
|
||||
}
|
||||
|
||||
type InventoryLevel {
|
||||
id: ID!
|
||||
created_at: DateTime!
|
||||
updated_at: DateTime!
|
||||
deleted_at: DateTime
|
||||
inventory_item_id: String!
|
||||
location_id: String!
|
||||
stocked_quantity: Int!
|
||||
reserved_quantity: Int!
|
||||
incoming_quantity: Int!
|
||||
metadata: JSON
|
||||
}
|
||||
|
||||
type ReservationItem {
|
||||
id: ID!
|
||||
created_at: DateTime!
|
||||
updated_at: DateTime!
|
||||
deleted_at: DateTime
|
||||
line_item_id: String
|
||||
inventory_item_id: String!
|
||||
location_id: String!
|
||||
quantity: Int!
|
||||
external_id: String
|
||||
description: String
|
||||
created_by: String
|
||||
metadata: JSON
|
||||
}
|
||||
`
|
||||
@@ -1,4 +0,0 @@
|
||||
export { default as InventoryLevelService } from "./inventory-level"
|
||||
export { default as InventoryItemService } from "./inventory-item"
|
||||
export { default as ReservationItemService } from "./reservation-item"
|
||||
export { default as InventoryService } from "./inventory"
|
||||
@@ -1,240 +0,0 @@
|
||||
import {
|
||||
CreateInventoryItemInput,
|
||||
FilterableInventoryItemProps,
|
||||
FindConfig,
|
||||
IEventBusService,
|
||||
InventoryItemDTO,
|
||||
SharedContext,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
InjectEntityManager,
|
||||
MedusaContext,
|
||||
MedusaError,
|
||||
isDefined,
|
||||
} from "@medusajs/utils"
|
||||
import { DeepPartial, EntityManager, FindManyOptions, In } from "typeorm"
|
||||
import { InventoryItem } from "../models"
|
||||
import { buildQuery } from "../utils/build-query"
|
||||
import { getListQuery } from "../utils/query"
|
||||
|
||||
type InjectedDependencies = {
|
||||
eventBusService: IEventBusService
|
||||
manager: EntityManager
|
||||
}
|
||||
|
||||
export default class InventoryItemService {
|
||||
static Events = {
|
||||
CREATED: "inventory-item.created",
|
||||
UPDATED: "inventory-item.updated",
|
||||
DELETED: "inventory-item.deleted",
|
||||
RESTORED: "inventory-item.restored",
|
||||
}
|
||||
|
||||
protected readonly manager_: EntityManager
|
||||
protected readonly eventBusService_: IEventBusService | undefined
|
||||
|
||||
constructor({ eventBusService, manager }: InjectedDependencies) {
|
||||
this.manager_ = manager
|
||||
this.eventBusService_ = eventBusService
|
||||
}
|
||||
|
||||
/**
|
||||
* @param selector - Filter options for inventory items.
|
||||
* @param config - Configuration for query.
|
||||
* @param context
|
||||
* @return Resolves to the list of inventory items that match the filter.
|
||||
*/
|
||||
async list(
|
||||
selector: FilterableInventoryItemProps = {},
|
||||
config: FindConfig<InventoryItem> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItemDTO[]> {
|
||||
const queryBuilder = getListQuery(
|
||||
context.transactionManager ?? this.manager_,
|
||||
selector,
|
||||
config
|
||||
)
|
||||
return await queryBuilder.getMany()
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves an inventory item by its id.
|
||||
* @param inventoryItemId - the id of the inventory item to retrieve.
|
||||
* @param config - the configuration options for the find operation.
|
||||
* @param context
|
||||
* @return The retrieved inventory item.
|
||||
* @throws If the inventory item id is not defined or if the inventory item is not found.
|
||||
*/
|
||||
async retrieve(
|
||||
inventoryItemId: string,
|
||||
config: FindConfig<InventoryItem> = {},
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItem> {
|
||||
if (!isDefined(inventoryItemId)) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`"inventoryItemId" must be defined`
|
||||
)
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const itemRepository = manager.getRepository(InventoryItem)
|
||||
|
||||
const query = buildQuery({ id: inventoryItemId }, config) as FindManyOptions
|
||||
const [inventoryItem] = await itemRepository.find(query)
|
||||
|
||||
if (!inventoryItem) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`InventoryItem with id ${inventoryItemId} was not found`
|
||||
)
|
||||
}
|
||||
|
||||
return inventoryItem
|
||||
}
|
||||
|
||||
/**
|
||||
* @param selector - Filter options for inventory items.
|
||||
* @param config - Configuration for query.
|
||||
* @param context
|
||||
* @return - Resolves to the list of inventory items that match the filter and the count of all matching items.
|
||||
*/
|
||||
async listAndCount(
|
||||
selector: FilterableInventoryItemProps = {},
|
||||
config: FindConfig<InventoryItem> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[InventoryItemDTO[], number]> {
|
||||
const queryBuilder = getListQuery(
|
||||
context.transactionManager ?? this.manager_,
|
||||
selector,
|
||||
config
|
||||
)
|
||||
|
||||
return await queryBuilder.getManyAndCount()
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
* @param context
|
||||
* @param data
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async create(
|
||||
data: CreateInventoryItemInput[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItem[]> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(InventoryItem)
|
||||
|
||||
const inventoryItem = itemRepository.create(
|
||||
data.map((tc) => ({
|
||||
sku: tc.sku,
|
||||
origin_country: tc.origin_country,
|
||||
metadata: tc.metadata,
|
||||
hs_code: tc.hs_code,
|
||||
mid_code: tc.mid_code,
|
||||
material: tc.material,
|
||||
weight: tc.weight,
|
||||
length: tc.length,
|
||||
height: tc.height,
|
||||
width: tc.width,
|
||||
requires_shipping: tc.requires_shipping,
|
||||
description: tc.description,
|
||||
thumbnail: tc.thumbnail,
|
||||
title: tc.title,
|
||||
}))
|
||||
)
|
||||
|
||||
const result = await itemRepository.save(inventoryItem)
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryItemService.Events.CREATED, {
|
||||
ids: result.map((i) => i.id),
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* @param inventoryItemId - The id of the inventory item to update.
|
||||
* @param data
|
||||
* @param context
|
||||
* @param context
|
||||
* @return The updated inventory item.
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async update(
|
||||
inventoryItemId: string,
|
||||
data: Omit<
|
||||
DeepPartial<InventoryItem>,
|
||||
"id" | "created_at" | "metadata" | "deleted_at"
|
||||
>,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItem> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(InventoryItem)
|
||||
|
||||
const item = await this.retrieve(inventoryItemId, undefined, context)
|
||||
|
||||
const shouldUpdate = Object.keys(data).some((key) => {
|
||||
return item[key] !== data[key]
|
||||
})
|
||||
|
||||
if (shouldUpdate) {
|
||||
itemRepository.merge(item, data)
|
||||
await itemRepository.save(item)
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryItemService.Events.UPDATED, {
|
||||
id: item.id,
|
||||
})
|
||||
}
|
||||
|
||||
return item
|
||||
}
|
||||
|
||||
/**
|
||||
* @param inventoryItemId - The id of the inventory item to delete.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async delete(
|
||||
inventoryItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(InventoryItem)
|
||||
|
||||
const ids = Array.isArray(inventoryItemId)
|
||||
? inventoryItemId
|
||||
: [inventoryItemId]
|
||||
|
||||
await itemRepository.softDelete({ id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryItemService.Events.DELETED, {
|
||||
ids: inventoryItemId,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* @param inventoryItemId - The id of the inventory item to restore.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async restore(
|
||||
inventoryItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(InventoryItem)
|
||||
|
||||
const ids = Array.isArray(inventoryItemId)
|
||||
? inventoryItemId
|
||||
: [inventoryItemId]
|
||||
|
||||
await itemRepository.restore({ id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryItemService.Events.RESTORED, {
|
||||
ids: inventoryItemId,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,398 +0,0 @@
|
||||
import {
|
||||
CreateInventoryLevelInput,
|
||||
FilterableInventoryLevelProps,
|
||||
FindConfig,
|
||||
IEventBusService,
|
||||
SharedContext,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
InjectEntityManager,
|
||||
MedusaContext,
|
||||
MedusaError,
|
||||
isDefined,
|
||||
} from "@medusajs/utils"
|
||||
import { DeepPartial, EntityManager, FindManyOptions, In } from "typeorm"
|
||||
import { InventoryLevel } from "../models"
|
||||
import { buildQuery } from "../utils/build-query"
|
||||
|
||||
type InjectedDependencies = {
|
||||
eventBusService: IEventBusService
|
||||
manager: EntityManager
|
||||
}
|
||||
|
||||
export default class InventoryLevelService {
|
||||
static Events = {
|
||||
CREATED: "inventory-level.created",
|
||||
UPDATED: "inventory-level.updated",
|
||||
DELETED: "inventory-level.deleted",
|
||||
RESTORED: "inventory-level.restored",
|
||||
}
|
||||
|
||||
protected readonly manager_: EntityManager
|
||||
protected readonly eventBusService_: IEventBusService | undefined
|
||||
|
||||
constructor({ eventBusService, manager }: InjectedDependencies) {
|
||||
this.manager_ = manager
|
||||
this.eventBusService_ = eventBusService
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a list of inventory levels based on the provided selector and configuration.
|
||||
* @param selector - An object containing filterable properties for inventory levels.
|
||||
* @param config - An object containing configuration options for the query.
|
||||
* @param context
|
||||
* @return Array of inventory levels.
|
||||
*/
|
||||
async list(
|
||||
selector: FilterableInventoryLevelProps = {},
|
||||
config: FindConfig<InventoryLevel> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevel[]> {
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const query = buildQuery(selector, config) as FindManyOptions
|
||||
return await levelRepository.find(query)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a list of inventory levels and a count based on the provided selector and configuration.
|
||||
* @param selector - An object containing filterable properties for inventory levels.
|
||||
* @param config - An object containing configuration options for the query.
|
||||
* @param context
|
||||
* @return An array of inventory levels and a count.
|
||||
*/
|
||||
async listAndCount(
|
||||
selector: FilterableInventoryLevelProps = {},
|
||||
config: FindConfig<InventoryLevel> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[InventoryLevel[], number]> {
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const query = buildQuery(selector, config) as FindManyOptions
|
||||
return await levelRepository.findAndCount(query)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a single inventory level by its ID.
|
||||
* @param inventoryLevelId - The ID of the inventory level to retrieve.
|
||||
* @param config - An object containing configuration options for the query.
|
||||
* @param context
|
||||
* @return A inventory level.
|
||||
* @throws If the inventory level ID is not defined or the given ID was not found.
|
||||
*/
|
||||
async retrieve(
|
||||
inventoryLevelId: string,
|
||||
config: FindConfig<InventoryLevel> = {},
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevel> {
|
||||
if (!isDefined(inventoryLevelId)) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`"inventoryLevelId" must be defined`
|
||||
)
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const query = buildQuery(
|
||||
{ id: inventoryLevelId },
|
||||
config
|
||||
) as FindManyOptions
|
||||
const [inventoryLevel] = await levelRepository.find(query)
|
||||
|
||||
if (!inventoryLevel) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`InventoryLevel with id ${inventoryLevelId} was not found`
|
||||
)
|
||||
}
|
||||
|
||||
return inventoryLevel
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new inventory level.
|
||||
* @param data - An object containing the properties for the new inventory level.
|
||||
* @param context
|
||||
* @return The created inventory level.
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async create(
|
||||
data: CreateInventoryLevelInput[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevel[]> {
|
||||
const manager = context.transactionManager!
|
||||
|
||||
const toCreate = data.map((d) => {
|
||||
return {
|
||||
location_id: d.location_id,
|
||||
inventory_item_id: d.inventory_item_id,
|
||||
stocked_quantity: d.stocked_quantity,
|
||||
reserved_quantity: d.reserved_quantity,
|
||||
incoming_quantity: d.incoming_quantity,
|
||||
}
|
||||
})
|
||||
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const inventoryLevels = levelRepository.create(toCreate)
|
||||
|
||||
const saved = await levelRepository.save(inventoryLevels)
|
||||
await this.eventBusService_?.emit?.(InventoryLevelService.Events.CREATED, {
|
||||
ids: saved.map((i) => i.id),
|
||||
})
|
||||
|
||||
return saved
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an existing inventory level.
|
||||
* @param inventoryLevelId - The ID of the inventory level to update.
|
||||
* @param data - An object containing the properties to update on the inventory level.
|
||||
* @param context
|
||||
* @return The updated inventory level.
|
||||
* @throws If the inventory level ID is not defined or the given ID was not found.
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async update(
|
||||
inventoryLevelId: string,
|
||||
data: Omit<
|
||||
DeepPartial<InventoryLevel>,
|
||||
"id" | "created_at" | "metadata" | "deleted_at"
|
||||
>,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevel> {
|
||||
const manager = context.transactionManager!
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const item = await this.retrieve(inventoryLevelId, undefined, context)
|
||||
|
||||
const shouldUpdate = Object.keys(data).some((key) => {
|
||||
return item[key] !== data[key]
|
||||
})
|
||||
|
||||
if (shouldUpdate) {
|
||||
levelRepository.merge(item, data)
|
||||
await levelRepository.save(item)
|
||||
|
||||
await this.eventBusService_?.emit?.(
|
||||
InventoryLevelService.Events.UPDATED,
|
||||
{
|
||||
id: item.id,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return item
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjust the reserved quantity for an inventory item at a specific location.
|
||||
* @param inventoryItemId - The ID of the inventory item.
|
||||
* @param locationId - The ID of the location.
|
||||
* @param quantity - The quantity to adjust from the reserved quantity.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async adjustReservedQuantity(
|
||||
inventoryItemId: string,
|
||||
locationId: string,
|
||||
quantity: number,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
await manager
|
||||
.createQueryBuilder()
|
||||
.update(InventoryLevel)
|
||||
.set({ reserved_quantity: () => `reserved_quantity + ${quantity}` })
|
||||
.where(
|
||||
"inventory_item_id = :inventoryItemId AND location_id = :locationId",
|
||||
{ inventoryItemId, locationId }
|
||||
)
|
||||
.execute()
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes inventory levels by inventory Item ID.
|
||||
* @param inventoryItemId - The ID or IDs of the inventory item to delete inventory levels for.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async deleteByInventoryItemId(
|
||||
inventoryItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const ids = Array.isArray(inventoryItemId)
|
||||
? inventoryItemId
|
||||
: [inventoryItemId]
|
||||
|
||||
const manager = context.transactionManager!
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
await levelRepository.softDelete({ inventory_item_id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryLevelService.Events.DELETED, {
|
||||
inventory_item_id: inventoryItemId,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores inventory levels by inventory Item ID.
|
||||
* @param inventoryItemId - The ID or IDs of the inventory item to restore inventory levels for.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async restoreByInventoryItemId(
|
||||
inventoryItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const ids = Array.isArray(inventoryItemId)
|
||||
? inventoryItemId
|
||||
: [inventoryItemId]
|
||||
|
||||
const manager = context.transactionManager!
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
await levelRepository.restore({ inventory_item_id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryLevelService.Events.RESTORED, {
|
||||
inventory_item_id: inventoryItemId,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an inventory level by ID.
|
||||
* @param inventoryLevelId - The ID or IDs of the inventory level to delete.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async delete(
|
||||
inventoryLevelId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const ids = Array.isArray(inventoryLevelId)
|
||||
? inventoryLevelId
|
||||
: [inventoryLevelId]
|
||||
|
||||
const manager = context.transactionManager!
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
await levelRepository.softDelete({ id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryLevelService.Events.DELETED, {
|
||||
ids: inventoryLevelId,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes inventory levels by location ID.
|
||||
* @param locationId - The ID of the location to delete inventory levels for.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async deleteByLocationId(
|
||||
locationId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const ids = Array.isArray(locationId) ? locationId : [locationId]
|
||||
|
||||
await levelRepository.softDelete({ location_id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(InventoryLevelService.Events.DELETED, {
|
||||
location_ids: ids,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total stocked quantity for a specific inventory item at multiple locations.
|
||||
* @param inventoryItemId - The ID of the inventory item.
|
||||
* @param locationIds - The IDs of the locations.
|
||||
* @param context
|
||||
* @return The total stocked quantity.
|
||||
*/
|
||||
async getStockedQuantity(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[] | string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<number> {
|
||||
if (!Array.isArray(locationIds)) {
|
||||
locationIds = [locationIds]
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const result = await levelRepository
|
||||
.createQueryBuilder()
|
||||
.select("SUM(stocked_quantity)", "quantity")
|
||||
.where("inventory_item_id = :inventoryItemId", { inventoryItemId })
|
||||
.andWhere("location_id IN (:...locationIds)", { locationIds })
|
||||
.getRawOne()
|
||||
|
||||
return parseFloat(result.quantity)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total available quantity for a specific inventory item at multiple locations.
|
||||
* @param inventoryItemId - The ID of the inventory item.
|
||||
* @param locationIds - The IDs of the locations.
|
||||
* @param context
|
||||
* @return The total available quantity.
|
||||
*/
|
||||
async getAvailableQuantity(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[] | string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<number> {
|
||||
if (!Array.isArray(locationIds)) {
|
||||
locationIds = [locationIds]
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const result = await levelRepository
|
||||
.createQueryBuilder()
|
||||
.select("SUM(stocked_quantity - reserved_quantity)", "quantity")
|
||||
.where("inventory_item_id = :inventoryItemId", { inventoryItemId })
|
||||
.andWhere("location_id IN (:...locationIds)", { locationIds })
|
||||
.getRawOne()
|
||||
|
||||
return parseFloat(result.quantity)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total reserved quantity for a specific inventory item at multiple locations.
|
||||
* @param inventoryItemId - The ID of the inventory item.
|
||||
* @param locationIds - The IDs of the locations.
|
||||
* @param context
|
||||
* @return The total reserved quantity.
|
||||
*/
|
||||
async getReservedQuantity(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[] | string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<number> {
|
||||
if (!Array.isArray(locationIds)) {
|
||||
locationIds = [locationIds]
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const levelRepository = manager.getRepository(InventoryLevel)
|
||||
|
||||
const result = await levelRepository
|
||||
.createQueryBuilder()
|
||||
.select("SUM(reserved_quantity)", "quantity")
|
||||
.where("inventory_item_id = :inventoryItemId", { inventoryItemId })
|
||||
.andWhere("location_id IN (:...locationIds)", { locationIds })
|
||||
.getRawOne()
|
||||
|
||||
return parseFloat(result.quantity)
|
||||
}
|
||||
}
|
||||
@@ -1,754 +0,0 @@
|
||||
import { InternalModuleDeclaration } from "@medusajs/modules-sdk"
|
||||
import {
|
||||
BulkUpdateInventoryLevelInput,
|
||||
CreateInventoryItemInput,
|
||||
CreateInventoryLevelInput,
|
||||
CreateReservationItemInput,
|
||||
FilterableInventoryItemProps,
|
||||
FilterableInventoryLevelProps,
|
||||
FilterableReservationItemProps,
|
||||
FindConfig,
|
||||
IInventoryService,
|
||||
InventoryItemDTO,
|
||||
InventoryLevelDTO,
|
||||
MODULE_RESOURCE_TYPE,
|
||||
ModuleJoinerConfig,
|
||||
ReservationItemDTO,
|
||||
SharedContext,
|
||||
UpdateInventoryLevelInput,
|
||||
UpdateReservationItemInput,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
InjectEntityManager,
|
||||
MedusaContext,
|
||||
MedusaError,
|
||||
promiseAll,
|
||||
} from "@medusajs/utils"
|
||||
import { EntityManager } from "typeorm"
|
||||
import { joinerConfig } from "../joiner-config"
|
||||
import InventoryItemService from "./inventory-item"
|
||||
import InventoryLevelService from "./inventory-level"
|
||||
import ReservationItemService from "./reservation-item"
|
||||
|
||||
type InjectedDependencies = {
|
||||
manager: EntityManager
|
||||
inventoryItemService: InventoryItemService
|
||||
inventoryLevelService: InventoryLevelService
|
||||
reservationItemService: ReservationItemService
|
||||
}
|
||||
|
||||
export default class InventoryService implements IInventoryService {
|
||||
protected readonly manager_: EntityManager
|
||||
|
||||
protected readonly inventoryItemService_: InventoryItemService
|
||||
protected readonly reservationItemService_: ReservationItemService
|
||||
protected readonly inventoryLevelService_: InventoryLevelService
|
||||
|
||||
constructor(
|
||||
{
|
||||
manager,
|
||||
inventoryItemService,
|
||||
inventoryLevelService,
|
||||
reservationItemService,
|
||||
}: InjectedDependencies,
|
||||
options?: unknown,
|
||||
protected readonly moduleDeclaration?: InternalModuleDeclaration
|
||||
) {
|
||||
this.manager_ = manager
|
||||
this.inventoryItemService_ = inventoryItemService
|
||||
this.inventoryLevelService_ = inventoryLevelService
|
||||
this.reservationItemService_ = reservationItemService
|
||||
}
|
||||
|
||||
__joinerConfig(): ModuleJoinerConfig {
|
||||
return joinerConfig
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists inventory items that match the given selector
|
||||
* @param selector - the selector to filter inventory items by
|
||||
* @param config - the find configuration to use
|
||||
* @param context
|
||||
* @return A tuple of inventory items and their total count
|
||||
*/
|
||||
async listInventoryItems(
|
||||
selector: FilterableInventoryItemProps,
|
||||
config: FindConfig<InventoryItemDTO> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[InventoryItemDTO[], number]> {
|
||||
return await this.inventoryItemService_.listAndCount(
|
||||
selector,
|
||||
config,
|
||||
context
|
||||
)
|
||||
}
|
||||
async list(
|
||||
selector: FilterableInventoryItemProps,
|
||||
config: FindConfig<InventoryItemDTO> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItemDTO[]> {
|
||||
return await this.inventoryItemService_.list(selector, config, context)
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists inventory levels that match the given selector
|
||||
* @param selector - the selector to filter inventory levels by
|
||||
* @param config - the find configuration to use
|
||||
* @param context
|
||||
* @return A tuple of inventory levels and their total count
|
||||
*/
|
||||
async listInventoryLevels(
|
||||
selector: FilterableInventoryLevelProps,
|
||||
config: FindConfig<InventoryLevelDTO> = {
|
||||
relations: [],
|
||||
skip: 0,
|
||||
take: 10,
|
||||
},
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[InventoryLevelDTO[], number]> {
|
||||
return await this.inventoryLevelService_.listAndCount(
|
||||
selector,
|
||||
config,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists reservation items that match the given selector
|
||||
* @param selector - the selector to filter reservation items by
|
||||
* @param config - the find configuration to use
|
||||
* @param context
|
||||
* @return A tuple of reservation items and their total count
|
||||
*/
|
||||
async listReservationItems(
|
||||
selector: FilterableReservationItemProps,
|
||||
config: FindConfig<ReservationItemDTO> = {
|
||||
relations: [],
|
||||
skip: 0,
|
||||
take: 10,
|
||||
},
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[ReservationItemDTO[], number]> {
|
||||
return await this.reservationItemService_.listAndCount(
|
||||
selector,
|
||||
config,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves an inventory item with the given id
|
||||
* @param inventoryItemId - the id of the inventory item to retrieve
|
||||
* @param config - the find configuration to use
|
||||
* @param context
|
||||
* @return The retrieved inventory item
|
||||
*/
|
||||
async retrieveInventoryItem(
|
||||
inventoryItemId: string,
|
||||
config?: FindConfig<InventoryItemDTO>,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItemDTO> {
|
||||
const inventoryItem = await this.inventoryItemService_.retrieve(
|
||||
inventoryItemId,
|
||||
config,
|
||||
context
|
||||
)
|
||||
return { ...inventoryItem }
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves an inventory level for a given inventory item and location
|
||||
* @param inventoryItemId - the id of the inventory item
|
||||
* @param locationId - the id of the location
|
||||
* @param context
|
||||
* @return the retrieved inventory level
|
||||
*/
|
||||
async retrieveInventoryLevel(
|
||||
inventoryItemId: string,
|
||||
locationId: string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevelDTO> {
|
||||
const [inventoryLevel] = await this.inventoryLevelService_.list(
|
||||
{ inventory_item_id: inventoryItemId, location_id: locationId },
|
||||
{ take: 1 },
|
||||
context
|
||||
)
|
||||
if (!inventoryLevel) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`Inventory level for item ${inventoryItemId} and location ${locationId} not found`
|
||||
)
|
||||
}
|
||||
return inventoryLevel
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a reservation item
|
||||
* @param reservationId
|
||||
* @param context
|
||||
* @param reservationId
|
||||
* @param context
|
||||
*/
|
||||
async retrieveReservationItem(
|
||||
reservationId: string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItemDTO> {
|
||||
return await this.reservationItemService_.retrieve(
|
||||
reservationId,
|
||||
undefined,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
private async ensureInventoryLevels(
|
||||
data: { location_id: string; inventory_item_id: string }[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevelDTO[]> {
|
||||
const inventoryLevels = await this.inventoryLevelService_.list(
|
||||
{
|
||||
inventory_item_id: data.map((e) => e.inventory_item_id),
|
||||
location_id: data.map((e) => e.location_id),
|
||||
},
|
||||
{},
|
||||
context
|
||||
)
|
||||
|
||||
const inventoryLevelMap: Map<
|
||||
string,
|
||||
Map<string, InventoryLevelDTO>
|
||||
> = inventoryLevels.reduce((acc, curr) => {
|
||||
const inventoryLevelMap = acc.get(curr.inventory_item_id) ?? new Map()
|
||||
inventoryLevelMap.set(curr.location_id, curr)
|
||||
acc.set(curr.inventory_item_id, inventoryLevelMap)
|
||||
return acc
|
||||
}, new Map())
|
||||
|
||||
const missing = data.filter(
|
||||
(i) => !inventoryLevelMap.get(i.inventory_item_id)?.get(i.location_id)
|
||||
)
|
||||
|
||||
if (missing.length) {
|
||||
const error = missing
|
||||
.map((missing) => {
|
||||
return `Item ${missing.inventory_item_id} is not stocked at location ${missing.location_id}`
|
||||
})
|
||||
.join(", ")
|
||||
throw new MedusaError(MedusaError.Types.NOT_FOUND, error)
|
||||
}
|
||||
|
||||
return inventoryLevels.map(
|
||||
(i) => inventoryLevelMap.get(i.inventory_item_id)!.get(i.location_id)!
|
||||
)
|
||||
}
|
||||
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async createReservationItems(
|
||||
input: CreateReservationItemInput[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItemDTO[]> {
|
||||
await this.ensureInventoryLevels(input, context)
|
||||
|
||||
return await this.reservationItemService_.create(input, context)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a reservation item
|
||||
* @param input - the input object
|
||||
* @return The created reservation item
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async createReservationItem(
|
||||
input: CreateReservationItemInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItemDTO> {
|
||||
const [result] = await this.createReservationItems([input], context)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async createInventoryItems(
|
||||
input: CreateInventoryItemInput[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItemDTO[]> {
|
||||
return await this.inventoryItemService_.create(input, context)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an inventory item
|
||||
* @param input - the input object
|
||||
* @param context
|
||||
* @return The created inventory item
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async createInventoryItem(
|
||||
input: CreateInventoryItemInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItemDTO> {
|
||||
const [result] = await this.createInventoryItems([input], context)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async createInventoryLevels(
|
||||
input: CreateInventoryLevelInput[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevelDTO[]> {
|
||||
return await this.inventoryLevelService_.create(input, context)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an inventory item
|
||||
* @param input - the input object
|
||||
* @param context
|
||||
* @return The created inventory level
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async createInventoryLevel(
|
||||
input: CreateInventoryLevelInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevelDTO> {
|
||||
const [result] = await this.createInventoryLevels([input], context)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an inventory item
|
||||
* @param inventoryItemId - the id of the inventory item to update
|
||||
* @param input - the input object
|
||||
* @param context
|
||||
* @return The updated inventory item
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async updateInventoryItem(
|
||||
inventoryItemId: string,
|
||||
input: Partial<CreateInventoryItemInput>,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryItemDTO> {
|
||||
const inventoryItem = await this.inventoryItemService_.update(
|
||||
inventoryItemId,
|
||||
input,
|
||||
context
|
||||
)
|
||||
return { ...inventoryItem }
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an inventory item
|
||||
* @param inventoryItemId - the id of the inventory item to delete
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async deleteInventoryItem(
|
||||
inventoryItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
await this.inventoryLevelService_.deleteByInventoryItemId(
|
||||
inventoryItemId,
|
||||
context
|
||||
)
|
||||
|
||||
return await this.inventoryItemService_.delete(inventoryItemId, context)
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore an inventory item and levels
|
||||
* @param inventoryItemId - the id of the inventory item to delete
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async restoreInventoryItem(
|
||||
inventoryItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
await this.inventoryLevelService_.restoreByInventoryItemId(
|
||||
inventoryItemId,
|
||||
context
|
||||
)
|
||||
|
||||
return await this.inventoryItemService_.restore(inventoryItemId, context)
|
||||
}
|
||||
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async deleteInventoryItemLevelByLocationId(
|
||||
locationId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
return await this.inventoryLevelService_.deleteByLocationId(
|
||||
locationId,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async deleteReservationItemByLocationId(
|
||||
locationId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
return await this.reservationItemService_.deleteByLocationId(
|
||||
locationId,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an inventory level
|
||||
* @param inventoryItemId - the id of the inventory item associated with the level
|
||||
* @param locationId - the id of the location associated with the level
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async deleteInventoryLevel(
|
||||
inventoryItemId: string,
|
||||
locationId: string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const [inventoryLevel] = await this.inventoryLevelService_.list(
|
||||
{ inventory_item_id: inventoryItemId, location_id: locationId },
|
||||
{ take: 1 },
|
||||
context
|
||||
)
|
||||
|
||||
if (!inventoryLevel) {
|
||||
return
|
||||
}
|
||||
|
||||
return await this.inventoryLevelService_.delete(inventoryLevel.id, context)
|
||||
}
|
||||
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async updateInventoryLevels(
|
||||
updates: ({
|
||||
inventory_item_id: string
|
||||
location_id: string
|
||||
} & UpdateInventoryLevelInput)[],
|
||||
context?: SharedContext
|
||||
): Promise<InventoryLevelDTO[]> {
|
||||
const inventoryLevels = await this.ensureInventoryLevels(updates)
|
||||
|
||||
const levelMap = inventoryLevels.reduce((acc, curr) => {
|
||||
const inventoryLevelMap = acc.get(curr.inventory_item_id) ?? new Map()
|
||||
inventoryLevelMap.set(curr.location_id, curr.id)
|
||||
acc.set(curr.inventory_item_id, inventoryLevelMap)
|
||||
return acc
|
||||
}, new Map())
|
||||
|
||||
return await promiseAll(
|
||||
updates.map(async (update) => {
|
||||
const levelId = levelMap
|
||||
.get(update.inventory_item_id)
|
||||
.get(update.location_id)
|
||||
|
||||
// TODO make this bulk
|
||||
return this.inventoryLevelService_.update(levelId, update, context)
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an inventory level
|
||||
* @param inventoryItemId - the id of the inventory item associated with the level
|
||||
* @param locationId - the id of the location associated with the level
|
||||
* @param input - the input object
|
||||
* @param context
|
||||
* @return The updated inventory level
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async updateInventoryLevel(
|
||||
inventoryItemId: string,
|
||||
locationIdOrContext?: string,
|
||||
input?: UpdateInventoryLevelInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevelDTO> {
|
||||
const updates: BulkUpdateInventoryLevelInput[] = [
|
||||
{
|
||||
inventory_item_id: inventoryItemId,
|
||||
location_id: locationIdOrContext as string,
|
||||
...input,
|
||||
},
|
||||
]
|
||||
|
||||
const [result] = await this.updateInventoryLevels(updates, context)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a reservation item
|
||||
* @param reservationItemId
|
||||
* @param input - the input object
|
||||
* @param context
|
||||
* @param context
|
||||
* @return The updated inventory level
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async updateReservationItem(
|
||||
reservationItemId: string,
|
||||
input: UpdateReservationItemInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItemDTO> {
|
||||
return await this.reservationItemService_.update(
|
||||
reservationItemId,
|
||||
input,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes reservation items by line item
|
||||
* @param lineItemId - the id of the line item associated with the reservation item
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async deleteReservationItemsByLineItem(
|
||||
lineItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
return await this.reservationItemService_.deleteByLineItem(
|
||||
lineItemId,
|
||||
context
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a reservation item
|
||||
* @param reservationItemId - the id of the reservation item to delete
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async deleteReservationItem(
|
||||
reservationItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
return await this.reservationItemService_.delete(reservationItemId, context)
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjusts the inventory level for a given inventory item and location.
|
||||
* @param inventoryItemId - the id of the inventory item
|
||||
* @param locationId - the id of the location
|
||||
* @param adjustment - the number to adjust the inventory by (can be positive or negative)
|
||||
* @param context
|
||||
* @return The updated inventory level
|
||||
* @throws when the inventory level is not found
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async adjustInventory(
|
||||
inventoryItemId: string,
|
||||
locationId: string,
|
||||
adjustment: number,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<InventoryLevelDTO> {
|
||||
const [inventoryLevel] = await this.inventoryLevelService_.list(
|
||||
{ inventory_item_id: inventoryItemId, location_id: locationId },
|
||||
{ take: 1 },
|
||||
context
|
||||
)
|
||||
if (!inventoryLevel) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`Inventory level for inventory item ${inventoryItemId} and location ${locationId} not found`
|
||||
)
|
||||
}
|
||||
|
||||
const updatedInventoryLevel = await this.inventoryLevelService_.update(
|
||||
inventoryLevel.id,
|
||||
{
|
||||
stocked_quantity: inventoryLevel.stocked_quantity + adjustment,
|
||||
},
|
||||
context
|
||||
)
|
||||
|
||||
return { ...updatedInventoryLevel }
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the available quantity of a given inventory item in a given location.
|
||||
* @param inventoryItemId - the id of the inventory item
|
||||
* @param locationIds - the ids of the locations to check
|
||||
* @param context
|
||||
* @return The available quantity
|
||||
* @throws when the inventory item is not found
|
||||
*/
|
||||
async retrieveAvailableQuantity(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<number> {
|
||||
// Throws if item does not exist
|
||||
await this.inventoryItemService_.retrieve(
|
||||
inventoryItemId,
|
||||
{
|
||||
select: ["id"],
|
||||
},
|
||||
context
|
||||
)
|
||||
|
||||
if (locationIds.length === 0) {
|
||||
return 0
|
||||
}
|
||||
|
||||
const availableQuantity =
|
||||
await this.inventoryLevelService_.getAvailableQuantity(
|
||||
inventoryItemId,
|
||||
locationIds,
|
||||
context
|
||||
)
|
||||
|
||||
return availableQuantity
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the stocked quantity of a given inventory item in a given location.
|
||||
* @param inventoryItemId - the id of the inventory item
|
||||
* @param locationIds - the ids of the locations to check
|
||||
* @param context
|
||||
* @return The stocked quantity
|
||||
* @throws when the inventory item is not found
|
||||
*/
|
||||
async retrieveStockedQuantity(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<number> {
|
||||
// Throws if item does not exist
|
||||
await this.inventoryItemService_.retrieve(
|
||||
inventoryItemId,
|
||||
{
|
||||
select: ["id"],
|
||||
},
|
||||
context
|
||||
)
|
||||
|
||||
if (locationIds.length === 0) {
|
||||
return 0
|
||||
}
|
||||
|
||||
const stockedQuantity =
|
||||
await this.inventoryLevelService_.getStockedQuantity(
|
||||
inventoryItemId,
|
||||
locationIds,
|
||||
context
|
||||
)
|
||||
|
||||
return stockedQuantity
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the reserved quantity of a given inventory item in a given location.
|
||||
* @param inventoryItemId - the id of the inventory item
|
||||
* @param locationIds - the ids of the locations to check
|
||||
* @param context
|
||||
* @return The reserved quantity
|
||||
* @throws when the inventory item is not found
|
||||
*/
|
||||
async retrieveReservedQuantity(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<number> {
|
||||
// Throws if item does not exist
|
||||
await this.inventoryItemService_.retrieve(
|
||||
inventoryItemId,
|
||||
{
|
||||
select: ["id"],
|
||||
},
|
||||
context
|
||||
)
|
||||
|
||||
if (locationIds.length === 0) {
|
||||
return 0
|
||||
}
|
||||
|
||||
const reservedQuantity =
|
||||
await this.inventoryLevelService_.getReservedQuantity(
|
||||
inventoryItemId,
|
||||
locationIds,
|
||||
context
|
||||
)
|
||||
|
||||
return reservedQuantity
|
||||
}
|
||||
|
||||
/**
|
||||
* Confirms whether there is sufficient inventory for a given quantity of a given inventory item in a given location.
|
||||
* @param inventoryItemId - the id of the inventory item
|
||||
* @param locationIds - the ids of the locations to check
|
||||
* @param quantity - the quantity to check
|
||||
* @param context
|
||||
* @return Whether there is sufficient inventory
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async confirmInventory(
|
||||
inventoryItemId: string,
|
||||
locationIds: string[],
|
||||
quantity: number,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<boolean> {
|
||||
const availableQuantity = await this.retrieveAvailableQuantity(
|
||||
inventoryItemId,
|
||||
locationIds,
|
||||
context
|
||||
)
|
||||
return availableQuantity >= quantity
|
||||
}
|
||||
}
|
||||
@@ -1,340 +0,0 @@
|
||||
import {
|
||||
CreateReservationItemInput,
|
||||
FilterableReservationItemProps,
|
||||
FindConfig,
|
||||
IEventBusService,
|
||||
SharedContext,
|
||||
UpdateReservationItemInput,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
InjectEntityManager,
|
||||
MedusaContext,
|
||||
MedusaError,
|
||||
isDefined,
|
||||
promiseAll,
|
||||
} from "@medusajs/utils"
|
||||
import { EntityManager, FindManyOptions, In } from "typeorm"
|
||||
import { InventoryLevelService } from "."
|
||||
import { ReservationItem } from "../models"
|
||||
import { buildQuery } from "../utils/build-query"
|
||||
|
||||
type InjectedDependencies = {
|
||||
eventBusService: IEventBusService
|
||||
manager: EntityManager
|
||||
inventoryLevelService: InventoryLevelService
|
||||
}
|
||||
|
||||
export default class ReservationItemService {
|
||||
static Events = {
|
||||
CREATED: "reservation-item.created",
|
||||
UPDATED: "reservation-item.updated",
|
||||
DELETED: "reservation-item.deleted",
|
||||
}
|
||||
|
||||
protected readonly manager_: EntityManager
|
||||
protected readonly eventBusService_: IEventBusService | undefined
|
||||
protected readonly inventoryLevelService_: InventoryLevelService
|
||||
|
||||
constructor({
|
||||
eventBusService,
|
||||
inventoryLevelService,
|
||||
manager,
|
||||
}: InjectedDependencies) {
|
||||
this.manager_ = manager
|
||||
this.eventBusService_ = eventBusService
|
||||
this.inventoryLevelService_ = inventoryLevelService
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists reservation items that match the provided filter.
|
||||
* @param selector - Filters to apply to the reservation items.
|
||||
* @param config - Configuration for the query.
|
||||
* @param context
|
||||
* @return Array of reservation items that match the selector.
|
||||
*/
|
||||
async list(
|
||||
selector: FilterableReservationItemProps = {},
|
||||
config: FindConfig<ReservationItem> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItem[]> {
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const itemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const query = buildQuery(selector, config) as FindManyOptions
|
||||
|
||||
return await itemRepository.find(query)
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists reservation items that match the provided filter and returns the total count.
|
||||
* @param selector - Filters to apply to the reservation items.
|
||||
* @param config - Configuration for the query.
|
||||
* @param context
|
||||
* @return Array of reservation items that match the selector and the total count.
|
||||
*/
|
||||
async listAndCount(
|
||||
selector: FilterableReservationItemProps = {},
|
||||
config: FindConfig<ReservationItem> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[ReservationItem[], number]> {
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const itemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const query = buildQuery(selector, config) as FindManyOptions
|
||||
|
||||
return await itemRepository.findAndCount(query)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a reservation item by its id.
|
||||
* @param reservationItemId - The id of the reservation item to retrieve.
|
||||
* @param config - Configuration for the query.
|
||||
* @param context
|
||||
* @return The reservation item with the provided id.
|
||||
* @throws If reservationItemId is not defined or if the reservation item was not found.
|
||||
*/
|
||||
async retrieve(
|
||||
reservationItemId: string,
|
||||
config: FindConfig<ReservationItem> = {},
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItem> {
|
||||
if (!isDefined(reservationItemId)) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`"reservationItemId" must be defined`
|
||||
)
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const reservationItemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const query = buildQuery(
|
||||
{ id: reservationItemId },
|
||||
config
|
||||
) as FindManyOptions
|
||||
const [reservationItem] = await reservationItemRepository.find(query)
|
||||
|
||||
if (!reservationItem) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`ReservationItem with id ${reservationItemId} was not found`
|
||||
)
|
||||
}
|
||||
|
||||
return reservationItem
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new reservation item.
|
||||
* @param data - The reservation item data.
|
||||
* @param context
|
||||
* @return The created reservation item.
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async create(
|
||||
data: CreateReservationItemInput[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItem[]> {
|
||||
const manager = context.transactionManager!
|
||||
const reservationItemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const reservationItems = reservationItemRepository.create(
|
||||
data.map((tc) => ({
|
||||
inventory_item_id: tc.inventory_item_id,
|
||||
line_item_id: tc.line_item_id,
|
||||
location_id: tc.location_id,
|
||||
quantity: tc.quantity,
|
||||
metadata: tc.metadata,
|
||||
external_id: tc.external_id,
|
||||
description: tc.description,
|
||||
created_by: tc.created_by,
|
||||
}))
|
||||
)
|
||||
|
||||
const [newReservationItems] = await promiseAll([
|
||||
reservationItemRepository.save(reservationItems),
|
||||
...data.map(
|
||||
async (data) =>
|
||||
// TODO make bulk
|
||||
await this.inventoryLevelService_.adjustReservedQuantity(
|
||||
data.inventory_item_id,
|
||||
data.location_id,
|
||||
data.quantity,
|
||||
context
|
||||
)
|
||||
),
|
||||
])
|
||||
|
||||
await this.eventBusService_?.emit?.(ReservationItemService.Events.CREATED, {
|
||||
ids: newReservationItems.map((i) => i.id),
|
||||
})
|
||||
|
||||
return newReservationItems
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a reservation item.
|
||||
* @param reservationItemId - The reservation item's id.
|
||||
* @param data - The reservation item data to update.
|
||||
* @param context
|
||||
* @return The updated reservation item.
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async update(
|
||||
reservationItemId: string,
|
||||
data: UpdateReservationItemInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<ReservationItem> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const item = await this.retrieve(reservationItemId, undefined, context)
|
||||
|
||||
const shouldUpdateQuantity =
|
||||
isDefined(data.quantity) && data.quantity !== item.quantity
|
||||
|
||||
const shouldUpdateLocation =
|
||||
isDefined(data.location_id) && data.location_id !== item.location_id
|
||||
|
||||
const ops: Promise<unknown>[] = []
|
||||
|
||||
if (shouldUpdateLocation) {
|
||||
ops.push(
|
||||
this.inventoryLevelService_.adjustReservedQuantity(
|
||||
item.inventory_item_id,
|
||||
item.location_id,
|
||||
item.quantity * -1,
|
||||
context
|
||||
),
|
||||
this.inventoryLevelService_.adjustReservedQuantity(
|
||||
item.inventory_item_id,
|
||||
data.location_id!,
|
||||
data.quantity || item.quantity!,
|
||||
context
|
||||
)
|
||||
)
|
||||
} else if (shouldUpdateQuantity) {
|
||||
const quantityDiff = data.quantity! - item.quantity
|
||||
ops.push(
|
||||
this.inventoryLevelService_.adjustReservedQuantity(
|
||||
item.inventory_item_id,
|
||||
item.location_id,
|
||||
quantityDiff,
|
||||
context
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
const mergedItem = itemRepository.merge(item, data)
|
||||
|
||||
ops.push(itemRepository.save(item))
|
||||
|
||||
await promiseAll(ops)
|
||||
|
||||
await this.eventBusService_?.emit?.(ReservationItemService.Events.UPDATED, {
|
||||
id: mergedItem.id,
|
||||
})
|
||||
|
||||
return mergedItem
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a reservation item by line item id.
|
||||
* @param lineItemId - the id of the line item to delete.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async deleteByLineItem(
|
||||
lineItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const lineItemIds = Array.isArray(lineItemId) ? lineItemId : [lineItemId]
|
||||
|
||||
const reservationItems = await this.list(
|
||||
{ line_item_id: lineItemIds },
|
||||
undefined,
|
||||
context
|
||||
)
|
||||
|
||||
const ops: Promise<unknown>[] = [
|
||||
itemRepository.softDelete({ line_item_id: In(lineItemIds) }),
|
||||
]
|
||||
|
||||
for (const reservation of reservationItems) {
|
||||
ops.push(
|
||||
this.inventoryLevelService_.adjustReservedQuantity(
|
||||
reservation.inventory_item_id,
|
||||
reservation.location_id,
|
||||
reservation.quantity * -1,
|
||||
context
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
await promiseAll(ops)
|
||||
|
||||
await this.eventBusService_?.emit?.(ReservationItemService.Events.DELETED, {
|
||||
line_item_id: lineItemId,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes reservation items by location ID.
|
||||
* @param locationId - The ID of the location to delete reservations for.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async deleteByLocationId(
|
||||
locationId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(ReservationItem)
|
||||
|
||||
const ids = Array.isArray(locationId) ? locationId : [locationId]
|
||||
|
||||
await itemRepository.softDelete({ location_id: In(ids) })
|
||||
|
||||
await this.eventBusService_?.emit?.(ReservationItemService.Events.DELETED, {
|
||||
location_id: locationId,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a reservation item by id.
|
||||
* @param reservationItemId - the id of the reservation item to delete.
|
||||
* @param context
|
||||
*/
|
||||
@InjectEntityManager()
|
||||
async delete(
|
||||
reservationItemId: string | string[],
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const ids = Array.isArray(reservationItemId)
|
||||
? reservationItemId
|
||||
: [reservationItemId]
|
||||
const manager = context.transactionManager!
|
||||
const itemRepository = manager.getRepository(ReservationItem)
|
||||
const items = await this.list({ id: ids }, undefined, context)
|
||||
|
||||
const promises: Promise<unknown>[] = items.map(async (item) => {
|
||||
await this.inventoryLevelService_.adjustReservedQuantity(
|
||||
item.inventory_item_id,
|
||||
item.location_id,
|
||||
item.quantity * -1,
|
||||
context
|
||||
)
|
||||
})
|
||||
|
||||
promises.push(itemRepository.softRemove(items))
|
||||
|
||||
await promiseAll(promises)
|
||||
|
||||
await this.eventBusService_?.emit?.(ReservationItemService.Events.DELETED, {
|
||||
ids: reservationItemId,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import { DatabaseType } from "typeorm"
|
||||
|
||||
export type InventoryServiceInitializeOptions = {
|
||||
database?: {
|
||||
type?: DatabaseType | string
|
||||
url?: string
|
||||
database?: string
|
||||
extra?: Record<string, any>
|
||||
schema?: string
|
||||
logging?: boolean
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
import { ExtendedFindConfig, FindConfig } from "@medusajs/types"
|
||||
import {
|
||||
And,
|
||||
FindManyOptions,
|
||||
FindOperator,
|
||||
FindOptionsOrder,
|
||||
FindOptionsRelations,
|
||||
FindOptionsSelect,
|
||||
FindOptionsWhere,
|
||||
ILike,
|
||||
In,
|
||||
IsNull,
|
||||
LessThan,
|
||||
LessThanOrEqual,
|
||||
MoreThan,
|
||||
MoreThanOrEqual,
|
||||
} from "typeorm"
|
||||
import { buildOrder, buildRelations, buildSelects } from "@medusajs/utils"
|
||||
|
||||
const operatorsMap = {
|
||||
lt: (value) => LessThan(value),
|
||||
gt: (value) => MoreThan(value),
|
||||
lte: (value) => LessThanOrEqual(value),
|
||||
gte: (value) => MoreThanOrEqual(value),
|
||||
contains: (value) => ILike(`%${value}%`),
|
||||
starts_with: (value) => ILike(`${value}%`),
|
||||
ends_with: (value) => ILike(`%${value}`),
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to build TypeORM queries.
|
||||
* @param selector The selector
|
||||
* @param config The config
|
||||
* @return The QueryBuilderConfig
|
||||
*/
|
||||
export function buildQuery<TWhereKeys extends object, TEntity = unknown>(
|
||||
selector: TWhereKeys,
|
||||
config: FindConfig<TEntity> = {}
|
||||
) {
|
||||
const query: ExtendedFindConfig<TEntity> = {
|
||||
where: buildWhere<TWhereKeys, TEntity>(selector),
|
||||
}
|
||||
|
||||
if ("deleted_at" in selector || config.withDeleted) {
|
||||
query.withDeleted = true
|
||||
}
|
||||
|
||||
if ("skip" in config) {
|
||||
;(query as FindManyOptions<TEntity>).skip = config.skip ?? undefined
|
||||
}
|
||||
|
||||
if ("take" in config) {
|
||||
;(query as FindManyOptions<TEntity>).take = config.take ?? undefined
|
||||
}
|
||||
|
||||
if (config.relations) {
|
||||
query.relations = buildRelations(
|
||||
config.relations
|
||||
) as FindOptionsRelations<TEntity>
|
||||
}
|
||||
|
||||
if (config.select) {
|
||||
query.select = buildSelects(
|
||||
config.select as string[]
|
||||
) as FindOptionsSelect<TEntity>
|
||||
}
|
||||
|
||||
if (config.order) {
|
||||
query.order = buildOrder(config.order) as FindOptionsOrder<TEntity>
|
||||
}
|
||||
|
||||
return query
|
||||
}
|
||||
|
||||
/**
|
||||
* @param constraints
|
||||
*
|
||||
* @example
|
||||
* const q = buildWhere(
|
||||
* {
|
||||
* id: "1234",
|
||||
* test1: ["123", "12", "1"],
|
||||
* test2: Not("this"),
|
||||
* date: { gt: date },
|
||||
* amount: { gt: 10 },
|
||||
* },
|
||||
*)
|
||||
*
|
||||
* // Output
|
||||
* {
|
||||
* id: "1234",
|
||||
* test1: In(["123", "12", "1"]),
|
||||
* test2: Not("this"),
|
||||
* date: MoreThan(date),
|
||||
* amount: MoreThan(10)
|
||||
* }
|
||||
*/
|
||||
function buildWhere<TWhereKeys extends object, TEntity>(
|
||||
constraints: TWhereKeys
|
||||
): FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[] {
|
||||
let where: FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[] = {}
|
||||
|
||||
if (Array.isArray(constraints)) {
|
||||
where = []
|
||||
constraints.forEach((constraint) => {
|
||||
;(where as FindOptionsWhere<TEntity>[]).push(
|
||||
buildWhere(constraint) as FindOptionsWhere<TEntity>
|
||||
)
|
||||
})
|
||||
|
||||
return where
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(constraints)) {
|
||||
if (value === undefined) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (value === null) {
|
||||
where[key] = IsNull()
|
||||
continue
|
||||
}
|
||||
|
||||
if (value instanceof FindOperator) {
|
||||
where[key] = value
|
||||
continue
|
||||
}
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
where[key] = In(value)
|
||||
continue
|
||||
}
|
||||
|
||||
if (typeof value === "object") {
|
||||
Object.entries(value).forEach(([objectKey, objectValue]) => {
|
||||
where[key] = where[key] || []
|
||||
if (operatorsMap[objectKey]) {
|
||||
where[key].push(operatorsMap[objectKey](objectValue))
|
||||
} else {
|
||||
if (objectValue != undefined && typeof objectValue === "object") {
|
||||
where[key] = buildWhere<any, TEntity>(objectValue)
|
||||
return
|
||||
}
|
||||
where[key] = value
|
||||
}
|
||||
return
|
||||
})
|
||||
|
||||
if (!Array.isArray(where[key])) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (where[key].length === 1) {
|
||||
where[key] = where[key][0]
|
||||
} else {
|
||||
where[key] = And(...where[key])
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
where[key] = value
|
||||
}
|
||||
|
||||
return where
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
import {
|
||||
ExtendedFindConfig,
|
||||
FilterableInventoryItemProps,
|
||||
FindConfig,
|
||||
} from "@medusajs/types"
|
||||
import { objectToStringPath } from "@medusajs/utils"
|
||||
import { EntityManager, FindOptionsWhere, Brackets } from "typeorm"
|
||||
|
||||
import { InventoryItem } from "../models"
|
||||
import { buildQuery } from "./build-query"
|
||||
|
||||
export function getListQuery(
|
||||
manager: EntityManager,
|
||||
selector: FilterableInventoryItemProps = {},
|
||||
config: FindConfig<InventoryItem> = { relations: [], skip: 0, take: 10 }
|
||||
) {
|
||||
const inventoryItemRepository = manager.getRepository(InventoryItem)
|
||||
|
||||
const { q, ...selectorRest } = selector
|
||||
const query = buildQuery(
|
||||
selectorRest,
|
||||
config
|
||||
) as ExtendedFindConfig<InventoryItem> & {
|
||||
where: FindOptionsWhere<
|
||||
InventoryItem & {
|
||||
location_id?: string
|
||||
}
|
||||
>
|
||||
}
|
||||
|
||||
const queryBuilder = inventoryItemRepository.createQueryBuilder("inv_item")
|
||||
|
||||
if ("location_id" in query.where) {
|
||||
const locationIds = Array.isArray(selector.location_id)
|
||||
? selector.location_id
|
||||
: [selector.location_id]
|
||||
|
||||
queryBuilder.innerJoin(
|
||||
"inventory_level",
|
||||
"level",
|
||||
"level.inventory_item_id = inv_item.id AND level.location_id IN (:...locationIds)",
|
||||
{ locationIds }
|
||||
)
|
||||
|
||||
delete query.where.location_id
|
||||
}
|
||||
|
||||
if (q) {
|
||||
queryBuilder.where(query.where).andWhere(
|
||||
new Brackets((qb) => {
|
||||
qb.where("inv_item.sku ILike :q", { q: `%${q}%` })
|
||||
.orWhere("inv_item.description ILike :q", { q: `%${q}%` })
|
||||
.orWhere("inv_item.title ILike :q", { q: `%${q}%` })
|
||||
})
|
||||
)
|
||||
} else {
|
||||
queryBuilder.where(query.where)
|
||||
}
|
||||
|
||||
if (query.take) {
|
||||
queryBuilder.take(query.take)
|
||||
}
|
||||
|
||||
if (query.skip) {
|
||||
queryBuilder.skip(query.skip)
|
||||
}
|
||||
|
||||
if (query.select) {
|
||||
const legacySelect = objectToStringPath(query.select)
|
||||
queryBuilder.select(legacySelect.map((s) => "inv_item." + s))
|
||||
}
|
||||
|
||||
if (query.withDeleted) {
|
||||
queryBuilder.withDeleted()
|
||||
}
|
||||
|
||||
if (query.order) {
|
||||
const toSelect: string[] = []
|
||||
const parsed = Object.entries(query.order).reduce((acc, [k, v]) => {
|
||||
const key = `inv_item.${k}`
|
||||
if (!query.select?.[k]) {
|
||||
toSelect.push(key)
|
||||
}
|
||||
acc[key] = v
|
||||
return acc
|
||||
}, {})
|
||||
queryBuilder.addSelect(toSelect)
|
||||
queryBuilder.orderBy(parsed)
|
||||
}
|
||||
|
||||
return queryBuilder
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": ["es2020"],
|
||||
"target": "ES2020",
|
||||
"outDir": "./dist",
|
||||
"esModuleInterop": true,
|
||||
"declaration": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"sourceMap": true,
|
||||
"noImplicitReturns": true,
|
||||
"strictNullChecks": true,
|
||||
"strictFunctionTypes": true,
|
||||
"noImplicitThis": true,
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": [
|
||||
"dist",
|
||||
"./src/**/__tests__",
|
||||
"./src/**/__mocks__",
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"include": ["src"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -69,7 +69,7 @@ export const MODULE_PACKAGE_NAMES = {
|
||||
[Modules.CART]: "@medusajs/cart",
|
||||
[Modules.CUSTOMER]: "@medusajs/customer",
|
||||
[Modules.EVENT_BUS]: "@medusajs/event-bus-local",
|
||||
[Modules.INVENTORY]: "@medusajs/inventory",
|
||||
[Modules.INVENTORY]: "@medusajs/inventory-next", // TODO: To be replaced when current `@medusajs/inventory` is deprecated
|
||||
[Modules.LINK]: "@medusajs/link-modules",
|
||||
[Modules.PAYMENT]: "@medusajs/payment",
|
||||
[Modules.PRICING]: "@medusajs/pricing",
|
||||
@@ -77,7 +77,7 @@ export const MODULE_PACKAGE_NAMES = {
|
||||
[Modules.PROMOTION]: "@medusajs/promotion",
|
||||
[Modules.SALES_CHANNEL]: "@medusajs/sales-channel",
|
||||
[Modules.FULFILLMENT]: "@medusajs/fulfillment",
|
||||
[Modules.STOCK_LOCATION]: "@medusajs/stock-location",
|
||||
[Modules.STOCK_LOCATION]: "@medusajs/stock-location-next", // TODO: To be replaced when current `@medusajs/stock-location` is deprecated
|
||||
[Modules.TAX]: "@medusajs/tax",
|
||||
[Modules.USER]: "@medusajs/user",
|
||||
[Modules.WORKFLOW_ENGINE]: "@medusajs/workflow-engine-inmemory",
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
/dist
|
||||
node_modules
|
||||
.DS_store
|
||||
.env*
|
||||
.env
|
||||
*.sql
|
||||
@@ -1,263 +0,0 @@
|
||||
# @medusajs/stock-location
|
||||
|
||||
## 1.11.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#6263](https://github.com/medusajs/medusa/pull/6263) [`45134e4d1`](https://github.com/medusajs/medusa/commit/45134e4d11cfcdc08dbd10aae687bfbe9e848ab9) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Workflows passing MedusaContext as argument
|
||||
|
||||
- [#6197](https://github.com/medusajs/medusa/pull/6197) [`d1c18a309`](https://github.com/medusajs/medusa/commit/d1c18a3090d71c68a98343fdbb53516f416504c5) Thanks [@pKorsholm](https://github.com/pKorsholm)! - feat(stock-location, medusa, types): add `q` and `order` query parameters to stock locations list endpoint
|
||||
|
||||
- Updated dependencies [[`12054f5c0`](https://github.com/medusajs/medusa/commit/12054f5c01915899223ddc6da734151b31fbb23b), [`3db2f95e65`](https://github.com/medusajs/medusa/commit/3db2f95e65909f4fff432990b48be74509052e83), [`96ba49329`](https://github.com/medusajs/medusa/commit/96ba49329b6b05922c90f0c55f16455cb40aa5ca), [`45134e4d1`](https://github.com/medusajs/medusa/commit/45134e4d11cfcdc08dbd10aae687bfbe9e848ab9), [`884428a1b`](https://github.com/medusajs/medusa/commit/884428a1b573e499d7659aefed639bf797147428), [`882aa549b`](https://github.com/medusajs/medusa/commit/882aa549bdcc6f378934eab2a7c485df354f46aa)]:
|
||||
- @medusajs/utils@1.11.5
|
||||
- @medusajs/modules-sdk@1.12.8
|
||||
|
||||
## 1.11.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5763](https://github.com/medusajs/medusa/pull/5763) [`d85fee42e`](https://github.com/medusajs/medusa/commit/d85fee42ee7f661310584dfee5741d6c53b989bb) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Medusa App loading modules reference
|
||||
|
||||
- [#6012](https://github.com/medusajs/medusa/pull/6012) [`192bc336cc`](https://github.com/medusajs/medusa/commit/192bc336cc2b6ec3820d94524c046dcd3c4ac7d9) Thanks [@olivermrbl](https://github.com/olivermrbl)! - feat(cart): Partial module service implementation
|
||||
|
||||
- Updated dependencies [[`68ddd866a5`](https://github.com/medusajs/medusa/commit/68ddd866a5ff9414e2db5b80d75acc5e81948540), [`72bc52231c`](https://github.com/medusajs/medusa/commit/72bc52231ca3a72fa6d197a248fe07a938ed0d85), [`99045848f`](https://github.com/medusajs/medusa/commit/99045848fd3e863359c7878d9bc05271ed083a0e), [`a9b4214503`](https://github.com/medusajs/medusa/commit/a9b42145032ee88aa922a11fe03e777b140c68f4), [`d85fee42e`](https://github.com/medusajs/medusa/commit/d85fee42ee7f661310584dfee5741d6c53b989bb), [`5e655dd59`](https://github.com/medusajs/medusa/commit/5e655dd59bda4ffface28db38021ba71cae6de10), [`b782d3bcb7`](https://github.com/medusajs/medusa/commit/b782d3bcb7e8088a962584b9a55200dd29c2161c), [`2b9f98895e`](https://github.com/medusajs/medusa/commit/2b9f98895eaca255e01278674b11cd7cb69b388f), [`302323916`](https://github.com/medusajs/medusa/commit/302323916b6d8eaf571cd59b5fc92a913af207de), [`da5cc4cf7`](https://github.com/medusajs/medusa/commit/da5cc4cf7f7f0ef40d409704a95b025ce95477f4), [`daecd82a7`](https://github.com/medusajs/medusa/commit/daecd82a7cdf7315599f464999690414c20d6748), [`06b33a9b4`](https://github.com/medusajs/medusa/commit/06b33a9b4525b77b1b14b35b973209700945654e), [`b6ac768698`](https://github.com/medusajs/medusa/commit/b6ac768698a3b49d0162cb49e628386f3352d034), [`130c641e5c`](https://github.com/medusajs/medusa/commit/130c641e5c91cf831de64fb87aebbfdc4d23530d), [`fade8ea7bf`](https://github.com/medusajs/medusa/commit/fade8ea7bf560343ecbde116d226ac44053cdb8e), [`8472460f53`](https://github.com/medusajs/medusa/commit/8472460f533322cc4535199aa768ac163021bc79)]:
|
||||
- @medusajs/utils@1.11.4
|
||||
- @medusajs/modules-sdk@1.12.7
|
||||
|
||||
## 1.11.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5713](https://github.com/medusajs/medusa/pull/5713) [`18afe0b9a`](https://github.com/medusajs/medusa/commit/18afe0b9addb33ec2e3b285651b4eb1ef8065845) Thanks [@pKorsholm](https://github.com/pKorsholm)! - fix(stock-location, inventory, medusa, types, utils): allow buildQuery to take null as an argument in order to prevent default pagination
|
||||
|
||||
- Updated dependencies [[`18afe0b9a`](https://github.com/medusajs/medusa/commit/18afe0b9addb33ec2e3b285651b4eb1ef8065845), [`de8f74867`](https://github.com/medusajs/medusa/commit/de8f748674bfd19b3dbadb9695d9080aa91940de), [`dc5750dd6`](https://github.com/medusajs/medusa/commit/dc5750dd665a91d35c0246ba83c7f90ec74907f4)]:
|
||||
- @medusajs/utils@1.11.1
|
||||
- @medusajs/modules-sdk@1.12.4
|
||||
|
||||
## 1.11.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`d2309e771`](https://github.com/medusajs/medusa/commit/d2309e771de1cb0366a8480787a52c2f01c859ea) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore(changesets): Add missing stock-location changeset
|
||||
|
||||
- Updated dependencies [[`c39bf69a5`](https://github.com/medusajs/medusa/commit/c39bf69a5e5cae75d7fa12aa6022b10903557a32), [`154c9b43b`](https://github.com/medusajs/medusa/commit/154c9b43bde1fdff562aba9da8a79af2660b29b3)]:
|
||||
- @medusajs/modules-sdk@1.12.3
|
||||
- @medusajs/utils@1.10.5
|
||||
|
||||
## 1.11.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#5468](https://github.com/medusajs/medusa/pull/5468) [`a45da9215`](https://github.com/medusajs/medusa/commit/a45da9215d2a7834c368037726aaa3961caadaf9) Thanks [@adrien2p](https://github.com/adrien2p)! - fix(medusa, modules-sdk, modules): Module loading was missing the expected dependencies and remote query reference fix
|
||||
|
||||
- Updated dependencies [[`a45da9215`](https://github.com/medusajs/medusa/commit/a45da9215d2a7834c368037726aaa3961caadaf9)]:
|
||||
- @medusajs/modules-sdk@1.12.2
|
||||
|
||||
## 1.11.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#5242](https://github.com/medusajs/medusa/pull/5242) [`130cbc1f4`](https://github.com/medusajs/medusa/commit/130cbc1f437af211b6d05f80128d90138abcd38d) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Modules exporting schema with entities and fields
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`eeceec791`](https://github.com/medusajs/medusa/commit/eeceec791c141996cf7fd06555afb6e738b52840), [`130cbc1f4`](https://github.com/medusajs/medusa/commit/130cbc1f437af211b6d05f80128d90138abcd38d), [`cb569c2df`](https://github.com/medusajs/medusa/commit/cb569c2dfe2d83e1ff72a49f2331450a83b73325)]:
|
||||
- @medusajs/utils@1.10.3
|
||||
- @medusajs/modules-sdk@1.12.0
|
||||
|
||||
## 1.10.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#4695](https://github.com/medusajs/medusa/pull/4695) [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - introduce @medusajs/link-modules
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`c3dba0694`](https://github.com/medusajs/medusa/commit/c3dba069488952945150117a30b1306a2e0bb3ce), [`460161a69`](https://github.com/medusajs/medusa/commit/460161a69f22cf6d561952e92e7d9b56912113e6), [`fcb6b4f51`](https://github.com/medusajs/medusa/commit/fcb6b4f510dba2757570625acb5da9476b7544fd), [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef), [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef), [`87bade096`](https://github.com/medusajs/medusa/commit/87bade096e3d536f29ddc57dbc4c04e5d7a46e4b), [`4d16acf5f`](https://github.com/medusajs/medusa/commit/4d16acf5f096b5656b645f510f9c971e7c2dc9ef), [`a4906d0ac`](https://github.com/medusajs/medusa/commit/a4906d0ac0af36b1382d3befe64281b404387bd7)]:
|
||||
- @medusajs/modules-sdk@1.10.0
|
||||
- @medusajs/utils@1.10.0
|
||||
|
||||
## 1.9.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#4232](https://github.com/medusajs/medusa/pull/4232) [`af2dc4f75`](https://github.com/medusajs/medusa/commit/af2dc4f75a2ed109495ca83b1bc6ae6941c2f716) Thanks [@adrien2p](https://github.com/adrien2p)! - feat(medusa, inventory, stock-location): Remove unnecessary transaction usage in the modules and list products end points
|
||||
|
||||
- Updated dependencies [[`f98ba5bde`](https://github.com/medusajs/medusa/commit/f98ba5bde83ba785eead31b0c9eb9f135d664178), [`14c0f62f8`](https://github.com/medusajs/medusa/commit/14c0f62f84704a4c87beff3daaff60a52f5c88b8)]:
|
||||
- @medusajs/utils@1.9.1
|
||||
- @medusajs/modules-sdk@1.8.8
|
||||
|
||||
## 1.9.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#4146](https://github.com/medusajs/medusa/pull/4146) [`db4199530`](https://github.com/medusajs/medusa/commit/db419953075e0907b8c4d27ab5188e9bd3e3d72b) Thanks [@fPolic](https://github.com/fPolic)! - chore(medusa, utils, inventory, stock-location): clear deps in the utils package
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`a91987fab`](https://github.com/medusajs/medusa/commit/a91987fab33745f9864eab21bd1c27e8e3e24571), [`e73c3e51c`](https://github.com/medusajs/medusa/commit/e73c3e51c9cd192eeae7a57b24b07bd466214145), [`db4199530`](https://github.com/medusajs/medusa/commit/db419953075e0907b8c4d27ab5188e9bd3e3d72b), [`c0e527d6e`](https://github.com/medusajs/medusa/commit/c0e527d6e0a67d0c53577a0b9c3d16ee8dc5740f)]:
|
||||
- @medusajs/utils@1.9.0
|
||||
- @medusajs/modules-sdk@1.8.7
|
||||
|
||||
## 1.8.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#4072](https://github.com/medusajs/medusa/pull/4072) [`6511959e2`](https://github.com/medusajs/medusa/commit/6511959e23177f3b4831915db0e8e788bc9047fa) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Revert to official Typeorm package
|
||||
|
||||
- Updated dependencies [[`cdbac2c84`](https://github.com/medusajs/medusa/commit/cdbac2c8403a3c15c0e11993f6b7dab268fa5c08), [`6511959e2`](https://github.com/medusajs/medusa/commit/6511959e23177f3b4831915db0e8e788bc9047fa)]:
|
||||
- @medusajs/utils@1.8.5
|
||||
- @medusajs/modules-sdk@1.8.6
|
||||
|
||||
## 1.8.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`1ea57c3a6`](https://github.com/medusajs/medusa/commit/1ea57c3a69a5377a8dd0821df819743ded4a222b)]:
|
||||
- @medusajs/utils@1.8.4
|
||||
- @medusajs/modules-sdk@1.8.5
|
||||
|
||||
## 1.8.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3981](https://github.com/medusajs/medusa/pull/3981) [`d539c6fee`](https://github.com/medusajs/medusa/commit/d539c6feeba8ee431f9a655b6cd4e9102cba2b25) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Bump Typeorm to Medusa fork
|
||||
|
||||
- Updated dependencies [[`0e488e71b`](https://github.com/medusajs/medusa/commit/0e488e71b186f7d08b18c4c6ba409ef3cadb8152), [`d539c6fee`](https://github.com/medusajs/medusa/commit/d539c6feeba8ee431f9a655b6cd4e9102cba2b25)]:
|
||||
- @medusajs/utils@1.8.3
|
||||
- @medusajs/modules-sdk@1.8.4
|
||||
|
||||
## 1.8.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3835](https://github.com/medusajs/medusa/pull/3835) [`af710f1b4`](https://github.com/medusajs/medusa/commit/af710f1b48a4545a5064029a557013af34c4c100) Thanks [@adrien2p](https://github.com/adrien2p)! - fix(medusa): Bulk create variant and pass transaction to the inventory service context methods
|
||||
|
||||
- Updated dependencies [[`af710f1b4`](https://github.com/medusajs/medusa/commit/af710f1b48a4545a5064029a557013af34c4c100), [`491566df6`](https://github.com/medusajs/medusa/commit/491566df6b7ced35f655f810961422945e10ecd0)]:
|
||||
- @medusajs/utils@1.8.2
|
||||
- @medusajs/modules-sdk@1.8.3
|
||||
|
||||
## 1.8.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @medusajs/modules-sdk@1.8.2
|
||||
|
||||
## 1.8.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3778](https://github.com/medusajs/medusa/pull/3778) [`654a54622`](https://github.com/medusajs/medusa/commit/654a54622303139e7180538bd686630ad9a46cfd) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Bump Typeorm
|
||||
|
||||
- Updated dependencies [[`654a54622`](https://github.com/medusajs/medusa/commit/654a54622303139e7180538bd686630ad9a46cfd), [`abdb74d99`](https://github.com/medusajs/medusa/commit/abdb74d997f49f994bff49787a396179982843b0)]:
|
||||
- @medusajs/utils@1.8.1
|
||||
- @medusajs/modules-sdk@1.8.1
|
||||
|
||||
## 1.8.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#3329](https://github.com/medusajs/medusa/pull/3329) [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Inventory and Stock location modules supporting isolated connection
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3041](https://github.com/medusajs/medusa/pull/3041) [`121b42acf`](https://github.com/medusajs/medusa/commit/121b42acfe98c12dd593f9b1f2072ff0f3b61724) Thanks [@riqwan](https://github.com/riqwan)! - chore(medusa): Typeorm fixes / enhancements
|
||||
|
||||
- upgrade typeorm from 0.2.51 to 0.3.11
|
||||
- Plugin repository loader to work with Typeorm update
|
||||
|
||||
- [#3685](https://github.com/medusajs/medusa/pull/3685) [`8ddb3952c`](https://github.com/medusajs/medusa/commit/8ddb3952c045e6c05c8d0f6922f0d4ba30cf3bd4) Thanks [@olivermrbl](https://github.com/olivermrbl)! - chore: Fix RC package versions
|
||||
|
||||
- [#3649](https://github.com/medusajs/medusa/pull/3649) [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Export initialize method for all modules
|
||||
|
||||
- [#3531](https://github.com/medusajs/medusa/pull/3531) [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Remove dependency on @medusajs/medusa from Inventory and Stock-Location Modules
|
||||
|
||||
- Updated dependencies [[`8ddb3952c`](https://github.com/medusajs/medusa/commit/8ddb3952c045e6c05c8d0f6922f0d4ba30cf3bd4), [`a0c919a8d`](https://github.com/medusajs/medusa/commit/a0c919a8d01ca5edf62336de48e9a112e3822f38), [`55e94d0b4`](https://github.com/medusajs/medusa/commit/55e94d0b45776776639d3970d4264b8f5c5385dd), [`74bc4b16a`](https://github.com/medusajs/medusa/commit/74bc4b16a07f78668003ca930bf2a0d928897ceb), [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b), [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73), [`bca1f80dd`](https://github.com/medusajs/medusa/commit/bca1f80dd501d878455e1ad4f5091cf20ef900ea), [`271844aed`](https://github.com/medusajs/medusa/commit/271844aedbe45c369e188b5d06458dbd6984cd39), [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def)]:
|
||||
- @medusajs/modules-sdk@1.8.0
|
||||
- @medusajs/utils@1.8.0
|
||||
|
||||
## 1.8.0-rc.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3649](https://github.com/medusajs/medusa/pull/3649) [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Export initialize method for all modules
|
||||
|
||||
- Updated dependencies [[`a0c919a8d`](https://github.com/medusajs/medusa/commit/a0c919a8d01ca5edf62336de48e9a112e3822f38), [`bd12a9508`](https://github.com/medusajs/medusa/commit/bd12a95083b69a70b83ad38578c5a68738c41b2b)]:
|
||||
- @medusajs/utils@0.0.2-rc.2
|
||||
- @medusajs/modules-sdk@0.1.0-rc.4
|
||||
|
||||
## 1.8.0-rc.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`55e94d0b4`](https://github.com/medusajs/medusa/commit/55e94d0b45776776639d3970d4264b8f5c5385dd)]:
|
||||
- @medusajs/modules-sdk@0.1.0-rc.3
|
||||
|
||||
## 1.8.0-rc.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- chore: Fix RC package versions
|
||||
|
||||
- Updated dependencies []:
|
||||
- @medusajs/modules-sdk@0.1.0-rc.2
|
||||
- @medusajs/utils@0.0.2-rc.1
|
||||
|
||||
## 1.8.0-rc.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#3329](https://github.com/medusajs/medusa/pull/3329) [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Inventory and Stock location modules supporting isolated connection
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3041](https://github.com/medusajs/medusa/pull/3041) [`121b42acf`](https://github.com/medusajs/medusa/commit/121b42acfe98c12dd593f9b1f2072ff0f3b61724) Thanks [@riqwan](https://github.com/riqwan)! - chore(medusa): Typeorm fixes / enhancements
|
||||
|
||||
- upgrade typeorm from 0.2.51 to 0.3.11
|
||||
- Plugin repository loader to work with Typeorm update
|
||||
|
||||
- [#3531](https://github.com/medusajs/medusa/pull/3531) [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Remove dependency on @medusajs/medusa from Inventory and Stock-Location Modules
|
||||
|
||||
- Updated dependencies [[`74bc4b16a`](https://github.com/medusajs/medusa/commit/74bc4b16a07f78668003ca930bf2a0d928897ceb), [`77d46220c`](https://github.com/medusajs/medusa/commit/77d46220c23bfe19e575cbc445874eb6c22f3c73), [`271844aed`](https://github.com/medusajs/medusa/commit/271844aedbe45c369e188b5d06458dbd6984cd39), [`4e9d257d3`](https://github.com/medusajs/medusa/commit/4e9d257d3bf76703ef5be8ca054cc9f0f7339def)]:
|
||||
- @medusajs/utils@0.0.2-rc.0
|
||||
- @medusajs/modules-sdk@0.1.0-rc.0
|
||||
|
||||
## 1.0.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`507ad00be`](https://github.com/medusajs/medusa/commit/507ad00bec74bb63b17eae8a4a3313eb6e0d2503), [`6e443dc70`](https://github.com/medusajs/medusa/commit/6e443dc708ffe20bf96d45ddc207ed274c28e344), [`eee928381`](https://github.com/medusajs/medusa/commit/eee9283818b1717f37f084c319201ea7144fdf8a), [`4cb44a3a2`](https://github.com/medusajs/medusa/commit/4cb44a3a2ec5bcf3d90e3b6a0e1f6bb9ff45e2b6), [`472f96d7f`](https://github.com/medusajs/medusa/commit/472f96d7fb8668a15df6e6f9ea31291891b3e688), [`61b0b2f3a`](https://github.com/medusajs/medusa/commit/61b0b2f3aa1d54d539b216a99032549485136a82), [`80452332d`](https://github.com/medusajs/medusa/commit/80452332d852ad7d33d74e1f08f12f45d7a35503), [`bbbb3d888`](https://github.com/medusajs/medusa/commit/bbbb3d888292391976355c88ecb0fcf8a7c115bc), [`10ff72c30`](https://github.com/medusajs/medusa/commit/10ff72c30ae59d2174d876b0c4141aad135d9a1c), [`968eb8fc6`](https://github.com/medusajs/medusa/commit/968eb8fc6b7ccd7221f88f42d75717f3a0547861), [`a59bd84e4`](https://github.com/medusajs/medusa/commit/a59bd84e41fb5d8fc2edc7bdc43d3cbf74d9d7dc), [`8c5219a31`](https://github.com/medusajs/medusa/commit/8c5219a31ef76ee571fbce84d7d57a63abe56eb0), [`cac13a88d`](https://github.com/medusajs/medusa/commit/cac13a88da42fa986bd7352fbc12a318b566d98f), [`a2cc084db`](https://github.com/medusajs/medusa/commit/a2cc084db817f8f7699e9b0daceda274b5f0e0c0), [`8194d19b0`](https://github.com/medusajs/medusa/commit/8194d19b0e933310fdc65af25300da5dd185e669)]:
|
||||
- @medusajs/medusa@1.7.7
|
||||
- medusa-interfaces@1.3.6
|
||||
|
||||
## 1.0.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3065](https://github.com/medusajs/medusa/pull/3065) [`2d525237b`](https://github.com/medusajs/medusa/commit/2d525237b682e89495b6cc8e3aa677bfad4d0726) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Fix (stock-location): stock location address required
|
||||
|
||||
- Updated dependencies [[`ce866475b`](https://github.com/medusajs/medusa/commit/ce866475b4b6c8b453638000f7b1df7a27daf45d), [`53532df8d`](https://github.com/medusajs/medusa/commit/53532df8d597ed5471c07296981b6959cba4ddc3), [`d8ffbe25b`](https://github.com/medusajs/medusa/commit/d8ffbe25b047fda0f644240c9f518f95e74f03cb), [`2d525237b`](https://github.com/medusajs/medusa/commit/2d525237b682e89495b6cc8e3aa677bfad4d0726), [`5b63533c7`](https://github.com/medusajs/medusa/commit/5b63533c77528cab31755cedab9e768f7461f373), [`09dc9c667`](https://github.com/medusajs/medusa/commit/09dc9c6677c0d64cf765b27290e707ea75edd4aa), [`4105405f2`](https://github.com/medusajs/medusa/commit/4105405f28c3f3e54a6077c95a575a268fb5569f), [`ee42b60a2`](https://github.com/medusajs/medusa/commit/ee42b60a20db2afc5e9b6b958502f9e86ec37d80), [`d0adaf57e`](https://github.com/medusajs/medusa/commit/d0adaf57ed1018f29bebf01e5cffde5f7192f89f), [`f65f590a2`](https://github.com/medusajs/medusa/commit/f65f590a2771d6e526d7dfc7ca721be74c8f79a9), [`5ec6d438f`](https://github.com/medusajs/medusa/commit/5ec6d438fb1f909be925461c788f3a3a958528e4), [`5c1d2a5e8`](https://github.com/medusajs/medusa/commit/5c1d2a5e83c3654ae468d17c900892c32ef76060), [`8e41c6996`](https://github.com/medusajs/medusa/commit/8e41c6996601142661bde877b9ee1d80b8325f5f), [`d50db84a3`](https://github.com/medusajs/medusa/commit/d50db84a336da2de9c06a59aa79f2a5e9aa558f1), [`82da3605f`](https://github.com/medusajs/medusa/commit/82da3605fb50cef182699900552109ad654f0df2), [`b242e2232`](https://github.com/medusajs/medusa/commit/b242e22326ce74d5437d0da6863f22facbb5964c), [`4339d47e1`](https://github.com/medusajs/medusa/commit/4339d47e1f6c9f6c8f100b3ac72c8a394b6dd44d), [`2e7e16b91`](https://github.com/medusajs/medusa/commit/2e7e16b9173e2779946776b9b07ce7232c683f36), [`9ebb50104`](https://github.com/medusajs/medusa/commit/9ebb50104cc1f6c8ef1cea446ae595fb2eb532a2), [`08324355a`](https://github.com/medusajs/medusa/commit/08324355a4466b017a0bc7ab1d333ee3cd27b8c4), [`e22a383f4`](https://github.com/medusajs/medusa/commit/e22a383f4738e8bc80394ccaba3ac9a4ae678955), [`dc156861d`](https://github.com/medusajs/medusa/commit/dc156861d413ecfe3fd264bcd5ad736d83d8a08e), [`8f4c84121`](https://github.com/medusajs/medusa/commit/8f4c84121bd9b8c7067d72f03125e13afe4d2571), [`bfa33f444`](https://github.com/medusajs/medusa/commit/bfa33f444cd225906149777c5c6e842685f3dd7c), [`f776ed234`](https://github.com/medusajs/medusa/commit/f776ed234fcfccf23041ffebecbae6c9a8b7e922), [`4d6e63d68`](https://github.com/medusajs/medusa/commit/4d6e63d68f4e64c365ecbba133876d95e6528763), [`fcba70570`](https://github.com/medusajs/medusa/commit/fcba705701b8013183fafb39e8dda4a85718080a), [`4f0d8992a`](https://github.com/medusajs/medusa/commit/4f0d8992a091a05e93dd5be3762dfa47f074610e), [`d25a53104`](https://github.com/medusajs/medusa/commit/d25a531045143d3be68d3cd3b5764bbbc792ee3a), [`86c87c7b1`](https://github.com/medusajs/medusa/commit/86c87c7b1020ab6bb02f931e1ee113f2857cf527), [`78650ea66`](https://github.com/medusajs/medusa/commit/78650ea66517b0a77100228615d8122f84ad235b), [`b9bda3bf4`](https://github.com/medusajs/medusa/commit/b9bda3bf4e0f95675041085cea5008268c37edd5), [`e581d3bd9`](https://github.com/medusajs/medusa/commit/e581d3bd90f9bc40105e7eaf34e0c94d4f657f7a), [`4d3210bfb`](https://github.com/medusajs/medusa/commit/4d3210bfbb84877d951f7319d2e87c1acbdd6aad)]:
|
||||
- @medusajs/medusa@1.7.6
|
||||
- medusa-interfaces@1.3.5
|
||||
|
||||
## 1.0.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2997](https://github.com/medusajs/medusa/pull/2997) [`9dbccd9ca`](https://github.com/medusajs/medusa/commit/9dbccd9ca78b8b66f9a21947bb863622e7ff326b) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - feat(medusa, stock-location, inventory): Allow modules to integrate with core
|
||||
|
||||
- [#3033](https://github.com/medusajs/medusa/pull/3033) [`1547dd814`](https://github.com/medusajs/medusa/commit/1547dd8143889fc30045fc3d0241de8e69acb76e) Thanks [@olivermrbl](https://github.com/olivermrbl)! - fix(medusa): Add module options to transaction base service to use in modules
|
||||
|
||||
- Updated dependencies [[`9dbccd9ca`](https://github.com/medusajs/medusa/commit/9dbccd9ca78b8b66f9a21947bb863622e7ff326b), [`542daeead`](https://github.com/medusajs/medusa/commit/542daeeadd78d939f5144c690e8907374da6d085), [`8c08d0031`](https://github.com/medusajs/medusa/commit/8c08d003198b94c00f8428a51c0e79d2ca9d1dc7), [`017538883`](https://github.com/medusajs/medusa/commit/017538883588792e1ff37abcab0fd2872c9af932), [`b2839e2e4`](https://github.com/medusajs/medusa/commit/b2839e2e4dc0d9344fa2ac8d4d16b796def4c56d), [`76d175231`](https://github.com/medusajs/medusa/commit/76d17523105d3860028a90a45b6038a64040e5ce), [`9e3beaf53`](https://github.com/medusajs/medusa/commit/9e3beaf5319dc785cf84b856cfcc8193df90c3a4), [`7d4b8b9cc`](https://github.com/medusajs/medusa/commit/7d4b8b9cc59672d01cdf0c6f331bc3d1eeec9bee), [`aab163bab`](https://github.com/medusajs/medusa/commit/aab163babb91759a05b852d34c299cdfac96d800), [`a0c4cfe0f`](https://github.com/medusajs/medusa/commit/a0c4cfe0f74cf30c45956c32c2fb22bf833bea68), [`27a29ef24`](https://github.com/medusajs/medusa/commit/27a29ef24e5ea1ba2bc0be8ecb7dd747d4c7c65b), [`aef842123`](https://github.com/medusajs/medusa/commit/aef8421235d8fff68d7d4f8b73f77484073311a5), [`1dc79590b`](https://github.com/medusajs/medusa/commit/1dc79590b3539af09dbc8fbf931d9b5ee225fb0d), [`9c4647383`](https://github.com/medusajs/medusa/commit/9c4647383ebf0a183ccc566636bcf7af06409060), [`a0c4cfe0f`](https://github.com/medusajs/medusa/commit/a0c4cfe0f74cf30c45956c32c2fb22bf833bea68), [`b80124d32`](https://github.com/medusajs/medusa/commit/b80124d32d950790c2a01b49e8c34d562b1d57f4), [`cb1ec0076`](https://github.com/medusajs/medusa/commit/cb1ec0076b4fd932c686d6027e8b060ceded3a64), [`142c8aa70`](https://github.com/medusajs/medusa/commit/142c8aa70f583d9b11a6add2b8f988e9ba4cf979), [`1547dd814`](https://github.com/medusajs/medusa/commit/1547dd8143889fc30045fc3d0241de8e69acb76e), [`d2c692aa9`](https://github.com/medusajs/medusa/commit/d2c692aa96ea89c053f9a694a9ae6dba77e89b14), [`150696de9`](https://github.com/medusajs/medusa/commit/150696de99fc852c5d72a746f168b6f62b2086ed), [`93d0dc1bd`](https://github.com/medusajs/medusa/commit/93d0dc1bdcb54cf6e87428a7bb9b0dac196b4de2), [`b3e4be720`](https://github.com/medusajs/medusa/commit/b3e4be72087d0b528c3cce322edf9325b855c8ae)]:
|
||||
- @medusajs/medusa@1.7.4
|
||||
- medusa-interfaces@1.3.4
|
||||
|
||||
## 1.0.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2907](https://github.com/medusajs/medusa/pull/2907) [`c07ffb616`](https://github.com/medusajs/medusa/commit/c07ffb61658b0cdbff00461d1fa267c6be2d1967) Thanks [@carlos-r-l-rodrigues](https://github.com/carlos-r-l-rodrigues)! - Stock locations module added
|
||||
|
||||
- Updated dependencies [[`1817b810f`](https://github.com/medusajs/medusa/commit/1817b810fc8563a08119b74b86ec0587d9e443a1), [`28bec599a`](https://github.com/medusajs/medusa/commit/28bec599ae34d29b626b1dc36f762fc0b2fe8f17), [`3f44abe01`](https://github.com/medusajs/medusa/commit/3f44abe01a7807adf0e807811d4bc52b713cd6b5), [`8ed4eab73`](https://github.com/medusajs/medusa/commit/8ed4eab73a2b067e19da5a1c8498cbff7125ea8d), [`645e0d0ec`](https://github.com/medusajs/medusa/commit/645e0d0ec5e2e49048887c62db662427c8a39cdf), [`47d075351`](https://github.com/medusajs/medusa/commit/47d075351fa4fdeaf32d48f2bd7e72943a293d9b), [`32b038fc3`](https://github.com/medusajs/medusa/commit/32b038fc3fb5f8fab09a7d23f881847c7ae02c0c), [`3d200c41f`](https://github.com/medusajs/medusa/commit/3d200c41f953c3c979a1586f6425a2fbdf159e7e), [`16716f5a4`](https://github.com/medusajs/medusa/commit/16716f5a4f94cb6bc1dcea278d1789da760f2767), [`71fa60892`](https://github.com/medusajs/medusa/commit/71fa60892cd7c00dd9cb8c222a1794ad6577fc1b), [`cc10c20f3`](https://github.com/medusajs/medusa/commit/cc10c20f356d4fe98336d879f8c9523bb63e9e48), [`eda26f6e8`](https://github.com/medusajs/medusa/commit/eda26f6e818a56672cdcce1d794c307c5490f956), [`077e4d960`](https://github.com/medusajs/medusa/commit/077e4d960687a909fd254cd69f4dd5b3e0bad204), [`f3ced106a`](https://github.com/medusajs/medusa/commit/f3ced106ad24fe21f099e10bee5666e1f65a9fc7), [`baeacd1cc`](https://github.com/medusajs/medusa/commit/baeacd1cc52c548eef6896fd83e606c858cf2165), [`e4af96853`](https://github.com/medusajs/medusa/commit/e4af9685313077ece7e3fb7bd27053108cd9d5f8), [`cac81749e`](https://github.com/medusajs/medusa/commit/cac81749eaa06b3b00ac5494591c96a0fcd7bf57), [`4a50786fb`](https://github.com/medusajs/medusa/commit/4a50786fbc78b36147f1f45d77c55dc0a582caba), [`c07ffb616`](https://github.com/medusajs/medusa/commit/c07ffb61658b0cdbff00461d1fa267c6be2d1967), [`8ba0addea`](https://github.com/medusajs/medusa/commit/8ba0addea3997c27efe4a50733b02a31e02f55e5), [`b9680b641`](https://github.com/medusajs/medusa/commit/b9680b641f2984eddbc1f49a37c050499fbaff69)]:
|
||||
- @medusajs/medusa@1.7.3
|
||||
@@ -1,13 +0,0 @@
|
||||
module.exports = {
|
||||
transform: {
|
||||
"^.+\\.[jt]s?$": [
|
||||
"ts-jest",
|
||||
{
|
||||
tsconfig: "tsconfig.spec.json",
|
||||
isolatedModules: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
testEnvironment: `node`,
|
||||
moduleFileExtensions: [`js`, `ts`],
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"name": "@medusajs/stock-location",
|
||||
"version": "1.11.5",
|
||||
"description": "Stock Location Module for Medusa",
|
||||
"main": "dist/index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/medusajs/medusa",
|
||||
"directory": "packages/stock-location"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"author": "Medusa",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@medusajs/types": "^1.11.12",
|
||||
"cross-env": "^5.2.1",
|
||||
"jest": "^29.6.3",
|
||||
"rimraf": "^5.0.1",
|
||||
"ts-jest": "^29.1.1",
|
||||
"typescript": "^5.1.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"@medusajs/modules-sdk": "^1.12.8",
|
||||
"@medusajs/utils": "^1.11.5",
|
||||
"awilix": "^8.0.0",
|
||||
"typeorm": "^0.3.16"
|
||||
},
|
||||
"scripts": {
|
||||
"watch": "tsc --build --watch",
|
||||
"prepublishOnly": "cross-env NODE_ENV=production tsc --build",
|
||||
"build": "rimraf dist && tsc --build",
|
||||
"test": "jest --passWithNoTests"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import { moduleDefinition } from "./module-definition"
|
||||
|
||||
export default moduleDefinition
|
||||
export * from "./initialize"
|
||||
export { revertMigration, runMigrations } from "./migrations/run-migration"
|
||||
export * from "./types"
|
||||
@@ -1,30 +0,0 @@
|
||||
import {
|
||||
ExternalModuleDeclaration,
|
||||
InternalModuleDeclaration,
|
||||
MedusaModule,
|
||||
MODULE_PACKAGE_NAMES,
|
||||
Modules,
|
||||
} from "@medusajs/modules-sdk"
|
||||
import { IEventBusService, IStockLocationService } from "@medusajs/types"
|
||||
import { moduleDefinition } from "../module-definition"
|
||||
import { StockLocationServiceInitializeOptions } from "../types"
|
||||
|
||||
export const initialize = async (
|
||||
options: StockLocationServiceInitializeOptions | ExternalModuleDeclaration,
|
||||
injectedDependencies?: {
|
||||
eventBusService: IEventBusService
|
||||
}
|
||||
): Promise<IStockLocationService> => {
|
||||
const serviceKey = Modules.STOCK_LOCATION
|
||||
const loaded = await MedusaModule.bootstrap<IStockLocationService>({
|
||||
moduleKey: serviceKey,
|
||||
defaultPath: MODULE_PACKAGE_NAMES[Modules.STOCK_LOCATION],
|
||||
declaration: options as
|
||||
| InternalModuleDeclaration
|
||||
| ExternalModuleDeclaration,
|
||||
injectedDependencies,
|
||||
moduleExports: moduleDefinition,
|
||||
})
|
||||
|
||||
return loaded[serviceKey]
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
import { ModuleJoinerConfig } from "@medusajs/types"
|
||||
import { Modules } from "@medusajs/modules-sdk"
|
||||
import { StockLocation } from "./models"
|
||||
import moduleSchema from "./schema"
|
||||
|
||||
export const joinerConfig: ModuleJoinerConfig = {
|
||||
serviceName: Modules.STOCK_LOCATION,
|
||||
primaryKeys: ["id"],
|
||||
linkableKeys: {
|
||||
stock_location_id: StockLocation.name,
|
||||
location_id: StockLocation.name,
|
||||
},
|
||||
schema: moduleSchema,
|
||||
alias: [
|
||||
{
|
||||
name: ["stock_location", "stock_locations"],
|
||||
args: {
|
||||
entity: "StockLocation",
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
import {
|
||||
InternalModuleDeclaration,
|
||||
LoaderOptions,
|
||||
MODULE_RESOURCE_TYPE,
|
||||
MODULE_SCOPE,
|
||||
} from "@medusajs/modules-sdk"
|
||||
import { MedusaError } from "@medusajs/utils"
|
||||
import { asValue } from "awilix"
|
||||
import { DataSource, DataSourceOptions } from "typeorm"
|
||||
import * as StockLocationModels from "../models"
|
||||
import { StockLocationServiceInitializeOptions } from "../types"
|
||||
|
||||
export default async (
|
||||
{ options, container }: LoaderOptions,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
): Promise<void> => {
|
||||
if (
|
||||
moduleDeclaration?.scope === MODULE_SCOPE.INTERNAL &&
|
||||
moduleDeclaration.resources === MODULE_RESOURCE_TYPE.SHARED
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
const dbData =
|
||||
options?.database as StockLocationServiceInitializeOptions["database"]
|
||||
|
||||
if (!dbData) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_ARGUMENT,
|
||||
`Database config is not present at module config "options.database"`
|
||||
)
|
||||
}
|
||||
|
||||
const entities = Object.values(StockLocationModels)
|
||||
const dataSource = new DataSource({
|
||||
type: dbData.type,
|
||||
url: dbData.url,
|
||||
database: dbData.database,
|
||||
extra: dbData.extra || {},
|
||||
schema: dbData.schema,
|
||||
entities,
|
||||
logging: dbData.logging,
|
||||
} as DataSourceOptions)
|
||||
|
||||
await dataSource.initialize()
|
||||
|
||||
container.register({
|
||||
manager: asValue(dataSource.manager),
|
||||
})
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
import * as setup from "./schema-migrations/1665749860179-setup"
|
||||
|
||||
export default [setup]
|
||||
@@ -1,65 +0,0 @@
|
||||
import { InternalModuleDeclaration, LoaderOptions } from "@medusajs/modules-sdk"
|
||||
import { DataSource, DataSourceOptions } from "typeorm"
|
||||
import { StockLocationServiceInitializeOptions } from "../types"
|
||||
|
||||
import migrations from "./index"
|
||||
|
||||
function getDataSource(
|
||||
dbData: StockLocationServiceInitializeOptions["database"]
|
||||
): DataSource {
|
||||
return new DataSource({
|
||||
type: dbData!.type,
|
||||
url: dbData!.url,
|
||||
database: dbData!.database,
|
||||
extra: dbData!.extra || {},
|
||||
migrations: migrations
|
||||
.map((migration: any): Function[] => {
|
||||
return Object.values(migration).filter(
|
||||
(fn) => typeof fn === "function"
|
||||
) as Function[]
|
||||
})
|
||||
.flat(),
|
||||
schema: dbData!.schema,
|
||||
logging: dbData!.logging,
|
||||
} as DataSourceOptions)
|
||||
}
|
||||
|
||||
export async function runMigrations(
|
||||
{ options, logger }: Omit<LoaderOptions, "container">,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
) {
|
||||
const dbData =
|
||||
options?.database as StockLocationServiceInitializeOptions["database"]
|
||||
|
||||
try {
|
||||
const dataSource = getDataSource(dbData)
|
||||
await dataSource.initialize()
|
||||
await dataSource.runMigrations()
|
||||
|
||||
logger?.info("Stock Location module migration executed")
|
||||
} catch (error) {
|
||||
logger?.error(
|
||||
`Stock Location module migration failed to run - Error: ${error}`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export async function revertMigration(
|
||||
{ options, logger }: Omit<LoaderOptions, "container">,
|
||||
moduleDeclaration?: InternalModuleDeclaration
|
||||
) {
|
||||
const dbData =
|
||||
options?.database as StockLocationServiceInitializeOptions["database"]
|
||||
|
||||
try {
|
||||
const dataSource = getDataSource(dbData)
|
||||
await dataSource.initialize()
|
||||
await dataSource.undoLastMigration()
|
||||
|
||||
logger?.info("Stock Location module migration reverted")
|
||||
} catch (error) {
|
||||
logger?.error(
|
||||
`Stock Location module migration failed to revert - Error: ${error}`
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
|
||||
export class setup1665749860179 implements MigrationInterface {
|
||||
name = "setup1665749860179"
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
CREATE TABLE "stock_location_address"
|
||||
(
|
||||
"id" CHARACTER VARYING NOT NULL,
|
||||
"created_at" TIMESTAMP WITH TIME zone NOT NULL DEFAULT Now(),
|
||||
"updated_at" TIMESTAMP WITH TIME zone NOT NULL DEFAULT Now(),
|
||||
"deleted_at" TIMESTAMP WITH TIME zone,
|
||||
"address_1" TEXT NOT NULL,
|
||||
"address_2" TEXT,
|
||||
"company" TEXT,
|
||||
"city" TEXT,
|
||||
"country_code" TEXT NOT NULL,
|
||||
"phone" TEXT,
|
||||
"province" TEXT,
|
||||
"postal_code" TEXT,
|
||||
"metadata" JSONB,
|
||||
CONSTRAINT "PK_b79bc27285bede680501b7b81a5" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX "IDX_stock_location_address_country_code" ON "stock_location_address" ("country_code");
|
||||
|
||||
CREATE TABLE "stock_location"
|
||||
(
|
||||
"id" CHARACTER VARYING NOT NULL,
|
||||
"created_at" TIMESTAMP WITH time zone NOT NULL DEFAULT Now(),
|
||||
"updated_at" TIMESTAMP WITH time zone NOT NULL DEFAULT Now(),
|
||||
"deleted_at" TIMESTAMP WITH time zone,
|
||||
"name" TEXT NOT NULL,
|
||||
"address_id" TEXT,
|
||||
"metadata" JSONB,
|
||||
CONSTRAINT "PK_adf770067d0df1421f525fa25cc" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX "IDX_stock_location_address_id" ON "stock_location" ("address_id") WHERE deleted_at IS NOT NULL;
|
||||
`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
DROP INDEX "IDX_stock_location_address_id";
|
||||
DROP TABLE "stock_location";
|
||||
|
||||
DROP INDEX "IDX_stock_location_address_country_code";
|
||||
DROP TABLE "stock_location_address";
|
||||
`)
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
export * from "./stock-location"
|
||||
export * from "./stock-location-address"
|
||||
@@ -1,65 +0,0 @@
|
||||
import { Searchable, generateEntityId } from "@medusajs/utils"
|
||||
import {
|
||||
BeforeInsert,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
DeleteDateColumn,
|
||||
Entity,
|
||||
Index,
|
||||
PrimaryColumn,
|
||||
UpdateDateColumn,
|
||||
} from "typeorm"
|
||||
|
||||
@Entity()
|
||||
export class StockLocationAddress {
|
||||
@PrimaryColumn()
|
||||
id: string
|
||||
|
||||
@CreateDateColumn({ type: "timestamptz" })
|
||||
created_at: Date
|
||||
|
||||
@UpdateDateColumn({ type: "timestamptz" })
|
||||
updated_at: Date
|
||||
|
||||
@DeleteDateColumn({ type: "timestamptz" })
|
||||
deleted_at: Date | null
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text" })
|
||||
address_1: string
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text", nullable: true })
|
||||
address_2: string | null
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text", nullable: true })
|
||||
company: string | null
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text", nullable: true })
|
||||
city: string | null
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text" })
|
||||
country_code: string
|
||||
|
||||
@Column({ type: "text", nullable: true })
|
||||
phone: string | null
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text", nullable: true })
|
||||
province: string | null
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text", nullable: true })
|
||||
postal_code: string | null
|
||||
|
||||
@Column({ type: "jsonb", nullable: true })
|
||||
metadata: Record<string, unknown> | null
|
||||
|
||||
@BeforeInsert()
|
||||
private beforeInsert(): void {
|
||||
this.id = generateEntityId(this.id, "laddr")
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
import { Searchable, generateEntityId } from "@medusajs/utils"
|
||||
import {
|
||||
BeforeInsert,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
DeleteDateColumn,
|
||||
Entity,
|
||||
Index,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
PrimaryColumn,
|
||||
UpdateDateColumn,
|
||||
} from "typeorm"
|
||||
import { StockLocationAddress } from "./stock-location-address"
|
||||
|
||||
@Entity()
|
||||
export class StockLocation {
|
||||
@PrimaryColumn()
|
||||
id: string
|
||||
|
||||
@CreateDateColumn({ type: "timestamptz" })
|
||||
created_at: Date
|
||||
|
||||
@UpdateDateColumn({ type: "timestamptz" })
|
||||
updated_at: Date
|
||||
|
||||
@DeleteDateColumn({ type: "timestamptz" })
|
||||
deleted_at: Date | null
|
||||
|
||||
@Searchable()
|
||||
@Column({ type: "text" })
|
||||
name: string
|
||||
|
||||
@Index()
|
||||
@Column({ type: "text", nullable: true })
|
||||
address_id: string | null
|
||||
|
||||
@Searchable()
|
||||
@ManyToOne(() => StockLocationAddress)
|
||||
@JoinColumn({ name: "address_id" })
|
||||
address: StockLocationAddress | null
|
||||
|
||||
@Column({ type: "jsonb", nullable: true })
|
||||
metadata: Record<string, unknown> | null
|
||||
|
||||
@BeforeInsert()
|
||||
private beforeInsert(): void {
|
||||
this.id = generateEntityId(this.id, "sloc")
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
import { ModuleExports } from "@medusajs/types"
|
||||
import loadConnection from "./loaders/connection"
|
||||
import migrations from "./migrations"
|
||||
import { revertMigration, runMigrations } from "./migrations/run-migration"
|
||||
import * as StockLocationModels from "./models"
|
||||
import StockLocationService from "./services/stock-location"
|
||||
|
||||
const service = StockLocationService
|
||||
const loaders = [loadConnection]
|
||||
const models = Object.values(StockLocationModels)
|
||||
|
||||
export const moduleDefinition: ModuleExports = {
|
||||
service,
|
||||
migrations,
|
||||
loaders,
|
||||
models,
|
||||
runMigrations,
|
||||
revertMigration,
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
export default `
|
||||
scalar DateTime
|
||||
scalar JSON
|
||||
type StockLocation {
|
||||
id: ID!
|
||||
created_at: DateTime!
|
||||
updated_at: DateTime!
|
||||
deleted_at: DateTime
|
||||
name: String!
|
||||
address_id: String
|
||||
address: StockLocationAddress
|
||||
metadata: JSON
|
||||
}
|
||||
type StockLocationAddress {
|
||||
id: ID!
|
||||
created_at: DateTime!
|
||||
updated_at: DateTime!
|
||||
deleted_at: DateTime
|
||||
address_1: String!
|
||||
address_2: String
|
||||
company: String
|
||||
city: String
|
||||
country_code: String!
|
||||
phone: String
|
||||
province: String
|
||||
postal_code: String
|
||||
metadata: JSON
|
||||
}
|
||||
`
|
||||
@@ -1 +0,0 @@
|
||||
export { default as StockLocationService } from "./stock-location"
|
||||
@@ -1,313 +0,0 @@
|
||||
import { InternalModuleDeclaration } from "@medusajs/modules-sdk"
|
||||
import {
|
||||
CreateStockLocationInput,
|
||||
FilterableStockLocationProps,
|
||||
FindConfig,
|
||||
IEventBusService,
|
||||
MODULE_RESOURCE_TYPE,
|
||||
ModuleJoinerConfig,
|
||||
SharedContext,
|
||||
StockLocationAddressInput,
|
||||
UpdateStockLocationInput,
|
||||
} from "@medusajs/types"
|
||||
import {
|
||||
InjectEntityManager,
|
||||
isDefined,
|
||||
MedusaContext,
|
||||
MedusaError,
|
||||
setMetadata,
|
||||
} from "@medusajs/utils"
|
||||
import { EntityManager, FindOptionsWhere, ILike } from "typeorm"
|
||||
import { joinerConfig } from "../joiner-config"
|
||||
import { StockLocation, StockLocationAddress } from "../models"
|
||||
import { buildQuery } from "../utils/build-query"
|
||||
|
||||
type InjectedDependencies = {
|
||||
manager: EntityManager
|
||||
eventBusService: IEventBusService
|
||||
}
|
||||
|
||||
/**
|
||||
* Service for managing stock locations.
|
||||
*/
|
||||
|
||||
export default class StockLocationService {
|
||||
static Events = {
|
||||
CREATED: "stock-location.created",
|
||||
UPDATED: "stock-location.updated",
|
||||
DELETED: "stock-location.deleted",
|
||||
}
|
||||
|
||||
protected readonly manager_: EntityManager
|
||||
protected readonly eventBusService_: IEventBusService
|
||||
|
||||
constructor(
|
||||
{ eventBusService, manager }: InjectedDependencies,
|
||||
options?: unknown,
|
||||
protected readonly moduleDeclaration?: InternalModuleDeclaration
|
||||
) {
|
||||
this.manager_ = manager
|
||||
this.eventBusService_ = eventBusService
|
||||
}
|
||||
|
||||
__joinerConfig(): ModuleJoinerConfig {
|
||||
return joinerConfig
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all stock locations that match the given selector.
|
||||
* @param selector - Properties to filter by.
|
||||
* @param config - Additional configuration for the query.
|
||||
* @param context
|
||||
* @return A list of stock locations.
|
||||
*/
|
||||
async list(
|
||||
selector: FilterableStockLocationProps = {},
|
||||
config: FindConfig<StockLocation> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<StockLocation[]> {
|
||||
const [locations] = await this.listAndCount(selector, config, context)
|
||||
return locations
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all stock locations that match the given selector and returns the count of matching stock locations.
|
||||
* @param selector - Properties to filter by.
|
||||
* @param config - Additional configuration for the query.
|
||||
* @param context
|
||||
* @return A list of stock locations and the count of matching stock locations.
|
||||
*/
|
||||
async listAndCount(
|
||||
selector: FilterableStockLocationProps = {},
|
||||
config: FindConfig<StockLocation> = { relations: [], skip: 0, take: 10 },
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<[StockLocation[], number]> {
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const locationRepo = manager.getRepository(StockLocation)
|
||||
let q
|
||||
if (selector.q) {
|
||||
q = selector.q
|
||||
delete selector.q
|
||||
}
|
||||
|
||||
const query = buildQuery(selector, config)
|
||||
|
||||
if (q) {
|
||||
const where = query.where as FindOptionsWhere<StockLocation>
|
||||
|
||||
delete where.name
|
||||
|
||||
query.where = [
|
||||
{
|
||||
...where,
|
||||
name: ILike(`%${q}%`),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
return await locationRepo.findAndCount(query)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a Stock Location by its ID.
|
||||
* @param stockLocationId - The ID of the stock location.
|
||||
* @param config - Additional configuration for the query.
|
||||
* @param context
|
||||
* @return The stock location.
|
||||
* @throws If the stock location ID is not definedor the stock location with the given ID was not found.
|
||||
*/
|
||||
async retrieve(
|
||||
stockLocationId: string,
|
||||
config: FindConfig<StockLocation> = {},
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<StockLocation> {
|
||||
if (!isDefined(stockLocationId)) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`"stockLocationId" must be defined`
|
||||
)
|
||||
}
|
||||
|
||||
const manager = context.transactionManager ?? this.manager_
|
||||
const locationRepo = manager.getRepository(StockLocation)
|
||||
|
||||
const query = buildQuery({ id: stockLocationId }, config)
|
||||
const [loc] = await locationRepo.find(query)
|
||||
|
||||
if (!loc) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`StockLocation with id ${stockLocationId} was not found`
|
||||
)
|
||||
}
|
||||
|
||||
return loc
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new stock location.
|
||||
* @param data - The input data for creating a Stock Location.
|
||||
* @param context
|
||||
* @returns The created stock location.
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async create(
|
||||
data: CreateStockLocationInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<StockLocation> {
|
||||
const manager = context.transactionManager!
|
||||
|
||||
const locationRepo = manager.getRepository(StockLocation)
|
||||
|
||||
const loc = locationRepo.create({
|
||||
name: data.name,
|
||||
})
|
||||
|
||||
if (isDefined(data.address) || isDefined(data.address_id)) {
|
||||
if (typeof data.address === "string" || data.address_id) {
|
||||
const addrId = (data.address ?? data.address_id) as string
|
||||
loc.address_id = addrId
|
||||
} else {
|
||||
const locAddressRepo = manager.getRepository(StockLocationAddress)
|
||||
const locAddress = locAddressRepo.create(data.address!)
|
||||
const addressResult = await locAddressRepo.save(locAddress)
|
||||
loc.address_id = addressResult.id
|
||||
}
|
||||
}
|
||||
|
||||
const { metadata } = data
|
||||
if (metadata) {
|
||||
loc.metadata = setMetadata(loc, metadata)
|
||||
}
|
||||
const result = await locationRepo.save(loc)
|
||||
|
||||
await this.eventBusService_?.emit?.(StockLocationService.Events.CREATED, {
|
||||
id: result.id,
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an existing stock location.
|
||||
* @param stockLocationId - The ID of the stock location to update.
|
||||
* @param updateData - The update data for the stock location.
|
||||
* @param context
|
||||
* @returns The updated stock location.
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async update(
|
||||
stockLocationId: string,
|
||||
updateData: UpdateStockLocationInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<StockLocation> {
|
||||
const manager = context.transactionManager!
|
||||
const locationRepo = manager.getRepository(StockLocation)
|
||||
|
||||
const item = await this.retrieve(stockLocationId, undefined, context)
|
||||
|
||||
const { address, ...data } = updateData
|
||||
|
||||
if (address) {
|
||||
if (item.address_id) {
|
||||
await this.updateAddress(item.address_id, address, context)
|
||||
} else {
|
||||
const locAddressRepo = manager.getRepository(StockLocationAddress)
|
||||
const locAddress = locAddressRepo.create(address)
|
||||
const addressResult = await locAddressRepo.save(locAddress)
|
||||
data.address_id = addressResult.id
|
||||
}
|
||||
}
|
||||
|
||||
const { metadata, ...fields } = data
|
||||
|
||||
const toSave = locationRepo.merge(item, fields)
|
||||
if (metadata) {
|
||||
toSave.metadata = setMetadata(toSave, metadata)
|
||||
}
|
||||
|
||||
await locationRepo.save(toSave)
|
||||
|
||||
await this.eventBusService_?.emit?.(StockLocationService.Events.UPDATED, {
|
||||
id: stockLocationId,
|
||||
})
|
||||
|
||||
return item
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an address for a Stock Location.
|
||||
* @param addressId - The ID of the address to update.
|
||||
* @param address - The update data for the address.
|
||||
* @param context
|
||||
* @returns The updated stock location address.
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
protected async updateAddress(
|
||||
addressId: string,
|
||||
address: StockLocationAddressInput,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<StockLocationAddress> {
|
||||
if (!isDefined(addressId)) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`"addressId" must be defined`
|
||||
)
|
||||
}
|
||||
|
||||
const manager = context.transactionManager!
|
||||
const locationAddressRepo = manager.getRepository(StockLocationAddress)
|
||||
|
||||
const existingAddress = await locationAddressRepo.findOne({
|
||||
where: { id: addressId },
|
||||
})
|
||||
if (!existingAddress) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`StockLocation address with id ${addressId} was not found`
|
||||
)
|
||||
}
|
||||
|
||||
const { metadata, ...fields } = address
|
||||
|
||||
const toSave = locationAddressRepo.merge(existingAddress, fields)
|
||||
if (metadata) {
|
||||
toSave.metadata = setMetadata(toSave, metadata)
|
||||
}
|
||||
|
||||
return await locationAddressRepo.save(toSave)
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a Stock Location.
|
||||
* @param id - The ID of the stock location to delete.
|
||||
* @param context
|
||||
* @returns An empty promise.
|
||||
*/
|
||||
@InjectEntityManager(
|
||||
(target) =>
|
||||
target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED
|
||||
)
|
||||
async delete(
|
||||
id: string,
|
||||
@MedusaContext() context: SharedContext = {}
|
||||
): Promise<void> {
|
||||
const manager = context.transactionManager!
|
||||
const locationRepo = manager.getRepository(StockLocation)
|
||||
|
||||
await locationRepo.softRemove({ id })
|
||||
|
||||
await this.eventBusService_?.emit?.(StockLocationService.Events.DELETED, {
|
||||
id,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import { DatabaseType } from "typeorm"
|
||||
|
||||
export type StockLocationServiceInitializeOptions = {
|
||||
database?: {
|
||||
type?: DatabaseType | string
|
||||
url?: string
|
||||
database?: string
|
||||
extra?: Record<string, any>
|
||||
schema?: string
|
||||
logging?: boolean
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
import { ExtendedFindConfig, FindConfig } from "@medusajs/types"
|
||||
import {
|
||||
And,
|
||||
FindManyOptions,
|
||||
FindOperator,
|
||||
FindOptionsOrder,
|
||||
FindOptionsRelations,
|
||||
FindOptionsSelect,
|
||||
FindOptionsWhere,
|
||||
ILike,
|
||||
In,
|
||||
IsNull,
|
||||
LessThan,
|
||||
LessThanOrEqual,
|
||||
MoreThan,
|
||||
MoreThanOrEqual,
|
||||
} from "typeorm"
|
||||
import { buildOrder, buildRelations, buildSelects } from "@medusajs/utils"
|
||||
|
||||
const operatorsMap = {
|
||||
lt: (value) => LessThan(value),
|
||||
gt: (value) => MoreThan(value),
|
||||
lte: (value) => LessThanOrEqual(value),
|
||||
gte: (value) => MoreThanOrEqual(value),
|
||||
contains: (value) => ILike(`%${value}%`),
|
||||
starts_with: (value) => ILike(`${value}%`),
|
||||
ends_with: (value) => ILike(`%${value}`),
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to build TypeORM queries.
|
||||
* @param selector The selector
|
||||
* @param config The config
|
||||
* @return The QueryBuilderConfig
|
||||
*/
|
||||
export function buildQuery<TWhereKeys extends object, TEntity = unknown>(
|
||||
selector: TWhereKeys,
|
||||
config: FindConfig<TEntity> = {}
|
||||
) {
|
||||
const query: ExtendedFindConfig<TEntity> = {
|
||||
where: buildWhere<TWhereKeys, TEntity>(selector),
|
||||
}
|
||||
|
||||
if ("deleted_at" in selector) {
|
||||
query.withDeleted = true
|
||||
}
|
||||
|
||||
if ("skip" in config) {
|
||||
;(query as FindManyOptions<TEntity>).skip = config.skip ?? undefined
|
||||
}
|
||||
|
||||
if ("take" in config) {
|
||||
;(query as FindManyOptions<TEntity>).take = config.take ?? undefined
|
||||
}
|
||||
|
||||
if (config.relations) {
|
||||
query.relations = buildRelations(
|
||||
config.relations
|
||||
) as FindOptionsRelations<TEntity>
|
||||
}
|
||||
|
||||
if (config.select) {
|
||||
query.select = buildSelects(
|
||||
config.select as string[]
|
||||
) as FindOptionsSelect<TEntity>
|
||||
}
|
||||
|
||||
if (config.order) {
|
||||
query.order = buildOrder(config.order) as FindOptionsOrder<TEntity>
|
||||
}
|
||||
|
||||
return query
|
||||
}
|
||||
|
||||
/**
|
||||
* @param constraints
|
||||
*
|
||||
* @example
|
||||
* const q = buildWhere(
|
||||
* {
|
||||
* id: "1234",
|
||||
* test1: ["123", "12", "1"],
|
||||
* test2: Not("this"),
|
||||
* date: { gt: date },
|
||||
* amount: { gt: 10 },
|
||||
* },
|
||||
*)
|
||||
*
|
||||
* // Output
|
||||
* {
|
||||
* id: "1234",
|
||||
* test1: In(["123", "12", "1"]),
|
||||
* test2: Not("this"),
|
||||
* date: MoreThan(date),
|
||||
* amount: MoreThan(10)
|
||||
* }
|
||||
*/
|
||||
function buildWhere<TWhereKeys extends object, TEntity>(
|
||||
constraints: TWhereKeys
|
||||
): FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[] {
|
||||
let where: FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[] = {}
|
||||
|
||||
if (Array.isArray(constraints)) {
|
||||
where = []
|
||||
constraints.forEach((constraint) => {
|
||||
;(where as FindOptionsWhere<TEntity>[]).push(
|
||||
buildWhere(constraint) as FindOptionsWhere<TEntity>
|
||||
)
|
||||
})
|
||||
|
||||
return where
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(constraints)) {
|
||||
if (value === undefined) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (value === null) {
|
||||
where[key] = IsNull()
|
||||
continue
|
||||
}
|
||||
|
||||
if (value instanceof FindOperator) {
|
||||
where[key] = value
|
||||
continue
|
||||
}
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
where[key] = In(value)
|
||||
continue
|
||||
}
|
||||
|
||||
if (typeof value === "object") {
|
||||
Object.entries(value).forEach(([objectKey, objectValue]) => {
|
||||
where[key] = where[key] || []
|
||||
if (operatorsMap[objectKey]) {
|
||||
where[key].push(operatorsMap[objectKey](objectValue))
|
||||
} else {
|
||||
if (objectValue != undefined && typeof objectValue === "object") {
|
||||
where[key] = buildWhere<any, TEntity>(objectValue)
|
||||
return
|
||||
}
|
||||
where[key] = value
|
||||
}
|
||||
return
|
||||
})
|
||||
|
||||
if (!Array.isArray(where[key])) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (where[key].length === 1) {
|
||||
where[key] = where[key][0]
|
||||
} else {
|
||||
where[key] = And(...where[key])
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
where[key] = value
|
||||
}
|
||||
|
||||
return where
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": ["es2020"],
|
||||
"target": "es2020",
|
||||
"outDir": "./dist",
|
||||
"esModuleInterop": true,
|
||||
"declaration": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"sourceMap": true,
|
||||
"noImplicitReturns": true,
|
||||
"strictNullChecks": true,
|
||||
"strictFunctionTypes": true,
|
||||
"noImplicitThis": true,
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": [
|
||||
"dist",
|
||||
"./src/**/__tests__",
|
||||
"./src/**/__mocks__",
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"include": ["src"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
/dist
|
||||
node_modules
|
||||
.DS_store
|
||||
.env*
|
||||
.env
|
||||
*.sql
|
||||
@@ -1,2 +0,0 @@
|
||||
export * from "./connection"
|
||||
export * from "./container"
|
||||
@@ -8596,22 +8596,17 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@medusajs/inventory@workspace:^, @medusajs/inventory@workspace:packages/inventory":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@medusajs/inventory@workspace:packages/inventory"
|
||||
"@medusajs/inventory@npm:latest":
|
||||
version: 1.11.6
|
||||
resolution: "@medusajs/inventory@npm:1.11.6"
|
||||
dependencies:
|
||||
"@medusajs/modules-sdk": ^1.12.8
|
||||
"@medusajs/types": ^1.11.12
|
||||
"@medusajs/utils": ^1.11.5
|
||||
awilix: ^8.0.0
|
||||
cross-env: ^5.2.1
|
||||
jest: ^29.6.3
|
||||
rimraf: ^5.0.1
|
||||
ts-jest: ^29.1.1
|
||||
typeorm: ^0.3.16
|
||||
typescript: ^5.1.6
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
checksum: 0eaa3b20e60ff75c8c15b7d8a15408778860a3263d855b08610b770a20fe282fe1dd279d4c923dfee98a388b9c036d96c89491eb89ef3c82eae220da6a468bcc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@medusajs/link-modules@^0.2.11, @medusajs/link-modules@workspace:packages/modules/link-modules":
|
||||
version: 0.0.0-use.local
|
||||
@@ -9130,22 +9125,17 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@medusajs/stock-location@workspace:packages/stock-location":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@medusajs/stock-location@workspace:packages/stock-location"
|
||||
"@medusajs/stock-location@npm:latest":
|
||||
version: 1.11.5
|
||||
resolution: "@medusajs/stock-location@npm:1.11.5"
|
||||
dependencies:
|
||||
"@medusajs/modules-sdk": ^1.12.8
|
||||
"@medusajs/types": ^1.11.12
|
||||
"@medusajs/utils": ^1.11.5
|
||||
awilix: ^8.0.0
|
||||
cross-env: ^5.2.1
|
||||
jest: ^29.6.3
|
||||
rimraf: ^5.0.1
|
||||
ts-jest: ^29.1.1
|
||||
typeorm: ^0.3.16
|
||||
typescript: ^5.1.6
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
checksum: 812e5b5f82b4e41e39bddc6148de8b45815c00dfff64d66972b1e61258c98c1c5da037b17df910db06ac7409cd6ea81777b130d025034ec6f14aeb9fc45994bd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@medusajs/store@workspace:^, @medusajs/store@workspace:packages/modules/store":
|
||||
version: 0.0.0-use.local
|
||||
@@ -9332,9 +9322,9 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@medusajs/user@workspace:^, @medusajs/user@workspace:packages/user":
|
||||
"@medusajs/user@workspace:^, @medusajs/user@workspace:packages/modules/user":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@medusajs/user@workspace:packages/user"
|
||||
resolution: "@medusajs/user@workspace:packages/modules/user"
|
||||
dependencies:
|
||||
"@medusajs/modules-sdk": ^1.12.10
|
||||
"@medusajs/types": ^1.11.15
|
||||
@@ -30393,7 +30383,7 @@ __metadata:
|
||||
"@medusajs/cache-inmemory": "workspace:*"
|
||||
"@medusajs/customer": "workspace:^"
|
||||
"@medusajs/event-bus-local": "workspace:*"
|
||||
"@medusajs/inventory": "workspace:^"
|
||||
"@medusajs/inventory": latest
|
||||
"@medusajs/medusa": "workspace:*"
|
||||
"@medusajs/modules-sdk": "workspace:^"
|
||||
"@medusajs/pricing": "workspace:^"
|
||||
@@ -30476,7 +30466,7 @@ __metadata:
|
||||
"@medusajs/currency": "workspace:^"
|
||||
"@medusajs/customer": "workspace:^"
|
||||
"@medusajs/event-bus-local": "workspace:*"
|
||||
"@medusajs/inventory": "workspace:^"
|
||||
"@medusajs/inventory": latest
|
||||
"@medusajs/inventory-next": "workspace:^"
|
||||
"@medusajs/medusa": "workspace:*"
|
||||
"@medusajs/modules-sdk": "workspace:^"
|
||||
@@ -30484,6 +30474,7 @@ __metadata:
|
||||
"@medusajs/product": "workspace:^"
|
||||
"@medusajs/promotion": "workspace:^"
|
||||
"@medusajs/region": "workspace:^"
|
||||
"@medusajs/stock-location": latest
|
||||
"@medusajs/store": "workspace:^"
|
||||
"@medusajs/tax": "workspace:^"
|
||||
"@medusajs/types": "workspace:^"
|
||||
|
||||
Reference in New Issue
Block a user