@startuml title "Push Notification Enrollment" hide footbox autonumber "[0] " participant "Client App" as Client << (U, #ccebc5) user >> participant "Orchestration Layer" as Orch << (C, #b3cde3) capital one >> participant "Messaging Server" as MS << (C, #b3cde3) capital one >> note over MS This is where you can put useful information like links to documentation or support processes. end note participant "Notification Subscription Server" as NSS << (C, #b3cde3) capital one >> participant "APNS" as APNS << (E, #fbb4ae) external >> participant "GCM" as GCM << (E, #fbb4ae) external >> ==Customer Action== Client -> Client: First time login, or app upgrade, or user toggles notifications on/off in the app. ==Device Registration== Client -> APNS: If iOS, register device token in APNS Client -> GCM: If Android, register device token in GCM ==Update Messaging Server== Client -> Orch: Update device token Orch -> MS: Get existing subscriptions MS -> Orch: If success, return all Orch -> Orch: Check if device token is present Orch -> MS: If device token is present, stop (skip to next group) Orch -> MS: If device token not present, add subscription note left { "device_token" : "APA91bE_YiasYasbda..." } end note MS -> Orch: Return success/failure ==Update Master Subscription== Orch -> NSS: Register device token NSS -> Orch: Return success/failure Orch -> Orch: Swallow failure Orch -> Client: Return success/failure ==Replicate Subscriptions== Client -> Orch: Update subscriptions Orch -> MS: Update subscriptions MS -> MS: Update subscription in Messaging Server MS -> Orch: Return success/failure Orch -> Orch: Swallow failure Orch -> Client: Return success/failure @enduml