feat(medusa, modules-sdk, types, utils): Re work modules loading and remove legacy functions (#5496)

This commit is contained in:
Adrien de Peretti
2023-11-02 17:59:13 +01:00
committed by GitHub
parent ca411e54eb
commit 154c9b43bd
39 changed files with 616 additions and 393 deletions

View File

@@ -6,20 +6,72 @@ import { composeTableName } from "./compose-link-name"
export function generateGraphQLSchema(
joinerConfig: ModuleJoinerConfig,
primary: ModuleJoinerRelationship,
foreign: ModuleJoinerRelationship
foreign: ModuleJoinerRelationship,
{ logger }: { logger } = { logger: console }
) {
const fieldNames = primary.foreignKey.split(",").concat(foreign.foreignKey)
let fieldNames!: string[]
let entityName!: string
const entityName = toPascalCase(
"Link_" +
(joinerConfig.databaseConfig?.tableName ??
composeTableName(
primary.serviceName,
primary.foreignKey,
foreign.serviceName,
foreign.foreignKey
))
)
if (!joinerConfig.isReadOnlyLink) {
fieldNames = primary.foreignKey.split(",").concat(foreign.foreignKey)
entityName = toPascalCase(
"Link_" +
(joinerConfig.databaseConfig?.tableName ??
composeTableName(
primary.serviceName,
primary.foreignKey,
foreign.serviceName,
foreign.foreignKey
))
)
}
let typeDef = ""
for (const extend of joinerConfig.extends ?? []) {
const extendedModule = MedusaModule.getModuleInstance(extend.serviceName)
if (!extendedModule && !extend.relationship.isInternalService) {
throw new Error(
`Module ${extend.serviceName} not found. Please verify that the module is configured and installed, also the module must be loaded before the link modules.`
)
}
const extJoinerConfig = MedusaModule.getJoinerConfig(
extend.relationship.serviceName
)
let extendedEntityName =
extJoinerConfig?.linkableKeys?.[extend.relationship.foreignKey]!
if (!extendedEntityName && (!primary || !foreign)) {
logger.warn(
`Link modules schema: No linkable key found for ${extend.relationship.foreignKey} on module ${extend.relationship.serviceName}.`
)
continue
}
const fieldName = camelToSnakeCase(
lowerCaseFirst(extend.relationship.alias)
)
let type = extend.relationship.isList ? `[${entityName}]` : entityName
if (extJoinerConfig?.isReadOnlyLink) {
type = extend.relationship.isList
? `[${extendedEntityName}]`
: extendedEntityName
}
typeDef += `
extend type ${extend.serviceName} {
${fieldName}: ${type}
}
`
}
if (joinerConfig.isReadOnlyLink) {
return typeDef
}
// Pivot table fields
const fields = fieldNames.reduce((acc, curr) => {
@@ -48,7 +100,7 @@ export function generateGraphQLSchema(
composeTableName(foreign.serviceName)
)}`
let typeDef = `
typeDef += `
type ${entityName} {
${(Object.entries(fields) as any)
.map(
@@ -66,36 +118,6 @@ export function generateGraphQLSchema(
}
`
for (const extend of joinerConfig.extends ?? []) {
const extendedModule = MedusaModule.getModuleInstance(extend.serviceName)
if (!extendedModule && !extend.relationship.isInternalService) {
throw new Error(
`Module ${extend.serviceName} not found. Please verify that the module is configured and installed, also the module must be loaded before the link modules.`
)
}
const joinerConfig = MedusaModule.getJoinerConfig(extend.serviceName)
let extendedEntityName =
joinerConfig?.linkableKeys?.[extend.relationship.primaryKey]!
if (!extendedEntityName) {
continue
}
extendedEntityName = toPascalCase(extendedEntityName)
const linkTableFieldName = camelToSnakeCase(
lowerCaseFirst(extend.relationship.alias)
)
const type = extend.relationship.isList ? `[${entityName}]` : entityName
typeDef += `
extend type ${extendedEntityName} {
${linkTableFieldName}: ${type}
}
`
}
return typeDef
}