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:
committed by
GitHub
parent
d814d9540e
commit
b42f151be3
@@ -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: [
|
||||
|
||||
@@ -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([[], {}]),
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user