Files
junk2jive-server/internal/router/router.go
rogueking cb14535c1f
Some checks failed
golangci-lint / lint (push) Failing after 24s
Run Go Tests / build (push) Failing after 0s
build / Build (push) Successful in 1m47s
Build and Push Docker Image / Build and push image (push) Successful in 2m29s
added error for roboflow
2025-05-06 19:18:16 -07:00

83 lines
2.0 KiB
Go

package router
import (
"net/http"
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
"go.uber.org/zap"
"golang.org/x/time/rate"
"gitea.miguelmuniz.com/rogueking/junk2jive-server/internal/limiter"
"gitea.miguelmuniz.com/rogueking/junk2jive-server/internal/logger"
"gitea.miguelmuniz.com/rogueking/junk2jive-server/internal/ollama"
"gitea.miguelmuniz.com/rogueking/junk2jive-server/internal/response"
"gitea.miguelmuniz.com/rogueking/junk2jive-server/internal/roboflow"
)
// Router encapsulates the Chi router and its dependencies
type Router struct {
router *chi.Mux
logger *zap.Logger
rateLimiter *limiter.RateLimiter
}
// NewRouter creates and configures a new Router instance
func NewRouter() *Router {
return &Router{
router: chi.NewRouter(),
}
}
func SetupRouter(origins []string) *Router {
router := chi.NewRouter()
router.Use(cors.Handler(cors.Options{
AllowedOrigins: origins,
AllowedMethods: []string{"GET", "POST", "OPTIONS"},
AllowedHeaders: []string{"Content-Type", "X-CSRF-Token"},
AllowCredentials: true,
MaxAge: 300,
}))
zlogger, _ := zap.NewProduction()
defer zlogger.Sync()
rl := limiter.New()
router.Use(middleware.RequestID)
router.Use(middleware.RealIP)
router.Use(middleware.Logger)
router.Use(middleware.Recoverer)
router.Use(middleware.Timeout(60 * time.Second))
router.Use(logger.Middleware(zlogger))
r := Router{
router: router,
logger: zlogger,
rateLimiter: rl,
}
r.router.Route("/v1/api", func(apiRouter chi.Router) {
apiRouter.Group(func(subRouter chi.Router) {
subRouter.Use(r.rateLimiter.Middleware(rate.Every(1*time.Second), 30))
subRouter.Get("/coffee", func(w http.ResponseWriter, r *http.Request) {
response.RespondWithJSON(w, http.StatusTeapot, map[string]string{"error": "I'm A Teapot!"})
})
subRouter.Post("/text", ollama.OllamaRequest)
subRouter.Post("/visual", roboflow.HandleImageRequest)
})
})
return &r
}
func (r *Router) GetRouter() *chi.Mux {
return r.router
}