56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
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
|
|
})
|
|
}
|