chore: Hide repository creation if they are not custom + add upsert support by default (#6127)
This commit is contained in:
1 parent
8a8a7183b8
commit
5e655dd59b
124 files changed
+1516
-2559
No files matched your search
@@ -1,9 +1,10 @@
|
||||
import { PromotionType } from "@medusajs/utils"
|
||||
import { createMedusaContainer, PromotionType } from "@medusajs/utils"
|
||||
import { SqlEntityManager } from "@mikro-orm/postgresql"
|
||||
import { PromotionRepository } from "@repositories"
|
||||
import { PromotionService } from "@services"
|
||||
import { createPromotions } from "../../../__fixtures__/promotion"
|
||||
import { MikroOrmWrapper } from "../../../utils"
|
||||
import { asValue } from "awilix"
|
||||
import ContainerLoader from "../../../../src/loaders/container"
|
||||
|
||||
jest.setTimeout(30000)
|
||||
|
||||
@@ -17,13 +18,12 @@ describe("Promotion Service", () => {
|
||||
repositoryManager = await MikroOrmWrapper.forkManager()
|
||||
testManager = await MikroOrmWrapper.forkManager()
|
||||
|
||||
const promotionRepository = new PromotionRepository({
|
||||
manager: repositoryManager,
|
||||
})
|
||||
const container = createMedusaContainer()
|
||||
container.register("manager", asValue(repositoryManager))
|
||||
|
||||
service = new PromotionService({
|
||||
promotionRepository: promotionRepository,
|
||||
})
|
||||
await ContainerLoader({ container })
|
||||
|
||||
service = container.resolve("promotionService")
|
||||
|
||||
await createPromotions(testManager)
|
||||
})
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
"node": ">=16"
|
||||
},
|
||||
"bin": {
|
||||
"medusa-promotion-migrations-down": "dist/scripts/bin/run-migration-down.js",
|
||||
"medusa-promotion-migrations-up": "dist/scripts/bin/run-migration-up.js",
|
||||
"medusa-promotion-seed": "dist/scripts/bin/run-seed.js"
|
||||
},
|
||||
"repository": {
|
||||
|
||||
@@ -1,7 +1,22 @@
|
||||
import { moduleDefinition } from "./module-definition"
|
||||
import { Modules } from "@medusajs/modules-sdk"
|
||||
import * as Models from "@models"
|
||||
import { ModulesSdkUtils } from "@medusajs/utils"
|
||||
|
||||
export default moduleDefinition
|
||||
|
||||
const migrationScriptOptions = {
|
||||
moduleName: Modules.PROMOTION,
|
||||
models: Models,
|
||||
pathToMigrations: __dirname + "/migrations",
|
||||
}
|
||||
|
||||
export const runMigrations = ModulesSdkUtils.buildMigrationScript(
|
||||
migrationScriptOptions
|
||||
)
|
||||
export const revertMigration = ModulesSdkUtils.buildRevertMigrationScript(
|
||||
migrationScriptOptions
|
||||
)
|
||||
|
||||
export * from "./initialize"
|
||||
export * from "./loaders"
|
||||
export * from "./scripts"
|
||||
@@ -1,70 +1,10 @@
|
||||
import * as defaultRepositories from "@repositories"
|
||||
import { ModulesSdkUtils } from "@medusajs/utils"
|
||||
import * as ModuleModels from "@models"
|
||||
import * as ModuleRepositories from "@repositories"
|
||||
import * as ModuleServices from "@services"
|
||||
|
||||
import { LoaderOptions } from "@medusajs/modules-sdk"
|
||||
import { ModulesSdkTypes } from "@medusajs/types"
|
||||
import { loadCustomRepositories } from "@medusajs/utils"
|
||||
import * as defaultServices from "@services"
|
||||
import { asClass } from "awilix"
|
||||
|
||||
export default async ({
|
||||
container,
|
||||
options,
|
||||
}: LoaderOptions<
|
||||
| ModulesSdkTypes.ModuleServiceInitializeOptions
|
||||
| ModulesSdkTypes.ModuleServiceInitializeCustomDataLayerOptions
|
||||
>): Promise<void> => {
|
||||
const customRepositories = (
|
||||
options as ModulesSdkTypes.ModuleServiceInitializeCustomDataLayerOptions
|
||||
)?.repositories
|
||||
|
||||
container.register({
|
||||
promotionService: asClass(defaultServices.PromotionService).singleton(),
|
||||
promotionRuleService: asClass(
|
||||
defaultServices.PromotionRuleService
|
||||
).singleton(),
|
||||
promotionRuleValueService: asClass(
|
||||
defaultServices.PromotionRuleValueService
|
||||
).singleton(),
|
||||
applicationMethodService: asClass(
|
||||
defaultServices.ApplicationMethodService
|
||||
).singleton(),
|
||||
campaignService: asClass(defaultServices.CampaignService).singleton(),
|
||||
campaignBudgetService: asClass(
|
||||
defaultServices.CampaignBudgetService
|
||||
).singleton(),
|
||||
})
|
||||
|
||||
if (customRepositories) {
|
||||
loadCustomRepositories({
|
||||
defaultRepositories,
|
||||
customRepositories,
|
||||
container,
|
||||
})
|
||||
} else {
|
||||
loadDefaultRepositories({ container })
|
||||
}
|
||||
}
|
||||
|
||||
function loadDefaultRepositories({ container }) {
|
||||
container.register({
|
||||
baseRepository: asClass(defaultRepositories.BaseRepository).singleton(),
|
||||
applicationMethodRepository: asClass(
|
||||
defaultRepositories.ApplicationMethodRepository
|
||||
).singleton(),
|
||||
promotionRepository: asClass(
|
||||
defaultRepositories.PromotionRepository
|
||||
).singleton(),
|
||||
promotionRuleRepository: asClass(
|
||||
defaultRepositories.PromotionRuleRepository
|
||||
).singleton(),
|
||||
promotionRuleValueRepository: asClass(
|
||||
defaultRepositories.PromotionRuleValueRepository
|
||||
).singleton(),
|
||||
campaignRepository: asClass(
|
||||
defaultRepositories.CampaignRepository
|
||||
).singleton(),
|
||||
campaignBudgetRepository: asClass(
|
||||
defaultRepositories.CampaignBudgetRepository
|
||||
).singleton(),
|
||||
})
|
||||
}
|
||||
export default ModulesSdkUtils.moduleContainerLoaderFactory({
|
||||
moduleModels: ModuleModels,
|
||||
moduleRepositories: ModuleRepositories,
|
||||
moduleServices: ModuleServices,
|
||||
})
|
||||
@@ -1,16 +0,0 @@
|
||||
import { DALUtils } from "@medusajs/utils"
|
||||
import { ApplicationMethod } from "@models"
|
||||
import { CreateApplicationMethodDTO, UpdateApplicationMethodDTO } from "@types"
|
||||
|
||||
export class ApplicationMethodRepository extends DALUtils.mikroOrmBaseRepositoryFactory<
|
||||
ApplicationMethod,
|
||||
{
|
||||
create: CreateApplicationMethodDTO
|
||||
update: UpdateApplicationMethodDTO
|
||||
}
|
||||
>(ApplicationMethod) {
|
||||
constructor(...args: any[]) {
|
||||
// @ts-ignore
|
||||
super(...arguments)
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
import { DALUtils } from "@medusajs/utils"
|
||||
import { CampaignBudget } from "@models"
|
||||
import { CreateCampaignBudgetDTO, UpdateCampaignBudgetDTO } from "@types"
|
||||
|
||||
export class CampaignBudgetRepository extends DALUtils.mikroOrmBaseRepositoryFactory<
|
||||
CampaignBudget,
|
||||
{
|
||||
create: CreateCampaignBudgetDTO
|
||||
update: UpdateCampaignBudgetDTO
|
||||
}
|
||||
>(CampaignBudget) {}
|
||||
@@ -1,7 +1,2 @@
|
||||
export { MikroOrmBaseRepository as BaseRepository } from "@medusajs/utils"
|
||||
export { ApplicationMethodRepository } from "./application-method"
|
||||
export { CampaignRepository } from "./campaign"
|
||||
export { CampaignBudgetRepository } from "./campaign-budget"
|
||||
export { PromotionRepository } from "./promotion"
|
||||
export { PromotionRuleRepository } from "./promotion-rule"
|
||||
export { PromotionRuleValueRepository } from "./promotion-rule-value"
|
||||
@@ -1,19 +0,0 @@
|
||||
import { DALUtils } from "@medusajs/utils"
|
||||
import { PromotionRuleValue } from "@models"
|
||||
import {
|
||||
CreatePromotionRuleValueDTO,
|
||||
UpdatePromotionRuleValueDTO,
|
||||
} from "@types"
|
||||
|
||||
export class PromotionRuleValueRepository extends DALUtils.mikroOrmBaseRepositoryFactory<
|
||||
PromotionRuleValue,
|
||||
{
|
||||
create: CreatePromotionRuleValueDTO
|
||||
update: UpdatePromotionRuleValueDTO
|
||||
}
|
||||
>(PromotionRuleValue) {
|
||||
constructor(...args: any[]) {
|
||||
// @ts-ignore
|
||||
super(...arguments)
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import { DALUtils } from "@medusajs/utils"
|
||||
import { PromotionRule } from "@models"
|
||||
import { CreatePromotionRuleDTO, UpdatePromotionRuleDTO } from "@types"
|
||||
|
||||
export class PromotionRuleRepository extends DALUtils.mikroOrmBaseRepositoryFactory<
|
||||
PromotionRule,
|
||||
{
|
||||
create: CreatePromotionRuleDTO
|
||||
update: UpdatePromotionRuleDTO
|
||||
}
|
||||
>(PromotionRule) {
|
||||
constructor(...args: any[]) {
|
||||
// @ts-ignore
|
||||
super(...arguments)
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import { DALUtils } from "@medusajs/utils"
|
||||
import { Promotion } from "@models"
|
||||
import { CreatePromotionDTO, UpdatePromotionDTO } from "@types"
|
||||
|
||||
export class PromotionRepository extends DALUtils.mikroOrmBaseRepositoryFactory<
|
||||
Promotion,
|
||||
{
|
||||
create: CreatePromotionDTO
|
||||
Update: UpdatePromotionDTO
|
||||
}
|
||||
>(Promotion) {
|
||||
constructor(...args: any[]) {
|
||||
// @ts-ignore
|
||||
super(...arguments)
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
export default (async () => {
|
||||
const { revertMigration } = await import("../migration-down")
|
||||
const { config } = await import("dotenv")
|
||||
config()
|
||||
await revertMigration()
|
||||
})()
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
export default (async () => {
|
||||
const { runMigrations } = await import("../migration-up")
|
||||
const { config } = await import("dotenv")
|
||||
config()
|
||||
await runMigrations()
|
||||
})()
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { EOL } from "os"
|
||||
import { run } from "../seed"
|
||||
|
||||
const args = process.argv
|
||||
const path = args.pop() as string
|
||||
|
||||
export default (async () => {
|
||||
const { config } = await import("dotenv")
|
||||
config()
|
||||
if (!path) {
|
||||
throw new Error(
|
||||
`filePath is required.${EOL}Example: medusa-promotion-seed <filePath>`
|
||||
)
|
||||
}
|
||||
|
||||
await run({ path })
|
||||
})()
|
||||
@@ -1,2 +0,0 @@
|
||||
export * from "./migration-up"
|
||||
export * from "./migration-down"
|
||||
@@ -1,43 +0,0 @@
|
||||
import { Modules } from "@medusajs/modules-sdk"
|
||||
import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types"
|
||||
import { DALUtils, ModulesSdkUtils } from "@medusajs/utils"
|
||||
import { EntitySchema } from "@mikro-orm/core"
|
||||
import * as PromotionModels from "@models"
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
export async function revertMigration({
|
||||
options,
|
||||
logger,
|
||||
}: Pick<
|
||||
LoaderOptions<ModulesSdkTypes.ModuleServiceInitializeOptions>,
|
||||
"options" | "logger"
|
||||
> = {}) {
|
||||
logger ??= console as unknown as Logger
|
||||
|
||||
const dbData = ModulesSdkUtils.loadDatabaseConfig(Modules.PROMOTION, options)!
|
||||
const entities = Object.values(PromotionModels) as unknown as EntitySchema[]
|
||||
const pathToMigrations = __dirname + "/../migrations"
|
||||
|
||||
const orm = await DALUtils.mikroOrmCreateConnection(
|
||||
dbData,
|
||||
entities,
|
||||
pathToMigrations
|
||||
)
|
||||
|
||||
try {
|
||||
const migrator = orm.getMigrator()
|
||||
await migrator.down()
|
||||
|
||||
logger?.info("Promotion module migration executed")
|
||||
} catch (error) {
|
||||
logger?.error(`Promotion module migration failed to run - Error: ${error}`)
|
||||
}
|
||||
|
||||
await orm.close()
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
import { Modules } from "@medusajs/modules-sdk"
|
||||
import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types"
|
||||
import { DALUtils, ModulesSdkUtils } from "@medusajs/utils"
|
||||
import { EntitySchema } from "@mikro-orm/core"
|
||||
import * as PromotionModels from "@models"
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
export async function runMigrations({
|
||||
options,
|
||||
logger,
|
||||
}: Pick<
|
||||
LoaderOptions<ModulesSdkTypes.ModuleServiceInitializeOptions>,
|
||||
"options" | "logger"
|
||||
> = {}) {
|
||||
logger ??= console as unknown as Logger
|
||||
|
||||
const dbData = ModulesSdkUtils.loadDatabaseConfig(Modules.PROMOTION, options)!
|
||||
const entities = Object.values(PromotionModels) as unknown as EntitySchema[]
|
||||
const pathToMigrations = __dirname + "/../migrations"
|
||||
|
||||
const orm = await DALUtils.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("Promotion module migration executed")
|
||||
} catch (error) {
|
||||
logger.error(`Promotion module migration failed to run - Error: ${error}`)
|
||||
}
|
||||
|
||||
await orm.close()
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
import { Modules } from "@medusajs/modules-sdk"
|
||||
import { LoaderOptions, Logger, ModulesSdkTypes } from "@medusajs/types"
|
||||
import { DALUtils, ModulesSdkUtils } from "@medusajs/utils"
|
||||
import { EntitySchema } from "@mikro-orm/core"
|
||||
import * as PromotionModels from "@models"
|
||||
import { EOL } from "os"
|
||||
import { resolve } from "path"
|
||||
|
||||
export async function run({
|
||||
options,
|
||||
logger,
|
||||
path,
|
||||
}: Partial<
|
||||
Pick<
|
||||
LoaderOptions<ModulesSdkTypes.ModuleServiceInitializeOptions>,
|
||||
"options" | "logger"
|
||||
>
|
||||
> & {
|
||||
path: string
|
||||
}) {
|
||||
logger ??= console as unknown as Logger
|
||||
|
||||
logger.info(`Loading seed data from ${path}...`)
|
||||
|
||||
const { promotionsData } = 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: promotionsData.${EOL}${e}`
|
||||
)
|
||||
throw e
|
||||
}
|
||||
)
|
||||
|
||||
const dbData = ModulesSdkUtils.loadDatabaseConfig(Modules.PROMOTION, options)!
|
||||
const entities = Object.values(PromotionModels) as unknown as EntitySchema[]
|
||||
const pathToMigrations = __dirname + "/../migrations"
|
||||
|
||||
const orm = await DALUtils.mikroOrmCreateConnection(
|
||||
dbData,
|
||||
entities,
|
||||
pathToMigrations
|
||||
)
|
||||
|
||||
const manager = orm.em.fork()
|
||||
|
||||
try {
|
||||
logger.info("Inserting promotions..")
|
||||
|
||||
// TODO: implement promotions seed data
|
||||
// await createPromotions(manager, promotionsData)
|
||||
} catch (e) {
|
||||
logger.error(
|
||||
`Failed to insert the seed data in the PostgreSQL database ${dbData.clientUrl}.${EOL}${e}`
|
||||
)
|
||||
}
|
||||
|
||||
await orm.close(true)
|
||||
}
|
||||
@@ -10,3 +10,4 @@ export * from "./campaign-budget"
|
||||
export * from "./promotion"
|
||||
export * from "./promotion-rule"
|
||||
export * from "./promotion-rule-value"
|
||||
export * from "./repositories"
|
||||
@@ -0,0 +1,91 @@
|
||||
import {
|
||||
ApplicationMethod,
|
||||
Campaign,
|
||||
CampaignBudget,
|
||||
Promotion,
|
||||
PromotionRule,
|
||||
PromotionRuleValue,
|
||||
} from "@models"
|
||||
import { DAL } from "@medusajs/types"
|
||||
import {
|
||||
CreateApplicationMethodDTO,
|
||||
UpdateApplicationMethodDTO,
|
||||
} from "./application-method"
|
||||
import { CreateCampaignDTO, UpdateCampaignDTO } from "./campaign"
|
||||
import {
|
||||
CreateCampaignBudgetDTO,
|
||||
UpdateCampaignBudgetDTO,
|
||||
} from "./campaign-budget"
|
||||
import { CreatePromotionDTO, UpdatePromotionDTO } from "./promotion"
|
||||
import {
|
||||
CreatePromotionRuleDTO,
|
||||
UpdatePromotionRuleDTO,
|
||||
} from "./promotion-rule"
|
||||
import {
|
||||
CreatePromotionRuleValueDTO,
|
||||
UpdatePromotionRuleValueDTO,
|
||||
} from "./promotion-rule-value"
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface IApplicationMethodRepository<
|
||||
TEntity extends ApplicationMethod = ApplicationMethod
|
||||
> extends DAL.RepositoryService<
|
||||
TEntity,
|
||||
{
|
||||
create: CreateApplicationMethodDTO
|
||||
update: UpdateApplicationMethodDTO
|
||||
}
|
||||
> {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface ICampaignRepository<TEntity extends Campaign = Campaign>
|
||||
extends DAL.RepositoryService<
|
||||
TEntity,
|
||||
{
|
||||
create: CreateCampaignDTO
|
||||
update: UpdateCampaignDTO
|
||||
}
|
||||
> {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface ICampaignBudgetRepository<
|
||||
TEntity extends CampaignBudget = CampaignBudget
|
||||
> extends DAL.RepositoryService<
|
||||
TEntity,
|
||||
{
|
||||
create: CreateCampaignBudgetDTO
|
||||
update: UpdateCampaignBudgetDTO
|
||||
}
|
||||
> {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface IPromotionRepository<TEntity extends Promotion = Promotion>
|
||||
extends DAL.RepositoryService<
|
||||
TEntity,
|
||||
{
|
||||
create: CreatePromotionDTO
|
||||
Update: UpdatePromotionDTO
|
||||
}
|
||||
> {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface IPromotionRuleRepository<
|
||||
TEntity extends PromotionRule = PromotionRule
|
||||
> extends DAL.RepositoryService<
|
||||
TEntity,
|
||||
{
|
||||
create: CreatePromotionRuleDTO
|
||||
update: UpdatePromotionRuleDTO
|
||||
}
|
||||
> {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface IPromotionRuleValueRepository<
|
||||
TEntity extends PromotionRuleValue = PromotionRuleValue
|
||||
> extends DAL.RepositoryService<
|
||||
TEntity,
|
||||
{
|
||||
create: CreatePromotionRuleValueDTO
|
||||
update: UpdatePromotionRuleValueDTO
|
||||
}
|
||||
> {}
|
||||
Reference in new issue
Block a user