add github.com/Kichiyaki/goutil, github.com/Kichiyaki/appmode, github.com/Kichiyaki/gopgutil

This commit is contained in:
Dawid Wysokiński 2021-05-02 13:16:32 +02:00
parent c05cc6ee9d
commit f907e7294e
31 changed files with 159 additions and 465 deletions

View File

@ -23,7 +23,7 @@ WORKDIR /root/
# Copy the Pre-built binary file from the previous stage
COPY --from=builder /app/zdamegzawodowy .
ENV MODE=production
ENV APP_MODE=production
ENV GIN_MODE=release
EXPOSE 8080

3
go.mod
View File

@ -4,8 +4,11 @@ go 1.16
require (
github.com/99designs/gqlgen v0.13.0
github.com/Kichiyaki/appmode v0.0.0-20210502105643-0a26207c548d // indirect
github.com/Kichiyaki/ginlogrus v0.0.0-20210502060406-bb0049cc40c4
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210502060056-ad595ba7b858
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210502103432-20b73c1e09b3 // indirect
github.com/Kichiyaki/goutil v0.0.0-20210502095630-318d17091eab // indirect
github.com/agnivade/levenshtein v1.1.0 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-contrib/cors v1.3.1

6
go.sum
View File

@ -2,10 +2,16 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Kichiyaki/appmode v0.0.0-20210502105643-0a26207c548d h1:ApX13STtfJc2YPH5D2JnBa6+4AM2vt7a81so/MPr/bA=
github.com/Kichiyaki/appmode v0.0.0-20210502105643-0a26207c548d/go.mod h1:41p1KTy/fiVocPnJR2h/iXh2NvWWVBdNoZrN8TWVXUI=
github.com/Kichiyaki/ginlogrus v0.0.0-20210502060406-bb0049cc40c4 h1:1fPLsfbM6DGZcpdV+IeD/52BP7tL33MoVh7FdUGj14g=
github.com/Kichiyaki/ginlogrus v0.0.0-20210502060406-bb0049cc40c4/go.mod h1:PTGPHApaVoNA6eEC72vqvzKRhhSUQnHfh9uSho3rsXk=
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210502060056-ad595ba7b858 h1:O7EPPY5lWaKbYB/5yJzE8WMesismUYuje7gOemo1UNo=
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210502060056-ad595ba7b858/go.mod h1:ADHVWnGlWcRn1aGthuh7I1Lrn6zzsjkVJju151dXyDw=
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210502103432-20b73c1e09b3 h1:kF01z5HAcpmn8PeGysegVKWblqV/t+boiZFi+6TIFVM=
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210502103432-20b73c1e09b3/go.mod h1:Ol4iqPU50Ena5DFDOJvGnr17/gVbnhqSW/TuI0mWyo4=
github.com/Kichiyaki/goutil v0.0.0-20210502095630-318d17091eab h1:XFHuFbQQPKkSYw/Z+nQ0ZeOz/Bx3PFWRk0lWtJc7yx8=
github.com/Kichiyaki/goutil v0.0.0-20210502095630-318d17091eab/go.mod h1:+HhI932Xb0xrCodNcCv5GPiCjLYhDxWhCtlEqMIJhB4=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
github.com/agnivade/levenshtein v1.0.3/go.mod h1:4SFRZbbXWLF4MU1T9Qg0pGgH3Pjs+t6ie5efyrwRJXs=
github.com/agnivade/levenshtein v1.1.0 h1:n6qGwyHG61v3ABce1rPVZklEYRT8NFpCMrpZdBUbYGM=

View File

@ -2,6 +2,7 @@ package httpdelivery
import (
"fmt"
"github.com/Kichiyaki/appmode"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/querycomplexity"
"time"
@ -15,7 +16,6 @@ import (
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/directive"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/resolvers"
"github.com/zdam-egzamin-zawodowy/backend/pkg/mode"
)
const (
@ -36,7 +36,7 @@ func Attach(group *gin.RouterGroup, cfg Config) error {
gqlHandler := graphqlHandler(prepareConfig(cfg.Resolver, cfg.Directive))
group.GET(graphqlEndpoint, gqlHandler)
group.POST(graphqlEndpoint, gqlHandler)
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
group.GET(playgroundEndpoint, playgroundHandler())
}
return nil
@ -57,7 +57,7 @@ func graphqlHandler(cfg generated.Config) gin.HandlerFunc {
})
srv.SetQueryCache(lru.New(100))
srv.Use(querycomplexity.GetComplexityLimitExtension())
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
srv.Use(extension.Introspection{})
}

View File

@ -2,13 +2,13 @@ package querycomplexity
import (
"github.com/99designs/gqlgen/graphql/handler/extension"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/profession"
"github.com/zdam-egzamin-zawodowy/backend/internal/qualification"
"github.com/zdam-egzamin-zawodowy/backend/internal/question"
"github.com/zdam-egzamin-zawodowy/backend/internal/user"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
)
const (

View File

@ -5,8 +5,8 @@ package resolvers
import (
"context"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"

View File

@ -5,7 +5,7 @@ package resolvers
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"

View File

@ -5,7 +5,7 @@ package resolvers
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"

View File

@ -5,7 +5,7 @@ package resolvers
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"

View File

@ -2,7 +2,7 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/Kichiyaki/gopgutil/v10"
"strings"
"time"
@ -73,10 +73,10 @@ func (input *ProfessionInput) ToProfession() *Profession {
func (input *ProfessionInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if !input.IsEmpty() {
if input.Name != nil {
q = q.Set(sql.BuildConditionEquals("name"), *input.Name)
q = q.Set(gopgutil.BuildConditionEquals("name"), *input.Name)
}
if input.Description != nil {
q = q.Set(sql.BuildConditionEquals("description"), *input.Description)
q = q.Set(gopgutil.BuildConditionEquals("description"), *input.Description)
}
}
@ -113,37 +113,37 @@ func (f *ProfessionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Quer
}
if !isZero(f.ID) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Slug) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
}
if !isZero(f.SlugNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
}
if !isZero(f.Name) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
}
if !isZero(f.NameNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
}
if !isZero(f.NameMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("name", alias)), f.NameMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("name", alias)), f.NameIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.DescriptionMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
}
if !isZero(f.DescriptionIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
}
if !isZero(f.QualificationID) {
@ -151,30 +151,30 @@ func (f *ProfessionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Quer
subquery := q.
New().
Model(&QualificationToProfession{}).
ColumnExpr(sql.BuildCountColumnExpr("qualification_id", "count")).
ColumnExpr(gopgutil.BuildCountColumnExpr("qualification_id", "count")).
Column("profession_id").
Where(sql.BuildConditionArray("qualification_id"), pg.Array(f.QualificationID)).
Where(gopgutil.BuildConditionArray("qualification_id"), pg.Array(f.QualificationID)).
Group("profession_id")
q = q.
Join(`INNER JOIN (?) AS qualification_to_professions ON qualification_to_professions.profession_id = profession.id`, subquery).
Where(sql.BuildConditionGTE("count"), sliceLength)
Where(gopgutil.BuildConditionGTE("count"), sliceLength)
}
if !isZero(f.CreatedAt) {
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
return q, nil

View File

@ -2,7 +2,7 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/Kichiyaki/gopgutil/v10"
"strings"
"time"
@ -113,16 +113,16 @@ func (input *QualificationInput) ToQualification() *Qualification {
func (input *QualificationInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if !input.IsEmpty() {
if input.Name != nil {
q = q.Set(sql.BuildConditionEquals("name"), *input.Name)
q = q.Set(gopgutil.BuildConditionEquals("name"), *input.Name)
}
if input.Code != nil {
q = q.Set(sql.BuildConditionEquals("code"), *input.Code)
q = q.Set(gopgutil.BuildConditionEquals("code"), *input.Code)
}
if input.Formula != nil {
q = q.Set(sql.BuildConditionEquals("formula"), *input.Formula)
q = q.Set(gopgutil.BuildConditionEquals("formula"), *input.Formula)
}
if input.Description != nil {
q = q.Set(sql.BuildConditionEquals("description"), *input.Description)
q = q.Set(gopgutil.BuildConditionEquals("description"), *input.Description)
}
}
@ -144,17 +144,17 @@ func (f *QualificationFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.
q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) {
if !isZero(f.NameMATCH) {
q = q.WhereOr(sql.BuildConditionMatch(sql.AddAliasToColumnName("name", alias)), f.NameMATCH)
q = q.WhereOr(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.WhereOr(sql.BuildConditionIEQ(sql.AddAliasToColumnName("name", alias)), f.NameIEQ)
q = q.WhereOr(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.CodeMATCH) {
q = q.WhereOr(sql.BuildConditionMatch(sql.AddAliasToColumnName("code", alias)), f.CodeMATCH)
q = q.WhereOr(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("code", alias)), f.CodeMATCH)
}
if !isZero(f.CodeIEQ) {
q = q.WhereOr(sql.BuildConditionIEQ(sql.AddAliasToColumnName("code", alias)), f.CodeIEQ)
q = q.WhereOr(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("code", alias)), f.CodeIEQ)
}
return q, nil
@ -202,57 +202,57 @@ func (f *QualificationFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Q
}
if !isZero(f.ID) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Slug) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
}
if !isZero(f.SlugNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
}
if !isZero(f.Name) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
}
if !isZero(f.NameNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
}
if !isZero(f.NameMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("name", alias)), f.NameMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("name", alias)), f.NameIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.Code) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("code", alias)), pg.Array(f.Code))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("code", alias)), pg.Array(f.Code))
}
if !isZero(f.CodeNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ))
}
if !isZero(f.CodeMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("code", alias)), f.CodeMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("code", alias)), f.CodeMATCH)
}
if !isZero(f.CodeIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("code", alias)), f.CodeIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("code", alias)), f.CodeIEQ)
}
if !isZero(f.Formula) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("formula", alias)), pg.Array(f.Formula))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("formula", alias)), pg.Array(f.Formula))
}
if !isZero(f.FormulaNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("formula", alias)), pg.Array(f.FormulaNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("formula", alias)), pg.Array(f.FormulaNEQ))
}
if !isZero(f.DescriptionMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
}
if !isZero(f.DescriptionIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
}
if !isZero(f.ProfessionID) {
@ -260,30 +260,30 @@ func (f *QualificationFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Q
subquery := q.
New().
Model(&QualificationToProfession{}).
ColumnExpr(sql.BuildCountColumnExpr("profession_id", "count")).
ColumnExpr(gopgutil.BuildCountColumnExpr("profession_id", "count")).
Column("qualification_id").
Where(sql.BuildConditionArray("profession_id"), pg.Array(f.ProfessionID)).
Where(gopgutil.BuildConditionArray("profession_id"), pg.Array(f.ProfessionID)).
Group("qualification_id")
q = q.
Join(`INNER JOIN (?) AS qualification_to_professions ON qualification_to_professions.qualification_id = qualification.id`, subquery).
Where(sql.BuildConditionGTE("count"), sliceLength)
Where(gopgutil.BuildConditionGTE("count"), sliceLength)
}
if !isZero(f.CreatedAt) {
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
if f.Or != nil {

View File

@ -2,7 +2,7 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/Kichiyaki/gopgutil/v10"
"strings"
"time"
@ -157,36 +157,36 @@ func (input *QuestionInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if !input.IsEmpty() {
if input.Content != nil {
q = q.Set(
sql.BuildConditionEquals(sql.AddAliasToColumnName("content", "question")),
gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("content", "question")),
*input.Content,
)
}
if input.From != nil {
q = q.Set(
sql.BuildConditionEquals(sql.AddAliasToColumnName("from", "question")),
gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("from", "question")),
*input.From,
)
}
if input.Explanation != nil {
q = q.Set(sql.BuildConditionEquals("explanation"), *input.Explanation)
q = q.Set(gopgutil.BuildConditionEquals("explanation"), *input.Explanation)
}
if input.CorrectAnswer != nil {
q = q.Set(sql.BuildConditionEquals("correct_answer"), *input.CorrectAnswer)
q = q.Set(gopgutil.BuildConditionEquals("correct_answer"), *input.CorrectAnswer)
}
if input.AnswerA != nil {
q = q.Set(sql.BuildConditionEquals("answer_a"), *input.AnswerA)
q = q.Set(gopgutil.BuildConditionEquals("answer_a"), *input.AnswerA)
}
if input.AnswerB != nil {
q = q.Set(sql.BuildConditionEquals("answer_b"), *input.AnswerB)
q = q.Set(gopgutil.BuildConditionEquals("answer_b"), *input.AnswerB)
}
if input.AnswerC != nil {
q = q.Set(sql.BuildConditionEquals("answer_c"), *input.AnswerC)
q = q.Set(gopgutil.BuildConditionEquals("answer_c"), *input.AnswerC)
}
if input.AnswerD != nil {
q = q.Set(sql.BuildConditionEquals("answer_d"), *input.AnswerD)
q = q.Set(gopgutil.BuildConditionEquals("answer_d"), *input.AnswerD)
}
if input.QualificationID != nil {
q = q.Set(sql.BuildConditionEquals("qualification_id"), *input.QualificationID)
q = q.Set(gopgutil.BuildConditionEquals("qualification_id"), *input.QualificationID)
}
}
@ -219,28 +219,28 @@ func (f *QuestionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query,
}
if !isZero(f.ID) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.From) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("from", alias)), pg.Array(f.From))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("from", alias)), pg.Array(f.From))
}
if !isZero(f.ContentMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("content", alias)), f.ContentMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("content", alias)), f.ContentMATCH)
}
if !isZero(f.ContentIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("content", alias)), f.ContentIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("content", alias)), f.ContentIEQ)
}
if !isZero(f.QualificationID) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationID))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationID))
}
if !isZero(f.QualificationIDNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationIDNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationIDNEQ))
}
if f.QualificationFilter != nil {
@ -249,19 +249,19 @@ func (f *QuestionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query,
}
if !isZero(f.CreatedAt) {
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
return q, nil

View File

@ -2,7 +2,7 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/Kichiyaki/gopgutil/v10"
"strings"
"time"
@ -105,7 +105,7 @@ func (input *UserInput) ToUser() *User {
func (input *UserInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if !input.IsEmpty() {
if input.DisplayName != nil {
q = q.Set(sql.BuildConditionEquals("display_name"), *input.DisplayName)
q = q.Set(gopgutil.BuildConditionEquals("display_name"), *input.DisplayName)
}
if input.Password != nil {
@ -113,19 +113,19 @@ func (input *UserInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if err != nil {
return q, err
}
q = q.Set(sql.BuildConditionEquals("password"), string(hashedPassword))
q = q.Set(gopgutil.BuildConditionEquals("password"), string(hashedPassword))
}
if input.Email != nil {
q = q.Set(sql.BuildConditionEquals("email"), *input.Email)
q = q.Set(gopgutil.BuildConditionEquals("email"), *input.Email)
}
if input.Role != nil {
q = q.Set(sql.BuildConditionEquals("role"), *input.Role)
q = q.Set(gopgutil.BuildConditionEquals("role"), *input.Role)
}
if input.Activated != nil {
q = q.Set(sql.BuildConditionEquals("activated"), *input.Activated)
q = q.Set(gopgutil.BuildConditionEquals("activated"), *input.Activated)
}
}
@ -148,22 +148,22 @@ func (f *UserFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query {
q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) {
if !isZero(f.DisplayNameMATCH) {
q = q.WhereOr(
sql.BuildConditionMatch(sql.AddAliasToColumnName("display_name", alias)),
gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("display_name", alias)),
f.DisplayNameMATCH,
)
}
if !isZero(f.DisplayNameIEQ) {
q = q.WhereOr(
sql.BuildConditionIEQ(sql.AddAliasToColumnName("display_name", alias)),
gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("display_name", alias)),
f.DisplayNameIEQ,
)
}
if !isZero(f.EmailMATCH) {
q = q.WhereOr(sql.BuildConditionMatch(sql.AddAliasToColumnName("email", alias)), f.EmailMATCH)
q = q.WhereOr(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("email", alias)), f.EmailMATCH)
}
if !isZero(f.EmailIEQ) {
q = q.WhereOr(sql.BuildConditionIEQ(sql.AddAliasToColumnName("email", alias)), f.EmailIEQ)
q = q.WhereOr(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("email", alias)), f.EmailIEQ)
}
return q, nil
@ -205,56 +205,56 @@ func (f *UserFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, err
}
if !isZero(f.ID) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Activated) {
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("activated", alias)), f.Activated)
q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("activated", alias)), f.Activated)
}
if !isZero(f.DisplayName) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayName))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayName))
}
if !isZero(f.DisplayNameNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayNameNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayNameNEQ))
}
if !isZero(f.DisplayNameMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("display_name", alias)), f.DisplayNameMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("display_name", alias)), f.DisplayNameMATCH)
}
if !isZero(f.DisplayNameIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("display_name", alias)), f.DisplayNameIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("display_name", alias)), f.DisplayNameIEQ)
}
if !isZero(f.Email) {
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("email", alias)), pg.Array(f.Email))
q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("email", alias)), pg.Array(f.Email))
}
if !isZero(f.EmailNEQ) {
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("email", alias)), pg.Array(f.EmailNEQ))
q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("email", alias)), pg.Array(f.EmailNEQ))
}
if !isZero(f.EmailMATCH) {
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("email", alias)), f.EmailMATCH)
q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("email", alias)), f.EmailMATCH)
}
if !isZero(f.EmailIEQ) {
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("email", alias)), f.EmailIEQ)
q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("email", alias)), f.EmailIEQ)
}
if !isZero(f.CreatedAt) {
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
if f.Or != nil {

View File

@ -2,8 +2,8 @@ package postgres
import (
"context"
"github.com/Kichiyaki/goutil/envutil"
"github.com/sirupsen/logrus"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/envutil"
"github.com/Kichiyaki/go-pg-logrus-query-logger/v10"
"github.com/go-pg/pg/v10"

View File

@ -1,28 +0,0 @@
package postgres
import (
"strings"
"github.com/go-pg/pg/v10/orm"
)
type Sort struct {
Relationships map[string]string
Orders []string
}
func (s Sort) Apply(q *orm.Query) (*orm.Query, error) {
for _, order := range s.Orders {
if alias := s.extractAlias(order); alias != "" && s.Relationships[alias] != "" {
q = q.Relation(s.Relationships[alias])
}
}
return q.Order(s.Orders...), nil
}
func (s Sort) extractAlias(order string) string {
if strings.Contains(order, ".") {
return strings.Split(order, ".")[0]
}
return ""
}

View File

@ -2,8 +2,8 @@ package repository
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
@ -109,7 +109,7 @@ func (repo *pgRepository) GetAssociatedQualifications(
if err := repo.
Model(&qualificationToProfession).
Context(ctx).
Where(sql.BuildConditionArray("profession_id"), pg.Array(ids)).
Where(gopgutil.BuildConditionArray("profession_id"), pg.Array(ids)).
Relation("Qualification").
Order("qualification.formula ASC", "qualification.code ASC").
Select(); err != nil {

View File

@ -2,8 +2,8 @@ package usecase
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/profession"
@ -65,7 +65,7 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg *profession.FetchConfig) ([
Count: true,
}
}
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
cfg.Sort = gopgutil.SanitizeOrders(cfg.Sort)
return ucase.professionRepository.Fetch(ctx, cfg)
}

View File

@ -2,8 +2,8 @@ package repository
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
@ -87,8 +87,8 @@ func (repo *pgRepository) UpdateMany(
if len(input.DissociateProfession) > 0 {
_, err := tx.
Model(&models.QualificationToProfession{}).
Where(sql.BuildConditionArray("profession_id"), pg.Array(input.DissociateProfession)).
Where(sql.BuildConditionArray("qualification_id"), pg.Array(qualificationIDs)).
Where(gopgutil.BuildConditionArray("profession_id"), pg.Array(input.DissociateProfession)).
Where(gopgutil.BuildConditionArray("qualification_id"), pg.Array(qualificationIDs)).
Delete()
if err != nil {
return handleInsertAndUpdateError(err)
@ -148,7 +148,7 @@ func (repo *pgRepository) GetSimilar(ctx context.Context, cfg *qualification.Get
subquery := repo.
Model(&models.QualificationToProfession{}).
Context(ctx).
Where(sql.BuildConditionEquals("qualification_id"), cfg.QualificationID).
Where(gopgutil.BuildConditionEquals("qualification_id"), cfg.QualificationID).
Column("profession_id")
qualificationIDs := []int{}
err = repo.
@ -156,8 +156,8 @@ func (repo *pgRepository) GetSimilar(ctx context.Context, cfg *qualification.Get
Context(ctx).
Column("qualification_id").
With("prof", subquery).
Where(sql.BuildConditionIn("profession_id"), pg.Safe("SELECT profession_id FROM prof")).
Where(sql.BuildConditionNEQ("qualification_id"), cfg.QualificationID).
Where(gopgutil.BuildConditionIn("profession_id"), pg.Safe("SELECT profession_id FROM prof")).
Where(gopgutil.BuildConditionNEQ("qualification_id"), cfg.QualificationID).
Select(&qualificationIDs)
if err != nil {
return nil, 0, errorutil.Wrap(err, messageFailedToFetchModel)

View File

@ -2,8 +2,8 @@ package usecase
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/qualification"
@ -65,7 +65,7 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg *qualification.FetchConfig)
Count: true,
}
}
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
cfg.Sort = gopgutil.SanitizeOrders(cfg.Sort)
return ucase.qualificationRepository.Fetch(ctx, cfg)
}
@ -107,7 +107,7 @@ func (ucase *usecase) GetSimilar(ctx context.Context, cfg *qualification.GetSimi
if cfg == nil || cfg.QualificationID <= 0 {
return nil, 0, errors.New(messageQualificationIDIsRequired)
}
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
cfg.Sort = gopgutil.SanitizeOrders(cfg.Sort)
return ucase.qualificationRepository.GetSimilar(ctx, cfg)
}

View File

@ -2,14 +2,13 @@ package repository
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"time"
"github.com/go-pg/pg/v10"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/postgres"
"github.com/zdam-egzamin-zawodowy/backend/internal/question"
"github.com/zdam-egzamin-zawodowy/backend/pkg/fstorage"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
@ -71,7 +70,7 @@ func (repo *pgRepository) UpdateOneByID(ctx context.Context, id int, input *mode
Model(item).
Context(ctx).
Returning("*").
Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("id", "question")), id).
Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("id", "question")), id).
Set("updated_at = ?", time.Now())
if _, err := baseQuery.
@ -116,16 +115,18 @@ func (repo *pgRepository) Delete(ctx context.Context, f *models.QuestionFilter)
func (repo *pgRepository) Fetch(ctx context.Context, cfg *question.FetchConfig) ([]*models.Question, int, error) {
var err error
items := []*models.Question{}
var items []*models.Question
total := 0
query := repo.
Model(&items).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset).
Apply(postgres.Sort{
Relationships: map[string]string{
"qualification": "qualification",
Apply(gopgutil.OrderAppender{
Relations: map[string]gopgutil.OrderAppenderRelation{
"qualification": {
Name: "Qualification",
},
},
Orders: cfg.Sort,
}.Apply).
@ -146,14 +147,14 @@ func (repo *pgRepository) GenerateTest(ctx context.Context, cfg *question.Genera
subquery := repo.
Model(&models.Question{}).
Column("id").
Where(sql.BuildConditionArray("qualification_id"), pg.Array(cfg.Qualifications)).
Where(gopgutil.BuildConditionArray("qualification_id"), pg.Array(cfg.Qualifications)).
OrderExpr("random()").
Limit(cfg.Limit)
items := []*models.Question{}
if err := repo.
Model(&items).
Context(ctx).
Where(sql.BuildConditionIn("id"), subquery).
Where(gopgutil.BuildConditionIn("id"), subquery).
Select(); err != nil && err != pg.ErrNoRows {
return nil, errorutil.Wrap(err, messageFailedToFetchModel)
}

View File

@ -2,10 +2,10 @@ package usecase
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/question"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
)
var (
@ -73,7 +73,7 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg *question.FetchConfig) ([]*
if cfg.Limit > question.FetchMaxLimit {
cfg.Limit = question.FetchMaxLimit
}
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
cfg.Sort = gopgutil.SanitizeOrders(cfg.Sort)
return ucase.questionRepository.Fetch(ctx, cfg)
}

View File

@ -2,9 +2,9 @@ package usecase
import (
"context"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/Kichiyaki/goutil/strutil"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"github.com/zdam-egzamin-zawodowy/backend/pkg/validator"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/user"
@ -82,7 +82,7 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg *user.FetchConfig) ([]*mode
if cfg.Limit > user.FetchMaxLimit || cfg.Limit <= 0 {
cfg.Limit = user.FetchMaxLimit
}
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
cfg.Sort = gopgutil.SanitizeOrders(cfg.Sort)
return ucase.userRepository.Fetch(ctx, cfg)
}
@ -144,7 +144,7 @@ func validateInput(input *models.UserInput, opts validateOptions) error {
}
if input.Email != nil {
if !validator.IsEmailValid(*input.Email) {
if !strutil.IsEmail(*input.Email) {
return errors.New(messageEmailIsInvalid)
}
} else if !opts.acceptNilValues {

12
main.go
View File

@ -2,6 +2,8 @@ package main
import (
"context"
"github.com/Kichiyaki/appmode"
"github.com/Kichiyaki/goutil/envutil"
"net/http"
"os"
"os/signal"
@ -32,14 +34,12 @@ import (
"github.com/joho/godotenv"
"github.com/sirupsen/logrus"
"github.com/zdam-egzamin-zawodowy/backend/pkg/fstorage"
"github.com/zdam-egzamin-zawodowy/backend/pkg/mode"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/envutil"
)
func init() {
os.Setenv("TZ", "UTC")
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
godotenv.Load(".env.local")
}
@ -164,12 +164,12 @@ func main() {
}
func setupLogger() {
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
logrus.SetLevel(logrus.DebugLevel)
}
timestampFormat := "2006-01-02 15:04:05"
if mode.Get() == mode.ProductionMode {
if appmode.Equals(appmode.ProductionMode) {
customFormatter := new(logrus.JSONFormatter)
customFormatter.TimestampFormat = timestampFormat
logrus.SetFormatter(customFormatter)
@ -185,7 +185,7 @@ func setupRouter() *gin.Engine {
router := gin.New()
router.Use(ginlogrus.Logger(logrus.WithFields(map[string]interface{}{})), gin.Recovery())
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
router.Use(cors.New(cors.Config{
AllowOriginFunc: func(string) bool {
return true

View File

@ -1,37 +0,0 @@
package mode
import (
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/envutil"
)
const (
EnvKey = "MODE"
DevelopmentMode = "development"
ProductionMode = "production"
TestMode = "test"
)
var mode = DevelopmentMode
func init() {
Set(envutil.GetenvString(EnvKey))
}
func Set(value string) {
if value == "" {
value = DevelopmentMode
}
switch value {
case DevelopmentMode,
ProductionMode,
TestMode:
mode = value
default:
panic("unknown mode: " + value)
}
}
func Get() string {
return mode
}

View File

@ -1,16 +0,0 @@
package sql
import "strings"
func AddAliasToColumnName(column, alias string) string {
if alias != "" && !strings.HasPrefix(column, alias+".") {
column = wrapStringInDoubleQuotes(alias) + "." + wrapStringInDoubleQuotes(column)
} else {
column = wrapStringInDoubleQuotes(column)
}
return column
}
func wrapStringInDoubleQuotes(str string) string {
return `"` + str + `"`
}

View File

@ -1,57 +0,0 @@
package sql
import (
"fmt"
)
func BuildConditionEquals(column string) string {
return column + " = ?"
}
func BuildConditionNEQ(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 BuildConditionIn(column string) string {
return column + " IN (?)"
}
func BuildConditionArray(column string) string {
return column + " = ANY(?)"
}
func BuildConditionNotInArray(column string) string {
return "NOT (" + BuildConditionArray(column) + ")"
}
func BuildCountColumnExpr(column, alias string) string {
base := fmt.Sprintf("count(%s)", column)
if alias != "" {
return base + " as " + alias
}
return base
}

View File

@ -1,102 +0,0 @@
package sql
import (
"regexp"
"strings"
"unicode"
"unicode/utf8"
)
var (
sortRegex = regexp.MustCompile(`^[\p{L}\_\.]+$`)
)
func SanitizeOrder(order string) string {
parts := strings.Split(strings.TrimSpace(order), " ")
length := len(parts)
if length != 2 || !sortRegex.Match([]byte(parts[0])) {
return ""
}
table := ""
column := parts[0]
if strings.Contains(parts[0], ".") {
columnAndTable := strings.Split(parts[0], ".")
table = underscore(columnAndTable[0]) + "."
column = columnAndTable[1]
}
direction := "ASC"
if strings.ToUpper(parts[1]) == "DESC" {
direction = "DESC"
}
return strings.ToLower(table+underscore(column)) + " " + direction
}
func SanitizeOrders(orders []string) []string {
var sanitizedOrders []string
for _, sort := range orders {
sanitized := SanitizeOrder(sort)
if sanitized != "" {
sanitizedOrders = append(sanitizedOrders, sanitized)
}
}
return sanitizedOrders
}
type buffer struct {
r []byte
runeBytes [utf8.UTFMax]byte
}
func (b *buffer) write(r rune) {
if r < utf8.RuneSelf {
b.r = append(b.r, byte(r))
return
}
n := utf8.EncodeRune(b.runeBytes[0:], r)
b.r = append(b.r, b.runeBytes[0:n]...)
}
func (b *buffer) indent() {
if len(b.r) > 0 {
b.r = append(b.r, '_')
}
}
func underscore(s string) string {
b := buffer{
r: make([]byte, 0, len(s)),
}
var m rune
var w bool
for _, ch := range s {
if unicode.IsUpper(ch) {
if m != 0 {
if !w {
b.indent()
w = true
}
b.write(m)
}
m = unicode.ToLower(ch)
} else {
if m != 0 {
b.indent()
b.write(m)
m = 0
w = false
}
b.write(ch)
}
}
if m != 0 {
if !w {
b.indent()
}
b.write(m)
}
return string(b.r)
}

View File

@ -1,30 +0,0 @@
package envutil
import (
"os"
"strconv"
)
func GetenvInt(key string) int {
str := GetenvString(key)
if str == "" {
return 0
}
i, err := strconv.Atoi(str)
if err != nil {
return 0
}
return i
}
func GetenvBool(key string) bool {
str := GetenvString(key)
if str == "" {
return false
}
return str == "true" || str == "1"
}
func GetenvString(key string) string {
return os.Getenv(key)
}

View File

@ -1,19 +1,19 @@
package errorutil
import (
"github.com/Kichiyaki/appmode"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/mode"
)
func Wrap(details error, message string) error {
if mode.Get() == mode.ProductionMode {
if appmode.Equals(appmode.ProductionMode) {
return errors.New(message)
}
return errors.Wrap(details, message)
}
func Wrapf(details error, message string, args ...interface{}) error {
if mode.Get() == mode.ProductionMode {
if appmode.Equals(appmode.ProductionMode) {
return errors.Errorf(message, args...)
}
return errors.Wrapf(details, message, args...)

View File

@ -1,22 +0,0 @@
package safeptr
func SafeBoolPointer(v *bool, def bool) bool {
if v == nil {
return def
}
return *v
}
func SafeIntPointer(s *int, def int) int {
if s == nil {
return def
}
return *s
}
func SafeStringPointer(s *string, def string) string {
if s == nil {
return def
}
return *s
}

View File

@ -1,24 +0,0 @@
package validator
import (
"net"
"regexp"
"strings"
)
var emailRegex = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
func IsEmailValid(e string) bool {
if len(e) < 3 && len(e) > 254 {
return false
}
if !emailRegex.MatchString(e) {
return false
}
parts := strings.Split(e, "@")
mx, err := net.LookupMX(parts[1])
if err != nil || len(mx) == 0 {
return false
}
return true
}