chore(medusa,orchestration,link-modules,modules-sdk): internal services as modules (#4925)

This commit is contained in:
Carlos R. L. Rodrigues authored and GitHub committed 2023-09-04 11:36:05 -03:00
1 parent 85fa90d9c6
commit a4906d0ac0
15 files changed
+348 -110

No files matched your search

+77
View File
@@ -0,0 +1,77 @@
import { Modules } from "@medusajs/modules-sdk"
import { ModuleJoinerConfig } from "@medusajs/types"
export const joinerConfig: ModuleJoinerConfig[] = [
{
serviceName: "cartService",
primaryKeys: ["id"],
linkableKeys: ["cart_id"],
alias: [
{
name: "cart",
},
],
relationships: [
{
serviceName: Modules.PRODUCT,
primaryKey: "id",
foreignKey: "variant_id",
alias: "variant",
args: {
methodSuffix: "Variants",
},
},
{
serviceName: "regionService",
primaryKey: "id",
foreignKey: "region_id",
alias: "region",
},
{
serviceName: "customerService",
primaryKey: "id",
foreignKey: "customer_id",
alias: "customer",
},
],
},
{
serviceName: "shippingProfileService",
primaryKeys: ["id"],
linkableKeys: ["profile_id"],
alias: [
{
name: "shipping_profile",
},
{
name: "shipping_profiles",
},
],
},
{
serviceName: "regionService",
primaryKeys: ["id"],
linkableKeys: ["region_id"],
alias: [
{
name: "region",
},
{
name: "regions",
},
],
},
{
serviceName: "customerService",
primaryKeys: ["id"],
linkableKeys: ["customer_id"],
alias: [
{
name: "customer",
},
{
name: "customers",
},
],
},
]
@@ -0,0 +1,10 @@
import { FlagSettings } from "../../types/feature-flags"
const IsolateProductDomainFeatureFlag: FlagSettings = {
key: "isolate_product_domain",
default_val: false,
env_key: "MEDUSA_FF_ISOLATE_PRODUCT_DOMAIN",
description: "[WIP] Isolate product domain dependencies from the core",
}
export default IsolateProductDomainFeatureFlag
+23 -5
View File
@@ -1,20 +1,28 @@
import { MedusaApp, moduleLoader, registerModules } from "@medusajs/modules-sdk"
import { ContainerRegistrationKeys } from "@medusajs/utils"
import { asValue } from "awilix"
import { Express, NextFunction, Request, Response } from "express"
import { createMedusaContainer } from "medusa-core-utils"
import { track } from "medusa-telemetry"
import { EOL } from "os"
import "reflect-metadata"
import requestIp from "request-ip"
import { Connection } from "typeorm"
import { joinerConfig } from "../joiner-config"
import modulesConfig from "../modules-config"
import { MedusaContainer } from "../types/global"
import { remoteQueryFetchData } from "../utils"
import apiLoader from "./api"
import loadConfig from "./config"
import databaseLoader, { dataSource } from "./database"
import defaultsLoader from "./defaults"
import expressLoader from "./express"
import featureFlagsLoader from "./feature-flags"
import IsolateProductDomainFeatureFlag from "./feature-flags/isolate-product-domain"
import Logger from "./logger"
import modelsLoader from "./models"
import passportLoader from "./passport"
import pgConnectionLoader from "./pg-connection"
import pluginsLoader, { registerPluginModels } from "./plugins"
import redisLoader from "./redis"
import repositoriesLoader from "./repositories"
@@ -23,11 +31,6 @@ import servicesLoader from "./services"
import strategiesLoader from "./strategies"
import subscribersLoader from "./subscribers"
import { moduleLoader, registerModules } from "@medusajs/modules-sdk"
import { createMedusaContainer } from "medusa-core-utils"
import pgConnectionLoader from "./pg-connection"
import { ContainerRegistrationKeys } from "@medusajs/utils"
type Options = {
directory: string
expressApp: Express
@@ -182,5 +185,20 @@ export default async ({
Logger.success(searchActivity, "Indexing event emitted") || {}
track("SEARCH_ENGINE_INDEXING_COMPLETED", { duration: searchAct.duration })
if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) {
const { query } = await MedusaApp({
modulesConfig,
servicesConfig: joinerConfig,
remoteFetchData: remoteQueryFetchData(container),
injectedDependencies: {
[ContainerRegistrationKeys.PG_CONNECTION]: container.resolve(
ContainerRegistrationKeys.PG_CONNECTION
),
},
})
container.register("remoteQuery", asValue(query))
}
return { container, dbConnection, app: expressApp }
}
+9
View File
@@ -0,0 +1,9 @@
import { MedusaModuleConfig, Modules } from "@medusajs/modules-sdk"
const modules: MedusaModuleConfig = [
{
module: Modules.PRODUCT,
},
]
export default modules
+2 -1
View File
@@ -11,8 +11,9 @@ export * from "./is-object"
export * from "./is-string"
export * from "./omit-deep"
export * from "./product-category"
export * from "./remote-query-fetch-data"
export * from "./remove-undefined-properties"
export * from "./set-metadata"
export * from "./validate-id"
export * from "./validators/is-type"
export { registerOverriddenValidators, validator } from "./validator"
export * from "./validators/is-type"
@@ -0,0 +1,53 @@
import { MedusaModule, RemoteQuery } from "@medusajs/modules-sdk"
import { MedusaContainer } from "@medusajs/types"
export function remoteQueryFetchData(container: MedusaContainer) {
return async (expand, keyField, ids, relationship) => {
const serviceConfig = expand.serviceConfig
const service = container.resolve(serviceConfig.serviceName, {
allowUnregistered: true,
})
if (MedusaModule.isInstalled(serviceConfig.serviceName)) {
return
}
const filters = {}
const options = {
...RemoteQuery.getAllFieldsAndRelations(expand),
}
if (ids) {
filters[keyField] = ids
}
const hasPagination = Object.keys(options).some((key) =>
["skip"].includes(key)
)
let methodName = hasPagination ? "listAndCount" : "list"
if (relationship?.args?.methodSuffix) {
methodName += relationship.args.methodSuffix
} else if (serviceConfig?.args?.methodSuffix) {
methodName += serviceConfig.args.methodSuffix
}
const result = await service[methodName](filters, options)
if (hasPagination) {
const [data, count] = result
return {
data: {
rows: data,
metadata: {},
},
path: "rows",
}
}
return {
data: result,
} as any
}
}