// 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")
dbtype = os.Getenv("DBTYPE")
dbcreds = os.Getenv("DB")
url = os.Getenv("URL")
secret = os.Getenv("SECRET")
)
type App struct {
log *log.Logger
space http.Handler
user http.Handler
ping 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.ping.ServeHTTP(w, r)
return
case "":
fallthrough
case "user":
a.user.ServeHTTP(w, r)
return
case "space":
a.space.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),
dbtype,
dbcreds,
security.Default(secret),
)
if err != nil {
applogger.Fatal(err)
}
if err := db.EnsureSetup(); err != nil {
applogger.Fatal(err)
}
app = &App{
log: applogger,
space: space.New(
log.New(w, "[cms:space] ", 0),
db,
),
user: user.New(
log.New(w, "[cms:user] ", 0),
db,
),
ping: ping.New(
log.New(w, "[cms:ping] ", 0),
db,
),
}
}
func main() {
app.log.Println("listening on", url)
app.log.Fatal(http.ListenAndServe(port, app))
}