78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
|
//go:build ignore
|
||
|
|
||
|
package graphql_handler
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/99designs/gqlgen/graphql"
|
||
|
"go.unistack.org/micro/v3/logger"
|
||
|
"go.unistack.org/micro/v3/store"
|
||
|
)
|
||
|
|
||
|
var _ graphql.Cache = (*cacheWrapper)(nil)
|
||
|
|
||
|
type Handler struct {
|
||
|
opts Options
|
||
|
}
|
||
|
|
||
|
type Option func(*Options)
|
||
|
|
||
|
type Options struct {
|
||
|
cache *cacheWrapper
|
||
|
Path string
|
||
|
}
|
||
|
|
||
|
type cacheWrapper struct {
|
||
|
s store.Store
|
||
|
l logger.Logger
|
||
|
}
|
||
|
|
||
|
func (c *cacheWrapper) Get(ctx context.Context, key string) (interface{}, bool) {
|
||
|
var val interface{}
|
||
|
if err := c.s.Read(ctx, key, val); err != nil && err != store.ErrNotFound {
|
||
|
c.l.Error(ctx, fmt.Sprintf("cache.Get %s failed", key), err)
|
||
|
return nil, false
|
||
|
}
|
||
|
return val, true
|
||
|
}
|
||
|
|
||
|
func (c *cacheWrapper) Add(ctx context.Context, key string, val interface{}) {
|
||
|
if err := c.s.Write(ctx, key, val); err != nil {
|
||
|
c.l.Error(ctx, fmt.Sprintf("cache.Add %s failed", key), err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Store(s store.Store) Option {
|
||
|
return func(o *Options) {
|
||
|
if o.cache == nil {
|
||
|
o.cache = &cacheWrapper{}
|
||
|
}
|
||
|
o.cache.s = s
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Logger(l logger.Logger) Option {
|
||
|
return func(o *Options) {
|
||
|
if o.cache == nil {
|
||
|
o.cache = &cacheWrapper{}
|
||
|
}
|
||
|
o.cache.l = l
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Path(path string) Option {
|
||
|
return func(o *Options) {
|
||
|
o.Path = path
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func NewHandler(opts ...Option) *Handler {
|
||
|
options := Options{}
|
||
|
for _, o := range opts {
|
||
|
o(&options)
|
||
|
}
|
||
|
return &Handler{opts: options}
|
||
|
}
|