summaryrefslogtreecommitdiffstats
path: root/src/cepis-health.cob
blob: 86da407a0bc89bc5d221308ee82abf2587ce7bdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
IDENTIFICATION DIVISION.
PROGRAM-ID. CEPIS-HEALTH.

*> ---------------------------------------------------------------------
*> Ask the API how it is.
*>
*>     CALL "CEPIS-HEALTH" USING CEPIS-CONFIG CEPIS-HEALTH CEPIS-STATUS
*>
*> Good for two things: confirming the API answers at all, and knowing
*> which version of the database is live. The DNE database is rebuilt
*> every two weeks and HEALTH-DNE identifies the edition in use.
*>
*> An API reporting itself degraded is not a failure of this call. It
*> answers 503 with a body, and that arrives in HEALTH-STATUS with
*> CEPIS-OK set -- checking health is exactly when you want the
*> diagnosis rather than an error. A transport failure still fails.
*> ---------------------------------------------------------------------

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY "cepis-http.cpy".
COPY "cepis-json.cpy".

LINKAGE SECTION.
COPY "cepis.cpy".

PROCEDURE DIVISION USING CEPIS-CONFIG CEPIS-HEALTH CEPIS-STATUS.

MAIN-START.
    INITIALIZE CEPIS-HEALTH

    MOVE SPACES TO HTTPQ-PATH
    MOVE "/health" TO HTTPQ-PATH
    MOVE 7 TO HTTPQ-PATH-LEN
    MOVE "Y" TO HTTPQ-ALLOW-503

    CALL "CEPIS-REQUEST" USING CEPIS-CONFIG CEPIS-HTTP-REQUEST
                               CEPIS-HTTP-RESPONSE CEPIS-STATUS
    END-CALL
    IF CEPIS-FAILED
        GOBACK
    END-IF

    IF HTTP-STATUS NOT = 200 AND HTTP-STATUS NOT = 503
        SET CEPIS-INVALID-RESPONSE TO TRUE
        MOVE SPACES TO CEPIS-STATUS-MESSAGE
        STRING "unexpected status " HTTP-STATUS " from /health"
            DELIMITED BY SIZE INTO CEPIS-STATUS-MESSAGE
        END-STRING
        GOBACK
    END-IF

    MOVE "status" TO JS-KEY
    PERFORM GET-MEMBER
    IF JS-TYPE = "E"
        SET CEPIS-INVALID-RESPONSE TO TRUE
        MOVE "response to /health is not a JSON object"
          TO CEPIS-STATUS-MESSAGE
        GOBACK
    END-IF
    MOVE JS-VALUE TO HEALTH-STATUS

    MOVE "dne" TO JS-KEY
    PERFORM GET-MEMBER
    MOVE JS-VALUE TO HEALTH-DNE

    MOVE "ceps" TO JS-KEY
    PERFORM GET-MEMBER
    IF JS-TYPE = "N"
        COMPUTE HEALTH-CEPS ROUNDED = FUNCTION NUMVAL (JS-VALUE)
    END-IF

    MOVE "geo" TO JS-KEY
    PERFORM GET-MEMBER
    IF JS-TYPE = "N"
        COMPUTE HEALTH-GEO ROUNDED = FUNCTION NUMVAL (JS-VALUE)
    END-IF

    MOVE "base_gerada_em" TO JS-KEY
    PERFORM GET-MEMBER
    MOVE JS-VALUE TO HEALTH-BASE-GERADA-EM

    SET CEPIS-OK TO TRUE
    GOBACK.

*> -------------------------------------------------------------------
GET-MEMBER.
    MOVE 1 TO JS-FROM
    MOVE HTTP-BODY-LEN TO JS-TO
    CALL "CEPIS-JSON-GET" USING HTTP-BODY CEPIS-JSON-SCAN
    END-CALL.

END PROGRAM CEPIS-HEALTH.