# 2024-01-15 MABS-RI+ Sequence Diagram # 1. Create Campaign & SSO ## Pseudo Flow - Use Form POST with jwtToken in PostBody - MerchantAdvBooking System -- Form POST: `/user/transfer` with Body: `{"token": ${jwt}}` --> Radica System - Details: refer to the SSO Diagram - Transfer Endpoint API Stub: Provided by Radica Dev Team ## JWT Spec ### Header ```json { "alg": "RS256", "typ": "JWT" } ``` ### Payload ```jsonc { "iss": "hktv-edms", "sub": "edms-ri-sso", "username": "mabs-merchant-user", // Created by RI+ User API "iat": ${now_time}, "exp": ${now_time + 120s}, // 120 sec expired } ``` - Need to put campaign id in order to open the campaign page after login? ### JWT Example - Keys: (HKTV-EDM owned the private key) - *RSA Public key should be given in offline at this moment* - May consider to use jwks endpoint in the future ``` -----BEGIN RSA PRIVATE KEY----- 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 -----END RSA PRIVATE KEY----- ``` - JWT generated by above key: ``` eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJoa3R2LWVkbXMiLCJzdWIiOiJlZG1zLXJpLXNzbyIsInVzZXJuYW1lIjoibWFicy1tZXJjaGFudC11c2VyIiwiaWF0IjoxNzA1MzkzOTkxLCJleHAiOjE3MDUzOTQxMTEsImFjY2Vzc190b2tlbiI6Inh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4In0.GFwSOA9Kwtsoc3PaAIer1wfbbOSIH-Arem-2TfR-7Dclo3P0WKtfEqSsilenX0GozDNJHFFoFNTViPCPb0Dyx1CSy2YxYCIDlO8NOaq6bb3RIXAYxLkWaqQu9J5DVoWXuf9YWzwNDXM4TQm6cuuWAcKR2ML20ot4WGziKhY4Ab85UdwCrSMgE2tps2Bs0bZzHxCtIyiVT5eWzpDW9j5qCnawpNhAvbpaGMjhvi1tcWuThs268eub7vHDpKfDPsNmBR74aJYSA4qu_R6s2KFJJzBg7PuKp0qoVnjq9I-ifC9VNXVQfq5ltx_9-gh7sUDugELAZpJJWXgOytJNH2XG2gE5Nk-hBNYAUPzGRvXc8U1qPzp-VtTOFdsnoTFQiOwejk8YGZ-M0Xf2pHVGZ92Ane0s_CvbgpyXso5I3ghXyLl3MqDppXUTnQTSJjf-stNqq5d_vp_0BsSeOPMEqFj_Gei1OwFcdfmnERpWVijP5R5MVQ9d1yNfED8NLHA_mQML ``` ## Flow Diagram (Merchant: Create User & SSO Login) ```mermaid sequenceDiagram box green HKTV participant HKTV-MABS Web participant HKTV-MABS participant HKTV-EDM end box blue Radica participant RADICA-RI participant RADICA-RI Web end rect rgb(100,100,100) note right of HKTV-MABS Web: Create a EDM Booking HKTV-MABS Web ->> HKTV-MABS: Create EDM Booking HKTV-MABS ->>+ HKTV-EDM: Request Create Campaign <br/> by User & StoreCode & RefId note over HKTV-EDM: Check if Radica Division exists for Store alt is Division NotExist HKTV-EDM ->>+ RADICA-RI: Create Division RADICA-RI ->>- HKTV-EDM: Return Division end note over HKTV-EDM: Check if Radica User Account exists for Merchant alt is User NotExist HKTV-EDM ->>+ RADICA-RI: Create User RADICA-RI ->>- HKTV-EDM: Return User end note over HKTV-EDM: Check if Radica User Account is Under Division alt is User NotUnderDivision HKTV-EDM ->>+ RADICA-RI: Update User Division RADICA-RI ->>- HKTV-EDM: Return User end HKTV-EDM ->>+ RADICA-RI: Create Campaign <br/> by (Division=StoreCode & RefId) RADICA-RI ->>- HKTV-EDM: Return CampaignId note left of HKTV-EDM: Store CampaignInfo By StoreCode & RefId HKTV-EDM ->>- HKTV-MABS: Return booking success HKTV-MABS ->> HKTV-MABS Web: Display Button for Editing / Viewing Campaign in Radica end rect rgb(0,100,100) note right of HKTV-MABS Web: SSO to RI+ Web HKTV-MABS Web ->>+ HKTV-MABS: Press create EDM Template Button <br/> or View Ad Job Status HKTV-MABS ->>+ HKTV-EDM: Request JWT Token to access RI+ (User + RefId) HKTV-EDM ->>- HKTV-MABS: Return JWT HKTV-MABS ->>- HKTV-MABS Web: Return JWT to Client HKTV-MABS Web ->>+ RADICA-RI Web: POST: /user/transfer Body: {token: ${jwt}} RADICA-RI Web ->>+ RADICA-RI: Verify Token Signature RADICA-RI ->>- RADICA-RI Web: Return User Info & User Session note left of RADICA-RI Web: Merchant create their own EDM Template <br/> or View Campaign Status end ``` # 2. Admin SSO ## Sequence Diagram ```mermaid sequenceDiagram box green HKTV participant HKTV-MABS Web participant HKTV-MABS participant HKTV-EDM end box blue Radica participant RADICA-RI participant RADICA-RI Web end rect rgb(100,100,100) note right of HKTV-MABS Web: Admin Login HKTV-MABS Web->>+HKTV-MABS: Admin clicks SSO HKTV-MABS->>+HKTV-EDM: Request JWT Token to access RI+ <br/> (User) note over HKTV-EDM: Check if User Account exists for Admin alt is User NotExist HKTV-EDM ->>+ RADICA-RI: Create User (is_all_division=true) RADICA-RI ->>- HKTV-EDM: Return User end HKTV-EDM ->>- HKTV-MABS: Return JWT HKTV-MABS ->>- HKTV-MABS Web: Return JWT to Client HKTV-MABS Web ->>+ RADICA-RI Web: POST: /user/transfer Body: {token: ${jwt}} RADICA-RI Web ->>+ RADICA-RI: Verify Token Signature RADICA-RI ->>- RADICA-RI Web: Return User Info & User Session note left of RADICA-RI Web: Admin Approve EDM Campaigns <br/> or View Campaign Status end ``` # 3. Sync email list (i.e. customer group) ## Sequence Diagram ```mermaid sequenceDiagram box green HKTV participant HKTV-EDM participant HKTV-datalake end box blue Radica participant RADICA-RI end rect rgb(100,100,100) note right of HKTV-EDM: Get Email list HKTV-EDM->>+HKTV-datalake: Request email list by customer group table_uuid HKTV-datalake->>-HKTV-EDM: Return email list by RabbitMQ <br/> (excluded opt-out emails) HKTV-EDM->>+RADICA-RI: POST contact list end ```