// cms is a free and open source content management system. package main import ( "log" "net/http" "os" "strings" "git.sr.ht/~evanj/cms/internal/c/ping" "git.sr.ht/~evanj/cms/internal/c/space" "git.sr.ht/~evanj/cms/internal/c/user" "git.sr.ht/~evanj/cms/internal/s/db" "git.sr.ht/~evanj/security" ) var ( app *App port = os.Getenv("PORT") dbcreds = os.Getenv("DB") url = os.Getenv("URL") secret = os.Getenv("SECRET") ) type App struct { log *log.Logger space http.Handler user http.Handler pong http.Handler } func (a *App) ServeHTTP(w http.ResponseWriter, r *http.Request) { parts := strings.Split(r.URL.Path, "/") if len(parts) < 2 { http.NotFound(w, r) return } switch parts[1] { case "ping": a.pong.ServeHTTP(w, r) return case "": fallthrough case "user": a.user.ServeHTTP(w, r) return } http.NotFound(w, r) } func init() { w := os.Stdout applogger := log.New(w, "[cms] ", 0) db, err := db.New( log.New(w, "[cms:db] ", 0), dbcreds, security.Default(secret), ) if err != nil { applogger.Fatal(err) } if err := db.EnsureSetup(); err != nil { applogger.Fatal(err) } app = &App{ applogger, user.New( log.New(w, "[cms:user] ", 0), db, ), space.New( log.New(w, "[cms:space] ", 0), db, ), ping.New( log.New(w, "[cms:ping] ", 0), db, ), } } func main() { app.log.Println("listening on", url) app.log.Fatal(http.ListenAndServe(port, app)) }