Files
arbeitszeitmessung/Backend/main.go
Tom Tröger 41c34c42cf
Some checks failed
Tests / Run Go Tests (push) Failing after 2m53s
Arbeitszeitmessung Deploy / Build Webserver (push) Successful in 3m4s
feat: updated docs to include filestruct
2026-01-26 21:46:51 +01:00

117 lines
3.5 KiB
Go

package main
import (
"arbeitszeitmessung/endpoints"
"arbeitszeitmessung/helper"
"arbeitszeitmessung/models"
"context"
"database/sql"
"log/slog"
"net/http"
"os"
"time"
"github.com/joho/godotenv"
_ "github.com/lib/pq"
)
func main() {
var err error
var logLevel slog.LevelVar
switch helper.GetEnv("LOG_LEVEL", "warn") {
case "debug":
logLevel.Set(slog.LevelDebug)
case "info":
logLevel.Set(slog.LevelInfo)
case "warn":
logLevel.Set(slog.LevelWarn)
case "error":
logLevel.Set(slog.LevelError)
}
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: &logLevel}))
slog.SetDefault(logger)
err = godotenv.Load(".env")
if err != nil {
slog.Info("No .env file found in directory!")
}
if helper.GetEnv("GO_ENV", "production") == "debug" {
logLevel.Set(slog.LevelDebug)
envs := os.Environ()
slog.Debug("Debug mode enabled", "Environment Variables", envs)
}
models.DB, err = OpenDatabase()
if err != nil {
slog.Error("Error while opening the database", "Error", err)
return
}
defer models.DB.(*sql.DB).Close()
if helper.GetEnv("GO_ENV", "production") != "debug" {
err = Migrate()
if err != nil {
slog.Error("Failed to migrate the database to newest version", "Error", err)
return
}
}
fs := http.FileServer(http.Dir("./static"))
endpoints.CreateSessionManager(24 * time.Hour)
server := http.NewServeMux()
// handles the different http routes
server.HandleFunc("/time/new", endpoints.TimeCreateHandler)
server.Handle("/absence", ParamsMiddleware(endpoints.AbsencHandler))
server.Handle("/time", ParamsMiddleware(endpoints.TimeHandler))
server.HandleFunc("/auto/logout", endpoints.LogoutHandler)
server.HandleFunc("/auto/kurzarbeit", endpoints.KurzarbeitFillHandler)
server.HandleFunc("/auto/feiertage", endpoints.FeiertagsHandler)
server.HandleFunc("/user/{action}", endpoints.UserHandler)
// server.HandleFunc("/user/login", endpoints.LoginHandler)
// server.HandleFunc("/user/settings", endpoints.UserSettingsHandler)
server.HandleFunc("/team", endpoints.TeamHandler)
server.HandleFunc("/presence", endpoints.TeamPresenceHandler)
server.Handle("/pdf", ParamsMiddleware(endpoints.PDFFormHandler))
server.HandleFunc("/pdf/generate", endpoints.PDFCreateController)
server.Handle("/", http.RedirectHandler("/time", http.StatusPermanentRedirect))
server.Handle("/static/", http.StripPrefix("/static/", fs))
serverSessionMiddleware := endpoints.Session.LoadAndSave(server)
serverSessionMiddleware = loggingMiddleware(serverSessionMiddleware)
// starting the http server
slog.Info("Server is running at http://localhost:8080")
slog.Error("Error starting Server", "Error", http.ListenAndServe(":8080", serverSessionMiddleware))
}
func ParamsMiddleware(next http.HandlerFunc) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
queryParams := r.URL.Query()
ctx := context.WithValue(r.Context(), "urlParams", queryParams)
if len(queryParams) > 0 {
slog.Debug("ParamsMiddleware added urlParams", slog.Any("urlParams", queryParams))
}
next.ServeHTTP(w, r.WithContext(ctx))
})
}
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
// Log the method and the requested URL
slog.Info("Started request", slog.String("Method", r.Method), slog.String("Path", r.URL.Path))
// Call the next handler in the chain
next.ServeHTTP(w, r)
// Log how long it took
slog.Info("Completet Request", slog.String("Time", time.Since(start).String()))
})
}