chore(utils, product): Attempt to simplify module scripts export (#6021)

This commit is contained in:
Adrien de Peretti
2024-01-09 20:20:05 +01:00
committed by GitHub
parent 90db656000
commit a9b4214503
16 changed files with 298 additions and 227 deletions

View File

@@ -0,0 +1,3 @@
export * from "./migration-down"
export * from "./migration-up"
export * from "./seed"

View File

@@ -0,0 +1,60 @@
import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types"
import { EntitySchema } from "@mikro-orm/core"
import { upperCaseFirst } from "../../common"
import { loadDatabaseConfig } from "../load-module-database-config"
import { mikroOrmCreateConnection } from "../../dal"
/**
* Utility function to build a migration script that will revert the migrations.
* Only used in mikro orm based modules.
* @param moduleName
* @param models
* @param pathToMigrations
*/
export function buildRevertMigrationScript({
moduleName,
models,
pathToMigrations,
}) {
/**
* This script is only valid for mikro orm managers. If a user provide a custom manager
* he is in charge of reverting the migrations.
* @param options
* @param logger
* @param moduleDeclaration
*/
return async function ({
options,
logger,
}: Pick<
LoaderOptions<ModulesSdkTypes.ModuleServiceInitializeOptions>,
"options" | "logger"
> = {}) {
logger ??= console as unknown as Logger
const dbData = loadDatabaseConfig(moduleName, options)!
const entities = Object.values(models) as unknown as EntitySchema[]
const orm = await mikroOrmCreateConnection(
dbData,
entities,
pathToMigrations
)
try {
const migrator = orm.getMigrator()
await migrator.down()
logger?.info(`${upperCaseFirst(moduleName)} module migration executed`)
} catch (error) {
logger?.error(
`${upperCaseFirst(
moduleName
)} module migration failed to run - Error: ${error}`
)
}
await orm.close()
}
}

View File

@@ -0,0 +1,67 @@
import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types"
import { EntitySchema } from "@mikro-orm/core"
import { upperCaseFirst } from "../../common"
import { loadDatabaseConfig } from "../load-module-database-config"
import { mikroOrmCreateConnection } from "../../dal"
/**
* Utility function to build a migration script that will run the migrations.
* Only used in mikro orm based modules.
* @param moduleName
* @param models
* @param pathToMigrations
*/
export function buildMigrationScript({ moduleName, models, pathToMigrations }) {
/**
* This script is only valid for mikro orm managers. If a user provide a custom manager
* he is in charge of running the migrations.
* @param options
* @param logger
* @param moduleDeclaration
*/
return async function ({
options,
logger,
}: Pick<
LoaderOptions<ModulesSdkTypes.ModuleServiceInitializeOptions>,
"options" | "logger"
> = {}) {
logger ??= console as unknown as Logger
const dbData = loadDatabaseConfig(moduleName, options)!
const entities = Object.values(models) as unknown as EntitySchema[]
const orm = await mikroOrmCreateConnection(
dbData,
entities,
pathToMigrations
)
try {
const migrator = orm.getMigrator()
const pendingMigrations = await migrator.getPendingMigrations()
logger.info(
`Running pending migrations: ${JSON.stringify(
pendingMigrations,
null,
2
)}`
)
await migrator.up({
migrations: pendingMigrations.map((m) => m.name),
})
logger.info(`${upperCaseFirst(moduleName)} module migration executed`)
} catch (error) {
logger.error(
`${upperCaseFirst(
moduleName
)} module migration failed to run - Error: ${error}`
)
}
await orm.close()
}
}

View File

@@ -0,0 +1,73 @@
import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types"
import { EntitySchema } from "@mikro-orm/core"
import { EOL } from "os"
import { resolve } from "path"
import { mikroOrmCreateConnection } from "../../dal"
import { loadDatabaseConfig } from "../load-module-database-config"
/**
* Utility function to build a seed script that will insert the seed data.
* @param moduleName
* @param models
* @param pathToMigrations
* @param seedHandler
*/
export function buildSeedScript({
moduleName,
models,
pathToMigrations,
seedHandler,
}: {
moduleName: string
models: Record<string, unknown>
pathToMigrations: string
seedHandler: (args: {
manager: any
logger: Logger
data: any
}) => Promise<void>
}) {
return async function ({
options,
logger,
path,
}: Partial<
Pick<
LoaderOptions<ModulesSdkTypes.ModuleServiceInitializeOptions>,
"options" | "logger"
>
> & {
path: string
}) {
const logger_ = (logger ?? console) as unknown as Logger
logger_.info(`Loading seed data from ${path}...`)
const dataSeed = await import(resolve(process.cwd(), path)).catch((e) => {
logger_.error(
`Failed to load seed data from ${path}. Please, provide a relative path and check that you export the following productCategoriesData, productsData, variantsData.${EOL}${e}`
)
throw e
})
const dbData = loadDatabaseConfig(moduleName, options)!
const entities = Object.values(models) as unknown as EntitySchema[]
const orm = await mikroOrmCreateConnection(
dbData,
entities,
pathToMigrations
)
const manager = orm.em.fork()
try {
logger_.info(`Inserting ${moduleName} data...`)
seedHandler({ manager, logger: logger_, data: dataSeed })
} catch (e) {
logger_.error(
`Failed to insert the seed data in the PostgreSQL database ${dbData.clientUrl}.${EOL}${e}`
)
}
await orm.close(true)
}
}