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"
|
2020-07-28 10:52:08 +00:00
|
|
|
"github.com/tribalwarshelp/shared/cache/allservers"
|
2020-06-24 13:05:31 +00:00
|
|
|
"github.com/tribalwarshelp/shared/models"
|
2020-06-02 15:45:21 +00:00
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
2020-06-18 14:44:02 +00:00
|
|
|
var serverDataLoadersContextKey ContextKey = "serverDataLoaders"
|
2020-06-24 13:05:31 +00:00
|
|
|
var langVersionLoadersContextKey ContextKey = "langVersionLoaders"
|
2020-06-18 11:06:55 +00:00
|
|
|
var dataloadersContextKey ContextKey = "dataloaders"
|
2020-06-02 15:45:21 +00:00
|
|
|
|
2020-07-28 10:52:08 +00:00
|
|
|
type DataLoadersToContextConfig struct {
|
|
|
|
ServerRepo server.Repository
|
|
|
|
AllServersCache allservers.Cache
|
|
|
|
}
|
|
|
|
|
|
|
|
func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Config) gin.HandlerFunc {
|
2020-06-02 15:45:21 +00:00
|
|
|
return func(c *gin.Context) {
|
|
|
|
ctx := c.Request.Context()
|
2020-06-24 13:05:31 +00:00
|
|
|
serverDataLoaders := make(map[string]*dataloaders.ServerDataLoaders)
|
|
|
|
langVersionDataLoaders := make(map[models.LanguageTag]*dataloaders.LangVersionDataLoaders)
|
2020-07-28 10:52:08 +00:00
|
|
|
servers, ok := dltcc.AllServersCache.Get()
|
|
|
|
if !ok {
|
|
|
|
var err error
|
|
|
|
servers, _, err = dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{})
|
|
|
|
if err != nil {
|
|
|
|
c.JSON(http.StatusOK, &gqlerror.Error{
|
|
|
|
Message: err.Error(),
|
|
|
|
})
|
|
|
|
c.Abort()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
go dltcc.AllServersCache.Set(servers)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
for _, server := range servers {
|
2020-06-24 13:05:31 +00:00
|
|
|
serverDataLoaders[server.Key] = dataloaders.NewServerDataLoaders(server.Key, cfg)
|
|
|
|
if _, ok := langVersionDataLoaders[server.LangVersionTag]; !ok {
|
|
|
|
langVersionDataLoaders[server.LangVersionTag] = dataloaders.NewLangVersionDataLoaders(server.LangVersionTag, cfg)
|
|
|
|
}
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
2020-06-24 13:05:31 +00:00
|
|
|
ctx = StoreServerDataLoadersInContext(ctx, serverDataLoaders)
|
|
|
|
ctx = StoreLangVersionDataLoadersInContext(ctx, langVersionDataLoaders)
|
|
|
|
ctx = StoreDataLoadersInContext(ctx, dataloaders.NewDataLoaders(cfg))
|
2020-06-18 14:44:02 +00:00
|
|
|
c.Request = c.Request.WithContext(ctx)
|
2020-06-02 15:45:21 +00:00
|
|
|
c.Next()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-18 14:44:02 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2020-06-24 13:05:31 +00:00
|
|
|
func StoreLangVersionDataLoadersInContext(ctx context.Context, loaders map[models.LanguageTag]*dataloaders.LangVersionDataLoaders) context.Context {
|
|
|
|
return context.WithValue(ctx, langVersionLoadersContextKey, loaders)
|
|
|
|
}
|
|
|
|
|
|
|
|
func LangVersionDataLoadersFromContext(ctx context.Context) map[models.LanguageTag]*dataloaders.LangVersionDataLoaders {
|
|
|
|
dl := ctx.Value(langVersionLoadersContextKey)
|
|
|
|
if dl == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return dl.(map[models.LanguageTag]*dataloaders.LangVersionDataLoaders)
|
|
|
|
}
|
|
|
|
|
2020-06-18 14:44:02 +00:00
|
|
|
func StoreDataLoadersInContext(ctx context.Context, loaders *dataloaders.DataLoaders) context.Context {
|
2020-06-18 11:06:55 +00:00
|
|
|
return context.WithValue(ctx, dataloadersContextKey, loaders)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|
|
|
|
|
2020-06-18 14:44:02 +00:00
|
|
|
func DataLoadersFromContext(ctx context.Context) *dataloaders.DataLoaders {
|
2020-06-18 11:06:55 +00:00
|
|
|
dl := ctx.Value(dataloadersContextKey)
|
2020-06-02 15:45:21 +00:00
|
|
|
if dl == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-06-18 14:44:02 +00:00
|
|
|
return dl.(*dataloaders.DataLoaders)
|
2020-06-02 15:45:21 +00:00
|
|
|
}
|