move sql helpers to the other package, all fields in all inputs are now pointers, add a new model - QualificationToProfession

This commit is contained in:
Dawid Wysokiński 2021-02-23 19:07:55 +01:00
parent d7c208c6f5
commit 5fe94741ce
6 changed files with 134 additions and 111 deletions

View File

@ -1,3 +1,4 @@
#!/bin/sh
cd ./internal/graphql
go run github.com/99designs/gqlgen
go mod tidy

View File

@ -1,59 +1,9 @@
package models
import (
"strings"
"time"
)
func addAliasToColumnName(column, prefix string) string {
if prefix != "" && !strings.HasPrefix(column, prefix+".") {
column = wrapStringInDoubleQuotes(prefix) + "." + wrapStringInDoubleQuotes(column)
} else {
column = wrapStringInDoubleQuotes(column)
}
return column
}
func wrapStringInDoubleQuotes(str string) string {
return `"` + str + `"`
}
func buildConditionEquals(column string) string {
return column + " = ?"
}
func buildConditionLT(column string) string {
return column + " < ?"
}
func buildConditionLTE(column string) string {
return column + " <= ?"
}
func buildConditionGT(column string) string {
return column + " > ?"
}
func buildConditionGTE(column string) string {
return column + " >= ?"
}
func buildConditionMatch(column string) string {
return column + " LIKE ?"
}
func buildConditionIEQ(column string) string {
return column + " ILIKE ?"
}
func buildConditionArray(column string) string {
return column + " = ANY(?)"
}
func buildConditionNotInArray(column string) string {
return "NOT (" + buildConditionArray(column) + ")"
}
func isZero(v interface{}) bool {
switch c := v.(type) {
case string:

View File

@ -7,6 +7,7 @@ import (
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/gosimple/slug"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
type Profession struct {
@ -35,8 +36,19 @@ func (p *Profession) BeforeUpdate(ctx context.Context) (context.Context, error)
}
type ProfessionInput struct {
Name string `json:"name,omitempty" xml:"name" gqlgen:"name"`
Description string `json:"description,omitempty" xml:"description" gqlgen:"description"`
Name *string `json:"name,omitempty" xml:"name" gqlgen:"name"`
Description *string `json:"description,omitempty" xml:"description" gqlgen:"description"`
}
func (input *ProfessionInput) ToProfession() *Profession {
p := &Profession{}
if input.Name != nil {
p.Name = *input.Name
}
if input.Description != nil {
p.Description = *input.Description
}
return p
}
type ProfessionFilter struct {
@ -63,53 +75,53 @@ type ProfessionFilter struct {
func (f *ProfessionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) {
if !isZero(f.ID) {
q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Slug) {
q = q.Where(buildConditionArray(addAliasToColumnName("slug", alias)), pg.Array(f.Slug))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
}
if !isZero(f.SlugNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
}
if !isZero(f.Name) {
q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
}
if !isZero(f.NameNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
}
if !isZero(f.NameMATCH) {
q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH)
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ)
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.DescriptionMATCH) {
q = q.Where(buildConditionMatch(addAliasToColumnName("description", alias)), f.DescriptionMATCH)
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
}
if !isZero(f.DescriptionIEQ) {
q = q.Where(buildConditionIEQ(addAliasToColumnName("description", alias)), f.DescriptionIEQ)
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
}
if !isZero(f.CreatedAt) {
q = q.Where(buildConditionEquals(addAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(buildConditionGT(addAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(sqlutils.BuildConditionGT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(buildConditionGTE(addAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(sqlutils.BuildConditionGTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(buildConditionLT(addAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(sqlutils.BuildConditionLT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(buildConditionLTE(addAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(sqlutils.BuildConditionLTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
return q, nil

View File

@ -31,3 +31,15 @@ func (q *Qualification) BeforeUpdate(ctx context.Context) (context.Context, erro
return ctx, nil
}
type QualificationToProfession struct {
QualificationID int `json:"qualificationID" xml:"qualificationID" gqlgen:"qualificationID"`
ProfessionID int `json:"professionID" xml:"professionID" gqlgen:"professionID"`
}
type QualificationInput struct {
Name string
Description string
Code string
Formula string
}

View File

@ -4,6 +4,8 @@ import (
"context"
"time"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/gosimple/slug"
@ -53,21 +55,6 @@ func (u *User) BeforeUpdate(ctx context.Context) (context.Context, error) {
return ctx, nil
}
func (u *User) MergeInput(input *UserInput) {
if input.DisplayName != "" {
u.DisplayName = input.DisplayName
}
if input.Password != "" {
u.Password = input.Password
}
if input.Role.IsValid() {
u.Role = input.Role
}
if input.Activated != nil {
u.Activated = input.Activated
}
}
func (u *User) CompareHashAndPassword(password string) error {
if password == u.Password {
return nil
@ -79,21 +66,30 @@ func (u *User) CompareHashAndPassword(password string) error {
}
type UserInput struct {
DisplayName string `json:"displayName" xml:"displayName" gqlgen:"displayName"`
Password string `json:"password" xml:"password" gqlgen:"password"`
Email string `json:"email" xml:"email" gqlgen:"email"`
Role Role `json:"role" xml:"role" gqlgen:"role"`
Activated *bool `json:"activated" xml:"activated" gqlgen:"activated"`
DisplayName *string `json:"displayName" xml:"displayName" gqlgen:"displayName"`
Password *string `json:"password" xml:"password" gqlgen:"password"`
Email *string `json:"email" xml:"email" gqlgen:"email"`
Role *Role `json:"role" xml:"role" gqlgen:"role"`
Activated *bool `json:"activated" xml:"activated" gqlgen:"activated"`
}
func (input *UserInput) ToUser() *User {
return &User{
DisplayName: input.DisplayName,
Password: input.Password,
Email: input.Email,
Role: input.Role,
Activated: input.Activated,
u := &User{
Activated: input.Activated,
}
if input.DisplayName != nil {
u.DisplayName = *input.DisplayName
}
if input.Password != nil {
u.Password = *input.Password
}
if input.Email != nil {
u.Email = *input.Email
}
if input.Role != nil {
u.Role = *input.Role
}
return u
}
type UserFilter struct {
@ -127,63 +123,63 @@ type UserFilter struct {
func (f *UserFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) {
if !isZero(f.ID) {
q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Slug) {
q = q.Where(buildConditionArray(addAliasToColumnName("slug", alias)), pg.Array(f.Slug))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
}
if !isZero(f.SlugNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
}
if !isZero(f.Activated) {
q = q.Where(buildConditionEquals(addAliasToColumnName("activated", alias)), f.Activated)
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("activated", alias)), f.Activated)
}
if !isZero(f.DisplayName) {
q = q.Where(buildConditionArray(addAliasToColumnName("display_name", alias)), pg.Array(f.DisplayName))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayName))
}
if !isZero(f.DisplayNameNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("display_name", alias)), pg.Array(f.DisplayNameNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayNameNEQ))
}
if !isZero(f.DisplayNameMATCH) {
q = q.Where(buildConditionMatch(addAliasToColumnName("display_name", alias)), f.DisplayNameMATCH)
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("display_name", alias)), f.DisplayNameMATCH)
}
if !isZero(f.DisplayNameIEQ) {
q = q.Where(buildConditionIEQ(addAliasToColumnName("display_name", alias)), f.DisplayNameIEQ)
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("display_name", alias)), f.DisplayNameIEQ)
}
if !isZero(f.Email) {
q = q.Where(buildConditionArray(addAliasToColumnName("email", alias)), pg.Array(f.Email))
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("email", alias)), pg.Array(f.Email))
}
if !isZero(f.EmailNEQ) {
q = q.Where(buildConditionNotInArray(addAliasToColumnName("email", alias)), pg.Array(f.EmailNEQ))
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("email", alias)), pg.Array(f.EmailNEQ))
}
if !isZero(f.EmailMATCH) {
q = q.Where(buildConditionMatch(addAliasToColumnName("email", alias)), f.EmailMATCH)
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("email", alias)), f.EmailMATCH)
}
if !isZero(f.EmailIEQ) {
q = q.Where(buildConditionIEQ(addAliasToColumnName("email", alias)), f.EmailIEQ)
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("email", alias)), f.EmailIEQ)
}
if !isZero(f.CreatedAt) {
q = q.Where(buildConditionEquals(addAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(buildConditionGT(addAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(sqlutils.BuildConditionGT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(buildConditionGTE(addAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(sqlutils.BuildConditionGTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(buildConditionLT(addAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(sqlutils.BuildConditionLT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(buildConditionLTE(addAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(sqlutils.BuildConditionLTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
return q, nil

52
pkg/utils/sql/sql.go Normal file
View File

@ -0,0 +1,52 @@
package sqlutils
import "strings"
func AddAliasToColumnName(column, prefix string) string {
if prefix != "" && !strings.HasPrefix(column, prefix+".") {
column = WrapStringInDoubleQuotes(prefix) + "." + WrapStringInDoubleQuotes(column)
} else {
column = WrapStringInDoubleQuotes(column)
}
return column
}
func WrapStringInDoubleQuotes(str string) string {
return `"` + str + `"`
}
func BuildConditionEquals(column string) string {
return column + " = ?"
}
func BuildConditionLT(column string) string {
return column + " < ?"
}
func BuildConditionLTE(column string) string {
return column + " <= ?"
}
func BuildConditionGT(column string) string {
return column + " > ?"
}
func BuildConditionGTE(column string) string {
return column + " >= ?"
}
func BuildConditionMatch(column string) string {
return column + " LIKE ?"
}
func BuildConditionIEQ(column string) string {
return column + " ILIKE ?"
}
func BuildConditionArray(column string) string {
return column + " = ANY(?)"
}
func BuildConditionNotInArray(column string) string {
return "NOT (" + BuildConditionArray(column) + ")"
}