mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-02 17:31:39 +00:00
61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package session
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
"github.com/labstack/echo/v4"
|
||
|
|
|
||
|
|
"github.com/onsonr/sonr/pkg/common"
|
||
|
|
"github.com/onsonr/sonr/pkg/common/types"
|
||
|
|
)
|
||
|
|
|
||
|
|
type contextKey string
|
||
|
|
|
||
|
|
// Context keys
|
||
|
|
const (
|
||
|
|
DataContextKey contextKey = "http_session_data"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Context = common.SessionCtx
|
||
|
|
|
||
|
|
// Get returns the session.Context from the echo context.
|
||
|
|
func Get(c echo.Context) (Context, error) {
|
||
|
|
ctx, ok := c.(*HTTPContext)
|
||
|
|
if !ok {
|
||
|
|
return nil, echo.NewHTTPError(http.StatusInternalServerError, "Session Context not found")
|
||
|
|
}
|
||
|
|
return ctx, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// WithData sets the session data in the context
|
||
|
|
func WithData(ctx context.Context, data *types.Session) context.Context {
|
||
|
|
return context.WithValue(ctx, DataContextKey, data)
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetData gets the session data from any context type
|
||
|
|
func GetData(ctx interface{}) *types.Session {
|
||
|
|
switch c := ctx.(type) {
|
||
|
|
case *HTTPContext:
|
||
|
|
if c != nil {
|
||
|
|
return c.sessionData
|
||
|
|
}
|
||
|
|
case context.Context:
|
||
|
|
if c != nil {
|
||
|
|
if val := c.Value(DataContextKey); val != nil {
|
||
|
|
if httpCtx, ok := val.(*types.Session); ok {
|
||
|
|
return httpCtx
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
case echo.Context:
|
||
|
|
if c != nil {
|
||
|
|
if httpCtx, ok := c.(*HTTPContext); ok && httpCtx != nil {
|
||
|
|
return httpCtx.sessionData
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// Return empty session rather than nil to prevent nil pointer panics
|
||
|
|
return &types.Session{}
|
||
|
|
}
|