77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package appcontext
|
|
|
|
import (
|
|
"context"
|
|
"github.com/google/uuid"
|
|
"strings"
|
|
)
|
|
|
|
type customContextType string
|
|
|
|
const (
|
|
AppCtx customContextType = "appCtx"
|
|
)
|
|
|
|
type AppExtContext struct {
|
|
UserEmail string // Email of the user
|
|
RequestID string // RequestID - used to track logs across a request-response cycle
|
|
Locale string // Locale for language
|
|
Application string // application for dynamic application auth
|
|
}
|
|
|
|
type AppContext struct {
|
|
context.Context
|
|
AppExtContext
|
|
}
|
|
|
|
func GetAppCtx(ctx context.Context) (AppExtContext, bool) {
|
|
if ctx == nil {
|
|
return AppExtContext{}, false
|
|
}
|
|
appCtx, exists := ctx.Value(AppCtx).(AppExtContext)
|
|
return appCtx, exists
|
|
}
|
|
|
|
func WithAppCtx(ctx context.Context, appCtx AppExtContext) context.Context {
|
|
return context.WithValue(ctx, AppCtx, appCtx)
|
|
}
|
|
|
|
func UpgradeCtx(ctx context.Context) AppContext {
|
|
var appCtx AppContext
|
|
tCtx, _ := GetAppCtx(ctx)
|
|
|
|
appCtx.Context = ctx
|
|
appCtx.AppExtContext = tCtx
|
|
return appCtx
|
|
}
|
|
|
|
func NewAppContext() AppContext {
|
|
return AppContext{
|
|
Context: context.Background(),
|
|
AppExtContext: AppExtContext{},
|
|
}
|
|
}
|
|
|
|
func CopyAppContext(ctx context.Context) AppContext {
|
|
appCtx, _ := GetAppCtx(ctx)
|
|
return AppContext{
|
|
Context: context.Background(),
|
|
AppExtContext: appCtx,
|
|
}
|
|
}
|
|
|
|
func New(id ...string) AppContext {
|
|
var requestID string
|
|
if len(id) > 0 {
|
|
requestID = id[0]
|
|
}
|
|
if len(requestID) == 0 {
|
|
requestID = strings.ReplaceAll(uuid.NewString(), "-", "")
|
|
}
|
|
appCtx := AppExtContext{
|
|
RequestID: requestID,
|
|
}
|
|
ctx := UpgradeCtx(WithAppCtx(context.Background(), appCtx))
|
|
return ctx
|
|
}
|