Repository navigation
Expand file tree
/
Copy pathmain.go
More file actions
140 lines (120 loc) · 4.22 KB
/
Copy pathmain.go
File metadata and controls
140 lines (120 loc) · 4.22 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"context"
"flag"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"voxeti/backend/controller"
"voxeti/backend/database"
"voxeti/backend/schema/job"
"voxeti/frontend"
"github.com/joho/godotenv"
"github.com/labstack/echo/v4"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
var (
devMode = false // enable at build time with: "go build -tags dev".
)
// var DATABASE_NAME string = "data"
func main() {
// parse command line flags
backendPort := flag.Int("p", 3000, "the port to host the backend on")
dbUri := flag.String("db", "", "the MongoDB database URI to connect to")
resetDb := flag.Bool("reset", false, "decide to reset the database")
flag.Parse()
// display splash screen
logo, _ := pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("voxeti", pterm.FgMagenta.ToStyle())).Srender()
pterm.DefaultCenter.Println(logo)
generate := pterm.DefaultBox.Sprint("Prototype created by " + pterm.Cyan("Generate"))
pterm.DefaultCenter.Println(generate)
// notify dev mode
if devMode {
pterm.Info.Println("Running in dev mode")
// load environment variables
err := godotenv.Load(".env")
if err != nil || os.Getenv("SESSION_KEY") == "" || os.Getenv("G_MAPS_API_KEY") == "" {
pterm.Info.Println("Failed to load environment variables, shutting down...")
pterm.Fatal.WithFatal(false).Println(err)
os.Exit(1)
}
}
// configure server
e, dbDisconnect := configureServer(*dbUri, *resetDb)
defer dbDisconnect()
// start echo server
go func() {
if err := e.Start(fmt.Sprintf(":%d", *backendPort)); err != nil && err != http.ErrServerClosed {
pterm.Fatal.WithFatal(false).Println(err)
os.Exit(1)
}
}()
// graceful shutdown on server closed
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
pterm.Println()
pterm.Info.Println("Shutting down...")
if err := e.Shutdown(ctx); err != nil {
pterm.Fatal.WithFatal(false).Println(err)
os.Exit(1)
}
// display active servers
pterm.Info.Printfln("Backend server: http://localhost:%d/api/ ...", *backendPort)
pterm.Info.Printfln("Frontend server: http://localhost:%d/ ...", *backendPort)
}
func configureServer(dbUri string, resetDb bool) (e *echo.Echo, dbDisconnect func()) {
// configure logger
spinnerSuccess, _ := pterm.DefaultSpinner.Start("Configuring logger...")
logLevel := pterm.LogLevelInfo
if devMode {
logLevel = pterm.LogLevelTrace
} // increase log level to support easier debugging
logger := pterm.DefaultLogger.WithLevel(logLevel)
spinnerSuccess.Success("Configured logger with log level ", logLevel)
// configure echo
spinnerSuccess, _ = pterm.DefaultSpinner.Start("Configuring echo...")
e = echo.New()
e.HideBanner = true
spinnerSuccess.Success("Configured echo")
// connect to database
spinnerSuccess, _ = pterm.DefaultSpinner.Start("Connecting to database...")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
dbClient, err := mongo.Connect(ctx, options.Client().ApplyURI(dbUri))
if err != nil || dbClient.Ping(ctx, readpref.Primary()) != nil {
spinnerSuccess.Fail("Failed to connect to database")
os.Exit(1)
}
dbDisconnect = func() {
if err = dbClient.Disconnect(ctx); err != nil {
panic(err)
}
}
spinnerSuccess.Success("Connected to database")
// create needed collections
spinnerSuccess, _ = pterm.DefaultSpinner.Start("Creating MongoDB collections...")
database.Setup(dbClient, logger, resetDb)
spinnerSuccess.Success("Created MongoDB collections")
// register frontend handlers
spinnerSuccess, _ = pterm.DefaultSpinner.Start("Registering frontend handlers...")
frontend.RegisterFrontendHandlers(e)
spinnerSuccess.Success("Registered frontend handlers")
// register backend handlers
spinnerSuccess, _ = pterm.DefaultSpinner.Start("Registering backend handlers...")
controller.RegisterHandlers(e, dbClient, logger)
spinnerSuccess.Success("Registered backend handlers")
go job.TransferPotentialToDeclined(dbClient, logger)
go job.DeleteMaxDeclinedJobs(dbClient, logger)
return
}