boilerplate-go/core/appcontext/context.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
}