Files
billit/internal/server/routes.go
2025-12-06 15:31:18 +05:30

133 lines
4.6 KiB
Go

package server
import (
"billit/internal/handler"
"billit/internal/logic"
"billit/internal/view"
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func (s *Server) RegisterRoutes() http.Handler {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"https://*", "http://*"},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"},
AllowHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
AllowCredentials: true,
MaxAge: 300,
}))
// Static files
if s.assetsFS != nil {
fileServer := http.FileServer(http.FS(s.assetsFS))
e.GET("/assets/*", echo.WrapHandler(fileServer))
}
// ========================================
// Auth Setup
// ========================================
authService := logic.NewAuthService(s.db)
authHandlers := handler.NewAuthHandlers(authService)
// ========================================
// API Routes (JSON responses) - Health only
// ========================================
healthHandlers := handler.NewHealthHandlers(s.db)
apiGroup := e.Group("/api")
{
apiGroup.GET("/health", healthHandlers.HealthHandler)
}
// ========================================
// Public Web Routes (no auth required)
// ========================================
e.GET("/", authHandlers.LoginPageHandler)
e.POST("/login", authHandlers.LoginHandler)
e.GET("/register", authHandlers.RegisterPageHandler)
e.POST("/register", authHandlers.RegisterHandler)
e.GET("/logout", authHandlers.LogoutHandler)
// ========================================
// Protected Web Routes (auth required)
// ========================================
protected := e.Group("")
protected.Use(authHandlers.AuthMiddleware)
// Home
homeHandlers := handler.NewHomeHandlers(s.db)
protected.GET("/home", homeHandlers.HomePageHandler)
// Account routes
accountHandlers := handler.NewAccountHandlers(s.db, authService)
protected.GET("/account", accountHandlers.AccountPageHandler)
protected.POST("/account/details", accountHandlers.UpdateDetailsHandler)
protected.POST("/account/password", accountHandlers.ChangePasswordHandler)
// Buyer routes
buyerHandlers := handler.NewBuyerHandlers(s.db)
protected.GET("/buyer", buyerHandlers.BuyerListHandler)
protected.GET("/buyer/create", buyerHandlers.BuyerCreatePageHandler)
protected.POST("/buyer/create", buyerHandlers.BuyerCreateHandler)
protected.GET("/buyer/edit/:id", buyerHandlers.BuyerEditPageHandler)
protected.POST("/buyer/edit/:id", buyerHandlers.BuyerUpdateHandler)
protected.DELETE("/buyer/:id", buyerHandlers.BuyerDeleteHandler)
// Invoices list
invoicesHandlers := handler.NewInvoicesHandlers(s.db)
protected.GET("/invoice", invoicesHandlers.InvoicesListHandler)
// Modal routes
modalHandlers := handler.NewModalHandlers()
protected.GET("/modal/confirm", modalHandlers.ConfirmHandler)
// Product routes (web UI)
productHandlers := handler.NewProductHandlers(s.db)
protected.GET("/product", productHandlers.ProductListHandler)
protected.GET("/product/create", productHandlers.ProductCreatePageHandler)
protected.POST("/product/create", productHandlers.ProductCreateHandler)
protected.GET("/product/edit/:sku", productHandlers.ProductEditPageHandler)
protected.POST("/product/edit/:sku", productHandlers.ProductUpdateHandler)
protected.DELETE("/product/:sku", productHandlers.ProductDeleteHandler)
// Billing routes (web UI)
billingHandlers := handler.NewBillingHandlers(s.db)
protected.GET("/billing", billingHandlers.BillingPageHandler)
protected.POST("/billing/calculate", billingHandlers.CalculateBillHandler)
protected.POST("/billing/generate", billingHandlers.GenerateBillHandler)
protected.GET("/billing/add-row", billingHandlers.AddProductRowHandler)
// Invoice view (protected - only owner can view)
protected.GET("/invoice/:id", billingHandlers.ShowInvoiceHandler)
// Legacy health check (kept for backward compatibility)
e.GET("/health", healthHandlers.HealthHandler)
// Custom 404 handler for Echo HTTP errors
e.HTTPErrorHandler = func(err error, c echo.Context) {
if he, ok := err.(*echo.HTTPError); ok {
switch he.Code {
case http.StatusNotFound:
_ = view.RenderNotFound(c, "")
return
case http.StatusInternalServerError:
_ = view.RenderServerError(c, "")
return
}
}
// Default error handler for other cases
e.DefaultHTTPErrorHandler(err, c)
}
// Catch-all for undefined routes (must be last)
e.RouteNotFound("/*", func(c echo.Context) error {
return view.RenderNotFound(c, "")
})
return e
}