@@ -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 ,
0 commit comments