56 lines
1.2 KiB
Go
Raw Permalink Normal View History

2025-02-22 23:00:56 +08:00
package session
import (
"context"
"errors"
"net/http"
"git.jeffthecoder.xyz/public/lazyhandler/magic"
"git.jeffthecoder.xyz/public/lazyhandler/middleware"
"github.com/go-session/session/v3"
)
type ctxKey int
const (
sessionKey ctxKey = iota
)
var (
ErrSessionStoreNotInitialized = errors.New("no session store in request context")
)
func Session(sessionStore session.ManagerStore) middleware.Middleware {
manager := session.NewManager(
session.SetStore(sessionStore),
)
return middleware.WrapFunc(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
store, err := manager.Start(r.Context(), w, r)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
defer store.Save()
next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), sessionKey, store)))
})
})
}
func GetSession(r *http.Request) (session.Store, error) {
if store, ok := r.Context().Value(sessionKey).(session.Store); ok {
return store, nil
}
return nil, ErrSessionStoreNotInitialized
}
func RegisterExtractor() {
magic.RegisterExtractorGeneric[session.Store](func(r *http.Request) (any, error) {
store, err := GetSession(r)
return store, err
})
}