feat(types, product, utils, medusa): Include shared connection for modules (#4626)

This commit is contained in:
Adrien de Peretti authored and GitHub committed 2023-08-08 15:10:34 +00:00
1 parent a2d7540e40
commit 3f3a84262c
26 files changed
+476 -168

No files matched your search

+9 -4
View File
@@ -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:
+12 -3
View File
@@ -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)
)
}
}