chore(): Improve internal repository delete algo (#11601)

* chore(): Improve internal repository delete algo

* chore(): Improve internal repository delete algo

* chore(): Improve internal repository delete algo

* update tests

* Create purple-donkeys-learn.md

* update tests
This commit is contained in:
Adrien de Peretti
2025-02-25 19:59:57 +01:00
committed by GitHub
parent d814d9540e
commit b42f151be3
14 changed files with 89 additions and 82 deletions

View File

@@ -267,12 +267,7 @@ describe("Internal Module Service Factory", () => {
})
it("should delete entities successfully", async () => {
const entitiesToDelete = [{ id: "1", name: "Item" }]
containerMock[modelRepositoryName].find.mockResolvedValueOnce(
entitiesToDelete
)
await instance.delete({ selector: {} })
await instance.delete({ selector: { id: "1" } })
expect(containerMock[modelRepositoryName].delete).toHaveBeenCalledWith(
{
$or: [

View File

@@ -29,21 +29,21 @@ describe("Abstract Module Service Factory", () => {
mainModelMockService: {
retrieve: jest.fn().mockResolvedValue({ id: "1", name: "Item" }),
list: jest.fn().mockResolvedValue([{ id: "1", name: "Item" }]),
delete: jest.fn().mockResolvedValue(undefined),
delete: jest.fn().mockResolvedValue([]),
softDelete: jest.fn().mockResolvedValue([[], {}]),
restore: jest.fn().mockResolvedValue([[], {}]),
},
otherModelMock1Service: {
retrieve: jest.fn().mockResolvedValue({ id: "1", name: "Item" }),
list: jest.fn().mockResolvedValue([{ id: "1", name: "Item" }]),
delete: jest.fn().mockResolvedValue(undefined),
delete: jest.fn().mockResolvedValue([]),
softDelete: jest.fn().mockResolvedValue([[], {}]),
restore: jest.fn().mockResolvedValue([[], {}]),
},
otherModelMock2Service: {
retrieve: jest.fn().mockResolvedValue({ id: "1", name: "Item" }),
list: jest.fn().mockResolvedValue([{ id: "1", name: "Item" }]),
delete: jest.fn().mockResolvedValue(undefined),
delete: jest.fn().mockResolvedValue([]),
softDelete: jest.fn().mockResolvedValue([[], {}]),
restore: jest.fn().mockResolvedValue([[], {}]),
},

View File

@@ -367,16 +367,16 @@ export function MedusaInternalService<
)
}
delete(idOrSelector: string, sharedContext?: Context): Promise<void>
delete(idOrSelector: string[], sharedContext?: Context): Promise<void>
delete(idOrSelector: object, sharedContext?: Context): Promise<void>
delete(idOrSelector: object[], sharedContext?: Context): Promise<void>
delete(idOrSelector: string, sharedContext?: Context): Promise<string[]>
delete(idOrSelector: string[], sharedContext?: Context): Promise<string[]>
delete(idOrSelector: object, sharedContext?: Context): Promise<string[]>
delete(idOrSelector: object[], sharedContext?: Context): Promise<string[]>
delete(
idOrSelector: {
selector: FilterQuery<any> | BaseFilterable<FilterQuery<any>>
},
sharedContext?: Context
): Promise<void>
): Promise<string[]>
@InjectTransactionManager(propertyRepositoryName)
async delete(
@@ -389,12 +389,12 @@ export function MedusaInternalService<
selector: FilterQuery<any> | BaseFilterable<FilterQuery<any>>
},
@MedusaContext() sharedContext: Context = {}
): Promise<void> {
): Promise<string[]> {
if (
!isDefined(idOrSelector) ||
(Array.isArray(idOrSelector) && !idOrSelector.length)
) {
return
return []
}
const primaryKeys = AbstractService_.retrievePrimaryKeys(model)
@@ -420,21 +420,7 @@ export function MedusaInternalService<
}
if (isObject(idOrSelector) && "selector" in idOrSelector) {
const entitiesToDelete = await this.list(
idOrSelector.selector as FilterQuery<any>,
{
select: primaryKeys,
},
sharedContext
)
for (const entity of entitiesToDelete) {
const criteria = {}
primaryKeys.forEach((key) => {
criteria[key] = entity[key]
})
deleteCriteria.$or.push(criteria)
}
deleteCriteria.$or.push(idOrSelector.selector)
} else {
const primaryKeysValues = Array.isArray(idOrSelector)
? idOrSelector
@@ -451,34 +437,18 @@ export function MedusaInternalService<
criteria[primaryKeys[0]] = primaryKeyValue
}
// TODO: Revisit
/*primaryKeys.forEach((key) => {
/!*if (
isObject(primaryKeyValue) &&
!isDefined(primaryKeyValue[key]) &&
// primaryKeys.length > 1
) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`Composite key must contain all primary key fields: ${primaryKeys.join(
", "
)}. Found: ${Object.keys(primaryKeyValue)}`
)
}*!/
criteria[key] = isObject(primaryKeyValue)
? primaryKeyValue[key]
: primaryKeyValue
})*/
return criteria
})
}
if (!deleteCriteria.$or.length) {
return
return []
}
await this[propertyRepositoryName].delete(deleteCriteria, sharedContext)
return await this[propertyRepositoryName].delete(
deleteCriteria,
sharedContext
)
}
@InjectTransactionManager(propertyRepositoryName)

View File

@@ -277,18 +277,16 @@ export function MedusaService<
? primaryKeyValues
: [primaryKeyValues]
await this.__container__[serviceRegistrationName].delete(
const ids = await this.__container__[serviceRegistrationName].delete(
primaryKeyValues_,
sharedContext
)
primaryKeyValues_.map((primaryKeyValue) =>
ids.map((id) =>
klassPrototype.aggregatedEvents.bind(this)({
action: CommonEvents.DELETED,
object: camelToSnakeCase(modelName).toLowerCase(),
data: isString(primaryKeyValue)
? { id: primaryKeyValue }
: primaryKeyValue,
data: isString(id) ? { id: id } : id,
context: sharedContext,
})
)