@startuml
'https://plantuml.com/sequence-diagram
autonumber
!include charts/skinparams/skinparams.puml
'skinparam maxmessagesize 250
'skinparam wrapWidth 350
'skinparam BoxPadding 50
'skinparam NoteFontColor green
'<style>
'note { FontColor blue
'      }
'</style>
'box "Internal Service" #STRATEGY
participant api_gateway as gw
participant strategy as strategy
database strategy_db as DB
participant routes_map as rm
'end box

'box "External Service" #LightBlue
participant geo_locator as geo_locator order 1
'end box
'!include /resources/variables.puml
'!$DELIVERY_ROUTE_NAME = "POST api/v1/delivery-route"
'!$DELIVERY_ROUTE_LINK = "https://nastachku.ru/"
'!$POLIGONS_NAME = "GET api/v1/geopoligons (end.lat, end.lon)"
'!$POLIGONS_LINK = "https://ul24.nastachku.ru/системный-и-бизнес-анализ"
'!$ROUTE_NAME = "POST api/v1/route(start.objectId, object_id_end)"
'!$ROUTE_LINK = "https://ul24.nastachku.ru/архитектура"
gw -> strategy: request POST api/v1/delivery-route
'gw -> strategy: [[$DELIVERY_ROUTE_LINK request POST $DELIVERY_ROUTE_NAME]]
'note left strategy #aqua
'заметка к **%autonumber%**
'{
'  "start": {
'    "objectId": "msk"
'  },
'  "end": {
'    "kladr": "78",
'    "lat": 59.93123,
'    "lon": 30.31123
'  },
'  "deliveryMethod": "посылка"
'}
'end note
activate strategy
strategy->strategy: проверить запрос (обязательны  start.objectId, end.lat, end.lon, deliveryMethod)
'alt #TECHNOLOGY позитивный сценарий
'strategy -> geo_locator: [[$POLIGONS_LINK request $POLIGONS_NAME]]
strategy -> geo_locator: request GET api/v1/geopoligons(end.lat, end.lon)
'note left geo_locator #teal
'заметка к **%autonumber%**
'api/v1/geopoligons/{lat}/{lon}
'end note

activate geo_locator
geo_locator --> strategy: return: array<poligon_id>
'note right geo_locator #teal
'заметка к **%autonumber%**
'{
'  "geoPoligons": [
'    "ddef3721-364f-4851-ab4e-f578908d01f9",
'    "153d3236-b65b-4ab3-9f74-f9977898ad53"
'  ]
'}
'end note
deactivate geo_locator
strategy-> DB: SELECT (array<poligon_id>,  deliveryMethod)
'note right DB
'<img /resources/tables.png {scale=0.5}>
'end note
activate DB
DB-->strategy: return: object_id_end
deactivate DB
'strategy->rm: [[$ROUTE_LINK request $ROUTE_NAME ]]
strategy->rm: request POST api/v1/route (start.objectId, object_id_end)
'note left rm #coral
'заметка к **%autonumber%**
'{
'  "objectIdStart": "msk",
'  "objectIdEnd": "spb"
'}
'end note
'note right rm #coral
'заметка к **%autonumber%**
'{
'  "route": [
'    {
'      "stepNum": 1,
'      "code": 1234,
'      "objectIdEnd": "spb",
'      "objectEndType": "DISTRIBUTION_CENTER",
'      "duration": 720
'    }
'  ]
'}
'end note

activate rm
rm-->strategy: return: route
deactivate rm
alt маршрут возвращен
alt #palegreen маршрут возвращен
strategy->strategy: взять route  преобразовать ответ к шаблону
'note right strategy #aqua
'заметка к **%autonumber%**
'{
'  "route": [
'    {
'      "code": 1234,
'      "stepNumber": 1,
'      "logObjectStart": "msk",
'      "logObjectEnd": "spb",
'      "controlDeliverytime": 720
'    }
'  ]
'}
'end note
'strategy --> gw:  response $DELIVERY_ROUTE_NAME  ответ 200
strategy --> gw:  response POST api/v1/delivery-route  ответ 200
'else  маршрут не найден
else #pink маршрут не найден
strategy --> gw:  response POST api/v1/delivery-route  404 "ROUTE_NOT_FOUND"
'strategy --> gw:  response $DELIVERY_ROUTE_NAME  404 "Not Found"
'note right strategy #aqua
'заметка к **%autonumber%**
'{
'  "error": "ROUTE_NOT_FOUND"
'}
'end note
end

deactivate strategy
@enduml