package main import ( "log" "net/http" "os" "time" root "marmic/servicetrade-toolbox" "marmic/servicetrade-toolbox/internal/handlers/web" "marmic/servicetrade-toolbox/internal/middleware" "github.com/gorilla/mux" ) func main() { err := root.InitializeWebTemplates() // Note the change here if err != nil { log.Fatalf("Failed to initialize web templates: %v", err) } r := mux.NewRouter() // Serve embedded static files staticFS, err := root.GetStaticFS() if err != nil { log.Fatalf("Failed to get static filesystem: %v", err) } r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.FS(staticFS)))) // Serve static files // r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) // Auth routes r.HandleFunc("/login", web.LoginHandler).Methods("GET", "POST") r.HandleFunc("/logout", web.LogoutHandler).Methods("GET", "POST") // Protected routes protected := r.PathPrefix("/").Subrouter() protected.Use(middleware.AuthMiddleware) protected.HandleFunc("/", web.DashboardHandler).Methods("GET") protected.HandleFunc("/jobs", web.JobsHandler).Methods("GET", "POST") protected.HandleFunc("/invoices", web.InvoicesHandler).Methods("GET", "POST") protected.HandleFunc("/ok-invoice/{id}", web.UpdateInvoiceStatusHandler).Methods("PUT") protected.HandleFunc("/draft-invoice/{id}", web.UpdateInvoiceStatusHandler).Methods("PUT") protected.HandleFunc("/failed-invoice/{id}", web.UpdateInvoiceStatusHandler).Methods("PUT") protected.HandleFunc("/pending_accounting-invoice/{id}", web.UpdateInvoiceStatusHandler).Methods("PUT") protected.HandleFunc("/processed-invoice/{id}", web.UpdateInvoiceStatusHandler).Methods("PUT") protected.HandleFunc("/void-invoice/{id}", web.UpdateInvoiceStatusHandler).Methods("PUT") protected.HandleFunc("/admin", web.AdminHandler).Methods("GET") protected.HandleFunc("/assets", web.AssetsHandler).Methods("GET") protected.HandleFunc("/companies", web.CompaniesHandler).Methods("GET") protected.HandleFunc("/contacts", web.ContactsHandler).Methods("GET") protected.HandleFunc("/contracts", web.ContractsHandler).Methods("GET") protected.HandleFunc("/generic", web.GenericHandler).Methods("GET") protected.HandleFunc("/locations", web.LocationsHandler).Methods("GET") protected.HandleFunc("/notifications", web.NotificationsHandler).Methods("GET") protected.HandleFunc("/quotes", web.QuotesHandler).Methods("GET") protected.HandleFunc("/services", web.ServicesHandler).Methods("GET") protected.HandleFunc("/tags", web.TagsHandler).Methods("GET") protected.HandleFunc("/users", web.UsersHandler).Methods("GET") // Document upload routes protected.HandleFunc("/documents", web.DocumentsHandler).Methods("GET") protected.HandleFunc("/process-csv", web.ProcessCSVHandler).Methods("POST") protected.HandleFunc("/upload-documents", web.UploadDocumentsHandler).Methods("POST") protected.HandleFunc("/documents/upload/results", web.UploadResultsHandler).Methods("GET") protected.HandleFunc("/documents/upload/job/file", web.UploadJobFileHandler).Methods("GET") // Document removal routes protected.HandleFunc("/documents/remove", web.DocumentRemoveHandler).Methods("GET") protected.HandleFunc("/documents/remove/process-csv", web.ProcessRemoveCSVHandler).Methods("POST") protected.HandleFunc("/documents/remove/job-selection", web.JobSelectionHandler).Methods("POST") protected.HandleFunc("/documents/remove/job/file", web.RemovalJobFileHandler).Methods("GET") protected.HandleFunc("/documents/remove/job/{jobID}", web.GetJobAttachmentsHandler).Methods("GET") protected.HandleFunc("/documents/remove/attachments/{jobID}", web.RemoveJobAttachmentsHandler).Methods("POST") protected.HandleFunc("/documents/remove/bulk", web.BulkRemoveDocumentsHandler).Methods("POST") protected.HandleFunc("/documents/remove/results", web.RemovalResultsHandler).Methods("GET") port := os.Getenv("PORT") if port == "" { port = "8080" } log.Println("Server starting on :" + port) // Create a custom server with appropriate timeouts server := &http.Server{ Addr: ":" + port, Handler: r, ReadTimeout: 2 * time.Hour, // Large timeout for big file uploads WriteTimeout: 2 * time.Hour, // Large timeout for big file responses IdleTimeout: 120 * time.Second, // How long to wait for the next request } log.Fatal(server.ListenAndServe()) }