@startuml API sequence flow
title API sequence flow

sprite $ew_logo [48x48/16] {
    000000000000000000245667766542000000000000000000
    000000000000000357777777777777753000000000000000
    000000000000047777777777777777777740000000000000
    000000000003777777777777777777777777300000000000
    000000000167777777777777777777777777761000000000
    000000002777777777777777777777777777777200000000
    000000037777777777777777777777777777777730000000
    000000377777777777777777777777777777777773000000
    000002777777777777777777777777777777777777200000
    000017777777777777777777777777777777777777710000
    000067777777777777777777777777777777777777750000
    000377777777777777777777777777777776777777773000
    000777777777777777777777777777777400677777777000
    004777777777777777777777777777777300177777777400
    007777777777777777777777777777777730047777777700
    037777777777777777777777777777777770007777777730
    057777777777777777777777777777777774005777777750
    077777777777777777777741247777777777002777777770
    277777777777777777777100002777777777200777777772
    477777777777777777773001100477777777400677777773
    577777777777777777770017710177777777600477777775
    677777777777777777750057740067777777700477777776
    677777777777777777740067760057777777700377777776
    777777776307777777730077760047777777700377777776
    777777773007777777740067760057777777700377777776
    677777774006777777740067750057777777600477777776
    677777775005777777760047740067777777500577777776
    577777776003777777770037720077777777300677777774
    477777777101777777771017700277777777101777777773
    277777777300677777774005500577777775003777777772
    077777777600277777776001601777777772006777777770
    057777777720057777777300444777777750027777777750
    037777777760006777777700067777777600067777777720
    007777777774000577777750005777775000477777777600
    004777777777300024542054000145410003777777777300
    000777777777740000000017500000000047777777776000
    000377777777776300000367763000003677777777772000
    000057777777777776567777777765677777777777750000
    000006777777777777777777777777777777777777600000
    000002777777777777777777777777777777777777100000
    000000277777777777777777777777777777777772000000
    000000027777777777777777777777777777777720000000
    000000002677777777777777777777777777776100000000
    000000000057777777777777777777777777750000000000
    000000000002677777777777777777777776300000000000
    000000000000037777777777777777777630000000000000
    000000000000000257777777777777752000000000000000
    000000000000000000235666666432000000000000000000
}

!include <tupadr3/font-awesome-5/solar_panel>
!include <tupadr3/font-awesome-5/bolt>
!include <tupadr3/font-awesome-5/user>

!include <logos/influxdb>
!include <logos/nestjs>

skinparam DefaultTextAlignment center
skinparam MaxMessageSize 100
skinparam Shadowing false

skinparam participant {
    Bordercolor none
    Backgroundcolor none
    Shadowing false
}

participant "<$solar_panel,color=DarkGreen>\nDER" as der1
participant "<$solar_panel,color=DarkGreen>\nDER" as der2
participant "<$user,color=Black>\nProsumer" as prosumer
participant "<$bolt,color=Orange>\nAggregator" as aggregator
participant "<$ew_logo,color=Purple>\nEW chain" as ewc
participant "<$influxdb,color=Blue>\nInfluxDB" as influxDB

== Create ==

'Prosumer
der1 --> prosumer : readings
der2 --> prosumer : readings
note left of prosumer : When n readings\nhave been aggregated\nthe prosumer\nwill send the\naggregated readings\nto the aggregator
activate prosumer
prosumer --> prosumer : calculate precise-proof
prosumer --> prosumer : sign root hash
prosumer --> aggregator : aggregated readings
deactivate prosumer

'Aggregator
activate aggregator
aggregator --> aggregator : check precise-proof
aggregator --> aggregator : get address from signature
aggregator <--> ewc : check ownership
aggregator <--> ewc : check duplicated readings
aggregator --> influxDB : traditional storage
aggregator --> ewc : log precise proof on EW-chain
deactivate aggregator

== Read ==

'Prosumer
prosumer --> aggregator ++ : get nonce
prosumer <-- aggregator -- : nonce
prosumer --> aggregator ++ : signed nonce
aggregator --> aggregator : get address from signature
prosumer <-- aggregator -- : jwt
prosumer --> aggregator ++ : get readings
aggregator --> aggregator : check jwt
aggregator <--> ewc : check ownership
aggregator --> influxDB  ++: get readings
aggregator <-- influxDB -- : readings
prosumer <-- aggregator -- : readings

@enduml