[WIP]
This commit is contained in:
parent
9d20460f16
commit
9186d45e2f
21
internal/postgres/answer.go
Normal file
21
internal/postgres/answer.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package postgres
|
||||
|
||||
type Answer string
|
||||
|
||||
const (
|
||||
AnswerA Answer = "a"
|
||||
AnswerB Answer = "b"
|
||||
AnswerC Answer = "c"
|
||||
AnswerD Answer = "d"
|
||||
)
|
||||
|
||||
func (answer Answer) IsValid() bool {
|
||||
switch answer {
|
||||
case AnswerA,
|
||||
AnswerB,
|
||||
AnswerC,
|
||||
AnswerD:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
9
internal/postgres/helpers.go
Normal file
9
internal/postgres/helpers.go
Normal file
|
@ -0,0 +1,9 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
)
|
||||
|
||||
func isZero(v interface{}) bool {
|
||||
return reflect.ValueOf(v).IsZero()
|
||||
}
|
125
internal/postgres/profession.go
Normal file
125
internal/postgres/profession.go
Normal file
|
@ -0,0 +1,125 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/Kichiyaki/gopgutil/v10"
|
||||
"github.com/zdam-egzamin-zawodowy/backend/internal"
|
||||
"time"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
"github.com/gosimple/slug"
|
||||
)
|
||||
|
||||
var _ pg.BeforeInsertHook = (*Profession)(nil)
|
||||
var _ pg.BeforeUpdateHook = (*Profession)(nil)
|
||||
|
||||
type Profession struct {
|
||||
tableName struct{} `pg:"alias:profession"`
|
||||
|
||||
ID int
|
||||
Slug string `pg:",unique"`
|
||||
Name string `pg:",unique"`
|
||||
Description string
|
||||
CreatedAt time.Time `pg:"default:now()"`
|
||||
}
|
||||
|
||||
func (p *Profession) BeforeInsert(ctx context.Context) (context.Context, error) {
|
||||
p.CreatedAt = time.Now()
|
||||
p.Slug = slug.Make(p.Name)
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
func (p *Profession) BeforeUpdate(ctx context.Context) (context.Context, error) {
|
||||
if p.Name != "" {
|
||||
p.Slug = slug.Make(p.Name)
|
||||
}
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
func applyProfessionInputUpdates(input internal.ProfessionInput) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if input.Name != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("name"), *input.Name)
|
||||
}
|
||||
|
||||
if input.Description != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("description"), *input.Description)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
|
||||
func applyProfessionFilter(f internal.ProfessionFilter, alias string) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if !isZero(f.ID) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID))
|
||||
}
|
||||
if !isZero(f.IDNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.Slug) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("slug", alias), pg.Array(f.Slug))
|
||||
}
|
||||
if !isZero(f.SlugNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("slug", alias), pg.Array(f.SlugNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.Name) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.Name))
|
||||
}
|
||||
if !isZero(f.NameNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.NameNEQ))
|
||||
}
|
||||
if !isZero(f.NameMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameMATCH)
|
||||
}
|
||||
if !isZero(f.NameIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.DescriptionMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("description", alias), f.DescriptionMATCH)
|
||||
}
|
||||
if !isZero(f.DescriptionIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("description", alias), f.DescriptionIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.QualificationID) {
|
||||
sliceLength := len(f.QualificationID)
|
||||
subquery := q.
|
||||
New().
|
||||
Model(&QualificationToProfession{}).
|
||||
ColumnExpr(gopgutil.BuildCountColumnExpr("qualification_id", "count")).
|
||||
Column("profession_id").
|
||||
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(gopgutil.BuildConditionGTE("count"), sliceLength)
|
||||
}
|
||||
|
||||
if !isZero(f.CreatedAt) {
|
||||
q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt)
|
||||
}
|
||||
if !isZero(f.CreatedAtGT) {
|
||||
q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGT)
|
||||
}
|
||||
if !isZero(f.CreatedAtGTE) {
|
||||
q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGTE)
|
||||
}
|
||||
if !isZero(f.CreatedAtLT) {
|
||||
q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLT)
|
||||
}
|
||||
if !isZero(f.CreatedAtLTE) {
|
||||
q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
186
internal/postgres/qualification.go
Normal file
186
internal/postgres/qualification.go
Normal file
|
@ -0,0 +1,186 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/Kichiyaki/gopgutil/v10"
|
||||
"github.com/zdam-egzamin-zawodowy/backend/internal"
|
||||
"time"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
"github.com/gosimple/slug"
|
||||
)
|
||||
|
||||
var _ pg.BeforeInsertHook = (*Qualification)(nil)
|
||||
var _ pg.BeforeUpdateHook = (*Qualification)(nil)
|
||||
|
||||
type Qualification struct {
|
||||
tableName struct{} `pg:"alias:qualification"`
|
||||
|
||||
ID int
|
||||
Slug string `pg:",unique"`
|
||||
Name string `pg:",unique:group_1"`
|
||||
Code string `pg:",unique:group_1"`
|
||||
Formula string
|
||||
Description string
|
||||
CreatedAt time.Time `pg:"default:now()"`
|
||||
}
|
||||
|
||||
func (q *Qualification) BeforeInsert(ctx context.Context) (context.Context, error) {
|
||||
q.CreatedAt = time.Now()
|
||||
q.Slug = slug.Make(q.Code)
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
func (q *Qualification) BeforeUpdate(ctx context.Context) (context.Context, error) {
|
||||
if q.Code != "" {
|
||||
q.Slug = slug.Make(q.Code)
|
||||
}
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
type QualificationToProfession struct {
|
||||
ID int
|
||||
QualificationID int `pg:"on_delete:CASCADE,unique:group_1"`
|
||||
Qualification *Qualification `pg:"rel:has-one"`
|
||||
ProfessionID int `pg:"on_delete:CASCADE,unique:group_1"`
|
||||
Profession *Profession `pg:"rel:has-one"`
|
||||
}
|
||||
|
||||
func applyQualificationInputUpdates(input internal.QualificationInput) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if input.Name != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("name"), *input.Name)
|
||||
}
|
||||
if input.Code != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("code"), *input.Code)
|
||||
}
|
||||
if input.Formula != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("formula"), *input.Formula)
|
||||
}
|
||||
if input.Description != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("description"), *input.Description)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
|
||||
func applyQualificationFilterOr(f internal.QualificationFilterOr, alias string) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) {
|
||||
if !isZero(f.NameMATCH) {
|
||||
q = q.WhereOr(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameMATCH)
|
||||
}
|
||||
if !isZero(f.NameIEQ) {
|
||||
q = q.WhereOr(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.CodeMATCH) {
|
||||
q = q.WhereOr(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("code", alias), f.CodeMATCH)
|
||||
}
|
||||
if !isZero(f.CodeIEQ) {
|
||||
q = q.WhereOr(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("code", alias), f.CodeIEQ)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
})
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
|
||||
func applyQualificationFilter(f internal.QualificationFilter, alias string) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if !isZero(f.ID) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID))
|
||||
}
|
||||
if !isZero(f.IDNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.Slug) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("slug", alias), pg.Array(f.Slug))
|
||||
}
|
||||
if !isZero(f.SlugNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("slug", alias), pg.Array(f.SlugNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.Name) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.Name))
|
||||
}
|
||||
if !isZero(f.NameNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.NameNEQ))
|
||||
}
|
||||
if !isZero(f.NameMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameMATCH)
|
||||
}
|
||||
if !isZero(f.NameIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.Code) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("code", alias), pg.Array(f.Code))
|
||||
}
|
||||
if !isZero(f.CodeNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("code", alias), pg.Array(f.CodeNEQ))
|
||||
}
|
||||
if !isZero(f.CodeMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("code", alias), f.CodeMATCH)
|
||||
}
|
||||
if !isZero(f.CodeIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("code", alias), f.CodeIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.Formula) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("formula", alias), pg.Array(f.Formula))
|
||||
}
|
||||
if !isZero(f.FormulaNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("formula", alias), pg.Array(f.FormulaNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.DescriptionMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("description", alias), f.DescriptionMATCH)
|
||||
}
|
||||
if !isZero(f.DescriptionIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("description", alias), f.DescriptionIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.ProfessionID) {
|
||||
sliceLength := len(f.ProfessionID)
|
||||
subquery := q.
|
||||
New().
|
||||
Model(&QualificationToProfession{}).
|
||||
ColumnExpr(gopgutil.BuildCountColumnExpr("profession_id", "count")).
|
||||
Column("qualification_id").
|
||||
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(gopgutil.BuildConditionGTE("count"), sliceLength)
|
||||
}
|
||||
|
||||
if !isZero(f.CreatedAt) {
|
||||
q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt)
|
||||
}
|
||||
if !isZero(f.CreatedAtGT) {
|
||||
q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGT)
|
||||
}
|
||||
if !isZero(f.CreatedAtGTE) {
|
||||
q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGTE)
|
||||
}
|
||||
if !isZero(f.CreatedAtLT) {
|
||||
q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLT)
|
||||
}
|
||||
if !isZero(f.CreatedAtLTE) {
|
||||
q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE)
|
||||
}
|
||||
|
||||
q = q.Apply(applyQualificationFilterOr(f.Or, alias))
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
141
internal/postgres/question.go
Normal file
141
internal/postgres/question.go
Normal file
|
@ -0,0 +1,141 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/Kichiyaki/gopgutil/v10"
|
||||
"github.com/zdam-egzamin-zawodowy/backend/internal"
|
||||
"time"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
)
|
||||
|
||||
var _ pg.BeforeInsertHook = (*Question)(nil)
|
||||
|
||||
type Question struct {
|
||||
tableName struct{} `pg:"alias:question"`
|
||||
|
||||
ID int
|
||||
From string `pg:",unique:group_1"`
|
||||
Content string `pg:",unique:group_1,notnull"`
|
||||
Explanation string
|
||||
CorrectAnswer Answer `pg:",unique:group_1,notnull"`
|
||||
Image string
|
||||
AnswerA string `pg:"answer_a"`
|
||||
AnswerAImage string `pg:"answer_a_image"`
|
||||
AnswerB string `pg:"answer_b" `
|
||||
AnswerBImage string `pg:"answer_b_image"`
|
||||
AnswerC string `pg:"answer_c" `
|
||||
AnswerCImage string `pg:"answer_c_image"`
|
||||
AnswerD string `pg:"answer_d" `
|
||||
AnswerDImage string `pg:"answer_d_image"`
|
||||
QualificationID int `pg:",unique:group_1,on_delete:CASCADE"`
|
||||
Qualification *Qualification `pg:"rel:has-one"`
|
||||
CreatedAt time.Time `pg:"default:now()"`
|
||||
UpdatedAt time.Time `pg:"default:now()"`
|
||||
}
|
||||
|
||||
func (q *Question) BeforeInsert(ctx context.Context) (context.Context, error) {
|
||||
q.CreatedAt = time.Now()
|
||||
q.UpdatedAt = time.Now()
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
func applyQuestionInputUpdates(input internal.QuestionInput) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if input.Content != nil {
|
||||
q = q.Set(
|
||||
gopgutil.BuildConditionEquals("content"),
|
||||
*input.Content,
|
||||
)
|
||||
}
|
||||
|
||||
if input.From != nil {
|
||||
q = q.Set(
|
||||
gopgutil.BuildConditionEquals("?"),
|
||||
pg.Ident("from"),
|
||||
*input.From,
|
||||
)
|
||||
}
|
||||
|
||||
if input.Explanation != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("explanation"), *input.Explanation)
|
||||
}
|
||||
|
||||
if input.CorrectAnswer != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("correct_answer"), *input.CorrectAnswer)
|
||||
}
|
||||
|
||||
if input.AnswerA != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("answer_a"), *input.AnswerA)
|
||||
}
|
||||
|
||||
if input.AnswerB != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("answer_b"), *input.AnswerB)
|
||||
}
|
||||
|
||||
if input.AnswerC != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("answer_c"), *input.AnswerC)
|
||||
}
|
||||
|
||||
if input.AnswerD != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("answer_d"), *input.AnswerD)
|
||||
}
|
||||
|
||||
if input.QualificationID != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("qualification_id"), *input.QualificationID)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
|
||||
func applyQuestionFilter(f internal.QuestionFilter, alias string) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if !isZero(f.ID) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID))
|
||||
}
|
||||
if !isZero(f.IDNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.From) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("from", alias), pg.Array(f.From))
|
||||
}
|
||||
|
||||
if !isZero(f.ContentMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("content", alias), f.ContentMATCH)
|
||||
}
|
||||
if !isZero(f.ContentIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("content", alias), f.ContentIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.QualificationID) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("qualification_id", alias), pg.Array(f.QualificationID))
|
||||
}
|
||||
if !isZero(f.QualificationIDNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("qualification_id", alias), pg.Array(f.QualificationIDNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.CreatedAt) {
|
||||
q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt)
|
||||
}
|
||||
if !isZero(f.CreatedAtGT) {
|
||||
q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGT)
|
||||
}
|
||||
if !isZero(f.CreatedAtGTE) {
|
||||
q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGTE)
|
||||
}
|
||||
if !isZero(f.CreatedAtLT) {
|
||||
q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLT)
|
||||
}
|
||||
if !isZero(f.CreatedAtLTE) {
|
||||
q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE)
|
||||
}
|
||||
|
||||
q = q.Apply(applyQualificationFilter(f.QualificationFilter, "qualification"))
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
21
internal/postgres/role.go
Normal file
21
internal/postgres/role.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package postgres
|
||||
|
||||
type Role string
|
||||
|
||||
const (
|
||||
RoleAdmin Role = "admin"
|
||||
RoleUser Role = "user"
|
||||
)
|
||||
|
||||
func (role Role) IsValid() bool {
|
||||
switch role {
|
||||
case RoleAdmin,
|
||||
RoleUser:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (role Role) String() string {
|
||||
return string(role)
|
||||
}
|
161
internal/postgres/user.go
Normal file
161
internal/postgres/user.go
Normal file
|
@ -0,0 +1,161 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/Kichiyaki/gopgutil/v10"
|
||||
"github.com/zdam-egzamin-zawodowy/backend/internal"
|
||||
"time"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
var _ pg.BeforeInsertHook = (*User)(nil)
|
||||
|
||||
type User struct {
|
||||
tableName struct{} `pg:"alias:user"`
|
||||
|
||||
ID int `json:"id" pg:",pk" xml:"id" gqlgen:"id"`
|
||||
DisplayName string `json:"displayName" pg:",use_zero,notnull" xml:"displayName" gqlgen:"displayName"`
|
||||
Password string `json:"-" gqlgen:"-" xml:"password"`
|
||||
Email string `json:"email" pg:",unique" xml:"email" gqlgen:"email"`
|
||||
CreatedAt time.Time `json:"createdAt" pg:"default:now()" xml:"createdAt" gqlgen:"createdAt"`
|
||||
Role Role `json:"role" xml:"role" gqlgen:"role"`
|
||||
Activated *bool `json:"activated" pg:"default:false,use_zero" xml:"activated" gqlgen:"activated"`
|
||||
}
|
||||
|
||||
func (u *User) BeforeInsert(ctx context.Context) (context.Context, error) {
|
||||
u.CreatedAt = time.Now()
|
||||
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
u.Password = string(hashedPassword)
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
func applyUserInputUpdates(input internal.UserInput) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if input.DisplayName != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("display_name"), *input.DisplayName)
|
||||
}
|
||||
|
||||
if input.Password != nil {
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(*input.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return q, err
|
||||
}
|
||||
q = q.Set(gopgutil.BuildConditionEquals("password"), string(hashedPassword))
|
||||
}
|
||||
|
||||
if input.Email != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("email"), *input.Email)
|
||||
}
|
||||
|
||||
if input.Role != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("role"), *input.Role)
|
||||
}
|
||||
|
||||
if input.Activated != nil {
|
||||
q = q.Set(gopgutil.BuildConditionEquals("activated"), *input.Activated)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
|
||||
func applyUserFilterOr(f internal.UserFilterOr, alias string) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) {
|
||||
if !isZero(f.DisplayNameMATCH) {
|
||||
q = q.WhereOr(
|
||||
gopgutil.BuildConditionMatch("?"),
|
||||
gopgutil.AddAliasToColumnName("display_name", alias),
|
||||
f.DisplayNameMATCH,
|
||||
)
|
||||
}
|
||||
if !isZero(f.DisplayNameIEQ) {
|
||||
q = q.WhereOr(
|
||||
gopgutil.BuildConditionIEQ("?"),
|
||||
gopgutil.AddAliasToColumnName("display_name", alias),
|
||||
f.DisplayNameIEQ,
|
||||
)
|
||||
}
|
||||
|
||||
if !isZero(f.EmailMATCH) {
|
||||
q = q.WhereOr(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("email", alias), f.EmailMATCH)
|
||||
}
|
||||
if !isZero(f.EmailIEQ) {
|
||||
q = q.WhereOr(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("email", alias), f.EmailIEQ)
|
||||
}
|
||||
|
||||
return q, nil
|
||||
})
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
|
||||
func applyUserFilter(f internal.UserFilter, alias string) func(q *orm.Query) (*orm.Query, error) {
|
||||
return func(q *orm.Query) (*orm.Query, error) {
|
||||
if !isZero(f.ID) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID))
|
||||
}
|
||||
if !isZero(f.IDNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ))
|
||||
}
|
||||
|
||||
if !isZero(f.Activated) {
|
||||
q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("activated", alias), f.Activated)
|
||||
}
|
||||
|
||||
if !isZero(f.DisplayName) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("display_name", alias), pg.Array(f.DisplayName))
|
||||
}
|
||||
if !isZero(f.DisplayNameNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("display_name", alias), pg.Array(f.DisplayNameNEQ))
|
||||
}
|
||||
if !isZero(f.DisplayNameMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("display_name", alias), f.DisplayNameMATCH)
|
||||
}
|
||||
if !isZero(f.DisplayNameIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("display_name", alias), f.DisplayNameIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.Email) {
|
||||
q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("email", alias), pg.Array(f.Email))
|
||||
}
|
||||
if !isZero(f.EmailNEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("email", alias), pg.Array(f.EmailNEQ))
|
||||
}
|
||||
if !isZero(f.EmailMATCH) {
|
||||
q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("email", alias), f.EmailMATCH)
|
||||
}
|
||||
if !isZero(f.EmailIEQ) {
|
||||
q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("email", alias), f.EmailIEQ)
|
||||
}
|
||||
|
||||
if !isZero(f.CreatedAt) {
|
||||
q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt)
|
||||
}
|
||||
if !isZero(f.CreatedAtGT) {
|
||||
q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGT)
|
||||
}
|
||||
if !isZero(f.CreatedAtGTE) {
|
||||
q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGTE)
|
||||
}
|
||||
if !isZero(f.CreatedAtLT) {
|
||||
q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLT)
|
||||
}
|
||||
if !isZero(f.CreatedAtLTE) {
|
||||
q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE)
|
||||
}
|
||||
|
||||
q = q.Apply(applyUserFilterOr(f.Or, alias))
|
||||
|
||||
return q, nil
|
||||
}
|
||||
}
|
|
@ -203,9 +203,9 @@ type QuestionFilter struct {
|
|||
ContentMATCH string `json:"contentMATCH" xml:"contentMATCH" gqlgen:"contentMATCH"`
|
||||
ContentIEQ string `json:"contentIEQ" xml:"contentIEQ" gqlgen:"contentIEQ"`
|
||||
|
||||
QualificationID []int `json:"qualificationID" xml:"qualificationID" gqlgen:"qualificationID"`
|
||||
QualificationIDNEQ []int `json:"qualificationIDNEQ" xml:"qualificationIDNEQ" gqlgen:"qualificationIDNEQ"`
|
||||
QualificationFilter *QualificationFilter `json:"qualificationFilter" xml:"qualificationFilter" gqlgen:"qualificationFilter"`
|
||||
QualificationID []int `json:"qualificationID" xml:"qualificationID" gqlgen:"qualificationID"`
|
||||
QualificationIDNEQ []int `json:"qualificationIDNEQ" xml:"qualificationIDNEQ" gqlgen:"qualificationIDNEQ"`
|
||||
QualificationFilter QualificationFilter `json:"qualificationFilter" xml:"qualificationFilter" gqlgen:"qualificationFilter"`
|
||||
|
||||
CreatedAt time.Time `gqlgen:"createdAt" json:"createdAt" xml:"createdAt"`
|
||||
CreatedAtGT time.Time `gqlgen:"createdAtGT" json:"createdAtGT" xml:"createdAtGT"`
|
||||
|
@ -245,11 +245,9 @@ func (f *QuestionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query,
|
|||
}
|
||||
|
||||
var err error
|
||||
if f.QualificationFilter != nil {
|
||||
q, err = f.QualificationFilter.WhereWithAlias(q.Relation("Qualification._"), "qualification")
|
||||
if err != nil {
|
||||
return q, err
|
||||
}
|
||||
q, err = f.QualificationFilter.WhereWithAlias(q.Relation("Qualification._"), "qualification")
|
||||
if err != nil {
|
||||
return q, err
|
||||
}
|
||||
|
||||
if !isZero(f.CreatedAt) {
|
||||
|
|
|
@ -194,7 +194,7 @@ type UserFilter struct {
|
|||
CreatedAtLT time.Time `json:"createdAtLT" xml:"createdAtLT" gqlgen:"createdAtLT"`
|
||||
CreatedAtLTE time.Time `json:"createdAtLTE" xml:"createdAtLTE" gqlgen:"createdAtLTE"`
|
||||
|
||||
Or *UserFilterOr
|
||||
Or UserFilterOr
|
||||
}
|
||||
|
||||
func (f *UserFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) {
|
||||
|
@ -255,9 +255,7 @@ func (f *UserFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, err
|
|||
q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE)
|
||||
}
|
||||
|
||||
if f.Or != nil {
|
||||
q = f.Or.WhereWithAlias(q, alias)
|
||||
}
|
||||
q = f.Or.WhereWithAlias(q, alias)
|
||||
|
||||
return q, nil
|
||||
}
|
||||
|
|
Reference in New Issue
Block a user