Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(medusa): Run shared module migrations #3109

Merged
merged 11 commits into from
Feb 1, 2023
5 changes: 5 additions & 0 deletions .changeset/sweet-windows-float.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---

feat(medusa): Run shared module migrations
5 changes: 3 additions & 2 deletions integration-tests/development/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ const express = require("express")
const importFrom = require("import-from")
const chokidar = require("chokidar")

require("dotenv").config({ path: path.join(__dirname, ".env.development") })

process.env.DEV_MODE = !!process[Symbol.for("ts-node.register.instance")]
process.env.NODE_ENV = process.env.DEV_MODE && "development"

require("dotenv").config({ path: path.join(__dirname, ".env.development") })

require("./dev-require")

Expand Down
50 changes: 26 additions & 24 deletions integration-tests/development/use-db-development.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
const path = require("path")

const { createConnection } = require("typeorm")
const { getConfigFile } = require("medusa-core-utils")

const DB_HOST = process.env.DB_HOST
const DB_USERNAME = process.env.DB_USERNAME
const DB_PASSWORD = process.env.DB_PASSWORD
const DB_NAME = process.env.DB_NAME
const DB_URL = `postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}`

process.env.NODE_ENV = "development"

require("./dev-require")

async function createDB() {
Expand All @@ -25,26 +28,26 @@ module.exports = {
initDb: async function () {
const cwd = path.resolve(path.join(__dirname, "../.."))

const configPath = path.resolve(
path.join(__dirname, "../api/medusa-config.js")
const { configModule } = getConfigFile(
path.join(__dirname),
`medusa-config`
)
const { featureFlags } = require(configPath)

const { featureFlags } = configModule

const basePath = path.join(cwd, "packages/medusa/src")

const featureFlagsLoader = require(path.join(
basePath,
`loaders`,
`feature-flags`
)).default
const featureFlagsLoader =
require("@medusajs/medusa/dist/loaders/feature-flags").default

const featureFlagsRouter = featureFlagsLoader({ featureFlags })

const modelsLoader = require(path.join(
basePath,
`loaders`,
`models`
)).default
const modelsLoader = require("@medusajs/medusa/dist/loaders/models").default

const {
getEnabledMigrations,
getModuleSharedResources,
} = require("@medusajs/medusa/dist/commands/utils/get-migrations")

const entities = modelsLoader({}, { register: false })

Expand All @@ -53,29 +56,28 @@ module.exports = {
path.join(basePath, `migrations`, `*.{j,t}s`)
)

const { getEnabledMigrations } = require(path.join(
basePath,
`commands`,
`utils`,
`get-migrations`
))
const isFlagEnabled = (flag) => featureFlagsRouter.isFeatureEnabled(flag)

const enabledMigrations = await getEnabledMigrations(
const { migrations: moduleMigrations, models: moduleModels } =
getModuleSharedResources(configModule, featureFlagsRouter)

const enabledMigrations = getEnabledMigrations(
[migrationDir],
(flag) => featureFlagsRouter.isFeatureEnabled(flag)
isFlagEnabled
)

const enabledEntities = entities.filter(
(e) => typeof e.isFeatureEnabled === "undefined" || e.isFeatureEnabled()
)

await createDB()

const dbConnection = await createConnection({
type: "postgres",
url: DB_URL,
entities: enabledEntities,
migrations: enabledMigrations,
//logging: true,
entities: enabledEntities.concat(moduleModels),
migrations: enabledMigrations.concat(moduleMigrations),
// logging: true,
})

await dbConnection.runMigrations()
Expand Down
19 changes: 12 additions & 7 deletions integration-tests/helpers/use-db.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const path = require("path")

const { getConfigFile } = require("medusa-core-utils")
const { dropDatabase } = require("pg-god")
const { createConnection } = require("typeorm")
const dbFactory = require("./use-template-db")
Expand Down Expand Up @@ -43,6 +44,7 @@ const DbTestUtil = {
forceDelete = forceDelete || []

const entities = this.db_.entityMetadatas

const manager = this.db_.manager

if (connectionType === "sqlite") {
Expand Down Expand Up @@ -79,8 +81,8 @@ const instance = DbTestUtil

module.exports = {
initDb: async function ({ cwd, database_extra }) {
const configPath = path.resolve(path.join(cwd, `medusa-config.js`))
const { projectConfig, featureFlags } = require(configPath)
const { configModule } = getConfigFile(cwd, `medusa-config`)
const { projectConfig, featureFlags } = configModule

const featureFlagsLoader =
require("@medusajs/medusa/dist/loaders/feature-flags").default
Expand Down Expand Up @@ -122,11 +124,14 @@ module.exports = {

const {
getEnabledMigrations,
getModuleSharedResources,
} = require("@medusajs/medusa/dist/commands/utils/get-migrations")

const enabledMigrations = await getEnabledMigrations(
[migrationDir],
(flag) => featureFlagsRouter.isFeatureEnabled(flag)
const { migrations: moduleMigrations, models: moduleModels } =
getModuleSharedResources(configModule, featureFlagsRouter)

const enabledMigrations = getEnabledMigrations([migrationDir], (flag) =>
featureFlagsRouter.isFeatureEnabled(flag)
)

const enabledEntities = entities.filter(
Expand All @@ -136,8 +141,8 @@ module.exports = {
const dbConnection = await createConnection({
type: "postgres",
url: DB_URL,
entities: enabledEntities,
migrations: enabledMigrations,
entities: enabledEntities.concat(moduleModels),
migrations: enabledMigrations.concat(moduleMigrations),
extra: database_extra ?? {},
name: "integration-tests",
})
Expand Down
15 changes: 11 additions & 4 deletions integration-tests/helpers/use-template-db.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const path = require("path")

require("dotenv").config({ path: path.join(__dirname, "../.env.test") })

const { getConfigFile } = require("medusa-core-utils")
const { createDatabase, dropDatabase } = require("pg-god")
const { createConnection, getConnection } = require("typeorm")

Expand All @@ -24,8 +25,10 @@ class DatabaseFactory {
}

async createTemplateDb_({ cwd }) {
// const cwd = path.resolve(path.join(__dirname, ".."))
const { configModule } = getConfigFile(cwd, `medusa-config`)

const connection = await this.getMasterConnection()

const migrationDir = path.resolve(
path.join(
__dirname,
Expand All @@ -41,14 +44,18 @@ class DatabaseFactory {

const {
getEnabledMigrations,
getModuleSharedResources,
} = require("@medusajs/medusa/dist/commands/utils/get-migrations")

// filter migrations to only include those that don't have feature flags
const enabledMigrations = await getEnabledMigrations(
const enabledMigrations = getEnabledMigrations(
[migrationDir],
(flag) => false
)

const { migrations: moduleMigrations } =
getModuleSharedResources(configModule)

await dropDatabase(
{
databaseName: this.templateDbName,
Expand All @@ -65,7 +72,7 @@ class DatabaseFactory {
type: "postgres",
name: "templateConnection",
url: `${DB_URL}/${this.templateDbName}`,
migrations: enabledMigrations,
migrations: enabledMigrations.concat(moduleMigrations),
})

await templateDbConnection.runMigrations()
Expand All @@ -76,7 +83,7 @@ class DatabaseFactory {

async getMasterConnection() {
try {
return await getConnection(this.masterConnectionName)
return getConnection(this.masterConnectionName)
} catch (err) {
return await this.createMasterConnection()
}
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@
"generate:entities": "typedoc --options typedoc.entities.js",
"release:snapshot": "changeset publish --no-git-tags --snapshot --tag snapshot",
"generate:announcement": "node ./scripts/doc-change-release.js",
"develop": "NODE_ENV=development ts-node --transpile-only ./integration-tests/development/server.js",
"develop:create:db": "NODE_ENV=development ts-node --transpile-only ./integration-tests/development/create-database.js",
"develop": "ts-node --transpile-only ./integration-tests/development/server.js",
"develop:create:db": "ts-node --transpile-only ./integration-tests/development/create-database.js",
"release:next": "changeset publish --no-git-tags --snapshot --tag next",
"version:next": "changeset version --snapshot next",
"check:freshness": "node ./scripts/freshness-check.js"
Expand Down
68 changes: 45 additions & 23 deletions packages/medusa/src/commands/migrate.js
Original file line number Diff line number Diff line change
@@ -1,51 +1,73 @@
import { createConnection } from "typeorm"
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
import { getConfigFile } from "medusa-core-utils"
import featureFlagLoader from "../loaders/feature-flags"
import { handleConfigError } from "../loaders/config"
import configModuleLoader from "../loaders/config"
import Logger from "../loaders/logger"

import getMigrations from "./utils/get-migrations"
import getMigrations, { getModuleSharedResources } from "./utils/get-migrations"

const t = async function ({ directory }) {
const args = process.argv
args.shift()
args.shift()
args.shift()

const { configModule, error } = getConfigFile(directory, `medusa-config`)

if (error) {
handleConfigError(error)
}
const getDataSource = async (directory) => {
const configModule = configModuleLoader(directory)

const featureFlagRouter = featureFlagLoader(configModule)

const enabledMigrations = await getMigrations(directory, featureFlagRouter)
const { coreMigrations } = getMigrations(directory, featureFlagRouter)

const connection = await createConnection({
const { migrations: moduleMigrations } = getModuleSharedResources(
configModule,
featureFlagRouter
)

return await createConnection({
type: configModule.projectConfig.database_type,
url: configModule.projectConfig.database_url,
schema: configModule.projectConfig.database_schema,
extra: configModule.projectConfig.database_extra || {},
migrations: enabledMigrations,
schema: configModule.projectConfig.database_schema,
migrations: coreMigrations.concat(moduleMigrations),
logging: true,
})
}

const main = async function ({ directory }) {
const args = process.argv
args.shift()
args.shift()
args.shift()

if (args[0] === "run") {
await connection.runMigrations()
await connection.close()
const dataSource = await getDataSource(directory)

await dataSource.runMigrations()
await dataSource.close()
Logger.info("Migrations completed.")
process.exit()
} else if (args[0] === "revert") {
await connection.undoLastMigration({ transaction: "all" })
await connection.close()
const dataSource = await getDataSource(directory)

await dataSource.undoLastMigration({ transaction: "all" })
await dataSource.close()
Logger.info("Migrations reverted.")

process.exit()
} else if (args[0] === "show") {
const configModule = configModuleLoader(directory)

const featureFlagRouter = featureFlagLoader(configModule)

const { coreMigrations } = getMigrations(directory, featureFlagRouter)

const connection = await createConnection({
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
type: configModule.projectConfig.database_type,
url: configModule.projectConfig.database_url,
extra: configModule.projectConfig.database_extra || {},
schema: configModule.projectConfig.database_schema,
migrations: coreMigrations,
logging: true,
})

const unapplied = await connection.showMigrations()
await connection.close()
process.exit(unapplied ? 1 : 0)
}
}

export default t
export default main
23 changes: 17 additions & 6 deletions packages/medusa/src/commands/seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import {
} from "../services"
import { ConfigModule } from "../types/global"
import { CreateProductInput } from "../types/product"
import getMigrations from "./utils/get-migrations"
import getMigrations, { getModuleSharedResources } from "./utils/get-migrations"

type SeedOptions = {
directory: string
Expand Down Expand Up @@ -58,15 +58,20 @@ const seed = async function ({ directory, migrate, seedFile }: SeedOptions) {

const dbType = configModule.projectConfig.database_type
if (migrate && dbType !== "sqlite") {
const migrationDirs = await getMigrations(directory, featureFlagRouter)
const { coreMigrations } = getMigrations(directory, featureFlagRouter)

const { migrations: moduleMigrations } = getModuleSharedResources(
configModule,
featureFlagRouter
)

const connectionOptions = {
type: configModule.projectConfig.database_type,
database: configModule.projectConfig.database_database,
schema: configModule.projectConfig.database_schema,
url: configModule.projectConfig.database_url,
extra: configModule.projectConfig.database_extra || {},
migrations: migrationDirs,
migrations: coreMigrations.concat(moduleMigrations),
logging: true,
} as ConnectionOptions

Expand All @@ -91,9 +96,15 @@ const seed = async function ({ directory, migrate, seedFile }: SeedOptions) {
const regionService: RegionService = container.resolve("regionService")
const productService: ProductService = container.resolve("productService")
/* eslint-disable */
const productVariantService: ProductVariantService = container.resolve("productVariantService")
const shippingOptionService: ShippingOptionService = container.resolve("shippingOptionService")
const shippingProfileService: ShippingProfileService = container.resolve("shippingProfileService")
const productVariantService: ProductVariantService = container.resolve(
"productVariantService"
)
const shippingOptionService: ShippingOptionService = container.resolve(
"shippingOptionService"
)
const shippingProfileService: ShippingProfileService = container.resolve(
"shippingProfileService"
)
/* eslint-enable */

await manager.transaction(async (tx) => {
Expand Down
Loading