Skip to content
Snippets Groups Projects
Select Git revision
  • fdecd2a51013dd8090a39d69581b4cc2aae933d5
  • master default protected
2 results

README.md

Blame
  • Pirátská SMS brána

    Kdo by to byl věřil, že si Piráti budou navzájem účtovat SMSky.

    Instalace

    Ne všechny závislosti jsou na Hackage, takže prozatím je potřeba vytvořit cabal.project:

    packages: .
    
    source-repository-package
        type: git
        location: https://github.com/mordae/hs-praha
        tag: master
        subdir: praha
    
    source-repository-package
        type: git
        location: https://github.com/mordae/hs-praha
        tag: master
        subdir: praha-logger
    
    source-repository-package
        type: git
        location: https://github.com/mordae/hs-praha
        tag: master
        subdir: praha-config
    
    source-repository-package
        type: git
        location: https://github.com/mordae/hs-praha
        tag: master
        subdir: praha-migrate
    
    source-repository-package
        type: git
        location: https://github.com/mordae/hs-aweg
        tag: master
    
    source-repository-package
        type: git
        location: https://github.com/mordae/hikaru
        tag: master

    Následně je možné projekt standardně sestavit:

    cabal build

    Pro sestavení a spuštění z lokálního adresáře:

    cabal run pelican -- --help

    V souboru pelican.env jsou přednastavené některé povinné proměnné prostředí. Je však zapotřebí dodefinovat ještě SMS_LOGIN a SMS_PASSWORD. Například skrze další konfigurační soubor:

    cabal run pelican -- -C pelican.env -C prod.env

    Případně přímo v prostředí:

    export SMS_LOGIN='john'
    export SMS_PASSWORD='wayne'
    cabal run pelican -- -C pelican.env

    Při lokálním testování s ostrým účtem od brány doporučuji zakázat potvrzování zpráv nastavením proměnné NOACK=1, jinak vaše lokální instance potvrdí příjem doručenek z produkce, což je nežádoucí.

    Balíček je také možné nainstalovat:

    cabal install

    Technické detaily

    SMS brána v tuto chvíli vystavuje následující služby:

    API

    Odeslání SMS zprávy na číslo

    POST /v1/send/to-number HTTP/1.1
    Content-Type: application/json
    
    {
        "application": "přidělené <appid>",
        "token": "přidělený přístupový <token>",
        "number": "+420123456789",
        "payload": "Váš PIN je $$. Piráti",
        "interpolate": ["1234"],
        "receipt": "volitelné <uuid> pro kontrolu doručení",
        "centre": "volitelný <název> nákladového střediska"
    }
    HTTP/1.1 202 Accepted
    Content-Type: text/plain; charset=utf8

    V případě zaslání pole interpolate dojde k nahrazení skupin $$ v poli payload odpovídajícími prvky z pole interpolate. Hodnoty z pole interpolate se po odeslání zprávy neuchovávají. Tato funkce slouží k předávání citlivých údajů.

    V historii zpráv tak v příkladu výše zůstane pouze text "Váš PIN je $$. Piráti".

    • V případě úspěchu je kód odpovědi 202 a tělo je prázdné.
    • V případě chyby je kód odpovědi z řad 400 nebo 500 a tělo obsahuje vysvětlení. U chyb na straně klienta (400) je tělo zpravidla typu text/plain a obsahuje krátký popis problému.

    Kontrola doručenky

    GET /v1/receipt/<uuid> HTTP/1.1
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
        "status": "pending|accepted|rejected|delivered|failed",
        "reason": "zdůvodnění nebo null",
        "ts": "2021-05-17T00:03:48.799695Z",
        "updated": "2021-05-17T00:03:00Z"
    }

    Pole ts obsahuje čas zanesení zprávy do systému na naší straně. Pole updated pak obsahuje čas poslední informace o zprávě od SMS brány.

    Význam stavů:

    • pending -- zatím nebyla předána SMS bráně
    • accepted -- přijata bránou
    • rejected -- odmítnuta bránou
    • delivered -- úspěšně doručena
    • failed -- nepodařilo se doručit nebo problém na straně brány

    Stav vždy začíná jako pending a končí jako rejected, delivered nebo failed. Vy výjimečných případech může dojít k tomu, že se stav z accepted změní na rejected a nelze vyloučit ani změnu ze stavu delivered na jiný.

    Hromadná kontrola doručenek

    GET /v1/receipts?since=2021-05-17T00:00:00Z HTTP/1.1
    Authorization: Basic <base64(<appid>:<token>)>
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    [
        {...},
        {...},
        {...}
    ]

    Pro hromadnou kontrolu doručenek je potřeba zadat přihlašovací údaje formou Basic Authentication. Výsledkem je pole doručenek. Jejich výpis je možné omezit pomocí parametru since v URL, který musí být platným ISO 8601 časem (včetně časového pásma nebo koncovky Z pro UTC).

    Doporučený způsob využití je ptát se pravidelně s parametrem since nastaveným na čas poslední odeslané zprávy, která je na vaší straně ještě ve stavu pending nebo accepted.