chore: Hide repository creation if they are not custom + add upsert support by default (#6127)

This commit is contained in:
Adrien de Peretti authored and GitHub committed 2024-01-19 15:09:38 +01:00
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)
})
-2
View File
@@ -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": {
+16 -1
View File
@@ -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"
+9 -69
View File
@@ -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 })
})()
-2
View File
@@ -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()
}
-58
View File
@@ -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)
}
+1
View File
@@ -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
}
> {}