blob: d5852e7376200c004b9bb7091b2e795720864217 [file] [log] [blame]
giolekvaf89e0462020-05-02 17:47:06 +04001package events
2
giolekvad2618252020-05-02 19:39:02 +04003import (
4 "bytes"
5 "encoding/json"
6 // "errors"
giolekvaede6d2b2020-05-05 22:14:16 +04007 "fmt"
giolekvad2618252020-05-02 19:39:02 +04008 "io/ioutil"
9 "net/http"
10
11 "github.com/golang/glog"
12)
13
14var jsonContentType = "application/json"
15
giolekvaf89e0462020-05-02 17:47:06 +040016type query struct {
giolekvad2618252020-05-02 19:39:02 +040017 Query string `json:"query"`
giolekvaf89e0462020-05-02 17:47:06 +040018}
19
giolekvad2618252020-05-02 19:39:02 +040020var getAllNewImageEventsTmpl = `{
21 queryImageEvent(filter: {
22 state: {
23 eq: NEW
24 le: NEW
25 lt: NEW
26 ge: NEW
27 gt: NEW
28 }
29 }) {
30 id
31 node {
32 id
33 }
34 }
35}`
36
giolekvaede6d2b2020-05-05 22:14:16 +040037var markEventDoneTmpl = `mutation {
38 updateImageEvent(input: {
39 filter: {
40 id: ["%s"]
41 },
42 set: {
43 state: DONE
44 }
45 }) {
46 numUids
47 }
48}`
49
giolekvaf89e0462020-05-02 17:47:06 +040050// Implements EventStore
51type GraphQLClient struct {
52 apiAddr string
53}
54
55func NewGraphQLClient(apiAddr string) EventStore {
56 return &GraphQLClient{apiAddr}
57}
58
giolekvad2618252020-05-02 19:39:02 +040059type location struct {
60 Line int `json:"line"`
61 Column int `json:"column"`
62}
63
64type gqlError struct {
65 Message string `json:"message"`
66 Locations []location `json:"location"`
67}
68
69type gqlNode struct {
70 Id string `json:"id"`
71}
72
73type gqlEvent struct {
74 Id string `json:"id"`
75 State string `json:"state"`
76 Node gqlNode `json:"node"`
77}
78
79type gqlData struct {
80 Events []gqlEvent `json:"queryImageEvent"`
81}
82
83type queryResp struct {
84 Errors []gqlError `json:"errors"`
85 Data gqlData `json:"data"`
86}
87
giolekvaf89e0462020-05-02 17:47:06 +040088func (c *GraphQLClient) GetEventsInState(state EventState) ([]Event, error) {
giolekvad2618252020-05-02 19:39:02 +040089 q := query{getAllNewImageEventsTmpl}
90 qJson, err := json.Marshal(q)
91 if err != nil {
92 return nil, err
93 }
94 resp, err := http.Post(c.apiAddr, jsonContentType, bytes.NewReader(qJson))
95 if err != nil {
96 return nil, err
97 }
98 respBody, err := ioutil.ReadAll(resp.Body)
99 if err != nil {
100 return nil, err
101 }
102 glog.Info(string(respBody))
103 var gqlResp gqlData
104 err = json.Unmarshal(respBody, &gqlResp)
105 if err != nil {
106 return nil, err
107 }
108 // if len(gqlResp.Errors) != 0 {
109 // return nil, errors.New(fmt.Sprintf("%v", gqlResp.Errors))
110 // }
111 var events []Event
112 for _, e := range gqlResp.Events {
113 events = append(events, Event{e.Id, EventStateNew, e.Node.Id})
114 }
115 return events, nil
giolekvaf89e0462020-05-02 17:47:06 +0400116}
giolekvaede6d2b2020-05-05 22:14:16 +0400117
118func (c *GraphQLClient) MarkEventDone(event Event) error {
119 q := query{fmt.Sprintf(markEventDoneTmpl, event.Id)}
120 qJson, err := json.Marshal(q)
121 if err != nil {
122 return err
123 }
124 _, err = http.Post(c.apiAddr, jsonContentType, bytes.NewReader(qJson))
125 if err != nil {
126 return err
127 }
128 // TODO(giolekva): check errors field
129 return nil
130}