package main import ( "fmt" "log" "net/http" "github.com/gorilla/sessions" "forge.cadoles.com/wpetit/goweb/session/gorilla" "forge.cadoles.com/wpetit/goweb/template/html" "github.com/go-chi/chi/middleware" "forge.cadoles.com/wpetit/goweb/service/session" "forge.cadoles.com/wpetit/goweb/service/template" "forge.cadoles.com/Pyxis/orion/cmd/server/jsonrpc" containerMiddleware "forge.cadoles.com/wpetit/goweb/middleware/container" "forge.cadoles.com/wpetit/goweb/service" "github.com/go-chi/chi" ) var ( conf = newDefaultConfig() ) func main() { if err := overwriteFromEnv(conf); err != nil { log.Fatal(err) } // Create service container container := service.NewContainer() container.Provide(jsonrpc.ServiceName, getJSONRPCServiceProvider()) container.Provide(template.ServiceName, html.ServiceProvider(conf.TemplateDir)) container.Provide(session.ServiceName, getSessionServiceProvider()) r := chi.NewRouter() r.Use(middleware.Recoverer) r.Use(middleware.RequestID) r.Use(middleware.Logger) r.Use(containerMiddleware.ServiceContainer(container)) configureRoutes(r) hostStr := fmt.Sprintf("%s:%s", conf.HTTPHost, conf.HTTPPort) log.Printf("listening on http://%s", hostStr) if err := http.ListenAndServe(hostStr, r); err != nil { log.Fatal(err) } } func getJSONRPCServiceProvider() service.Provider { jsonrpc := jsonrpc.NewServer() return func(c *service.Container) (interface{}, error) { return jsonrpc, nil } } func getSessionServiceProvider() service.Provider { // Create a new encrypted/authenticated cookie store for the session cookieStore, err := gorilla.CreateCookieSessionStore(32, 64) var sessionService session.Service if err == nil { sessionService = gorilla.NewSessionService( "orion", cookieStore, &sessions.Options{ HttpOnly: true, }, ) } return func(c *service.Container) (interface{}, error) { if err != nil { return nil, err } return sessionService, nil } }