@@ -337,36 +337,16 @@ export class PuppetService extends PUPPET.Puppet {
337
337
}
338
338
339
339
/**
340
- * Huan(202108): consider to use `messagePayloadDirty`, `roomPayloadDirty`
341
- * to replace this `dirtyPayload` method for a clearer design and easy to maintain.
340
+ *
341
+ * Huan(202111) Issue #158 - Refactoring the 'dirty' event, dirtyPayload(),
342
+ * and XXXPayloadDirty() methods logic & spec
343
+ *
344
+ * @see https://github.com/wechaty/puppet/issues/158
345
+ *
342
346
*/
343
347
override async dirtyPayload ( type : PUPPET . type . Payload , id : string ) {
344
348
log . verbose ( 'PuppetService' , 'dirtyPayload(%s, %s)' , type , id )
345
349
346
- await super . dirtyPayload ( type , id )
347
-
348
- switch ( type ) {
349
- case PUPPET . type . Payload . Contact :
350
- await this . payloadStore . contact ?. delete ( id )
351
- break
352
- case PUPPET . type . Payload . Friendship :
353
- // TODO
354
- break
355
- case PUPPET . type . Payload . Message :
356
- // await this.payloadStore.message?.del(id)
357
- // TODO
358
- break
359
- case PUPPET . type . Payload . Room :
360
- await this . payloadStore . room ?. delete ( id )
361
- break
362
- case PUPPET . type . Payload . RoomMember :
363
- await this . payloadStore . roomMember ?. delete ( id )
364
- break
365
- default :
366
- log . error ( 'PuppetService' , 'dirtyPayload(%s) unknown type' , type )
367
- break
368
- }
369
-
370
350
const request = new grpcPuppet . DirtyPayloadRequest ( )
371
351
request . setId ( id )
372
352
request . setType ( type )
@@ -382,6 +362,31 @@ export class PuppetService extends PUPPET.Puppet {
382
362
}
383
363
}
384
364
365
+ /**
366
+ * `onDirty()` is called when the puppet emit `dirty` event.
367
+ * the event listener will be registered in `start()` from the `PuppetAbstract` class
368
+ */
369
+ override onDirty (
370
+ {
371
+ payloadType,
372
+ payloadId,
373
+ } : PUPPET . payload . EventDirty ,
374
+ ) : void {
375
+ log . verbose ( 'PuppetService' , 'onDirty(%s<%s>, %s)' , PUPPET . type . Payload [ payloadType ] , payloadType , payloadId )
376
+
377
+ const dirtyMap = {
378
+ [ PUPPET . type . Payload . Contact ] : async ( id : string ) => this . payloadStore . contact ?. delete ( id ) ,
379
+ [ PUPPET . type . Payload . Friendship ] : async ( _ : string ) => { } ,
380
+ [ PUPPET . type . Payload . Message ] : async ( _ : string ) => { } ,
381
+ [ PUPPET . type . Payload . Room ] : async ( id : string ) => this . payloadStore . room ?. delete ( id ) ,
382
+ [ PUPPET . type . Payload . RoomMember ] : async ( id : string ) => this . payloadStore . roomMember ?. delete ( id ) ,
383
+ [ PUPPET . type . Payload . Unspecified ] : async ( id : string ) => { throw new Error ( 'Unspecified type with id: ' + id ) } ,
384
+ }
385
+
386
+ const dirtyFuncSync = this . wrapAsync ( dirtyMap [ payloadType ] )
387
+ dirtyFuncSync ( payloadId )
388
+ }
389
+
385
390
/**
386
391
*
387
392
* Contact
@@ -1417,14 +1422,15 @@ export class PuppetService extends PUPPET.Puppet {
1417
1422
return response . getMemberIdsList ( )
1418
1423
}
1419
1424
1420
- override async roomMemberRawPayload ( roomId : string , contactId : string ) : Promise < any > {
1425
+ override async roomMemberRawPayload ( roomId : string , contactId : string ) : Promise < PUPPET . payload . RoomMember > {
1421
1426
log . verbose ( 'PuppetService' , 'roomMemberRawPayload(%s, %s)' , roomId , contactId )
1422
1427
1423
- const id = this . payloadStore . roomMemberId ( roomId , contactId )
1424
- const cachedPayload = await this . payloadStore . roomMember ?. get ( id )
1425
- if ( cachedPayload ) {
1426
- log . silly ( 'PuppetService' , 'roomMemberRawPayload(%s) cache HIT' , id )
1427
- return cachedPayload
1428
+ const cachedPayload = await this . payloadStore . roomMember ?. get ( roomId )
1429
+ const cachedRoomMemberPayload = cachedPayload && cachedPayload [ contactId ]
1430
+
1431
+ if ( cachedRoomMemberPayload ) {
1432
+ log . silly ( 'PuppetService' , 'roomMemberRawPayload(%s, %s) cache HIT' , roomId , contactId )
1433
+ return cachedRoomMemberPayload
1428
1434
}
1429
1435
1430
1436
const request = new grpcPuppet . RoomMemberPayloadRequest ( )
@@ -1444,13 +1450,16 @@ export class PuppetService extends PUPPET.Puppet {
1444
1450
roomAlias : response . getRoomAlias ( ) ,
1445
1451
}
1446
1452
1447
- await this . payloadStore . roomMember ?. set ( id , payload )
1448
- log . silly ( 'PuppetService' , 'roomMemberRawPayload(%s) cache SET' , id )
1453
+ await this . payloadStore . roomMember ?. set ( roomId , {
1454
+ ...cachedPayload ,
1455
+ contactId : payload ,
1456
+ } )
1457
+ log . silly ( 'PuppetService' , 'roomMemberRawPayload(%s, %s) cache SET' , roomId , contactId )
1449
1458
1450
1459
return payload
1451
1460
}
1452
1461
1453
- override async roomMemberRawPayloadParser ( payload : any ) : Promise < PUPPET . payload . RoomMember > {
1462
+ override async roomMemberRawPayloadParser ( payload : PUPPET . payload . RoomMember ) : Promise < PUPPET . payload . RoomMember > {
1454
1463
// log.silly('PuppetService', 'roomMemberRawPayloadParser({id:%s})', payload.id)
1455
1464
// passthrough
1456
1465
return payload
0 commit comments