· 4 years ago · Jul 31, 2021, 03:58 PM
1package controller
2import (
3 "encoding/json"
4 "fmt"
5 "io/ioutil"
6 "net/http"
7 "log"
8 "github.com/labstack/echo"
9)
10
11
12type Response []struct {
13 ActiveCases int `json:"activeCases"`
14 ActiveCasesNew int `json:"activeCasesNew"`
15 Recovered int `json:"recovered"`
16 RecoveredNew int `json:"recoveredNew"`
17 Deaths int `json:"deaths"`
18 DeathsNew int `json:"deathsNew"`
19 PreviousDayTests int `json:"previousDayTests"`
20 TotalCases int `json:"totalCases"`
21 SourceURL string `json:"sourceUrl"`
22 ReadMe string `json:"readMe"`
23 RegionData []struct {
24 Region string `json:"region"`
25 ActiveCases int `json:"activeCases"`
26 NewInfected int `json:"newInfected"`
27 Recovered int `json:"recovered"`
28 NewRecovered int `json:"newRecovered"`
29 Deceased int `json:"deceased"`
30 NewDeceased int `json:"newDeceased"`
31 TotalInfected int `json:"totalInfected"`
32 } `json:"regionData"`
33}
34
35func updatedata(){
36 quickstartDatabase := MI.Client.Database("article")
37 articleCollection := quickstartDatabase.Collection("blogs")
38 ctx, _ := context.WithTimeout(context.Background(), 15*time.Second)
39 articleResult, err := articleCollection.InsertOne(ctx, bson.D{
40 {Key: "title", Value: "The Polyglot Developer Podcast"},
41 {Key: "author", Value: "Nic Raboy"},
42 })
43 if err != nil{
44 log.Fatal(err)
45 }
46 fmt.Printf("Inserted documents into episode collection!\n")
47 // // lo.Printf(len(articleResult))
48 // objectID := articleResult.InsertedID.(primitive.ObjectID)
49 fmt.Println(articleResult)
50
51}
52// GetCovidCases - handler method for getting covid cases from API
53func GetCovidCases(c echo.Context) (err error) {
54 fmt.Println("Calling API...")
55 client := &http.Client{}
56 req, err := http.NewRequest("GET", "https://api.apify.com/v2/datasets/6isWRcvjRrcmlSaYw/items", nil)
57 if err != nil {
58 fmt.Print(err.Error())
59 }
60 req.Header.Add("Accept", "application/json")
61 req.Header.Add("Content-Type", "application/json")
62 resp, err := client.Do(req) //making request
63 if err != nil {
64 fmt.Print(err.Error())
65 }
66 defer resp.Body.Close()
67 log.Println(resp.Body)
68 bodyBytes, err := ioutil.ReadAll(resp.Body) //reading resonse
69 if err != nil {
70 fmt.Print(err.Error())
71 }
72 var responseObject Response //object of struct type Response
73 json.Unmarshal(bodyBytes, &responseObject) //unmarshaling the response
74 //fmt.Printf("API Response as struct %+v\n", responseObject)
75 updatedata(responseObject)
76 return c.JSON(http.StatusOK,responseObject)
77}
78
79
80RAW Paste Data
81package controller
82import (
83 "encoding/json"
84 "fmt"
85 "io/ioutil"
86 "net/http"
87 "log"
88 "github.com/labstack/echo"
89)
90
91
92// this is array of cases
93// we must add bson keyword for mongodb library autodetect fields
94type Response []struct {
95 ID primitive.ObjectID `json:"id";bson:"_id"`
96 ActiveCases int `json:"activeCases";bson:"activeCases"`
97 ActiveCasesNew int `json:"activeCasesNew";bson:"activeCasesNew"`
98 Recovered int `json:"recovered";bson:"recovered"`
99 RecoveredNew int `json:"recoveredNew";bson:"recoveredNew"`
100 Deaths int `json:"deaths";bson:"deaths"`
101 DeathsNew int `json:"deathsNew";bson:"deathsNew"`
102 PreviousDayTests int `json:"previousDayTests";bson:"previousDayTests"`
103 TotalCases int `json:"totalCases";bson:"totalCases"`
104 SourceURL string `json:"sourceUrl";bson:"sourceUrl"`
105 ReadMe string `json:"readMe";bson:"readMe"`
106 RegionData []struct {
107 Region string `json:"region";bson:"region"`
108 ActiveCases int `json:"activeCases";bson:"activeCases"`
109 NewInfected int `json:"newInfected";bson:"newInfected"`
110 Recovered int `json:"recovered";bson:"recovered"`
111 NewRecovered int `json:"newRecovered";bson:"newRecovered"`
112 Deceased int `json:"deceased";bson:"deceased"`
113 NewDeceased int `json:"newDeceased";bson:"newDeceased"`
114 TotalInfected int `json:"totalInfected";bson:"totalInfected"`
115 } `json:"regionData";bson:"regionData"`
116}
117
118func structToBsonDocument(v interface{}) (doc *bson.D, err error) {
119 data, err := bson.Marshal(v)
120 if err != nil {
121 return
122 }
123
124 err = bson.Unmarshal(data, &doc)
125 return
126}
127
128
129func updatedata(response Response){
130 // now we need to define our database and collection
131 quickstartDatabase := MI.Client.Database("covid") // maybe we need create this database before
132
133 // set collection
134 articleCollection := quickstartDatabase.Collection("cases")
135
136 // set insert timeout
137 ctx, _ := context.WithTimeout(context.Background(), 15*time.Second)
138
139
140 // for each all covid cases
141 for _, v := range response {
142 // now we must use 'v' (current response case)
143 // but we need set by hand every field :(
144 // but if we define struc like mongodb document, can parse with libreary :)
145 parsedStruct, parseStructToDocumentErr := structToBsonDocument(v)
146 if parseStructToDocumentErr != nil{
147 log.Fatal(parseStructToDocumentErr)
148 }
149 fmt.Println(parsedStruct)
150
151
152 covidCaseInsertResult, err := articleCollection.InsertOne(ctx, parsedStruct) // now this throw syntax error, we need parse before
153
154 /*
155 articleResult, err := articleCollection.InsertOne(ctx, bson.D{
156 {Key: "title", Value: "The Polyglot Developer Podcast"},
157 {Key: "author", Value: "Nic Raboy"},
158 })
159
160 */
161 if err != nil{
162 log.Fatal(err)
163 }
164 fmt.Printf("Inserted documents into episode collection!\n")
165 // // lo.Printf(len(articleResult))
166 // objectID := articleResult.InsertedID.(primitive.ObjectID)
167 fmt.Println(covidCaseInsertResult)
168 }
169}
170// GetCovidCases - handler method for getting covid cases from API
171func GetCovidCases(c echo.Context) (err error) {
172 fmt.Println("Calling API...")
173 client := &http.Client{}
174 req, err := http.NewRequest("GET", "https://api.apify.com/v2/datasets/6isWRcvjRrcmlSaYw/items", nil)
175 if err != nil {
176 fmt.Print(err.Error())
177 }
178 req.Header.Add("Accept", "application/json")
179 req.Header.Add("Content-Type", "application/json")
180 resp, err := client.Do(req) //making request
181 if err != nil {
182 fmt.Print(err.Error())
183 }
184 defer resp.Body.Close()
185 log.Println(resp.Body)
186 bodyBytes, err := ioutil.ReadAll(resp.Body) //reading resonse
187 if err != nil {
188 fmt.Print(err.Error())
189 }
190 var responseObject Response //object of struct type Response
191 json.Unmarshal(bodyBytes, &responseObject) //unmarshaling the response
192 //fmt.Printf("API Response as struct %+v\n", responseObject)
193 updatedata(responseObject)
194 return c.JSON(http.StatusOK,responseObject)
195}