@startuml
participant APIHelper
participant User
participant MealRequestsTable
participant MealRequestDetail
participant Main
participant NearbyUsersMap
participant NearbyUsersFilter
participant FriendProfile
participant FriendsTable
participant CreateMealRequest
MealRequestsTable -> MealRequestDetail : click on meal request
MealRequestDetail -> APIHelper : POST cancel_request
APIHelper -> User : update meal_requests array
User -> MealRequestsTable : update requests table
Main -> NearbyUsersMap : click on "Nearby Users" tab
NearbyUsersMap -> APIHelper : GET nearby_users
APIHelper -> NearbyUsersMap : display nearby users
NearbyUsersMap -> FriendProfile : click on user pin on map
FriendProfile -> APIHelper : GET friend profile
APIHelper -> FriendProfile : display friend profile
FriendProfile -> CreateMealRequest : click on "invite"
FriendProfile -> APIHelper : POST add_user
APIHelper -> User : update friends array
User -> FriendsTable : update friend table
NearbyUsersMap -> NearbyUsersFilter : click on "Filter" button
NearbyUsersFilter -> APIHelper : GET nearby_users_with_filter
APIHelper -> NearbyUsersMap : displayed filtered nearby users
@enduml
SEQUENCE DIAGRAM
6067996904652800
UserUserAppAppFoursquareAPIFoursquareAPIServerServerDatabaseDatabasecheck ingps datalist of venuesuser picks a venuemakePostRequest()checkIn()ResultSetalt[login key is correct]HTTP Response(success:true)[else]HTTP Response(success:false)
SEQUENCE DIAGRAM
6078193425448960
UserUserAppAppFoursquareAPIFoursquareAPIServerServerDatabaseDatabasecheck ingps datalist of venuesuser picks a venuemakePostRequest()checkIn()ResultSetalt[login key is correct]HTTP Response(success:true)[else]HTTP Response(success:false)
@startuml
actor User
User->App:check in
App->FoursquareAPI:gps data
FoursquareAPI-->App:list of venues
App->App:user picks a venue
App->Server:makePostRequest()
Server->Database:checkIn()
Database-->Server:ResultSet
alt login key is correct
Server-->App:HTTP Response(success:true)
else else
Server-->App:HTTP Response(success:false)
end
@enduml
SEQUENCE DIAGRAM
6078193425448960
:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped)seg2:MemorySegment(Mapped):b10-auth:b10-auth:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped)seg2:MemorySegment(Mapped)new/initial config(datasrc cfg)<<construct>>:ConfigurableClientListconfigure(cfg)<<construct>> (cfg):CacheConfig<<construct>>:ZoneTableSegment(Mapped)isWritable()Segment not writablewhen not resetfalsegetStatus()DataSourceStatus[]subscribe tomemmgr groupcommand frommemmgr(datasrc_name,segmentparam)resetMemorySegment(datasrc_name,READ_ONLY,segmentparam)reset(READ_ONLY,segmentparam)<<construct>>seg1:MemorySegment(Mapped)command frommemmgr(datasrc_name,segmentparam)resetMemorySegment(datasrc_name,READ_ONLY,segmentparam)reset(READ_ONLY,segmentparam)<<destroy>><<construct>>seg2:MemorySegment(Mapped)reload(zonename)getCachedZoneWriter(zone_name)isWritable()Segment not writableas it is READ_ONLYfalseCACHE_NOT_WRITABLE
SEQUENCE DIAGRAM
6081862132826112
:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped)seg2:MemorySegment(Mapped):b10-auth:b10-auth:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped)seg2:MemorySegment(Mapped)new/initial config(datasrc cfg)<<construct>>:ConfigurableClientListconfigure(cfg)<<construct>> (cfg):CacheConfig<<construct>>:ZoneTableSegment(Mapped)isWritable()Segment not writablewhen not resetfalsegetStatus()DataSourceStatus[]subscribe tomemmgr groupcommand frommemmgr(datasrc_name,segmentparam)resetMemorySegment(datasrc_name,READ_ONLY,segmentparam)reset(READ_ONLY,segmentparam)<<construct>>seg1:MemorySegment(Mapped)command frommemmgr(datasrc_name,segmentparam)resetMemorySegment(datasrc_name,READ_ONLY,segmentparam)reset(READ_ONLY,segmentparam)<<destroy>><<construct>>seg2:MemorySegment(Mapped)reload(zonename)getCachedZoneWriter(zone_name)isWritable()Segment not writableas it is READ_ONLYfalseCACHE_NOT_WRITABLE
@startuml
autonumber
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
autonumber 15
Bob -> Alice : Another authentication Request
Bob <- Alice : Another authentication Response
autonumber 40 10
Bob -> Alice : Yet another authentication Request
Bob <- Alice : Yet another authentication Response
@enduml
SEQUENCE DIAGRAM
6084542192418816
:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped):ZoneTablela:LoadActionzw:ZoneWriterzd:ZoneDataseg2:MemorySegment(Mapped):b10-memmgr:b10-memmgr:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped)seg2:MemorySegment(Mapped):ZoneTablela:LoadActionzw:ZoneWriterzd:ZoneDatanew/initial config(datasrc cfg)<<construct>>:ConfigurableClientListconfigure(cfg)<<construct>> (cfg):CacheConfig<<construct>>:ZoneTableSegment(Mapped)isWritable()Segment not writablewhen not resetfalsegetStatus()DataSourceStatus[]loop[for each datasrc with mapped segment]resetMemorySegment(datasrc_name,READ_WRITE,segmentparam)reset(READ_WRITE,segmentparam)<<construct>>seg1:MemorySegment(Mapped)<<construct>>:ZoneTablegetZoneTableAccessor(datasrc_name,cache=true)ZoneTableAccessorloop[for each zone given by ZoneTableIterator]getCachedZoneWriter(zone_name)getLoadAction()<<construct>>la:LoadActionla<<construct>> (la)zw:ZoneWriterzwload()(funcall)<<construct>> via helperszd:ZoneDatazdinstall()addZone(zd)NULL (no old data)command tomodules(datasrc_name,segmentparam)ack from allmodulesresetMemorySegment(datasrc_name,READ_WRITE,segmentparam)reset(READ_WRITE,segmentparam)<<destroy>><<construct>>seg2:MemorySegment(Mapped)load zonefor each zonegiven byZoneTableIterator
SEQUENCE DIAGRAM
6087763954761728
:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped):ZoneTablela:LoadActionzw:ZoneWriterzd:ZoneDataseg2:MemorySegment(Mapped):b10-memmgr:b10-memmgr:ConfigurableClientList:CacheConfig:ZoneTableSegment(Mapped)seg1:MemorySegment(Mapped)seg2:MemorySegment(Mapped):ZoneTablela:LoadActionzw:ZoneWriterzd:ZoneDatanew/initial config(datasrc cfg)<<construct>>:ConfigurableClientListconfigure(cfg)<<construct>> (cfg):CacheConfig<<construct>>:ZoneTableSegment(Mapped)isWritable()Segment not writablewhen not resetfalsegetStatus()DataSourceStatus[]loop[for each datasrc with mapped segment]resetMemorySegment(datasrc_name,READ_WRITE,segmentparam)reset(READ_WRITE,segmentparam)<<construct>>seg1:MemorySegment(Mapped)<<construct>>:ZoneTablegetZoneTableAccessor(datasrc_name,cache=true)ZoneTableAccessorloop[for each zone given by ZoneTableIterator]getCachedZoneWriter(zone_name)getLoadAction()<<construct>>la:LoadActionla<<construct>> (la)zw:ZoneWriterzwload()(funcall)<<construct>> via helperszd:ZoneDatazdinstall()addZone(zd)NULL (no old data)command tomodules(datasrc_name,segmentparam)ack from allmodulesresetMemorySegment(datasrc_name,READ_WRITE,segmentparam)reset(READ_WRITE,segmentparam)<<destroy>><<construct>>seg2:MemorySegment(Mapped)load zonefor each zonegiven byZoneTableIterator
@startuml
participant memmgr as ":b10-memmgr"
[-> memmgr: new/initial config\n(datasrc cfg)
activate memmgr
participant list as ":Configurable\nClientList"
create list
memmgr -> list: <<construct>>
memmgr -> list: configure(cfg)
activate list
participant CacheConfig as ":CacheConfig"
create CacheConfig
list -> CacheConfig: <<construct>> (cfg)
participant zt_segment as ":ZoneTable\nSegment\n(Mapped)"
create zt_segment
list -> zt_segment: <<construct>>
list -> zt_segment: isWritable()
activate zt_segment
note over zt_segment: Segment not writable\nwhen not reset
zt_segment --> list: false
deactivate zt_segment
deactivate list
memmgr -> list: getStatus()
activate list
list --> memmgr: DataSourceStatus[]
deactivate list
loop for each datasrc with mapped segment
memmgr -> list: resetMemorySegment\n(datasrc_name,\nREAD_WRITE,\nsegmentparam)
activate list
list -> zt_segment: reset\n(READ_WRITE,\nsegmentparam)
activate zt_segment
participant segment as "seg1:Memory\nSegment\n(Mapped)"
create segment
zt_segment -> segment: <<construct>>
participant segment.2 as "seg2:Memory\nSegment\n(Mapped)"
participant ZoneTable as ":ZoneTable"
create ZoneTable
zt_segment -> ZoneTable: <<construct>>
deactivate zt_segment
deactivate list
memmgr -> list: getZoneTableAccessor\n(datasrc_name,\ncache=true)
activate list
list -> memmgr: ZoneTableAccessor
deactivate list
loop for each zone given by ZoneTableIterator
memmgr -> list: getCachedZoneWriter\n(zone_name)
activate list
list -> CacheConfig: getLoadAction()
activate CacheConfig
participant LoadAction as "la:LoadAction"
create LoadAction
CacheConfig -> LoadAction: <<construct>>
CacheConfig --> list : la
deactivate CacheConfig
participant ZoneWriter as "zw:ZoneWriter"
create ZoneWriter
list -> ZoneWriter: <<construct>> (la)
list --> memmgr: zw
deactivate list
memmgr -> ZoneWriter: load()
activate ZoneWriter
ZoneWriter -> LoadAction: (funcall)
activate LoadAction
participant ZoneData as "zd:ZoneData"
create ZoneData
LoadAction -> ZoneData: <<construct>> via helpers
LoadAction --> ZoneWriter: zd
deactivate LoadAction
deactivate ZoneWriter
memmgr -> ZoneWriter: install()
activate ZoneWriter
ZoneWriter -> ZoneTable: addZone(zd)
activate ZoneTable
ZoneTable --> ZoneWriter: NULL (no old data)
deactivate ZoneTable
deactivate ZoneWriter
end
[<- memmgr: command to\nmodules\n(datasrc_name,\nsegmentparam)
[--> memmgr: ack from all\nmodules
memmgr -> list: resetMemorySegment\n(datasrc_name,\nREAD_WRITE,\nsegmentparam)
activate list
list -> zt_segment: reset\n(READ_WRITE,\nsegmentparam)
activate zt_segment
zt_segment -> segment: <<destroy>>
destroy segment
create segment.2
zt_segment -> segment.2: <<construct>>
deactivate zt_segment
deactivate list
note left of memmgr: load zone\nfor each zone\ngiven by\nZoneTableIterator
end
[<-- memmgr
deactivate memmgr
@enduml
SEQUENCE DIAGRAM
6087763954761728
Transform Jobs Workers (Successful Block Copy or FFmpeg transcoding)OrchestraOrchestraStorageStorageTransformTransformStartup (celeryd -Q queue_name)<< get next transform job from queue >><< next transform job is ... >>concurrency_valuejobs can be threatedsimultaneously (multithreading)alt[if job encoder_name is 'copy']Launch new block copy<< read input media from medias path >><< read block 1/N from input media >><< write block 1/N to output media >><< update job status & statistics ... >><< read block 2/N from input media >><< write block 2/N to output media >><< read block N/N from input media >><< write block N/N to output media >><< end of file >><< update job status & statistics ... >>[job encoder_name is 'ffmpeg' or 'dashcast']Launch new FFmpeg / DashCast instance<< read input media from medias path >><< FFmpeg / DashCast read input media >><< FFmpeg / DashCast write output media >><< update job status & statistics ... >><< FFmpeg / DashCast read input media >><< FFmpeg / DashCast write output media >><< FFmpeg / DashCast read input media >><< FFmpeg / DashCast write output media >><< end of file >><< update job status & statistics ... >>POST /transform/callback {"job_id": "<uuid_of_job>", "status": "SUCCESS"}Set media status=READY into MongoDBOK 200{"status": 200, value="Your work is much appreciated, thanks !"}
SEQUENCE DIAGRAM
6120602737836032
Transform Jobs Workers (Successful Block Copy or FFmpeg transcoding)OrchestraOrchestraStorageStorageTransformTransformStartup (celeryd -Q queue_name)<< get next transform job from queue >><< next transform job is ... >>concurrency_valuejobs can be threatedsimultaneously (multithreading)alt[if job encoder_name is 'copy']Launch new block copy<< read input media from medias path >><< read block 1/N from input media >><< write block 1/N to output media >><< update job status & statistics ... >><< read block 2/N from input media >><< write block 2/N to output media >><< read block N/N from input media >><< write block N/N to output media >><< end of file >><< update job status & statistics ... >>[job encoder_name is 'ffmpeg' or 'dashcast']Launch new FFmpeg / DashCast instance<< read input media from medias path >><< FFmpeg / DashCast read input media >><< FFmpeg / DashCast write output media >><< update job status & statistics ... >><< FFmpeg / DashCast read input media >><< FFmpeg / DashCast write output media >><< FFmpeg / DashCast read input media >><< FFmpeg / DashCast write output media >><< end of file >><< update job status & statistics ... >>POST /transform/callback {"job_id": "<uuid_of_job>", "status": "SUCCESS"}Set media status=READY into MongoDBOK 200{"status": 200, value="Your work is much appreciated, thanks !"}
@startuml
skin BlueModern
title Transform Jobs Workers (Successful Block Copy or FFmpeg transcoding)
'participant "WebUI" as W
participant "Orchestra" as O
participant "Storage" as S
participant "Transform" as T
'participant "Publisher" as P
activate O
T -> T: Startup (celeryd -Q queue_name)
activate T
T -> O: << get next transform job from queue >>
O --> T: << next transform job is ... >>
note right: <b>concurrency_value</b> jobs can be threated\nsimultaneously (multithreading)
alt if job encoder_name is 'copy'
T -> T: Launch new block copy
T -> S: << read input media from medias path >>
activate S
S --> T: << read block 1/N from input media >>
T --> S: << write block 1/N to output media >>
T --> O: << update job status & statistics ... >>
S --> T: << read block 2/N from input media >>
T --> S: << write block 2/N to output media >>
S --> T: << read block N/N from input media >>
T --> S: << write block N/N to output media >>
S --> T: << end of file >>
deactivate S
T --> O: << update job status & statistics ... >>
else job encoder_name is 'ffmpeg' or 'dashcast'
T -> T: Launch new FFmpeg / DashCast instance
T -> S: << read input media from medias path >>
activate S
S --> T: << FFmpeg / DashCast read input media >>
T --> S: << FFmpeg / DashCast write output media >>
T --> O: << update job status & statistics ... >>
S --> T: << FFmpeg / DashCast read input media >>
T --> S: << FFmpeg / DashCast write output media >>
S --> T: << FFmpeg / DashCast read input media >>
T --> S: << FFmpeg / DashCast write output media >>
S --> T: << end of file >>
deactivate S
T --> O: << update job status & statistics ... >>
end
T -> O: POST /transform/callback {"job_id": "<uuid_of_job>", "status": "SUCCESS"}
activate O
O -> O: Set media status=READY into MongoDB
O --> T: <b>OK 200</b> {"status": 200, value="Your work is much appreciated, thanks !"}
deactivate T
deactivate O
@enduml
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
@enduml
SEQUENCE DIAGRAM
6121211817885696
UserUserAppAppServerServerDatabaseDatabaseregistermakePostRequest()registerNewUser()ResultSetalt[email is unique]HTTP Response(success:true)[else]HTTP Response(success:false)
SEQUENCE DIAGRAM
6129861345148928
UserUserAppAppServerServerDatabaseDatabaseregistermakePostRequest()registerNewUser()ResultSetalt[email is unique]HTTP Response(success:true)[else]HTTP Response(success:false)
@startuml
actor User
User->App:register
App->Server:makePostRequest()
Server->Database:registerNewUser()
Database-->Server:ResultSet
alt email is unique
Server-->App:HTTP Response(success:true)
else else
Server-->App:HTTP Response(success:false)
end
@enduml
SEQUENCE DIAGRAM
6129861345148928
ClassAClassAClassBClassBClassCClassCClassDClassDWe do outside-in if westart with ClassAWe do inside-out if westart with ClassD
SEQUENCE DIAGRAM
6135265487749120
ClassAClassAClassBClassBClassCClassCClassDClassDWe do outside-in if westart with ClassAWe do inside-out if westart with ClassD
@startuml
note left of ClassA #aqua
We do outside-in if we
start with ClassA
end note
-> ClassA
|||
ClassA -> ClassB
|||
ClassB -> ClassC
|||
ClassB <- ClassC
|||
ClassB -> ClassD
|||
ClassB <- ClassD
|||
ClassA <- ClassB
|||
<- ClassA
note right of ClassD #aqua
We do inside-out if we
start with ClassD
end note
@enduml
SEQUENCE DIAGRAM
6135265487749120
User Pulls newest changes of documentsUserUserPullClientPullClientPsychicOctoRobotServerPsychicOctoRobotServerGitServerGitServerNode.js server which serves thewebpages requested by the user.requests page forpulling new revisionsweb page forPullClientThe PullClient is aJavascript client made of js-gitand our code bundled with browserifyreads local "git"directory to checkfor repositoriespresentDisplays documentsthat are trackedin repositories locallyselects documentrepository to pullalt[Contact GitServer Directly]Requests new revisions for repositoryNew revisions for repository[get updates through PsychicOctoRobotServer]Sends request new revisions of repoRequests new revisions for repositoryNew revisions for repositoryNew revisions for repositoryDisplays message notifying user of success/failure
SEQUENCE DIAGRAM
6136375468359680
User Pulls newest changes of documentsUserUserPullClientPullClientPsychicOctoRobotServerPsychicOctoRobotServerGitServerGitServerNode.js server which serves thewebpages requested by the user.requests page forpulling new revisionsweb page forPullClientThe PullClient is aJavascript client made of js-gitand our code bundled with browserifyreads local "git"directory to checkfor repositoriespresentDisplays documentsthat are trackedin repositories locallyselects documentrepository to pullalt[Contact GitServer Directly]Requests new revisions for repositoryNew revisions for repository[get updates through PsychicOctoRobotServer]Sends request new revisions of repoRequests new revisions for repositoryNew revisions for repositoryNew revisions for repositoryDisplays message notifying user of success/failure
@startuml
title User Pulls newest changes of documents
actor User
participant PullClient
participant PsychicOctoRobotServer
note right of PsychicOctoRobotServer
Node.js server which serves the
webpages requested by the user.
end note
participant GitServer
User -> PsychicOctoRobotServer : requests page for \n pulling new revisions
PsychicOctoRobotServer -> User : web page for \n PullClient
note right
The PullClient is a
Javascript client made of js-git
and our code bundled with browserify
end note
PullClient -> PullClient : reads local "git" \n directory to check \n for repositories \n present
PullClient -> User : Displays documents \n that are tracked \n in repositories locally
User -> PullClient : selects document \n repository to pull
alt Contact GitServer Directly
PullClient -> GitServer : Requests new revisions for repository
GitServer -> PullClient : New revisions for repository
else get updates through PsychicOctoRobotServer
PullClient -> PsychicOctoRobotServer : Sends request new revisions of repo
PsychicOctoRobotServer -> GitServer : Requests new revisions for repository
GitServer -> PsychicOctoRobotServer : New revisions for repository
PsychicOctoRobotServer -> PullClient : New revisions for repository
end
PullClient -> User : Displays message notifying user of success/failure
@enduml
SEQUENCE DIAGRAM
6136375468359680
UserUserAppAppServerServerDatabaseDatabasecomment on reviewmakePostRequest()putComment()ResultSetalt[login key is correct]alt[review is found]HTTP Response(success:true)[else]HTTP Response(success:false)[else]HTTP Response(success:false)
SEQUENCE DIAGRAM
6138859167416320
UserUserAppAppServerServerDatabaseDatabasecomment on reviewmakePostRequest()putComment()ResultSetalt[login key is correct]alt[review is found]HTTP Response(success:true)[else]HTTP Response(success:false)[else]HTTP Response(success:false)
@startuml
actor User
User->App:comment on review
App->Server:makePostRequest()
Server->Database:putComment()
Database-->Server:ResultSet
alt login key is correct
alt review is found
Server-->App:HTTP Response(success:true)
else else
Server-->App:HTTP Response(success:false)
end
else else
Server-->App:HTTP Response(success:false)
end
@enduml
MerchantMerchantSEQRSEQRSEQR AppSEQR AppsendInvoice(unique reference)getPaymentStatusISSUEDask for invoice at point of sale or using referenceretry until you get SUCCESSpayment (with uniqe reference)getPaymentStatusPAIDPayment cleared!Done (show receipt)Happy!
SEQUENCE DIAGRAM
6170332687761408
MerchantMerchantSEQRSEQRSEQR AppSEQR AppsendInvoice(unique reference)getPaymentStatusISSUEDask for invoice at point of sale or using referenceretry until you get SUCCESSpayment (with uniqe reference)getPaymentStatusPAIDPayment cleared!Done (show receipt)Happy!
@startuml
skinparam monochrome true
participant Merchant
participant SEQR
participant "SEQR App" as SEQRApp
Merchant->SEQR: sendInvoice
SEQR-->Merchant: (unique reference)
Merchant->SEQR: getPaymentStatus
SEQR-->Merchant: ISSUED
SEQRApp->SEQR: ask for invoice at point of sale or using reference
Note right of SEQR: retry until you get SUCCESS
SEQRApp->SEQR: payment (with uniqe reference)
Merchant->SEQR: getPaymentStatus
SEQR-->Merchant: PAID
Note right of Merchant: Payment cleared!
SEQR->SEQRApp: Done (show receipt)
Merchant-->SEQRApp: Happy!
@enduml
@startuml
participant User
User -> A: do work
activate A
A -> B: << create request >>
activate B
B -> C: do work
activate C
C -> B: work done
destroy C
B -> A: requested created
deactivate B
A -> User: done
deactivate A
@enduml
@startuml
skinparam backgroundColor #EEEBDC
skinparam sequenceArrowColor DeepSkyBlue
skinparam sequenceParticipantBorderColor DeepSkyBlue
skinparam sequenceActorBorderColor DeepSkyBlue
skinparam sequenceLifeLineBorderColor blue
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
@enduml
@startuml
== Initialisation ==
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
== Repetition ==
Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
@enduml
SEQUENCE DIAGRAM
6215863770284032
UserUserAppAppServerServerDatabaseDatabaseget all comments for reviewmakeGetRequest()getCommentsForReview()ResultSetalt[review is found]HTTP Response(success:true, data)[else]HTTP Response(success:false)
SEQUENCE DIAGRAM
6221810420940800
UserUserAppAppServerServerDatabaseDatabaseget all comments for reviewmakeGetRequest()getCommentsForReview()ResultSetalt[review is found]HTTP Response(success:true, data)[else]HTTP Response(success:false)
@startuml
actor User
User->App:get all comments for review
App->Server:makeGetRequest()
Server->Database:getCommentsForReview()
Database-->Server:ResultSet
alt review is found
Server-->App:HTTP Response(success:true, data)
else else
Server-->App:HTTP Response(success:false)
end
@enduml