add github.com/Kichiyaki/goutil, github.com/Kichiyaki/appmode, github.com/Kichiyaki/gopgutil
This commit is contained in:
parent
c05cc6ee9d
commit
f907e7294e
|
@ -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
3
go.mod
|
@ -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
6
go.sum
|
@ -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=
|
||||
|
|
|
@ -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{})
|
||||
}
|
||||
|
||||
|
|
|
@ -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 (
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 ""
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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
12
main.go
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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 + `"`
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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...)
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
Reference in New Issue