This repository has been archived on 2022-09-04. You can view files and clone it, but cannot push or open issues or pull requests.
api/middleware/dataloaders_to_context.go

65 lines
1.8 KiB
Go
Raw Normal View History

2020-06-02 15:45:21 +00:00
package middleware
import (
"context"
"net/http"
"github.com/vektah/gqlparser/v2/gqlerror"
"github.com/tribalwarshelp/api/graphql/dataloaders"
"github.com/tribalwarshelp/api/server"
"github.com/gin-gonic/gin"
)
var serverDataLoadersContextKey ContextKey = "serverDataLoaders"
var dataloadersContextKey ContextKey = "dataloaders"
2020-06-02 15:45:21 +00:00
func DataLoadersToContext(serverRepo server.Repository, cfg dataloaders.Config) gin.HandlerFunc {
return func(c *gin.Context) {
ctx := c.Request.Context()
loaders := make(map[string]*dataloaders.ServerDataLoaders)
2020-06-02 15:45:21 +00:00
servers, _, err := serverRepo.Fetch(c.Request.Context(), nil)
if err != nil {
c.JSON(http.StatusOK, &gqlerror.Error{
Message: err.Error(),
})
c.Abort()
return
}
for _, server := range servers {
loaders[server.Key] = dataloaders.NewServerDataLoaders(server.Key, cfg)
2020-06-02 15:45:21 +00:00
}
ctx = StoreServerDataLoadersInContext(ctx, loaders)
ctx = StoreDataLoadersInContext(ctx, dataloaders.New(cfg))
c.Request = c.Request.WithContext(ctx)
2020-06-02 15:45:21 +00:00
c.Next()
}
}
func StoreServerDataLoadersInContext(ctx context.Context, loaders map[string]*dataloaders.ServerDataLoaders) context.Context {
return context.WithValue(ctx, serverDataLoadersContextKey, loaders)
}
func ServerDataLoadersFromContext(ctx context.Context) map[string]*dataloaders.ServerDataLoaders {
dl := ctx.Value(serverDataLoadersContextKey)
if dl == nil {
return nil
}
return dl.(map[string]*dataloaders.ServerDataLoaders)
}
func StoreDataLoadersInContext(ctx context.Context, loaders *dataloaders.DataLoaders) context.Context {
return context.WithValue(ctx, dataloadersContextKey, loaders)
2020-06-02 15:45:21 +00:00
}
func DataLoadersFromContext(ctx context.Context) *dataloaders.DataLoaders {
dl := ctx.Value(dataloadersContextKey)
2020-06-02 15:45:21 +00:00
if dl == nil {
return nil
}
return dl.(*dataloaders.DataLoaders)
2020-06-02 15:45:21 +00:00
}