-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain.go
More file actions
105 lines (83 loc) · 3.02 KB
/
main.go
File metadata and controls
105 lines (83 loc) · 3.02 KB
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
package main
import (
"fmt"
"log"
"net/http"
"os"
"time"
"github.com/acmpesuecc/bunsamosa-bot/database"
"github.com/acmpesuecc/bunsamosa-bot/globals"
"github.com/acmpesuecc/bunsamosa-bot/handlers"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/rs/cors"
"github.com/rs/zerolog"
)
func main() {
// Parse YAML File to read in secrets
// Initialize state
YAML_SECRETS_PATH := ""
// Check if we're in a development environment
IS_DEV_ENV := os.Getenv("BUNSAMOSA_DEV_MODE")
if IS_DEV_ENV == "1" {
YAML_SECRETS_PATH = "./secrets-dev.yaml"
} else {
YAML_SECRETS_PATH = "/root/bunsamosa-bot/secrets.yaml"
}
globals.AppState = globals.App{}
globals.AppState.LogLevel = os.Getenv("LOG_LEVEL")
jsonLogDirPath := os.Getenv("JSON_LOG_DIR")
globals.AppState.JSONLogWriter = openLogFile(jsonLogDirPath)
globals.AppState.InitializeLogger()
globals.AppState.ParseFromYAML(YAML_SECRETS_PATH)
// Initialize the Github Client
globals.AppState.InitializeGithubClient()
initLogger := globals.AppState.ZeroLogger.With().Array("scope", zerolog.Arr().Str("INIT")).Logger()
handlers.TimerDaemonURL = globals.AppState.TimerDaemonURL
dbManager := &database.DBManager{}
err := dbManager.Init(globals.AppState.DBPath, globals.AppState.ZeroLogger)
if err != nil {
initLogger.Panic().Err(err)
}
globals.AppState.DBManager = dbManager
initLogger.Info().Msg("Initialised Database Successfully!")
// TODO use Higher-Order Functions to generate this response function
// with the webhook secret from the YAML Parsed into the app in scope
mux := http.NewServeMux()
mux.HandleFunc("POST /Github", handlers.WebhookHandler)
mux.HandleFunc("GET /leaderboard_mat", handlers.LeaderboardMaterialized)
mux.HandleFunc("GET /records", handlers.LeaderboardUserSpecific)
mux.Handle("GET /metrics", promhttp.Handler())
mux.HandleFunc("/timer", handlers.TimerHandler)
mux.HandleFunc("GET /ping", handlers.PingHandler)
// Unutilised routes
mux.HandleFunc("GET /lb_all", handlers.LeaderboardAllRecords)
mux.HandleFunc("GET /leaderboard", handlers.Leaderboard_nonmaterialized)
initLogger.Info().Msg("Registered all routes")
handler := cors.Default().Handler(mux)
initLogger.Info().Msg("Initialized CORS")
webserverAddr := fmt.Sprintf("0.0.0.0:%d", globals.AppState.WebServerPort)
initLogger.Info().Msg("Starting Web Server")
err = http.ListenAndServe(webserverAddr, handler)
if err != nil && err != http.ErrServerClosed {
initLogger.Fatal().Err(err)
}
}
func openLogFile(jsonLogsDir string) *os.File {
if jsonLogsDir == "" {
panic("JSON_LOG_DIR is a mandatory env var!")
}
err := os.MkdirAll(jsonLogsDir, 0777)
if err != nil {
panic("JSON Log Directory cannot be created!")
}
logRoot, err := os.OpenRoot(jsonLogsDir)
if err != nil {
panic("JSON Log Directory cannot be opened!")
}
logName := fmt.Sprintf("%d.log", time.Now().Unix())
logFile, err := logRoot.OpenFile(logName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0777)
if err != nil {
log.Panicf("JSON Log file could not be created! -> %+v", err)
}
return logFile
}