-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
126 lines (115 loc) · 3.23 KB
/
main.go
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"cell-shield-go/shieldinformation"
"embed"
"encoding/json"
"fmt"
"github.com/ReneKroon/ttlcache/v2"
"io/fs"
"log"
"net/http"
"os"
"time"
)
type ShieldsIoJson struct {
SchemaVersion int `json:"schemaVersion"`
Label string `json:"label"`
Message string `json:"message"`
Color string `json:"color"`
}
//go:embed static/*
var content embed.FS
func main() {
serverRoot, err := fs.Sub(content, "static")
if err != nil {
log.Fatal(err)
}
var cache ttlcache.SimpleCache = ttlcache.NewCache()
err = cache.SetTTL(time.Duration(30 * time.Second))
if err != nil {
log.Fatal(err)
}
http.Handle("/", http.FileServer(http.FS(serverRoot)))
http.HandleFunc("/gs", func(w http.ResponseWriter, r *http.Request) {
spreadSheetId := r.URL.Query().Get("spreadSheetId")
if spreadSheetId == "" {
err := json.NewEncoder(w).Encode(ShieldsIoJson{
SchemaVersion: 1,
Label: "Error",
Message: "spreadSheetId is missing!",
Color: "red",
})
if err != nil {
return
}
log.Println("spreadSheetId missing from:", r.URL.RawQuery)
return
}
cellRange := r.URL.Query().Get("cellRange")
if cellRange == "" {
err := json.NewEncoder(w).Encode(ShieldsIoJson{
SchemaVersion: 1,
Label: "Error",
Message: "cellRange is missing!",
Color: "red",
})
if err != nil {
return
}
log.Println("cellRange missing from:", r.URL.RawQuery)
return
}
cacheKey := "Sheet " + spreadSheetId + " | Range " + cellRange
shieldInformationRetrieve, err := cache.Get(cacheKey)
if err == ttlcache.ErrNotFound {
log.Println("Cache was not hit for", cacheKey)
freshShieldInformation, shErr := shieldinformation.GrabShieldInformation(spreadSheetId, cellRange)
shieldInformationRetrieve = freshShieldInformation
if shErr != nil {
err := json.NewEncoder(w).Encode(ShieldsIoJson{
SchemaVersion: 1,
Label: "Error",
Message: fmt.Sprintf("Unable to retrieve shield information | %s", shErr),
Color: "red",
})
if err != nil {
return
}
log.Println("Unable to retrieve shield information for", r.URL.RawQuery, shErr)
return
}
chErr := cache.Set(cacheKey, shieldInformationRetrieve)
if chErr != nil {
// If we can't set the cache, we don't care oh well.
log.Println("Unable to set", cacheKey)
}
} else {
log.Println("Cache was hit for", cacheKey)
}
shieldInformation := shieldInformationRetrieve.(*shieldinformation.ShieldInformation)
err = json.NewEncoder(w).Encode(ShieldsIoJson{
SchemaVersion: 1,
Label: shieldInformation.ShieldLabel,
Message: shieldInformation.ShieldMessage,
Color: shieldInformation.ColorHex,
})
if err != nil {
err := json.NewEncoder(w).Encode(ShieldsIoJson{
SchemaVersion: 1,
Label: "Error",
Message: fmt.Sprintf("Unable to generate shield information | %s", err),
Color: "red",
})
if err != nil {
return
}
}
log.Println("Sent shield information for", r.URL.RawQuery)
})
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Println("listening on port", port)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}