diff options
Diffstat (limited to 'services/services.go')
| -rw-r--r-- | services/services.go | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/services/services.go b/services/services.go new file mode 100644 index 0000000..b9e5693 --- /dev/null +++ b/services/services.go @@ -0,0 +1,93 @@ +package services + +import ( + "encoding/json" + "io" + "net/http" + "os" +) + +var ( + ServiceList []Service + FallbackMap map[string]string +) + +const ( + baseRepoLink = "https://git.sr.ht/~benbusby/farside/blob/main/" + + noCFServicesJSON = "services.json" + fullServicesJSON = "services-full.json" +) + +type Service struct { + Type string `json:"type"` + TestURL string `json:"test_url,omitempty"` + Fallback string `json:"fallback,omimtempty"` + Instances []string `json:"instances"` +} + +func ingestServicesList(servicesBytes []byte) error { + err := json.Unmarshal(servicesBytes, &ServiceList) + return err +} + +func GetServicesFileName() string { + cloudflareEnabled := false + + cfEnabledVar := os.Getenv("FARSIDE_CF_ENABLED") + if len(cfEnabledVar) > 0 && cfEnabledVar == "1" { + cloudflareEnabled = true + } + + serviceJSON := noCFServicesJSON + if cloudflareEnabled { + serviceJSON = fullServicesJSON + } + + return serviceJSON +} + + +func FetchServicesFile(serviceJSON string) ([]byte, error) { + resp, err := http.Get(baseRepoLink + serviceJSON) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + err = os.WriteFile(serviceJSON, bodyBytes, 0666) + if err != nil { + return nil, err + } + + return bodyBytes, nil +} + +func InitializeServices() error { + serviceJSON := GetServicesFileName() + fileBytes, err := os.ReadFile(serviceJSON) + if err != nil { + fileBytes, err = FetchServicesFile(serviceJSON) + if err != nil { + return err + } + } + + err = ingestServicesList(fileBytes) + if err != nil { + return err + } + + FallbackMap = make(map[string]string) + for _, serviceElement := range ServiceList { + FallbackMap[serviceElement.Type] = serviceElement.Fallback + } + + return nil +} |
