1
0
Files
coconut-leaf/backend/main.go

80 lines
2.1 KiB
Go

// main.go
package main
import (
"fmt"
"os"
"github.com/yyc12345/coconut-leaf/backend/cli"
"github.com/yyc12345/coconut-leaf/backend/config"
"github.com/yyc12345/coconut-leaf/backend/database"
"github.com/yyc12345/coconut-leaf/backend/logger"
"github.com/yyc12345/coconut-leaf/backend/server"
"github.com/yyc12345/coconut-leaf/backend/utils"
)
func main() {
args := cli.Parse()
cfg, err := config.Load(args.Config)
if err != nil {
fmt.Fprintln(os.Stderr, "error loading config file:", err)
os.Exit(1)
}
// Splash is printed directly; the logger is not built yet.
fmt.Println("Coconut-leaf")
fmt.Println("A light, self-host and multi-account calendar system")
fmt.Println("Project: https://github.com/yyc12345/coconut-leaf")
fmt.Println("===================")
// Build the logger from the loaded config.
loggerLevel := logger.Production
if cfg.Others.Debug {
loggerLevel = logger.Development
}
log := logger.New(loggerLevel)
// Create the database backend selected by the config.
deps := database.Deps{Cfg: cfg, Logger: log}
var db database.Database
switch cfg.Database.Driver {
case config.DatabaseDriverSqlite:
db, err = database.NewSqlite3Database(deps)
case config.DatabaseDriverMysql:
db, err = database.NewMysqlDatabase(deps)
default:
log.Error("unknown database driver", "driver", cfg.Database.Driver)
os.Exit(1)
}
if err != nil {
log.Error("failed to open database", "error", err)
os.Exit(1)
}
// Initialize the schema and first admin user when requested.
if args.Init {
if !utils.IsValidUsername(args.Username) {
log.Error("invalid init username")
os.Exit(1)
}
if !utils.IsValidPassword(args.Password) {
log.Error("invalid init password")
os.Exit(1)
}
if err := db.Init(args.Username, args.Password); err != nil {
log.Error("failed to initialize database", "error", err)
os.Exit(1)
}
}
// Serve.
defer db.Close()
log.Info("Starting server...")
handler := &server.Handler{DB: db, Logger: log, Cfg: cfg}
if err := server.Run(handler); err != nil {
log.Error("server stopped with error", "error", err)
os.Exit(1)
}
}