/
context.go
45 lines (39 loc) · 1.83 KB
/
context.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Copyright 2015-present, Cyrill @ Schumacher.fm and the CoreStore contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package scope
import (
"context"
)
type ctxScopeKey uint8
type ctxScopeWrapper struct {
websiteID uint32
storeID uint32
}
// WithContext adds the store scope with its parent website scope to the
// context. Different middlewares may call this function to set a new scope
// depending on different conditions. For example the JSON web token middleware
// can set a scope because the JWT contains a new store code. Or a geoip
// middleware can set the scope depending on geo location information. These IDs
// will be later used to e.g. read the scoped configuration.
func WithContext(ctx context.Context, websiteID, storeID uint32) context.Context {
return context.WithValue(ctx, ctxScopeKey(0), ctxScopeWrapper{websiteID: websiteID, storeID: storeID})
}
// FromContext returns the requested current store scope and its parent website
// scope from a context. This scope is only valid for the current context in a
// request. A scope gets set via HTTP form, cookie, JSON Web Token or GeoIP or
// other fancy features.
func FromContext(ctx context.Context) (websiteID, storeID uint32, ok bool) {
w, ok := ctx.Value(ctxScopeKey(0)).(ctxScopeWrapper)
return w.websiteID, w.storeID, ok && w.websiteID >= 0 && w.storeID >= 0
}