77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
package service
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"git.umbrella.haus/ae/notatest/internal/data"
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/go-chi/chi/v5/middleware"
|
|
"github.com/go-chi/cors"
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
type SvcConfig struct {
|
|
JWTSecret string
|
|
CSRFSecret string
|
|
IsProd bool
|
|
Domain string
|
|
FrontendURL string
|
|
}
|
|
|
|
func (sc *SvcConfig) allowedOrigins() []string {
|
|
allowed := []string{sc.FrontendURL}
|
|
log.Debug().Msgf("CORS allowedOrigins: %v", allowed)
|
|
return allowed
|
|
}
|
|
|
|
func Run(conn *pgx.Conn, q *data.Queries, config SvcConfig) error {
|
|
r := chi.NewRouter()
|
|
|
|
if !config.IsProd {
|
|
log.Warn().Msg("Running in *INSECURE* development mode")
|
|
}
|
|
|
|
authRouter := authResource{
|
|
Config: config,
|
|
Users: q,
|
|
Tokens: q,
|
|
}
|
|
notesRouter := notesResource{
|
|
Config: config,
|
|
Notes: q,
|
|
}
|
|
|
|
// Global middlewares
|
|
r.Use(middleware.RequestID)
|
|
r.Use(middleware.RealIP)
|
|
r.Use(loggerMiddleware(&log.Logger))
|
|
r.Use(cors.Handler(cors.Options{
|
|
AllowedOrigins: config.allowedOrigins(),
|
|
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
|
|
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-Csrf-Token"},
|
|
ExposedHeaders: []string{"List", "X-Csrf-Token"},
|
|
AllowCredentials: true,
|
|
MaxAge: 300,
|
|
}))
|
|
r.Use(middleware.Recoverer)
|
|
r.Use(middleware.AllowContentType("application/json"))
|
|
|
|
// Routes grouped by functionality (we must prefix the API routes with `/api`
|
|
// as the domain will be the same for the front and back ends)
|
|
r.Route("/api", func(r chi.Router) {
|
|
r.Mount("/auth", authRouter.Routes())
|
|
r.Mount("/notes", notesRouter.Routes())
|
|
r.Get("/ping", ping)
|
|
})
|
|
|
|
log.Info().Msg("Starting server on :8080")
|
|
return http.ListenAndServe(":8080", r)
|
|
}
|
|
|
|
func ping(w http.ResponseWriter, r *http.Request) {
|
|
respondJSON(w, http.StatusOK, map[string]string{
|
|
"message": "pong",
|
|
})
|
|
}
|