You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.5 KiB
71 lines
1.5 KiB
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",
|
|
)
|
|
}
|