Add ability to set filters per operation / action

This commit is contained in:
Vikram Rangnekar
2019-10-06 16:28:10 -04:00
parent 450d77ccbd
commit 9299855d8a
17 changed files with 446 additions and 225 deletions

View File

@ -124,6 +124,13 @@ e.g. db:migrate -+1
Run: cmdNew,
})
rootCmd.AddCommand(&cobra.Command{
Use: fmt.Sprintf("conf:dump [%s]", strings.Join(viper.SupportedExts, "|")),
Short: "Dump config to file",
Long: "Dump current config to a file in the selected format",
Run: cmdConfDump,
})
rootCmd.Flags().StringVar(&confPath,
"path", "./config", "path to config files")
@ -144,35 +151,7 @@ func initLog() *zerolog.Logger {
}
func initConf() (*config, error) {
vi := viper.New()
vi.SetEnvPrefix("SG")
vi.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
vi.AutomaticEnv()
vi.AddConfigPath(confPath)
vi.AddConfigPath("./config")
vi.SetConfigName(getConfigName())
vi.SetDefault("host_port", "0.0.0.0:8080")
vi.SetDefault("web_ui", false)
vi.SetDefault("enable_tracing", false)
vi.SetDefault("auth_fail_block", "always")
vi.SetDefault("seed_file", "seed.js")
vi.SetDefault("database.type", "postgres")
vi.SetDefault("database.host", "localhost")
vi.SetDefault("database.port", 5432)
vi.SetDefault("database.user", "postgres")
vi.SetDefault("database.schema", "public")
vi.SetDefault("env", "development")
vi.BindEnv("env", "GO_ENV")
vi.BindEnv("HOST", "HOST")
vi.BindEnv("PORT", "PORT")
vi.SetDefault("auth.rails.max_idle", 80)
vi.SetDefault("auth.rails.max_active", 12000)
vi := newConfig()
if err := vi.ReadInConfig(); err != nil {
return nil, err
@ -184,12 +163,16 @@ func initConf() (*config, error) {
return nil, fmt.Errorf("unable to decode config, %v", err)
}
if len(c.Tables) == 0 {
c.Tables = c.DB.Tables
}
for k, v := range c.Inflections {
flect.AddPlural(k, v)
}
for i := range c.DB.Tables {
t := c.DB.Tables[i]
for i := range c.Tables {
t := c.Tables[i]
t.Name = flect.Pluralize(strings.ToLower(t.Name))
}

29
serv/cmd_conf.go Normal file
View File

@ -0,0 +1,29 @@
package serv
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
func cmdConfDump(cmd *cobra.Command, args []string) {
if len(args) != 1 {
cmd.Help()
os.Exit(1)
}
fname := fmt.Sprintf("%s.%s", getConfigName(), args[0])
vi := newConfig()
if err := vi.ReadInConfig(); err != nil {
logger.Fatal().Err(err).Send()
}
if err := vi.WriteConfigAs(fname); err != nil {
logger.Fatal().Err(err).Send()
}
logger.Info().Msgf("config dumped to ./%s", fname)
}

View File

@ -245,6 +245,7 @@ func cmdDBMigrate(cmd *cobra.Command, args []string) {
// }
// os.Exit(1)
}
logger.Info().Msg("migration done")
}

View File

@ -141,5 +141,6 @@ func ifNotExists(filePath string, doFn func(string) error) {
if err != nil {
logger.Fatal().Err(err).Msgf("unable to create '%s'", filePath)
}
logger.Info().Msgf("created '%s'", filePath)
}

View File

@ -52,6 +52,8 @@ func cmdDBSeed(cmd *cobra.Command, args []string) {
if err != nil {
logger.Fatal().Err(err).Msg("failed to execute script")
}
logger.Info().Msg("seed script done")
}
//func runFunc(call goja.FunctionCall) {

View File

@ -3,7 +3,7 @@ package serv
import (
"strings"
"github.com/gobuffalo/flect"
"github.com/spf13/viper"
)
type config struct {
@ -69,14 +69,20 @@ type config struct {
Tables []configTable
} `mapstructure:"database"`
Tables []configTable
}
type configTable struct {
Name string
Filter []string
Table string
Blocklist []string
Remotes []configRemote
Name string
Filter []string
FilterQuery []string `mapstructure:"filter_query"`
FilterInsert []string `mapstructure:"filter_insert"`
FilterUpdate []string `mapstructure:"filter_update"`
FilterDelete []string `mapstructure:"filter_delete"`
Table string
Blocklist []string
Remotes []configRemote
}
type configRemote struct {
@ -92,6 +98,40 @@ type configRemote struct {
} `mapstructure:"set_headers"`
}
func newConfig() *viper.Viper {
vi := viper.New()
vi.SetEnvPrefix("SG")
vi.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
vi.AutomaticEnv()
vi.AddConfigPath(confPath)
vi.AddConfigPath("./config")
vi.SetConfigName(getConfigName())
vi.SetDefault("host_port", "0.0.0.0:8080")
vi.SetDefault("web_ui", false)
vi.SetDefault("enable_tracing", false)
vi.SetDefault("auth_fail_block", "always")
vi.SetDefault("seed_file", "seed.js")
vi.SetDefault("database.type", "postgres")
vi.SetDefault("database.host", "localhost")
vi.SetDefault("database.port", 5432)
vi.SetDefault("database.user", "postgres")
vi.SetDefault("database.schema", "public")
vi.SetDefault("env", "development")
vi.BindEnv("env", "GO_ENV")
vi.BindEnv("HOST", "HOST")
vi.BindEnv("PORT", "PORT")
vi.SetDefault("auth.rails.max_idle", 80)
vi.SetDefault("auth.rails.max_active", 12000)
return vi
}
func (c *config) getVariables() map[string]string {
vars := make(map[string]string, len(c.DB.vars))
@ -113,10 +153,10 @@ func (c *config) getVariables() map[string]string {
}
func (c *config) getAliasMap() map[string][]string {
m := make(map[string][]string, len(c.DB.Tables))
m := make(map[string][]string, len(c.Tables))
for i := range c.DB.Tables {
t := c.DB.Tables[i]
for i := range c.Tables {
t := c.Tables[i]
if len(t.Table) == 0 {
continue
@ -127,28 +167,3 @@ func (c *config) getAliasMap() map[string][]string {
}
return m
}
func (c *config) getFilterMap() map[string][]string {
m := make(map[string][]string, len(c.DB.Tables))
for i := range c.DB.Tables {
t := c.DB.Tables[i]
if len(t.Filter) == 0 {
continue
}
singular := flect.Singularize(t.Name)
plural := flect.Pluralize(t.Name)
if t.Filter[0] == "none" {
m[singular] = []string{}
m[plural] = []string{}
} else {
m[singular] = t.Filter
m[plural] = t.Filter
}
}
return m
}

View File

@ -25,7 +25,7 @@ type resolvFn struct {
func initResolvers() error {
rmap = make(map[uint64]*resolvFn)
for _, t := range conf.DB.Tables {
for _, t := range conf.Tables {
err := initRemotes(t)
if err != nil {
return err

View File

@ -12,6 +12,7 @@ import (
rice "github.com/GeertJohan/go.rice"
"github.com/dosco/super-graph/psql"
"github.com/dosco/super-graph/qcode"
"github.com/gobuffalo/flect"
)
func initCompilers(c *config) (*qcode.Compiler, *psql.Compiler, error) {
@ -20,13 +21,46 @@ func initCompilers(c *config) (*qcode.Compiler, *psql.Compiler, error) {
return nil, nil, err
}
qc, err := qcode.NewCompiler(qcode.Config{
conf := qcode.Config{
DefaultFilter: c.DB.Defaults.Filter,
FilterMap: c.getFilterMap(),
Blocklist: c.DB.Defaults.Blocklist,
KeepArgs: false,
})
FilterMap: qcode.Filters{
All: make(map[string][]string, len(c.Tables)),
Query: make(map[string][]string, len(c.Tables)),
Insert: make(map[string][]string, len(c.Tables)),
Update: make(map[string][]string, len(c.Tables)),
Delete: make(map[string][]string, len(c.Tables)),
},
Blocklist: c.DB.Defaults.Blocklist,
KeepArgs: false,
}
for i := range c.Tables {
t := c.Tables[i]
singular := flect.Singularize(t.Name)
plural := flect.Pluralize(t.Name)
setFilter := func(fm map[string][]string, fil []string) {
switch {
case len(fil) == 0:
return
case fil[0] == "none" || len(fil[0]) == 0:
fm[singular] = []string{}
fm[plural] = []string{}
default:
fm[singular] = t.Filter
fm[plural] = t.Filter
}
}
setFilter(conf.FilterMap.All, t.Filter)
setFilter(conf.FilterMap.Query, t.FilterQuery)
setFilter(conf.FilterMap.Insert, t.FilterInsert)
setFilter(conf.FilterMap.Update, t.FilterUpdate)
setFilter(conf.FilterMap.Delete, t.FilterDelete)
}
qc, err := qcode.NewCompiler(conf)
if err != nil {
return nil, nil, err
}