Files
reservierungssystem/backend/cmd/main.go
T

95 lines
2.2 KiB
Go

package main
import (
"log"
"net/http"
"os"
"reservation-system/backend/internal/api"
"reservation-system/backend/internal/auth"
"reservation-system/backend/internal/db"
"reservation-system/backend/internal/email"
"golang.org/x/crypto/bcrypt"
)
func main() {
// Initialize JWT
jwtSecret := os.Getenv("JWT_SECRET")
if jwtSecret == "" {
jwtSecret = "your-secret-key-change-in-production"
}
auth.InitJWTSecret(jwtSecret)
// Initialize database
dbPath := os.Getenv("DB_PATH")
if dbPath == "" {
dbPath = "/data/reservations.db"
}
database, err := db.New(dbPath)
if err != nil {
log.Fatalf("Failed to initialize database: %v", err)
}
defer database.Close()
// Create default admin user if none exists
createDefaultUser(database)
// Start email processor
emailProcessor := email.NewEmailProcessor(database)
emailProcessor.Start()
defer emailProcessor.Stop()
// Setup API handlers
handler := api.NewHandler(database)
mux := http.NewServeMux()
handler.RegisterRoutes(mux)
// Static files
fs := http.FileServer(http.Dir("/app/frontend"))
mux.Handle("/", fs)
// Start server
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Printf("Server starting on port %s", port)
if err := http.ListenAndServe(":"+port, corsMiddleware(mux)); err != nil {
log.Fatalf("Server failed: %v", err)
}
}
func createDefaultUser(database *db.DB) {
adminUser, _ := database.GetUserByUsername("admin")
if adminUser == nil {
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte("admin"), bcrypt.DefaultCost)
user := &db.models.User{
Username: "admin",
Password: string(hashedPassword),
IsAdmin: true,
}
if err := database.CreateUser(user); err != nil {
log.Printf("Failed to create default user: %v", err)
} else {
log.Println("Created default admin user (admin/admin)")
}
}
}
func corsMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
next.ServeHTTP(w, r)
})
}