Files
feedmee/backend/server.go

75 lines
2.3 KiB
Go

package main
import (
"net/http"
"menu/handlers"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
)
func NewServer(app *handlers.App, address string, allowedOrigins []string) *http.Server {
r := chi.NewRouter()
// Middleware
r.Use(middleware.RequestID)
r.Use(middleware.Recoverer)
r.Use(middleware.Logger)
r.Use(cors.Handler(cors.Options{
AllowedOrigins: allowedOrigins,
AllowedMethods: []string{"GET", "POST", "OPTIONS"},
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type"},
AllowCredentials: true,
MaxAge: 300,
}))
// Routes (bind methods to app)
r.Post("/api/register", app.HandleRegister)
r.Post("/api/login", app.HandleLogin)
r.Get("/api/options", app.HandleOptions)
r.Post("/api/selection", app.HandleSaveSelection)
r.Get("/api/selection", app.HandleGetSelection)
r.Get("/api/orders", app.HandleGetOrders)
r.Post("/api/orders", app.HandleAddOrder)
r.Get("/api/orders/stream", app.HandleOrdersStream)
r.Delete("/api/orders/{id}", app.HandleDeleteOrder)
r.Get("/api/me", app.HandleWhoAmI)
r.Get("/api/finalize/time", app.HandleGetFinalizeTime)
// Only role 0 and 1 allowed
r.Route("/api/admin", func(r chi.Router) {
r.Use(app.RequireLevel(1))
r.Post("/menu", app.HandleAdminMenu)
r.Get("/menu", app.HandleGetMenuRaw)
r.Get("/users", app.HandleGetUsers)
r.Delete("/users/{id}", app.HandleDeleteUser)
r.Put("/users/{id}", app.HandleUpdateUser)
r.Get("/orders", app.HandleGetAllOrders)
r.Put("/orders/{id}/status", app.HandleAdminUpdateOrderStatus)
r.Delete("/orders/{id}", app.HandleAdminDeleteOrder)
r.Get("/finalize/time", app.HandleGetFinalizeTime)
r.Post("/finalize/time", app.HandleSetFinalizeTime)
r.Post("/finalize/now", app.HandleFinalizeNow)
r.Get("/finalize/last", app.HandleGetLastSummary)
})
// Moderators (role <= 50)
r.Route("/api/mod", func(r chi.Router) {
r.Use(app.RequireLevel(50))
r.Post("/menu", app.HandleAdminMenu) // menu editor
r.Get("/menu", app.HandleGetMenuRaw)
r.Get("/finalize/time", app.HandleGetFinalizeTime)
r.Post("/finalize/time", app.HandleSetFinalizeTime)
r.Post("/finalize/now", app.HandleFinalizeNow)
r.Get("/finalize/last", app.HandleGetLastSummary)
})
// Return configured server
return &http.Server{
Addr: address,
Handler: r,
}
}