Skip to content

Commit bfe4187

Browse files
authored
1667 personal data eraser timeout with sorting (#1668)
1 parent 9d35653 commit bfe4187

File tree

2 files changed

+32
-38
lines changed

2 files changed

+32
-38
lines changed

packages/personal-data-erasure/src/main.js

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type {
1919
Client,
2020
ClientRequest,
2121
ClientResponse,
22+
SuccessResult,
2223
ServiceBuilderInstance,
2324
MethodType,
2425
ClientResult,
@@ -161,7 +162,7 @@ export default class PersonalDataErasure {
161162
)
162163
}
163164

164-
deleteAll(customerId: string): Promise<Array<AllData>> {
165+
async deleteAll(customerId: string): Promise<void> {
165166
if (!customerId) throw Error('missing `customerId` argument')
166167
this.logger.info('Starting deletion')
167168

@@ -194,45 +195,38 @@ export default class PersonalDataErasure {
194195
.build(),
195196
builder: requestBuilder.reviews,
196197
}
197-
198198
const resourcesToDelete = [
199-
customersResource,
199+
reviewsResource,
200+
shoppingListsResource,
200201
ordersResource,
201202
paymentsResource,
202-
shoppingListsResource,
203-
reviewsResource,
203+
customersResource,
204204
]
205-
206-
return Promise.all(
207-
resourcesToDelete.map(
208-
(resource: {
209-
uri: string,
210-
builder: ServiceBuilderInstance,
211-
}): Promise<AllData> => {
212-
const request = PersonalDataErasure.buildRequest(resource.uri, 'GET')
213-
214-
return this.client.process(
215-
request,
216-
(response: ClientResponse): Promise<void> => {
217-
if (response.statusCode !== 200 && response.statusCode !== 404)
218-
return Promise.reject(
219-
Error(`Request returned status code ${response.statusCode}`)
220-
)
221-
if (response.statusCode === 200)
222-
this._deleteOne(response, resource.builder)
223-
return Promise.resolve()
224-
},
225-
{ accumulate: true }
205+
for (let i = 0; i < resourcesToDelete.length; i += 1) {
206+
const resource = resourcesToDelete[i]
207+
let continueProcessing = true
208+
while (continueProcessing) {
209+
const request = PersonalDataErasure.buildRequest(resource.uri, 'GET')
210+
/* eslint-disable no-await-in-loop */
211+
const response = await this.client.execute(request)
212+
if (response.statusCode !== 200 && response.statusCode !== 404)
213+
return Promise.reject(
214+
Error(`Request returned status code ${response.statusCode}`)
226215
)
227-
}
228-
)
229-
)
216+
if (response.body && response.body.results.length < 20)
217+
continueProcessing = false
218+
if (response.statusCode === 200)
219+
await this._deleteOne(response, resource.builder)
220+
/* eslint-enable no-await-in-loop */
221+
}
222+
}
223+
return Promise.resolve()
230224
}
231225

232-
_deleteOne(response: ClientResponse, builder: ServiceBuilderInstance) {
226+
async _deleteOne(response: SuccessResult, builder: ServiceBuilderInstance) {
233227
const results = response.body ? response.body.results : []
234228
if (results.length > 0) {
235-
Promise.all(
229+
await Promise.all(
236230
results.map((result: AllData): Promise<ClientResult> => {
237231
const deleteRequest = PersonalDataErasure.buildDeleteRequest(
238232
result,

packages/personal-data-erasure/test/main.spec.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,8 @@ describe('PersonalDataErasure', () => {
154154
results: [],
155155
},
156156
}
157-
personalDataErasure.client.process = jest.fn(
158-
async (request, callback) => {
159-
await callback(payload)
160-
}
157+
personalDataErasure.client.execute = jest.fn(() =>
158+
Promise.resolve(payload)
161159
)
162160
})
163161

@@ -167,9 +165,9 @@ describe('PersonalDataErasure', () => {
167165
).rejects.toThrowErrorMatchingSnapshot())
168166
})
169167
test('should throw error if no customerID is passed', () => {
170-
expect(() =>
168+
return expect(
171169
personalDataErasure.deleteAll()
172-
).toThrowErrorMatchingSnapshot()
170+
).rejects.toThrowErrorMatchingSnapshot()
173171
})
174172
})
175173

@@ -239,7 +237,9 @@ describe('PersonalDataErasure', () => {
239237
results: [],
240238
},
241239
}
242-
expect(personalDataErasure._deleteOne(payload)).toBeFalsy()
240+
return expect(
241+
personalDataErasure._deleteOne(payload)
242+
).resolves.toBeFalsy()
243243
})
244244
})
245245
})

0 commit comments

Comments
 (0)