Skip to content

Commit

Permalink
Fix for web-ridge#38 and other improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
RichardLindhout committed Oct 17, 2020
1 parent b005f86 commit 555d26e
Show file tree
Hide file tree
Showing 12 changed files with 432 additions and 394 deletions.
179 changes: 53 additions & 126 deletions convert.go

Large diffs are not rendered by default.

49 changes: 30 additions & 19 deletions convert.gotpl
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@
{{ range $field := .Fields }}
{{- if $field.IsPrimaryNumberID -}}
func {{ $model.Name }}IDToGraphQL(v uint) string {
return boilergql.IDToGraphQL(v, models.TableNames.{{ $model.Name }})
return boilergql.IDToGraphQL(v, models.TableNames.{{ $model.BoilerModel.TableName }})
}
{{- end -}}
{{- end }}
Expand All @@ -147,37 +147,48 @@
}

r := &{{ $.Frontend.PackageName }}.{{ .Name }}{
{{ range $field := .Fields }}
{{ range $field := .Fields -}}
{{- with .Description }}
{{.|prefixLines "// "}}
{{- end}}
{{- if $field.IsNumberID -}}
{{ $field.Name }}: {{ $field.ConvertConfig.ToGraphQL }},
{{- if $field.ConvertConfig.IsCustom -}}
{{- if $field.IsPrimaryNumberID -}}
{{- $field.Name }}: {{ $field.ConvertConfig.ToGraphQL }},
{{- else if and $field.IsNumberID $field.BoilerField.IsRelation -}}
{{- $field.Name }}: {{ $field.ConvertConfig.ToGraphQL }},
{{- else if $field.IsRelation -}}
{{- else -}}
{{- $field.Name }}: {{ $field.ConvertConfig.ToGraphQL }}(m.{{ $field.BoilerField.Name }}),
{{- end }}
{{- else if $field.IsRelation -}}
{{- else if $field.ConvertConfig.IsCustom }}
{{ $field.Name }}: {{ $field.ConvertConfig.ToGraphQL }}(m.{{ $field.BoilerField.Name }}),
{{- else }}
{{ $field.Name }}: m.{{ $field.BoilerField.Name }},
{{- end -}}
{{- end }}
{{- else -}}
{{- $field.Name }}: m.{{ $field.BoilerField.Name }},
{{- end }}
{{ end }}
}

{{ range $field := .Fields }}

{{- if $field.IsRelation }}

{{- if $field.IsPlural }}
if m.R != nil && m.R.{{ $field.Name }} != nil {
r.{{ $field.Name }} = {{ $field.BoilerField.Relationship.PluralName }}ToGraphQL(m.R.{{ $field.Name }})
}
{{- else }}

if boilergql.{{ $field.ConvertConfig.BoilerTypeAsText }}IsFilled(m.{{ $field.Name }}ID) {
if m.R != nil && m.R.{{ $field.Name }} != nil {
r.{{ $field.Name }} = {{ $field.BoilerField.Relationship.Name }}ToGraphQL(m.R.{{ $field.Name }})
} else {
r.{{ $field.Name }} = {{ $field.BoilerField.Relationship.Name }}With{{ $field.ConvertConfig.BoilerTypeAsText }}ID(m.{{ $field.Name }}ID)
}
}
{{- else }}
{{- if $field.BoilerField.IsForeignKey }}
if boilergql.{{ $field.ConvertConfig.BoilerTypeAsText }}IsFilled(m.{{ $field.Name }}ID) {
if m.R != nil && m.R.{{ $field.Name }} != nil {
r.{{ $field.Name }} = {{ $field.BoilerField.Relationship.Name }}ToGraphQL(m.R.{{ $field.Name }})
} else {
r.{{ $field.Name }} = {{ $field.BoilerField.Relationship.Name }}With{{ $field.ConvertConfig.BoilerTypeAsText }}ID(m.{{ $field.Name }}ID)
}
}
{{- else }}
if m.R != nil && m.R.{{ $field.Name }} != nil {
r.{{ $field.Name }} = {{ $field.BoilerField.Relationship.Name }}ToGraphQL(m.R.{{ $field.Name }})
}
{{- end -}}
{{- end -}}
{{end -}}
{{- end }}
Expand Down
43 changes: 27 additions & 16 deletions convert_input.gotpl
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,24 @@
)( *models.{{ .BoilerModel.Name }}) {
if m == nil {
return nil
}
}

r := &models.{{ .BoilerModel.Name }}{
{{ range $field := .Fields -}}
{{ if $field.IsNumberID -}}
{{- $field.BoilerField.Name }} : {{ $field.ConvertConfig.ToBoiler }},
{{ else if $field.IsRelation -}}
{{ else if $field.ConvertConfig.IsCustom -}}
{{- $field.BoilerField.Name }} : {{ $field.ConvertConfig.ToBoiler }}(m.{{ $field.Name }}),
{{ else -}}
{{- if $field.ConvertConfig.IsCustom -}}
{{- if $field.IsPrimaryNumberID -}}
{{- $field.BoilerField.Name }} : {{ $field.ConvertConfig.ToBoiler }},
{{- else if and $field.IsNumberID $field.BoilerField.IsRelation -}}
{{- $field.BoilerField.Name }} : {{ $field.ConvertConfig.ToBoiler }},
{{- else if $field.IsRelation -}}
{{- else -}}
{{- $field.BoilerField.Name }} : {{ $field.ConvertConfig.ToBoiler }}(m.{{ $field.Name }}),
{{- end }}
{{- else if $field.IsRelation -}}
{{- else -}}
{{- $field.BoilerField.Name }}: m.{{ $field.Name }},
{{ end }}
{{- end -}}
{{- end }}
{{ end }}
}
return r
}
Expand All @@ -72,14 +78,19 @@
switch key {
{{ range $field := .Fields -}}
case "{{ $field.JSONName }}":
{{ if $field.IsNumberID -}}
modelM[models.{{ $model.BoilerModel.Name }}Columns.{{- $field.BoilerField.Name }}] = {{ $field.ConvertConfig.ToBoiler }}
{{ else if $field.IsRelation -}}
{{ else if $field.ConvertConfig.IsCustom -}}
modelM[models.{{ $model.BoilerModel.Name }}Columns.{{- $field.BoilerField.Name }}] = {{ $field.ConvertConfig.ToBoiler }}(m.{{ $field.Name }})
{{ else -}}
{{- if $field.ConvertConfig.IsCustom }}
{{- if $field.IsPrimaryNumberID }}
modelM[models.{{ $model.BoilerModel.Name }}Columns.{{- $field.BoilerField.Name }}] = {{ $field.ConvertConfig.ToBoiler }}
{{- else if and $field.IsNumberID $field.BoilerField.IsRelation }}
modelM[models.{{ $model.BoilerModel.Name }}Columns.{{- $field.BoilerField.Name }}] = {{ $field.ConvertConfig.ToBoiler }}
{{- else if $field.IsRelation -}}
{{- else }}
modelM[models.{{ $model.BoilerModel.Name }}Columns.{{- $field.BoilerField.Name }}] = {{ $field.ConvertConfig.ToBoiler }}(m.{{ $field.Name }})
{{- end }}
{{- else if $field.IsRelation -}}
{{- else }}
modelM[models.{{ $model.BoilerModel.Name }}Columns.{{- $field.BoilerField.Name }}] = m.{{ $field.Name }}
{{ end -}}
{{- end }}
{{ end -}}
}
}
Expand Down
41 changes: 30 additions & 11 deletions filter.gotpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
{{ reserveImport "io" }}
{{ reserveImport "strconv" }}
{{ reserveImport "time" }}
{{ reserveImport "reflect" }}
{{ reserveImport "unsafe" }}
{{ reserveImport "sync" }}
{{ reserveImport "errors" }}
{{ reserveImport "bytes" }}
Expand All @@ -12,7 +14,7 @@
{{ reserveImport "github.com/vektah/gqlparser/v2/ast" }}
{{ reserveImport "github.com/99designs/gqlgen/graphql" }}
{{ reserveImport "github.com/99designs/gqlgen/graphql/introspection" }}

{{ reserveImport "github.com/volatiletech/sqlboiler/v4/drivers" }}
{{ reserveImport "github.com/ericlagergren/decimal" }}
{{ reserveImport "github.com/volatiletech/sqlboiler/v4/boil" }}
{{ reserveImport "github.com/volatiletech/sqlboiler/v4/queries" }}
Expand All @@ -39,6 +41,16 @@ const in = " IN ?"
const notIn = " NOT IN ?"

func appendSubQuery(queryMods []qm.QueryMod, q *queries.Query) []qm.QueryMod {
// TODO: integrate with subquery in sqlboiler if it will be released in the future
{{- if $.PluginConfig.UseReflectWorkaroundForSubModelFilteringInPostgresIssue25 }}
// https://github.com/web-ridge/gqlgen-sqlboiler/issues/25 we need this for postgres
member := reflect.ValueOf(q).Elem().FieldByName("dialect")
dialectPtr := (**drivers.Dialect)(unsafe.Pointer(member.UnsafeAddr()))
dialect := **dialectPtr
dialect.UseIndexPlaceholders = false
*dialectPtr = &dialect
{{- end }}

qs, args := queries.BuildQuery(q)
qsClean := strings.TrimSuffix(qs, ";")
return append(queryMods, qm.Where(fmt.Sprintf("EXISTS(%v)", qsClean), args...))
Expand Down Expand Up @@ -259,9 +271,11 @@ func IntFilterToMods(m *{{ $.Frontend.PackageName }}.IntFilter, column string) [
{{ range $field := .Fields }}
{{- if and $field.IsRelation $field.BoilerField.IsRelation }}
{{- if $field.IsPlural }}
queryMods = append(queryMods, {{ $field.TypeWithoutPointer|go }}SubqueryToMods(m.{{ $field.Name }}, "", models.TableNames.{{- $model.BoilerModel.Name }})...)
queryMods = append(queryMods, {{ $field.TypeWithoutPointer|go }}SubqueryToMods(m.{{ $field.Name }}, "", models.TableNames.{{- $model.BoilerModel.TableName }})...)
{{- else if $field.BoilerField.IsForeignKey }}
queryMods = append(queryMods, {{ $field.TypeWithoutPointer|go }}SubqueryToMods(m.{{ $field.Name }}, models.{{ $model.BoilerModel.Name }}Columns.{{ $field.BoilerField.Name }}, models.TableNames.{{- $model.BoilerModel.TableName }})...)
{{- else }}
queryMods = append(queryMods, {{ $field.TypeWithoutPointer|go }}SubqueryToMods(m.{{ $field.Name }}, models.{{ $model.BoilerModel.Name }}Columns.{{ $field.BoilerField.Name }}, models.TableNames.{{- $model.BoilerModel.Name }})...)
queryMods = append(queryMods, {{ $field.TypeWithoutPointer|go }}SubqueryToMods(m.{{ $field.Name }}, "", models.TableNames.{{- $model.BoilerModel.TableName }})...)
{{- end }}
{{- else if $field.IsOr }}
if m.Or != nil {
Expand All @@ -284,16 +298,21 @@ func IntFilterToMods(m *{{ $.Frontend.PackageName }}.IntFilter, column string) [

if len(queryMods) > 0 && parentTable != "" {
{{ range $field := .Fields }}
{{- if and $field.IsRelation $field.BoilerField.IsRelation }}
if parentTable == models.TableNames.{{ $field.Relationship.Name }} {
{{- if $field.IsPlural }}
{{- else }}
queryMods = append(queryMods, qm.Where(fmt.Sprintf("%v.%v = %v.id", models.TableNames.{{- $model.BoilerModel.Name }}, models.{{ $model.BoilerModel.Name }}Columns.{{ $field.BoilerField.Name }}, parentTable)))
{{- end }}
}
{{- if not $field.IsPlural -}}
{{- if and $field.IsRelation $field.BoilerField.IsRelation -}}
{{- if $field.BoilerField.IsForeignKey }}
if parentTable == models.TableNames.{{ $field.Relationship.BoilerModel.TableName }} {
queryMods = append(queryMods, qm.Where(fmt.Sprintf("%v.%v = %v.id", models.TableNames.{{- $model.BoilerModel.TableName }}, models.{{ $model.BoilerModel.Name }}Columns.{{ $field.BoilerField.Name }}, parentTable)))
}
{{- else }}
// TODO: if the relations filtering does not work, please make an issue
// if parentTable == models.TableNames.{{ $field.Relationship.BoilerModel.TableName }} {
// queryMods = append(queryMods, qm.Where(fmt.Sprintf("%v.%v = %v.id", models.TableNames.{{- $model.BoilerModel.TableName }}, models.{{ $model.BoilerModel.Name }}Columns.{{ $field.BoilerField.Name }}, parentTable)))
// }
{{- end -}}
{{- end -}}
{{- end -}}
{{ end }}

}


Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ require (
github.com/pkg/errors v0.9.1
github.com/vektah/gqlparser/v2 v2.0.1
github.com/web-ridge/go-pluralize v0.1.5
golang.org/x/mod v0.3.0 // indirect
golang.org/x/mod v0.3.0
golang.org/x/tools v0.0.0-20200507205054-480da3ebd79c
)
24 changes: 4 additions & 20 deletions helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ package gqlgen_sqlboiler

import (
"fmt"
"golang.org/x/mod/modfile"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"

"golang.org/x/mod/modfile"
)

func getRootImportPath() string {
Expand All @@ -19,16 +19,6 @@ func getRootImportPath() string {
return importPath
}

func getGoImportFromFile(dir string) string {
dir = strings.TrimPrefix(dir, "/")
importPath, err := rootImportPath()
if err != nil {
fmt.Printf("error while getting root import path %v", err)
return ""
}
return path.Join(importPath, dir)
}

func rootImportPath() (string, error) {
projectPath, err := getWorkingPath()
if err != nil {
Expand All @@ -50,13 +40,6 @@ func rootImportPath() (string, error) {

return gopathImport(projectPath), nil
}
func getProjectPath(dir string) (string, error) {
longPath, err := filepath.Abs(dir)
if err != nil {
return "", fmt.Errorf("error while trying to convert folder to gopath %w", err)
}
return strings.TrimSuffix(longPath, dir), nil
}

// getWorkingPath gets the current working directory
func getWorkingPath() (string, error) {
Expand All @@ -66,6 +49,7 @@ func getWorkingPath() (string, error) {
}
return wd, nil
}

func hasGoMod(projectPath string) bool {
filePath := path.Join(projectPath, "go.mod")
return fileExists(filePath)
Expand All @@ -88,7 +72,7 @@ func getModulePath(projectPath string) (string, error) {

modPath := modfile.ModulePath(file)
if modPath == "" {
return "", fmt.Errorf("could not determine mod path \n")
return "", fmt.Errorf("could not determine mod path")
}
return modPath, nil
}
Expand Down
3 changes: 2 additions & 1 deletion helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ func Test_gopathImport(t *testing.T) {
want: "github.com/someonefamous/famous-project",
},
}
for _, tt := range tests {
for i := range tests {
tt := tests[i]
t.Run(tt.name, func(t *testing.T) {
if got := gopathImport(tt.args.dir); got != tt.want {
t.Errorf("gopathImport() = %v, want %v", got, tt.want)
Expand Down
7 changes: 3 additions & 4 deletions internal_code.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import (
"golang.org/x/tools/go/packages"
)

var gopaths []string
var gopaths []string //nolint:gochecknoglobals

func init() {
func init() { //nolint:gochecknoinits
gopaths = filepath.SplitList(build.Default.GOPATH)
for i, p := range gopaths {
gopaths[i] = filepath.ToSlash(filepath.Join(p, "src"))
Expand Down Expand Up @@ -61,7 +61,7 @@ func NameForDir(dir string) string {
return SanitizePackageName(filepath.Base(dir))
}

var invalidPackageNameChar = regexp.MustCompile(`[^\w]`)
var invalidPackageNameChar = regexp.MustCompile(`[^\w]`) //nolint:gochecknoglobals

func SanitizePackageName(pkg string) string {
return invalidPackageNameChar.ReplaceAllLiteralString(filepath.Base(pkg), "_")
Expand Down Expand Up @@ -121,7 +121,6 @@ func (r *Rewriter) getFile(filename string) string {
}

r.files[filename] = string(b)

}

return r.files[filename]
Expand Down
6 changes: 3 additions & 3 deletions preload.gotpl
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
var TablePreloadMap = map[string]map[string]boilergql.ColumnSetting{
{{ range $model := .Models -}}
{{ if $model.IsPreloadable -}}
models.TableNames.{{- $model.Name }}: {
models.TableNames.{{- $model.BoilerModel.TableName }}: {
{{- range $value := $model.PreloadArray }}
"{{$value.Key}}": {
Name: {{$value.ColumnSetting.Name}},
Expand All @@ -48,11 +48,11 @@ var TablePreloadMap = map[string]map[string]boilergql.ColumnSetting{

{{ if $model.IsPreloadable -}}
func Get{{ .Name }}PreloadMods(ctx context.Context) (queryMods []qm.QueryMod) {
return boilergql.GetPreloadModsWithLevel(ctx, TablePreloadMap, models.TableNames.{{ .Name }}, "")
return boilergql.GetPreloadModsWithLevel(ctx, TablePreloadMap, models.TableNames.{{ $model.BoilerModel.TableName }}, "")
}

func Get{{ .Name }}PreloadModsWithLevel(ctx context.Context, level string) (queryMods []qm.QueryMod) {
return boilergql.GetPreloadModsWithLevel(ctx, TablePreloadMap, models.TableNames.{{ .Name }}, level)
return boilergql.GetPreloadModsWithLevel(ctx, TablePreloadMap, models.TableNames.{{ $model.BoilerModel.TableName }}, level)
}
{{ end -}}
{{- end }}
Expand Down
Loading

0 comments on commit 555d26e

Please sign in to comment.