| package handlers |
| |
| import ( |
| "encoding/json" |
| "fmt" |
| "log" |
| "net/http" |
| "time" |
| |
| "github.com/pkg/errors" |
| |
| "repodiff/constants" |
| e "repodiff/entities" |
| ) |
| |
| var globalJobStatus = constants.JobStatusNotStarted |
| var globalMeta string |
| var globalStartTime time.Time |
| |
| type healthResponse struct { |
| ApplicationStatus string `json:"application_status"` |
| JobStatus string `json:"job_status"` |
| Meta string `json:"meta"` |
| ElapsedTime string `json:"elapsed_time"` |
| } |
| |
| func writeJsonResponse(writer http.ResponseWriter, entity interface{}) { |
| serialized, err := json.MarshalIndent(entity, "", " ") |
| if err != nil { |
| log.Fatal(err) |
| } |
| writer.Header().Set("Content-Type", "application/json") |
| writer.Write(serialized) |
| } |
| |
| func handleHealth(writer http.ResponseWriter, request *http.Request) { |
| switch request.Method { |
| case "GET": |
| writeJsonResponse( |
| writer, |
| healthResponse{ |
| ApplicationStatus: "ok", |
| JobStatus: globalJobStatus, |
| Meta: globalMeta, |
| ElapsedTime: fmt.Sprintf("%s", time.Now().Sub(globalStartTime)), |
| }, |
| ) |
| } |
| } |
| |
| func listenForStatusChanges(statusChannel chan e.StatusMessage) { |
| for { |
| m := <-statusChannel |
| globalJobStatus = m.JobStatus |
| globalMeta = m.Meta |
| } |
| } |
| |
| func StartHTTP(servePort int, statusChannel chan e.StatusMessage) error { |
| globalStartTime = time.Now() |
| go listenForStatusChanges(statusChannel) |
| http.HandleFunc("/health", handleHealth) |
| return errors.Wrap( |
| http.ListenAndServe( |
| fmt.Sprintf(":%d", servePort), |
| nil, |
| ), |
| "Error starting web server", |
| ) |
| } |