feat(types, product, utils, medusa): Include shared connection for modules (#4626)
This commit is contained in:
1 parent
a2d7540e40
commit
3f3a84262c
26 files changed
+476
-168
No files matched your search
@@ -74,6 +74,7 @@
|
||||
"ioredis-mock": "8.4.0",
|
||||
"iso8601-duration": "^1.3.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"knex": "2.4.2",
|
||||
"lodash": "^4.17.21",
|
||||
"medusa-core-utils": "^1.2.0",
|
||||
"medusa-telemetry": "^0.0.16",
|
||||
@@ -86,6 +87,7 @@
|
||||
"passport-http-bearer": "^1.0.1",
|
||||
"passport-jwt": "^4.0.1",
|
||||
"passport-local": "^1.0.0",
|
||||
"pg": "^8.11.2",
|
||||
"qs": "^6.11.2",
|
||||
"randomatic": "^3.1.1",
|
||||
"redis": "^3.0.2",
|
||||
|
||||
@@ -40,12 +40,17 @@ export default async ({
|
||||
}: Options): Promise<DataSource> => {
|
||||
const entities = container.resolve("db_entities")
|
||||
|
||||
const connectionString = configModule.projectConfig.database_url
|
||||
const database = configModule.projectConfig.database_database
|
||||
const extra: any = configModule.projectConfig.database_extra || {}
|
||||
const schema = configModule.projectConfig.database_schema || "public"
|
||||
|
||||
dataSource = new DataSource({
|
||||
type: "postgres",
|
||||
url: configModule.projectConfig.database_url,
|
||||
database: configModule.projectConfig.database_database,
|
||||
extra: configModule.projectConfig.database_extra || {},
|
||||
schema: configModule.projectConfig.database_schema,
|
||||
url: connectionString,
|
||||
database: database,
|
||||
extra,
|
||||
schema,
|
||||
entities,
|
||||
migrations: customOptions?.migrations,
|
||||
logging:
|
||||
|
||||
@@ -25,6 +25,8 @@ 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
|
||||
@@ -44,7 +46,10 @@ export default async ({
|
||||
const configModule = loadConfig(rootDirectory)
|
||||
|
||||
const container = createMedusaContainer()
|
||||
container.register("configModule", asValue(configModule))
|
||||
container.register(
|
||||
ContainerRegistrationKeys.CONFIG_MODULE,
|
||||
asValue(configModule)
|
||||
)
|
||||
|
||||
// Add additional information to context of request
|
||||
expressApp.use((req: Request, res: Response, next: NextFunction) => {
|
||||
@@ -59,7 +64,7 @@ export default async ({
|
||||
track("FEATURE_FLAGS_LOADED")
|
||||
|
||||
container.register({
|
||||
logger: asValue(Logger),
|
||||
[ContainerRegistrationKeys.LOGGER]: asValue(Logger),
|
||||
featureFlagRouter: asValue(featureFlagRouter),
|
||||
})
|
||||
|
||||
@@ -87,6 +92,8 @@ export default async ({
|
||||
const stratAct = Logger.success(stratActivity, "Strategies initialized") || {}
|
||||
track("STRATEGIES_INIT_COMPLETED", { duration: stratAct.duration })
|
||||
|
||||
await pgConnectionLoader({ container, configModule })
|
||||
|
||||
const modulesActivity = Logger.activity(`Initializing modules${EOL}`)
|
||||
track("MODULES_INIT_STARTED")
|
||||
await moduleLoader({
|
||||
@@ -112,7 +119,9 @@ export default async ({
|
||||
const rAct = Logger.success(repoActivity, "Repositories initialized") || {}
|
||||
track("REPOSITORIES_INIT_COMPLETED", { duration: rAct.duration })
|
||||
|
||||
container.register({ manager: asValue(dataSource.manager) })
|
||||
container.register({
|
||||
[ContainerRegistrationKeys.MANAGER]: asValue(dataSource.manager),
|
||||
})
|
||||
|
||||
const servicesActivity = Logger.activity(`Initializing services${EOL}`)
|
||||
track("SERVICES_INIT_STARTED")
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import { asValue, AwilixContainer } from "awilix"
|
||||
import { ConfigModule } from "../types/global"
|
||||
import { ContainerRegistrationKeys } from "@medusajs/utils"
|
||||
import { ClientConfig } from "pg"
|
||||
import knex from "knex"
|
||||
|
||||
type Options = {
|
||||
configModule: ConfigModule
|
||||
container: AwilixContainer
|
||||
}
|
||||
|
||||
export default async ({ container, configModule }: Options): Promise<void> => {
|
||||
const connectionString = configModule.projectConfig.database_url
|
||||
const database = configModule.projectConfig.database_database
|
||||
const extra: any = configModule.projectConfig.database_extra || {}
|
||||
const schema = configModule.projectConfig.database_schema || "public"
|
||||
|
||||
// Share a knex connection to be consumed by the shared modules
|
||||
if (!container.hasRegistration(ContainerRegistrationKeys.PG_CONNECTION)) {
|
||||
const config: ClientConfig = {
|
||||
connectionString,
|
||||
database,
|
||||
ssl: extra?.ssl ?? false,
|
||||
idle_in_transaction_session_timeout:
|
||||
extra.idle_in_transaction_session_timeout ?? undefined, // prevent null to be passed
|
||||
}
|
||||
|
||||
// TODO: see later if it is possible to use the same connection with multiple pool config using this shared connection across the modules
|
||||
// const pgConnection = await new Client(config).connect() // or any other method to create your connection here
|
||||
|
||||
const pgConnection = knex<any, any>({
|
||||
client: "pg",
|
||||
searchPath: schema,
|
||||
connection: {
|
||||
connectionString: connectionString,
|
||||
database,
|
||||
ssl: extra?.ssl ?? false,
|
||||
idle_in_transaction_session_timeout:
|
||||
extra.idle_in_transaction_session_timeout ?? undefined, // prevent null to be passed
|
||||
},
|
||||
pool: {
|
||||
min: 0,
|
||||
max: extra.max,
|
||||
idleTimeoutMillis: extra.idleTimeoutMillis ?? undefined, // prevent null to be passed
|
||||
},
|
||||
})
|
||||
|
||||
container.register(
|
||||
ContainerRegistrationKeys.PG_CONNECTION,
|
||||
asValue(pgConnection)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user