pop-camarades/main.go

217 lines
7.3 KiB
Go

package main
import (
"embed"
"fmt"
"io/fs"
"net/http"
"git.readonly.ch/bouzoure/pop-camarades/controllers"
"git.readonly.ch/bouzoure/pop-camarades/helpers"
"git.readonly.ch/bouzoure/pop-camarades/middlewares"
"github.com/flosch/pongo2/v6"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/filesystem"
loggerMiddleware "github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/helmet/v2"
"github.com/gofiber/template/django/v3"
)
//go:embed static/*
var embedStatic embed.FS
//go:embed views
var embedViews embed.FS
func main() {
log := helpers.GetLogger()
config, err := helpers.GetConfig()
if err != nil {
log.Fatal(err)
}
accountCheck, err := helpers.FirstAccountCheck()
if err != nil {
log.Fatal(err)
}
if !accountCheck {
err = helpers.FirstAccountCreate()
if err != nil {
log.Fatal(err)
}
}
// Create a new engine
var engine *django.Engine
if config.Debug {
engine = django.New("./views", ".html")
engine.ShouldReload = true
} else {
embedViews2, err := fs.Sub(embedViews, "views")
if err != nil {
log.Fatal(err)
}
engine = django.NewFileSystem(
http.FS(embedViews2),
".html",
)
}
pongo2.RegisterFilter("time_diff", helpers.TemplTimeDiff)
app := fiber.New(fiber.Config{
Views: engine,
ErrorHandler: helpers.FiberErrorHandler,
})
if config.Debug {
app.Static("/static", "./static")
} else {
app.Use("/static", filesystem.New(filesystem.Config{
Root: http.FS(embedStatic),
PathPrefix: "static",
Browse: false,
}))
}
// Base middlewares
app.Use(loggerMiddleware.New())
app.Use(helmet.New())
// Misc endpoints without auth
app.Post("/set-color-mode", controllers.SetColorMode)
// Licences page
app.Use("/licences", middlewares.TemplatesMiddleware)
app.Get("/licences", controllers.Licences)
// Security middlewares
app.Use(middlewares.SavedSessionMiddleware)
app.Use(middlewares.AuthMiddleware)
app.Use(middlewares.WelcomeMiddleware)
app.Use(middlewares.MfaEnrollMiddleware)
app.Use(middlewares.MfaVerifyMiddleware)
app.Use(middlewares.TemplatesMiddleware)
app.Use("/admin", middlewares.AuthzAdmin)
// Main pages
app.Get("/", controllers.Homepage)
app.Get("/admin", controllers.Admin)
// Login & logout
app.Get("/login", controllers.LoginForm)
app.Post("/login", controllers.LoginForm)
app.Get("/logout", controllers.LogoutProcess)
// Welcome page on first login
app.Get("/welcome", controllers.WelcomePage)
app.Post("/welcome", controllers.WelcomePage)
// TOTP enroll & verify
app.Get("/totp/enroll", controllers.TotpEnrollPage)
app.Post("/totp/enroll", controllers.TotpEnrollPage)
app.Get("/totp/verify", controllers.TotpVerifyPage)
app.Post("/totp/verify", controllers.TotpVerifyPage)
// Members
app.Get("/members", controllers.Members)
app.Get("/members/:id<int;min(0)>", controllers.MemberShow)
app.Get("/members/add", controllers.MemberAdd)
app.Post("/members/add", controllers.MemberAdd)
app.Get("/members/:id<int;min(0)>/edit", controllers.MemberEdit)
app.Post("/members/:id<int;min(0)>/edit", controllers.MemberEdit)
app.Post("/members/:id<int;min(0)>/convert", controllers.MemberConvert)
app.Post("/members/:id<int;min(0)>/archive", controllers.MemberArchive)
app.Post("/members/:id<int;min(0)>/restore", controllers.MemberRestore)
app.Post("/members/:id<int;min(0)>/purge", controllers.MemberPurge)
// Contacts
app.Get("/contacts", controllers.Contacts)
app.Get("/contacts/:id<int;min(0)>", controllers.ContactShow)
app.Get("/contacts/add", controllers.ContactAdd)
app.Post("/contacts/add", controllers.ContactAdd)
app.Get("/contacts/:id<int;min(0)>/edit", controllers.ContactEdit)
app.Post("/contacts/:id<int;min(0)>/edit", controllers.ContactEdit)
app.Post("/contacts/:id<int;min(0)>/convert", controllers.ContactConvert)
app.Post("/contacts/:id<int;min(0)>/archive", controllers.ContactArchive)
app.Post("/contacts/:id<int;min(0)>/restore", controllers.ContactRestore)
app.Post("/contacts/:id<int;min(0)>/purge", controllers.ContactPurge)
// Account manage
app.Get("/account/manage", controllers.AccountManage)
app.Post("/account/manage", controllers.AccountManage)
app.Get("/account/totp", controllers.AccountTotp)
app.Post("/account/totp", controllers.AccountTotp)
// Admin: Sections
app.Get("/admin/sections", controllers.Sections)
app.Get("/admin/sections/:id<int;min(0)>", controllers.SectionShow)
app.Get("/admin/sections/add", controllers.SectionAdd)
app.Post("/admin/sections/add", controllers.SectionAdd)
app.Get("/admin/sections/:id<int;min(0)>/edit", controllers.SectionEdit)
app.Post("/admin/sections/:id<int;min(0)>/edit", controllers.SectionEdit)
app.Post("/admin/sections/:id<int;min(0)>/delete", controllers.SectionDelete)
// Admin: Lists
app.Get("/admin/lists", controllers.Lists)
app.Get("/admin/lists/:id<int;min(0)>", controllers.ListShow)
app.Get("/admin/lists/add", controllers.ListAdd)
app.Post("/admin/lists/add", controllers.ListAdd)
app.Get("/admin/lists/:id<int;min(0)>/edit", controllers.ListEdit)
app.Post("/admin/lists/:id<int;min(0)>/edit", controllers.ListEdit)
app.Post("/admin/lists/:id<int;min(0)>/delete", controllers.ListDelete)
app.Get("/admin/lists/:id<int;min(0)>/items/add", controllers.ListItemAdd)
app.Post("/admin/lists/:id<int;min(0)>/items/add", controllers.ListItemAdd)
app.Get("/admin/lists/:id<int;min(0)>/items/:itemid<int;min(0)>", controllers.ListItemEdit)
app.Post("/admin/lists/:id<int;min(0)>/items/:itemid<int;min(0)>", controllers.ListItemEdit)
app.Post("/admin/lists/:id<int;min(0)>/items/:itemid<int;min(0)>/delete", controllers.ListItemDelete)
// Admin: Fields
app.Get("/admin/fields", controllers.Fields)
app.Get("/admin/fields/:id<int;min(0)>", controllers.FieldShow)
app.Get("/admin/fields/add", controllers.FieldAdd)
app.Post("/admin/fields/add", controllers.FieldAdd)
app.Get("/admin/fields/:id<int;min(0)>/edit", controllers.FieldEdit)
app.Post("/admin/fields/:id<int;min(0)>/edit", controllers.FieldEdit)
app.Post("/admin/fields/:id<int;min(0)>/delete", controllers.FieldDelete)
// Admin: Users
app.Get("/admin/users", controllers.Users)
app.Get("/admin/users/:id<int;min(0)>", controllers.UserShow)
app.Get("/admin/users/add", controllers.UserAdd)
app.Post("/admin/users/add", controllers.UserAdd)
app.Get("/admin/users/:id<int;min(0)>/edit", controllers.UserEdit)
app.Post("/admin/users/:id<int;min(0)>/edit", controllers.UserEdit)
app.Get("/admin/users/:id<int;min(0)>/permissions", controllers.UserPermissions)
app.Post("/admin/users/:id<int;min(0)>/permissions", controllers.UserPermissions)
app.Post("/admin/users/:id<int;min(0)>/delete", controllers.UserDelete)
// Admin: Roles
app.Get("/admin/roles", controllers.Roles)
app.Get("/admin/roles/:id<int;min(0)>", controllers.RoleShow)
app.Get("/admin/roles/add", controllers.RoleAdd)
app.Post("/admin/roles/add", controllers.RoleAdd)
app.Get("/admin/roles/:id<int;min(0)>/edit", controllers.RoleEdit)
app.Post("/admin/roles/:id<int;min(0)>/edit", controllers.RoleEdit)
app.Post("/admin/roles/:id<int;min(0)>/delete", controllers.RoleDelete)
log.Info(
"starting web server",
"address", config.App.ListenAddress,
"port", config.App.ListenPort,
)
listenAddr := fmt.Sprintf(
"%s:%d",
config.App.ListenAddress,
config.App.ListenPort,
)
err = app.Listen(listenAddr)
if err != nil {
log.Fatal(err)
}
}