Merge pull request #7 from zdam-egzamin-zawodowy/refactor

Refactor
This commit is contained in:
Dawid Wysokiński 2021-05-02 09:25:30 +02:00 committed by GitHub
commit f65aa260b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 266 additions and 266 deletions

10
go.mod
View File

@ -4,34 +4,26 @@ go 1.16
require (
github.com/99designs/gqlgen v0.13.0
github.com/Kichiyaki/ginlogrus v0.0.0-20210502060406-bb0049cc40c4 // 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/agnivade/levenshtein v1.1.0 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-contrib/cors v1.3.1
github.com/gin-gonic/gin v1.6.3
github.com/go-pg/pg/v10 v10.9.1
github.com/go-playground/validator/v10 v10.5.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.2.0
github.com/gosimple/slug v1.9.0
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/joho/godotenv v1.3.0
github.com/json-iterator/go v1.1.11 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pkg/errors v0.9.1
github.com/sethvargo/go-password v0.2.0
github.com/sirupsen/logrus v1.8.1
github.com/ugorji/go v1.2.5 // indirect
github.com/vektah/gqlparser/v2 v2.1.0
github.com/vmihailenco/msgpack/v5 v5.3.1 // indirect
go.opentelemetry.io/otel v0.20.0 // indirect
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 // indirect
golang.org/x/text v0.3.6 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

View File

@ -7,7 +7,7 @@ import (
"github.com/zdam-egzamin-zawodowy/backend/internal/auth/jwt"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/user"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
)
type usecase struct {
@ -44,7 +44,7 @@ func (ucase *usecase) SignIn(ctx context.Context, email, password string, staySi
},
})
if err != nil {
return nil, "", errorutils.Wrap(err, messageInvalidCredentials)
return nil, "", errorutil.Wrap(err, messageInvalidCredentials)
}
return u, token, nil
@ -53,7 +53,7 @@ func (ucase *usecase) SignIn(ctx context.Context, email, password string, staySi
func (ucase *usecase) ExtractAccessTokenMetadata(ctx context.Context, accessToken string) (*models.User, error) {
metadata, err := ucase.tokenGenerator.ExtractAccessTokenMetadata(accessToken)
if err != nil {
return nil, errorutils.Wrap(err, messageInvalidAccessToken)
return nil, errorutil.Wrap(err, messageInvalidAccessToken)
}
return ucase.GetUserByCredentials(ctx, metadata.Credentials.Email, metadata.Credentials.Password)
@ -76,7 +76,7 @@ func (ucase *usecase) GetUserByCredentials(ctx context.Context, email, password
u := users[0]
if err := u.CompareHashAndPassword(password); err != nil {
return nil, errorutils.Wrap(err, messageInvalidCredentials)
return nil, errorutil.Wrap(err, messageInvalidCredentials)
}
return u, nil

View File

@ -31,7 +31,7 @@ type Config struct {
func Attach(group *gin.RouterGroup, cfg Config) error {
if cfg.Resolver == nil {
return errors.New("Graphql resolver cannot be nil")
return errors.New("cfg.Resolver is required")
}
gqlHandler := graphqlHandler(prepareConfig(cfg.Resolver, cfg.Directive))
group.GET(graphqlEndpoint, gqlHandler)

View File

@ -7,15 +7,15 @@ import (
"github.com/99designs/gqlgen/graphql"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
)
type Directive struct{}
func (d *Directive) Authenticated(ctx context.Context, obj interface{}, next graphql.Resolver, yes bool) (interface{}, error) {
func (d *Directive) Authenticated(ctx context.Context, _ interface{}, next graphql.Resolver, yes bool) (interface{}, error) {
_, err := middleware.UserFromContext(ctx)
if yes && err != nil {
return nil, errorutils.Wrap(err, messageMustBeSignedIn)
return nil, errorutil.Wrap(err, messageMustBeSignedIn)
} else if !yes && err == nil {
return nil, errors.New(messageMustBeSignedOut)
}
@ -23,10 +23,10 @@ func (d *Directive) Authenticated(ctx context.Context, obj interface{}, next gra
return next(ctx)
}
func (d *Directive) HasRole(ctx context.Context, obj interface{}, next graphql.Resolver, role models.Role) (interface{}, error) {
func (d *Directive) HasRole(ctx context.Context, _ interface{}, next graphql.Resolver, role models.Role) (interface{}, error) {
user, err := middleware.UserFromContext(ctx)
if err != nil {
return nil, errorutils.Wrap(err, messageMustBeSignedIn)
return nil, errorutil.Wrap(err, messageMustBeSignedIn)
}
if user.Role != role {
return nil, errors.New(messageUnauthorized)

View File

@ -8,7 +8,7 @@ import (
"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/utils"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
)
const (
@ -40,7 +40,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, profession.FetchDefaultLimit),
safeptr.SafeIntPointer(limit, profession.FetchDefaultLimit),
professionsTotalFieldComplexity,
1,
)
@ -56,7 +56,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, qualification.FetchDefaultLimit),
safeptr.SafeIntPointer(limit, qualification.FetchDefaultLimit),
qualificationsTotalFieldComplexity,
1,
)
@ -72,7 +72,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, question.FetchDefaultLimit),
safeptr.SafeIntPointer(limit, question.FetchDefaultLimit),
questionsTotalFieldComplexity,
1,
)
@ -80,7 +80,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.GenerateTest = func(childComplexity int, qualificationIDs []int, limit *int) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, question.TestMaxLimit),
safeptr.SafeIntPointer(limit, question.TestMaxLimit),
0,
3,
)
@ -96,7 +96,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, user.FetchMaxLimit),
safeptr.SafeIntPointer(limit, user.FetchMaxLimit),
usersTotalFieldComplexity,
1,
)

View File

@ -6,11 +6,11 @@ package resolvers
import (
"context"
"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"
"github.com/zdam-egzamin-zawodowy/backend/internal/profession"
"github.com/zdam-egzamin-zawodowy/backend/pkg/utils"
)
func (r *mutationResolver) CreateProfession(ctx context.Context, input models.ProfessionInput) (*models.Profession, error) {
@ -41,8 +41,8 @@ func (r *queryResolver) Professions(
&profession.FetchConfig{
Count: shouldCount(ctx),
Filter: filter,
Limit: utils.SafeIntPointer(limit, profession.FetchDefaultLimit),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, profession.FetchDefaultLimit),
Offset: safeptr.SafeIntPointer(offset, 0),
Sort: sort,
},
)

View File

@ -5,11 +5,11 @@ package resolvers
import (
"context"
"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"
"github.com/zdam-egzamin-zawodowy/backend/internal/qualification"
"github.com/zdam-egzamin-zawodowy/backend/pkg/utils"
)
func (r *mutationResolver) CreateQualification(ctx context.Context, input models.QualificationInput) (*models.Qualification, error) {
@ -40,8 +40,8 @@ func (r *queryResolver) Qualifications(
&qualification.FetchConfig{
Count: shouldCount(ctx),
Filter: filter,
Limit: utils.SafeIntPointer(limit, qualification.FetchDefaultLimit),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, qualification.FetchDefaultLimit),
Offset: safeptr.SafeIntPointer(offset, 0),
Sort: sort,
},
)
@ -62,8 +62,8 @@ func (r *queryResolver) SimilarQualifications(
&qualification.GetSimilarConfig{
Count: shouldCount(ctx),
QualificationID: qualificationID,
Limit: utils.SafeIntPointer(limit, qualification.FetchDefaultLimit),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, qualification.FetchDefaultLimit),
Offset: safeptr.SafeIntPointer(offset, 0),
Sort: sort,
},
)

View File

@ -5,12 +5,12 @@ package resolvers
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/question"
"github.com/zdam-egzamin-zawodowy/backend/pkg/utils"
)
func (r *mutationResolver) CreateQuestion(ctx context.Context, input models.QuestionInput) (*models.Question, error) {
@ -30,7 +30,7 @@ func (r *mutationResolver) DeleteQuestions(ctx context.Context, ids []int) ([]*m
func (r *queryResolver) GenerateTest(ctx context.Context, qualificationIDs []int, limit *int) ([]*models.Question, error) {
return r.QuestionUsecase.GenerateTest(ctx, &question.GenerateTestConfig{
Qualifications: qualificationIDs,
Limit: utils.SafeIntPointer(limit, question.TestMaxLimit),
Limit: safeptr.SafeIntPointer(limit, question.TestMaxLimit),
})
}
@ -48,8 +48,8 @@ func (r *queryResolver) Questions(
&question.FetchConfig{
Count: shouldCount(ctx),
Filter: filter,
Limit: utils.SafeIntPointer(limit, question.FetchDefaultLimit),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, question.FetchDefaultLimit),
Offset: safeptr.SafeIntPointer(offset, 0),
Sort: sort,
},
)
@ -61,7 +61,7 @@ func (r *questionResolver) Qualification(ctx context.Context, obj *models.Questi
return obj.Qualification, nil
}
if obj != nil || obj.QualificationID > 0 {
if obj != nil && obj.QualificationID > 0 {
if dataloader, err := middleware.DataLoaderFromContext(ctx); err == nil && dataloader != nil {
return dataloader.QualificationByID.Load(obj.QualificationID)
}

View File

@ -5,12 +5,12 @@ package resolvers
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/safeptr"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/generated"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/user"
"github.com/zdam-egzamin-zawodowy/backend/pkg/utils"
)
func (r *mutationResolver) CreateUser(ctx context.Context, input models.UserInput) (*models.User, error) {
@ -49,7 +49,7 @@ func (r *mutationResolver) SignIn(
ctx,
email,
password,
utils.SafeBoolPointer(staySignedIn, false),
safeptr.SafeBoolPointer(staySignedIn, false),
)
if err != nil {
return nil, err
@ -71,8 +71,8 @@ func (r *queryResolver) Users(
&user.FetchConfig{
Count: shouldCount(ctx),
Filter: filter,
Limit: utils.SafeIntPointer(limit, user.FetchMaxLimit),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, user.FetchMaxLimit),
Offset: safeptr.SafeIntPointer(offset, 0),
Sort: sort,
},
)
@ -84,6 +84,6 @@ func (r *queryResolver) User(ctx context.Context, id int) (*models.User, error)
}
func (r *queryResolver) Me(ctx context.Context) (*models.User, error) {
user, _ := middleware.UserFromContext(ctx)
return user, nil
u, _ := middleware.UserFromContext(ctx)
return u, nil
}

View File

@ -2,13 +2,13 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"time"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/gosimple/slug"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
var _ pg.BeforeInsertHook = (*Profession)(nil)
@ -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(sqlutils.BuildConditionEquals("name"), *input.Name)
q = q.Set(sql.BuildConditionEquals("name"), *input.Name)
}
if input.Description != nil {
q = q.Set(sqlutils.BuildConditionEquals("description"), *input.Description)
q = q.Set(sql.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(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Slug) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
}
if !isZero(f.SlugNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
}
if !isZero(f.Name) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
}
if !isZero(f.NameNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
}
if !isZero(f.NameMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("name", alias)), f.NameMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("name", alias)), f.NameIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.DescriptionMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
}
if !isZero(f.DescriptionIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.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(sqlutils.BuildCountColumnExpr("qualification_id", "count")).
ColumnExpr(sql.BuildCountColumnExpr("qualification_id", "count")).
Column("profession_id").
Where(sqlutils.BuildConditionArray("qualification_id"), pg.Array(f.QualificationID)).
Where(sql.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(sqlutils.BuildConditionGTE("count"), sliceLength)
Where(sql.BuildConditionGTE("count"), sliceLength)
}
if !isZero(f.CreatedAt) {
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sqlutils.BuildConditionGT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sqlutils.BuildConditionGTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sqlutils.BuildConditionLT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sqlutils.BuildConditionLTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
return q, nil

View File

@ -2,13 +2,13 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"time"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/gosimple/slug"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
var _ pg.BeforeInsertHook = (*Qualification)(nil)
@ -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(sqlutils.BuildConditionEquals("name"), *input.Name)
q = q.Set(sql.BuildConditionEquals("name"), *input.Name)
}
if input.Code != nil {
q = q.Set(sqlutils.BuildConditionEquals("code"), *input.Code)
q = q.Set(sql.BuildConditionEquals("code"), *input.Code)
}
if input.Formula != nil {
q = q.Set(sqlutils.BuildConditionEquals("formula"), *input.Formula)
q = q.Set(sql.BuildConditionEquals("formula"), *input.Formula)
}
if input.Description != nil {
q = q.Set(sqlutils.BuildConditionEquals("description"), *input.Description)
q = q.Set(sql.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(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("name", alias)), f.NameMATCH)
q = q.WhereOr(sql.BuildConditionMatch(sql.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.WhereOr(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("name", alias)), f.NameIEQ)
q = q.WhereOr(sql.BuildConditionIEQ(sql.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.CodeMATCH) {
q = q.WhereOr(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("code", alias)), f.CodeMATCH)
q = q.WhereOr(sql.BuildConditionMatch(sql.AddAliasToColumnName("code", alias)), f.CodeMATCH)
}
if !isZero(f.CodeIEQ) {
q = q.WhereOr(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("code", alias)), f.CodeIEQ)
q = q.WhereOr(sql.BuildConditionIEQ(sql.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(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Slug) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.Slug))
}
if !isZero(f.SlugNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("slug", alias)), pg.Array(f.SlugNEQ))
}
if !isZero(f.Name) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.Name))
}
if !isZero(f.NameNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ))
}
if !isZero(f.NameMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("name", alias)), f.NameMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("name", alias)), f.NameMATCH)
}
if !isZero(f.NameIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("name", alias)), f.NameIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("name", alias)), f.NameIEQ)
}
if !isZero(f.Code) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("code", alias)), pg.Array(f.Code))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("code", alias)), pg.Array(f.Code))
}
if !isZero(f.CodeNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ))
}
if !isZero(f.CodeMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("code", alias)), f.CodeMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("code", alias)), f.CodeMATCH)
}
if !isZero(f.CodeIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("code", alias)), f.CodeIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("code", alias)), f.CodeIEQ)
}
if !isZero(f.Formula) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("formula", alias)), pg.Array(f.Formula))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("formula", alias)), pg.Array(f.Formula))
}
if !isZero(f.FormulaNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("formula", alias)), pg.Array(f.FormulaNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("formula", alias)), pg.Array(f.FormulaNEQ))
}
if !isZero(f.DescriptionMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("description", alias)), f.DescriptionMATCH)
}
if !isZero(f.DescriptionIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("description", alias)), f.DescriptionIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.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(sqlutils.BuildCountColumnExpr("profession_id", "count")).
ColumnExpr(sql.BuildCountColumnExpr("profession_id", "count")).
Column("qualification_id").
Where(sqlutils.BuildConditionArray("profession_id"), pg.Array(f.ProfessionID)).
Where(sql.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(sqlutils.BuildConditionGTE("count"), sliceLength)
Where(sql.BuildConditionGTE("count"), sliceLength)
}
if !isZero(f.CreatedAt) {
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sqlutils.BuildConditionGT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sqlutils.BuildConditionGTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sqlutils.BuildConditionLT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sqlutils.BuildConditionLTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
if f.Or != nil {

View File

@ -2,13 +2,13 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"time"
"github.com/99designs/gqlgen/graphql"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
var _ pg.BeforeInsertHook = (*Question)(nil)
@ -157,36 +157,36 @@ func (input *QuestionInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if !input.IsEmpty() {
if input.Content != nil {
q = q.Set(
sqlutils.BuildConditionEquals(sqlutils.WrapStringInDoubleQuotes("content")),
sql.BuildConditionEquals(sql.AddAliasToColumnName("content", "question")),
*input.Content,
)
}
if input.From != nil {
q = q.Set(
sqlutils.BuildConditionEquals(sqlutils.WrapStringInDoubleQuotes("from")),
sql.BuildConditionEquals(sql.AddAliasToColumnName("from", "question")),
*input.From,
)
}
if input.Explanation != nil {
q = q.Set(sqlutils.BuildConditionEquals("explanation"), *input.Explanation)
q = q.Set(sql.BuildConditionEquals("explanation"), *input.Explanation)
}
if input.CorrectAnswer != nil {
q = q.Set(sqlutils.BuildConditionEquals("correct_answer"), *input.CorrectAnswer)
q = q.Set(sql.BuildConditionEquals("correct_answer"), *input.CorrectAnswer)
}
if input.AnswerA != nil {
q = q.Set(sqlutils.BuildConditionEquals("answer_a"), *input.AnswerA)
q = q.Set(sql.BuildConditionEquals("answer_a"), *input.AnswerA)
}
if input.AnswerB != nil {
q = q.Set(sqlutils.BuildConditionEquals("answer_b"), *input.AnswerB)
q = q.Set(sql.BuildConditionEquals("answer_b"), *input.AnswerB)
}
if input.AnswerC != nil {
q = q.Set(sqlutils.BuildConditionEquals("answer_c"), *input.AnswerC)
q = q.Set(sql.BuildConditionEquals("answer_c"), *input.AnswerC)
}
if input.AnswerD != nil {
q = q.Set(sqlutils.BuildConditionEquals("answer_d"), *input.AnswerD)
q = q.Set(sql.BuildConditionEquals("answer_d"), *input.AnswerD)
}
if input.QualificationID != nil {
q = q.Set(sqlutils.BuildConditionEquals("qualification_id"), *input.QualificationID)
q = q.Set(sql.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(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.From) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("from", alias)), pg.Array(f.From))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("from", alias)), pg.Array(f.From))
}
if !isZero(f.ContentMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("content", alias)), f.ContentMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("content", alias)), f.ContentMATCH)
}
if !isZero(f.ContentIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("content", alias)), f.ContentIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("content", alias)), f.ContentIEQ)
}
if !isZero(f.QualificationID) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationID))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationID))
}
if !isZero(f.QualificationIDNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("qualification_id", alias)), pg.Array(f.QualificationIDNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.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(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sqlutils.BuildConditionGT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sqlutils.BuildConditionGTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sqlutils.BuildConditionLT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sqlutils.BuildConditionLTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
return q, nil

View File

@ -2,11 +2,10 @@ package models
import (
"context"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"time"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/pkg/errors"
@ -106,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(sqlutils.BuildConditionEquals("display_name"), *input.DisplayName)
q = q.Set(sql.BuildConditionEquals("display_name"), *input.DisplayName)
}
if input.Password != nil {
@ -114,19 +113,19 @@ func (input *UserInput) ApplyUpdate(q *orm.Query) (*orm.Query, error) {
if err != nil {
return q, err
}
q = q.Set(sqlutils.BuildConditionEquals("password"), string(hashedPassword))
q = q.Set(sql.BuildConditionEquals("password"), string(hashedPassword))
}
if input.Email != nil {
q = q.Set(sqlutils.BuildConditionEquals("email"), *input.Email)
q = q.Set(sql.BuildConditionEquals("email"), *input.Email)
}
if input.Role != nil {
q = q.Set(sqlutils.BuildConditionEquals("role"), *input.Role)
q = q.Set(sql.BuildConditionEquals("role"), *input.Role)
}
if input.Activated != nil {
q = q.Set(sqlutils.BuildConditionEquals("activated"), *input.Activated)
q = q.Set(sql.BuildConditionEquals("activated"), *input.Activated)
}
}
@ -149,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(
sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("display_name", alias)),
sql.BuildConditionMatch(sql.AddAliasToColumnName("display_name", alias)),
f.DisplayNameMATCH,
)
}
if !isZero(f.DisplayNameIEQ) {
q = q.WhereOr(
sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("display_name", alias)),
sql.BuildConditionIEQ(sql.AddAliasToColumnName("display_name", alias)),
f.DisplayNameIEQ,
)
}
if !isZero(f.EmailMATCH) {
q = q.WhereOr(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("email", alias)), f.EmailMATCH)
q = q.WhereOr(sql.BuildConditionMatch(sql.AddAliasToColumnName("email", alias)), f.EmailMATCH)
}
if !isZero(f.EmailIEQ) {
q = q.WhereOr(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("email", alias)), f.EmailIEQ)
q = q.WhereOr(sql.BuildConditionIEQ(sql.AddAliasToColumnName("email", alias)), f.EmailIEQ)
}
return q, nil
@ -206,56 +205,56 @@ func (f *UserFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, err
}
if !isZero(f.ID) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.ID))
}
if !isZero(f.IDNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ))
}
if !isZero(f.Activated) {
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("activated", alias)), f.Activated)
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("activated", alias)), f.Activated)
}
if !isZero(f.DisplayName) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayName))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayName))
}
if !isZero(f.DisplayNameNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayNameNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("display_name", alias)), pg.Array(f.DisplayNameNEQ))
}
if !isZero(f.DisplayNameMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("display_name", alias)), f.DisplayNameMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("display_name", alias)), f.DisplayNameMATCH)
}
if !isZero(f.DisplayNameIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("display_name", alias)), f.DisplayNameIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("display_name", alias)), f.DisplayNameIEQ)
}
if !isZero(f.Email) {
q = q.Where(sqlutils.BuildConditionArray(sqlutils.AddAliasToColumnName("email", alias)), pg.Array(f.Email))
q = q.Where(sql.BuildConditionArray(sql.AddAliasToColumnName("email", alias)), pg.Array(f.Email))
}
if !isZero(f.EmailNEQ) {
q = q.Where(sqlutils.BuildConditionNotInArray(sqlutils.AddAliasToColumnName("email", alias)), pg.Array(f.EmailNEQ))
q = q.Where(sql.BuildConditionNotInArray(sql.AddAliasToColumnName("email", alias)), pg.Array(f.EmailNEQ))
}
if !isZero(f.EmailMATCH) {
q = q.Where(sqlutils.BuildConditionMatch(sqlutils.AddAliasToColumnName("email", alias)), f.EmailMATCH)
q = q.Where(sql.BuildConditionMatch(sql.AddAliasToColumnName("email", alias)), f.EmailMATCH)
}
if !isZero(f.EmailIEQ) {
q = q.Where(sqlutils.BuildConditionIEQ(sqlutils.AddAliasToColumnName("email", alias)), f.EmailIEQ)
q = q.Where(sql.BuildConditionIEQ(sql.AddAliasToColumnName("email", alias)), f.EmailIEQ)
}
if !isZero(f.CreatedAt) {
q = q.Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
q = q.Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAt)
}
if !isZero(f.CreatedAtGT) {
q = q.Where(sqlutils.BuildConditionGT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
q = q.Where(sql.BuildConditionGT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT)
}
if !isZero(f.CreatedAtGTE) {
q = q.Where(sqlutils.BuildConditionGTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
q = q.Where(sql.BuildConditionGTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE)
}
if !isZero(f.CreatedAtLT) {
q = q.Where(sqlutils.BuildConditionLT(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
q = q.Where(sql.BuildConditionLT(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT)
}
if !isZero(f.CreatedAtLTE) {
q = q.Where(sqlutils.BuildConditionLTE(sqlutils.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
q = q.Where(sql.BuildConditionLTE(sql.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE)
}
if f.Or != nil {

View File

@ -1,11 +1,9 @@
package db
package postgres
import (
"context"
"os"
"github.com/sirupsen/logrus"
envutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/env"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/envutil"
"github.com/Kichiyaki/go-pg-logrus-query-logger/v10"
"github.com/go-pg/pg/v10"
@ -46,11 +44,11 @@ func Connect(cfg *Config) (*pg.DB, error) {
func prepareOptions() *pg.Options {
return &pg.Options{
User: os.Getenv("DB_USER"),
Password: os.Getenv("DB_PASSWORD"),
Database: os.Getenv("DB_NAME"),
Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"),
PoolSize: envutils.GetenvInt("DB_POOL_SIZE"),
User: envutil.GetenvString("DB_USER"),
Password: envutil.GetenvString("DB_PASSWORD"),
Database: envutil.GetenvString("DB_NAME"),
Addr: envutil.GetenvString("DB_HOST") + ":" + envutil.GetenvString("DB_PORT"),
PoolSize: envutil.GetenvInt("DB_POOL_SIZE"),
}
}

View File

@ -1,4 +1,4 @@
package db
package postgres
import (
"strings"

View File

@ -3,10 +3,10 @@ package repository
import (
"context"
"github.com/pkg/errors"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
"github.com/go-pg/pg/v10"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
@ -69,7 +69,7 @@ func (repo *pgRepository) Delete(ctx context.Context, f *models.ProfessionFilter
Returning("*").
Apply(f.Where).
Delete(); err != nil && err != pg.ErrNoRows {
return nil, errorutils.Wrap(err, messageFailedToDeleteModel)
return nil, errorutil.Wrap(err, messageFailedToDeleteModel)
}
return items, nil
}
@ -92,7 +92,7 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg *profession.FetchConfig
err = query.Select()
}
if err != nil && err != pg.ErrNoRows {
return nil, 0, errorutils.Wrap(err, messageFailedToFetchModel)
return nil, 0, errorutil.Wrap(err, messageFailedToFetchModel)
}
return items, total, nil
}
@ -109,11 +109,11 @@ func (repo *pgRepository) GetAssociatedQualifications(
if err := repo.
Model(&qualificationToProfession).
Context(ctx).
Where(sqlutils.BuildConditionArray("profession_id"), pg.Array(ids)).
Where(sql.BuildConditionArray("profession_id"), pg.Array(ids)).
Relation("Qualification").
Order("qualification.formula ASC", "qualification.code ASC").
Select(); err != nil {
return nil, errorutils.Wrap(err, messageFailedToFetchAssociatedQualifications)
return nil, errorutil.Wrap(err, messageFailedToFetchAssociatedQualifications)
}
for _, record := range qualificationToProfession {
m[record.ProfessionID] = append(m[record.ProfessionID], record.Qualification)
@ -123,7 +123,7 @@ func (repo *pgRepository) GetAssociatedQualifications(
func handleInsertAndUpdateError(err error) error {
if strings.Contains(err.Error(), "name") || strings.Contains(err.Error(), "slug") {
return errorutils.Wrap(err, messageNameIsAlreadyTaken)
return errorutil.Wrap(err, messageNameIsAlreadyTaken)
}
return errorutils.Wrap(err, messageFailedToSaveModel)
return errorutil.Wrap(err, messageFailedToSaveModel)
}

View File

@ -3,10 +3,10 @@ package usecase
import (
"context"
"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"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
type usecase struct {
@ -65,7 +65,7 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg *profession.FetchConfig) ([
Count: true,
}
}
cfg.Sort = sqlutils.SanitizeSorts(cfg.Sort)
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
return ucase.professionRepository.Fetch(ctx, cfg)
}

View File

@ -3,11 +3,10 @@ package repository
import (
"context"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
"github.com/go-pg/pg/v10"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
@ -88,8 +87,8 @@ func (repo *pgRepository) UpdateMany(
if len(input.DissociateProfession) > 0 {
_, err := tx.
Model(&models.QualificationToProfession{}).
Where(sqlutils.BuildConditionArray("profession_id"), pg.Array(input.DissociateProfession)).
Where(sqlutils.BuildConditionArray("qualification_id"), pg.Array(qualificationIDs)).
Where(sql.BuildConditionArray("profession_id"), pg.Array(input.DissociateProfession)).
Where(sql.BuildConditionArray("qualification_id"), pg.Array(qualificationIDs)).
Delete()
if err != nil {
return handleInsertAndUpdateError(err)
@ -116,7 +115,7 @@ func (repo *pgRepository) Delete(ctx context.Context, f *models.QualificationFil
Returning("*").
Apply(f.Where).
Delete(); err != nil && err != pg.ErrNoRows {
return nil, errorutils.Wrap(err, messageFailedToDeleteModel)
return nil, errorutil.Wrap(err, messageFailedToDeleteModel)
}
return items, nil
}
@ -139,7 +138,7 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg *qualification.FetchCon
err = query.Select()
}
if err != nil && err != pg.ErrNoRows {
return nil, 0, errorutils.Wrap(err, messageFailedToFetchModel)
return nil, 0, errorutil.Wrap(err, messageFailedToFetchModel)
}
return items, total, nil
}
@ -149,7 +148,7 @@ func (repo *pgRepository) GetSimilar(ctx context.Context, cfg *qualification.Get
subquery := repo.
Model(&models.QualificationToProfession{}).
Context(ctx).
Where(sqlutils.BuildConditionEquals("qualification_id"), cfg.QualificationID).
Where(sql.BuildConditionEquals("qualification_id"), cfg.QualificationID).
Column("profession_id")
qualificationIDs := []int{}
err = repo.
@ -157,11 +156,11 @@ func (repo *pgRepository) GetSimilar(ctx context.Context, cfg *qualification.Get
Context(ctx).
Column("qualification_id").
With("prof", subquery).
Where(sqlutils.BuildConditionIn("profession_id"), pg.Safe("SELECT profession_id FROM prof")).
Where(sqlutils.BuildConditionNEQ("qualification_id"), cfg.QualificationID).
Where(sql.BuildConditionIn("profession_id"), pg.Safe("SELECT profession_id FROM prof")).
Where(sql.BuildConditionNEQ("qualification_id"), cfg.QualificationID).
Select(&qualificationIDs)
if err != nil {
return nil, 0, errorutils.Wrap(err, messageFailedToFetchModel)
return nil, 0, errorutil.Wrap(err, messageFailedToFetchModel)
}
if len(qualificationIDs) == 0 {
@ -195,9 +194,9 @@ func (repo *pgRepository) associateQualificationWithProfession(tx *pg.Tx, qualif
func handleInsertAndUpdateError(err error) error {
if strings.Contains(err.Error(), "name") {
return errorutils.Wrap(err, messageNameIsAlreadyTaken)
return errorutil.Wrap(err, messageNameIsAlreadyTaken)
} else if strings.Contains(err.Error(), "code") || strings.Contains(err.Error(), "slug") {
return errorutils.Wrap(err, messageCodeIsAlreadyTaken)
return errorutil.Wrap(err, messageCodeIsAlreadyTaken)
}
return errorutils.Wrap(err, messageFailedToSaveModel)
return errorutil.Wrap(err, messageFailedToSaveModel)
}

View File

@ -3,10 +3,10 @@ package usecase
import (
"context"
"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"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
type usecase struct {
@ -65,7 +65,7 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg *qualification.FetchConfig)
Count: true,
}
}
cfg.Sort = sqlutils.SanitizeSorts(cfg.Sort)
cfg.Sort = sql.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 = sqlutils.SanitizeSorts(cfg.Sort)
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
return ucase.qualificationRepository.GetSimilar(ctx, cfg)
}

View File

@ -3,17 +3,16 @@ package repository
import (
"context"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/pkg/sql"
"strings"
"time"
"github.com/zdam-egzamin-zawodowy/backend/pkg/filestorage"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
"github.com/go-pg/pg/v10"
"github.com/zdam-egzamin-zawodowy/backend/internal/db"
"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"
)
type pgRepository struct {
@ -23,7 +22,7 @@ type pgRepository struct {
type PGRepositoryConfig struct {
DB *pg.DB
FileStorage filestorage.FileStorage
FileStorage fstorage.FileStorage
}
func NewPGRepository(cfg *PGRepositoryConfig) (question.Repository, error) {
@ -60,7 +59,7 @@ func (repo *pgRepository) Store(ctx context.Context, input *models.QuestionInput
Set("answer_c_image = ?", item.AnswerCImage).
Set("answer_d_image = ?", item.AnswerDImage).
Update(); err != nil && err != pg.ErrNoRows {
return nil, errorutils.Wrap(err, messageFailedToSaveModel)
return nil, errorutil.Wrap(err, messageFailedToSaveModel)
}
return item, nil
@ -72,7 +71,7 @@ func (repo *pgRepository) UpdateOneByID(ctx context.Context, id int, input *mode
Model(item).
Context(ctx).
Returning("*").
Where(sqlutils.BuildConditionEquals(sqlutils.AddAliasToColumnName("id", "question")), id).
Where(sql.BuildConditionEquals(sql.AddAliasToColumnName("id", "question")), id).
Set("updated_at = ?", time.Now())
if _, err := baseQuery.
@ -107,7 +106,7 @@ func (repo *pgRepository) Delete(ctx context.Context, f *models.QuestionFilter)
Returning("*").
Apply(f.Where).
Delete(); err != nil && err != pg.ErrNoRows {
return nil, errorutils.Wrap(err, messageFailedToDeleteModel)
return nil, errorutil.Wrap(err, messageFailedToDeleteModel)
}
go repo.getAllImagesAndDelete(items)
@ -124,7 +123,7 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg *question.FetchConfig)
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset).
Apply(db.Sort{
Apply(postgres.Sort{
Relationships: map[string]string{
"qualification": "qualification",
},
@ -138,7 +137,7 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg *question.FetchConfig)
err = query.Select()
}
if err != nil && err != pg.ErrNoRows {
return nil, 0, errorutils.Wrap(err, messageFailedToFetchModel)
return nil, 0, errorutil.Wrap(err, messageFailedToFetchModel)
}
return items, total, nil
}
@ -147,23 +146,23 @@ func (repo *pgRepository) GenerateTest(ctx context.Context, cfg *question.Genera
subquery := repo.
Model(&models.Question{}).
Column("id").
Where(sqlutils.BuildConditionArray("qualification_id"), pg.Array(cfg.Qualifications)).
Where(sql.BuildConditionArray("qualification_id"), pg.Array(cfg.Qualifications)).
OrderExpr("random()").
Limit(cfg.Limit)
items := []*models.Question{}
if err := repo.
Model(&items).
Context(ctx).
Where(sqlutils.BuildConditionIn("id"), subquery).
Where(sql.BuildConditionIn("id"), subquery).
Select(); err != nil && err != pg.ErrNoRows {
return nil, errorutils.Wrap(err, messageFailedToFetchModel)
return nil, errorutil.Wrap(err, messageFailedToFetchModel)
}
return items, nil
}
func handleInsertAndUpdateError(err error) error {
if strings.Contains(err.Error(), "questions_from_content_correct_answer_qualification_id_key") {
return errorutils.Wrap(err, messageSimilarRecordExists)
return errorutil.Wrap(err, messageSimilarRecordExists)
}
return errorutils.Wrap(err, messageFailedToSaveModel)
return errorutil.Wrap(err, messageFailedToSaveModel)
}

View File

@ -1,16 +1,16 @@
package repository
import (
"github.com/zdam-egzamin-zawodowy/backend/pkg/fstorage/fstorageutil"
"path/filepath"
"github.com/99designs/gqlgen/graphql"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/pkg/filestorage"
"github.com/zdam-egzamin-zawodowy/backend/pkg/utils"
"github.com/zdam-egzamin-zawodowy/backend/pkg/fstorage"
)
type repository struct {
fileStorage filestorage.FileStorage
fileStorage fstorage.FileStorage
}
func (repo *repository) saveImages(destination *models.Question, input *models.QuestionInput) {
@ -34,7 +34,7 @@ func (repo *repository) saveImages(destination *models.Question, input *models.Q
generated := false
if filenames[index] == "" {
generated = true
filenames[index] = utils.GenerateFilename(filepath.Ext(file.Filename))
filenames[index] = fstorageutil.GenerateFilename(filepath.Ext(file.Filename))
}
err := repo.fileStorage.Put(file.File, filenames[index])
if err != nil && generated {

View File

@ -5,7 +5,7 @@ import (
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/question"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
"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 = sqlutils.SanitizeSorts(cfg.Sort)
cfg.Sort = sql.SanitizeOrders(cfg.Sort)
return ucase.questionRepository.Fetch(ctx, cfg)
}

View File

@ -5,7 +5,7 @@ import (
"github.com/pkg/errors"
"strings"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/errorutil"
"github.com/go-pg/pg/v10"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
@ -68,7 +68,7 @@ func (repo *pgRepository) Delete(ctx context.Context, f *models.UserFilter) ([]*
Returning("*").
Apply(f.Where).
Delete(); err != nil && err != pg.ErrNoRows {
return nil, errorutils.Wrap(err, messageFailedToDeleteModel)
return nil, errorutil.Wrap(err, messageFailedToDeleteModel)
}
return items, nil
}
@ -91,14 +91,14 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg *user.FetchConfig) ([]*
err = query.Select()
}
if err != nil && err != pg.ErrNoRows {
return nil, 0, errorutils.Wrap(err, messageFailedToFetchModel)
return nil, 0, errorutil.Wrap(err, messageFailedToFetchModel)
}
return items, total, nil
}
func handleInsertAndUpdateError(err error) error {
if strings.Contains(err.Error(), "email") {
return errorutils.Wrap(err, messageEmailIsAlreadyTaken)
return errorutil.Wrap(err, messageEmailIsAlreadyTaken)
}
return errorutils.Wrap(err, messageFailedToSaveModel)
return errorutil.Wrap(err, messageFailedToSaveModel)
}

View File

@ -3,11 +3,11 @@ package usecase
import (
"context"
"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"
"github.com/zdam-egzamin-zawodowy/backend/pkg/utils"
sqlutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/sql"
)
type usecase struct {
@ -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 = sqlutils.SanitizeSorts(cfg.Sort)
cfg.Sort = sql.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 !utils.IsEmailValid(*input.Email) {
if !validator.IsEmailValid(*input.Email) {
return errors.New(messageEmailIsInvalid)
}
} else if !opts.acceptNilValues {

18
main.go
View File

@ -7,16 +7,16 @@ import (
"os/signal"
"time"
graphqlhttpdelivery "github.com/zdam-egzamin-zawodowy/backend/internal/graphql/delivery/http"
graphqlhttpdelivery "github.com/zdam-egzamin-zawodowy/backend/internal/graphql/delivery/httpdelivery"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/directive"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/resolvers"
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/internal/auth/jwt"
authusecase "github.com/zdam-egzamin-zawodowy/backend/internal/auth/usecase"
"github.com/zdam-egzamin-zawodowy/backend/internal/db"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/zdam-egzamin-zawodowy/backend/internal/graphql/dataloader"
"github.com/zdam-egzamin-zawodowy/backend/internal/postgres"
professionrepository "github.com/zdam-egzamin-zawodowy/backend/internal/profession/repository"
professionusecase "github.com/zdam-egzamin-zawodowy/backend/internal/profession/usecase"
qualificationrepository "github.com/zdam-egzamin-zawodowy/backend/internal/qualification/repository"
@ -31,9 +31,9 @@ import (
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
"github.com/sirupsen/logrus"
"github.com/zdam-egzamin-zawodowy/backend/pkg/filestorage"
"github.com/zdam-egzamin-zawodowy/backend/pkg/fstorage"
"github.com/zdam-egzamin-zawodowy/backend/pkg/mode"
envutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/env"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/envutil"
)
func init() {
@ -47,12 +47,12 @@ func init() {
}
func main() {
fileStorage := filestorage.New(&filestorage.Config{
BasePath: os.Getenv("FILE_STORAGE_PATH"),
fileStorage := fstorage.New(&fstorage.Config{
BasePath: envutil.GetenvString("FILE_STORAGE_PATH"),
})
dbConn, err := db.Connect(&db.Config{
LogQueries: envutils.GetenvBool("LOG_DB_QUERIES"),
dbConn, err := postgres.Connect(&postgres.Config{
LogQueries: envutil.GetenvBool("LOG_DB_QUERIES"),
})
if err != nil {
logrus.Fatal(errors.Wrap(err, "Couldn't connect to the db"))
@ -88,7 +88,7 @@ func main() {
//usecases
authUsecase, err := authusecase.New(&authusecase.Config{
UserRepository: userRepository,
TokenGenerator: jwt.NewTokenGenerator(os.Getenv("ACCESS_SECRET")),
TokenGenerator: jwt.NewTokenGenerator(envutil.GetenvString("ACCESS_SECRET")),
})
if err != nil {
logrus.Fatal(err)

View File

@ -1,4 +1,4 @@
package filestorage
package fstorage
import "os"

View File

@ -1,4 +1,4 @@
package filestorage
package fstorage
import (
"io"

View File

@ -1,4 +1,4 @@
package utils
package fstorageutil
import (
"strings"

View File

@ -1,4 +1,4 @@
package filestorage
package fstorage
import "io"

View File

@ -1,7 +1,7 @@
package mode
import (
"os"
"github.com/zdam-egzamin-zawodowy/backend/pkg/util/envutil"
)
const (
@ -14,7 +14,7 @@ const (
var mode = DevelopmentMode
func init() {
Set(os.Getenv(EnvKey))
Set(envutil.GetenvString(EnvKey))
}
func Set(value string) {

16
pkg/sql/alias.go Normal file
View File

@ -0,0 +1,16 @@
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,23 +1,9 @@
package sqlutils
package sql
import (
"fmt"
"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 + `"`
}
func BuildConditionEquals(column string) string {
return column + " = ?"
}

View File

@ -1,4 +1,4 @@
package sqlutils
package sql
import (
"regexp"
@ -11,39 +11,39 @@ var (
sortRegex = regexp.MustCompile(`^[\p{L}\_\.]+$`)
)
func SanitizeSort(sort string) string {
splitted := strings.Split(strings.TrimSpace(sort), " ")
length := len(splitted)
func SanitizeOrder(order string) string {
parts := strings.Split(strings.TrimSpace(order), " ")
length := len(parts)
if length != 2 || !sortRegex.Match([]byte(splitted[0])) {
if length != 2 || !sortRegex.Match([]byte(parts[0])) {
return ""
}
table := ""
column := splitted[0]
if strings.Contains(splitted[0], ".") {
columnAndTable := strings.Split(splitted[0], ".")
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(splitted[1]) == "DESC" {
if strings.ToUpper(parts[1]) == "DESC" {
direction = "DESC"
}
return strings.ToLower(table+underscore(column)) + " " + direction
}
func SanitizeSorts(sorts []string) []string {
sanitizedSorts := []string{}
for _, sort := range sorts {
sanitized := SanitizeSort(sort)
func SanitizeOrders(orders []string) []string {
var sanitizedOrders []string
for _, sort := range orders {
sanitized := SanitizeOrder(sort)
if sanitized != "" {
sanitizedSorts = append(sanitizedSorts, sanitized)
sanitizedOrders = append(sanitizedOrders, sanitized)
}
}
return sanitizedSorts
return sanitizedOrders
}
type buffer struct {

View File

@ -1,4 +1,4 @@
package envutils
package envutil
import (
"os"
@ -6,7 +6,7 @@ import (
)
func GetenvInt(key string) int {
str := os.Getenv(key)
str := GetenvString(key)
if str == "" {
return 0
}
@ -18,9 +18,13 @@ func GetenvInt(key string) int {
}
func GetenvBool(key string) bool {
str := os.Getenv(key)
str := GetenvString(key)
if str == "" {
return false
}
return str == "true" || str == "1"
}
func GetenvString(key string) string {
return os.Getenv(key)
}

View File

@ -1,4 +1,4 @@
package errorutils
package errorutil
import (
"github.com/pkg/errors"

View File

@ -1,4 +1,4 @@
package utils
package safeptr
func SafeBoolPointer(v *bool, def bool) bool {
if v == nil {
@ -13,3 +13,10 @@ func SafeIntPointer(s *int, def int) int {
}
return *s
}
func SafeStringPointer(s *string, def string) string {
if s == nil {
return def
}
return *s
}

View File

@ -1,4 +1,4 @@
package utils
package validator
import (
"net"