feat(core-flows,modules-sdk,types,medusa,link-modules): adds variant <> inventory item link endpoints (#7576)

what:

- adds variant inventory link management endpoints:
```
Link inventory item to variant
POST /products/:id/variants/:vid/inventory-items

Update variant's inventory item link
POST /products/:id/variants/:vid/inventory-items/:iid

Unlink variant's inventory item
DELETE /products/:id/variants/:vid/inventory-items/:iid
```

- a batch endpoint that does the above 3 across variants
```
POST /products/:id/variants/inventory-items
```
This commit is contained in:
Riqwan Thamir
2024-06-03 20:23:29 +02:00
committed by GitHub
parent 122186a78d
commit ecfbfcc707
23 changed files with 1279 additions and 126 deletions

View File

@@ -1,8 +1,8 @@
import {
InternalModuleDeclaration,
MedusaModule,
MODULE_RESOURCE_TYPE,
MODULE_SCOPE,
MedusaModule,
ModuleRegistrationName,
} from "@medusajs/modules-sdk"
import {
@@ -16,6 +16,7 @@ import {
ModuleServiceInitializeOptions,
} from "@medusajs/types"
import {
arrayDifference,
ContainerRegistrationKeys,
lowerCaseFirst,
simpleHash,
@@ -50,7 +51,9 @@ export const initialize = async (
)
for (const linkDefinition of allLinksToLoad) {
const definition = JSON.parse(JSON.stringify(linkDefinition))
const definition: ModuleJoinerConfig = JSON.parse(
JSON.stringify(linkDefinition)
)
const [primary, foreign] = definition.relationships ?? []
@@ -65,6 +68,24 @@ export const initialize = async (
throw new Error(`Foreign key cannot be a composed key.`)
}
if (Array.isArray(definition.extraDataFields)) {
const extraDataFields = definition.extraDataFields
const definedDbFields = Object.keys(
definition.databaseConfig?.extraFields || {}
)
const difference = arrayDifference(extraDataFields, definedDbFields)
if (difference.length) {
throw new Error(
`extraDataFields (fieldNames: ${difference.join(
","
)}) need to be configured under databaseConfig (serviceName: ${
definition.serviceName
}).`
)
}
}
const serviceKey = !definition.isReadOnlyLink
? lowerCaseFirst(
definition.serviceName ??
@@ -112,7 +133,10 @@ export const initialize = async (
logger,
})
definition.alias ??= []
if (!Array.isArray(definition.alias)) {
definition.alias = definition.alias ? [definition.alias] : []
}
for (const alias of definition.alias) {
alias.args ??= {}

View File

@@ -1,11 +1,23 @@
import { Constructor, ILinkModule, ModuleJoinerConfig } from "@medusajs/types"
import { isDefined } from "@medusajs/utils"
import { LinkModuleService } from "@services"
export function getModuleService(
joinerConfig: ModuleJoinerConfig
): Constructor<ILinkModule> {
const joinerConfig_ = JSON.parse(JSON.stringify(joinerConfig))
const databaseConfig = joinerConfig_.databaseConfig
delete joinerConfig_.databaseConfig
// If extraDataFields is not defined, pick the fields to populate and validate from the
// database config if any fields are provided.
if (!isDefined(joinerConfig_.extraDataFields)) {
joinerConfig_.extraDataFields = Object.keys(
databaseConfig.extraFields || {}
)
}
return class LinkService extends LinkModuleService<unknown> {
override __joinerConfig(): ModuleJoinerConfig {
return joinerConfig_ as ModuleJoinerConfig