|
|
package main
import ( "fmt" "github.com/gin-gonic/gin" "github.com/gisle/stufflog/api" "github.com/gisle/stufflog/config" "github.com/gisle/stufflog/database" "github.com/gisle/stufflog/services" "github.com/urfave/cli" "log" "net/http" "os" "path" )
func main() { configPath := "/etc/stufflog.yaml" uiRoot := ""
app := cli.NewApp() app.Name = "stufflog" app.Usage = "Prioritize stuff, do stuff, log stuff"
app.Flags = []cli.Flag{ cli.StringFlag{ Name: "conf, c", Value: configPath, Usage: "Configuration file locations", Destination: &configPath, }, cli.StringFlag{ Name: "ui", Value: uiRoot, Usage: "UI Root (blank for no UI)", Destination: &uiRoot, }, }
app.Action = func(c *cli.Context) error { // Load configuration
conf, err := config.Load(configPath) if err != nil { return fmt.Errorf("failed to load config: %s", err) }
// Load database
db, err := database.Init(conf.Database) if err != nil { return fmt.Errorf("failed to init database: %s", err) }
// Setup gin
if !conf.Server.Debug { gin.SetMode(gin.ReleaseMode) } router := gin.New()
// Setup services
auth := services.NewAuthService(db) scoring := services.NewScoringService(db)
// Setup APIs
api.User(router.Group("/api/user"), auth) api.Activity(router.Group("/api/activity"), db, auth) api.Period(router.Group("/api/period"), db, scoring, auth)
// Setup UI
if uiRoot != "" { router.NoRoute(gin.WrapH(http.FileServer(http.Dir(uiRoot)))) router.GET("/activities/", func(c *gin.Context) { http.ServeFile(c.Writer, c.Request, path.Join(uiRoot, "index.html")) }) }
// Start listening
log.Println("Starting server on", conf.Server.Listen) return router.Run(conf.Server.Listen)
// TODO: Handle interrupts because docker and sigint aren't the best of friends.
}
err := app.Run(os.Args) if err != nil { log.Fatal(err) } }
|