@@ -383,6 +383,62 @@ class UserService {
383
383
return this . dao . withTransaction ( dao => callback ( new UserService ( dao ) ) ) ;
384
384
}
385
385
386
+ public async rebuild ( ) {
387
+ const nats = await NatsService . get ( ) ;
388
+
389
+ await this . transaction ( async tsx => {
390
+ await tsx . dao . clear ( ) ;
391
+ await nats . fetch ( "members.*" , async msg => {
392
+ const data = msg . json ( ) ;
393
+ await tsx . handleMessage ( data , msg ) ;
394
+ } ) ;
395
+ } ) ;
396
+ }
397
+
398
+ public async handleMessage ( pEvent : unknown , msg : JsMsg ) {
399
+ const event = UserEvent . parse ( pEvent ) ;
400
+
401
+ const userId = parseInt ( msg . subject . split ( "." ) [ 1 ] , 10 ) ;
402
+
403
+ if ( event . type === "set" ) {
404
+ // Parsitaan käyttäjän ID viestin subjektista, joka on muotoa `members.{id}`.
405
+
406
+ if ( event . fields . created ) {
407
+ event . fields . created = new Date ( event . fields . created ) ;
408
+ }
409
+
410
+ if ( event . fields . registration_ban_bypass_until ) {
411
+ event . fields . registration_ban_bypass_until = new Date ( event . fields . registration_ban_bypass_until ) ;
412
+ }
413
+
414
+ // Päivitetään muokkausviestin mukaiset arvot tietokantaan.
415
+ await this . dao . update ( userId , event . fields ) ;
416
+ } else if ( event . type === "create" || event . type === "import" ) {
417
+ if ( event . fields . created ) {
418
+ event . fields . created = new Date ( event . fields . created ) ;
419
+ }
420
+
421
+ if ( event . fields . modified ) {
422
+ event . fields . modified = new Date ( event . fields . modified ) ;
423
+ }
424
+
425
+ await this . dao . save ( {
426
+ ...event . fields ,
427
+ id : userId ,
428
+ last_seq : msg . seq ,
429
+ } ) ;
430
+
431
+ return ;
432
+ } else if ( event . type === "delete" ) {
433
+ await this . dao . remove ( userId ) ;
434
+ return ;
435
+ }
436
+
437
+ // Tallennetaan tietokantaan tieto siitä, että olemme käsitelleet tämän viestin,
438
+ // vaikka viesti ei olisikaan meille relevantti.
439
+ await this . dao . update ( userId , { last_seq : msg . seq } ) ;
440
+ }
441
+
386
442
/**
387
443
* Taustaprosessi, joka kuuntelee jäsentieto-streamiin julkaistuja viestejä
388
444
* ja käsittelee ne.
@@ -393,52 +449,7 @@ class UserService {
393
449
this . abortSignal = new ConsumerAbortSignal ( ) ;
394
450
395
451
return new Promise < void > ( resolve => {
396
- const handler = async ( pEvent : unknown , msg : JsMsg ) => {
397
- const event = UserEvent . parse ( pEvent ) ;
398
-
399
- const userId = parseInt ( msg . subject . split ( "." ) [ 1 ] , 10 ) ;
400
-
401
- if ( event . type === "set" ) {
402
- // Parsitaan käyttäjän ID viestin subjektista, joka on muotoa `members.{id}`.
403
-
404
- if ( event . fields . created ) {
405
- // Tämä piti tehdä jostain syystä. Syyttäkää user-serviceä älkääkä NATSia.
406
- event . fields . created = new Date ( event . fields . created ) ;
407
- }
408
-
409
- if ( event . fields . registration_ban_bypass_until ) {
410
- event . fields . registration_ban_bypass_until = new Date ( event . fields . registration_ban_bypass_until ) ;
411
- }
412
-
413
- // Päivitetään muokkausviestin mukaiset arvot tietokantaan.
414
- await this . dao . update ( userId , event . fields ) ;
415
- } else if ( event . type === "create" || event . type === "import" ) {
416
- if ( event . fields . created ) {
417
- event . fields . created = new Date ( event . fields . created ) ;
418
- }
419
-
420
- if ( event . fields . modified ) {
421
- event . fields . modified = new Date ( event . fields . modified ) ;
422
- }
423
-
424
- await this . dao . save ( {
425
- ...event . fields ,
426
- id : userId ,
427
- last_seq : msg . seq ,
428
- } ) ;
429
-
430
- return ;
431
- } else if ( event . type === "delete" ) {
432
- await this . dao . remove ( userId ) ;
433
- return ;
434
- }
435
-
436
- // Tallennetaan tietokantaan tieto siitä, että olemme käsitelleet tämän viestin,
437
- // vaikka viesti ei olisikaan meille relevantti.
438
- await this . dao . update ( userId , { last_seq : msg . seq } ) ;
439
- } ;
440
-
441
- nats . subscribe ( handler , {
452
+ nats . subscribe ( this . handleMessage . bind ( this ) , {
442
453
onReady : ( ) => resolve ( ) ,
443
454
signal : this . abortSignal ,
444
455
} ) ;
0 commit comments