From ced92b68577f5fcfe11ea13568969204b20c0034 Mon Sep 17 00:00:00 2001 From: Ivan Zakrevsky Date: Tue, 28 May 2024 21:58:39 +0300 Subject: [PATCH] WIP: SpecialistRepository --- .../internal/domain/specialist/specialist.go | 8 +-- .../queries/specialist_insert_query.go | 64 ++++++++++++++++++- .../specialist/specialist_repository.go | 43 +++++++++++++ 3 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 grade/internal/infrastructure/repositories/specialist/specialist_repository.go diff --git a/grade/internal/domain/specialist/specialist.go b/grade/internal/domain/specialist/specialist.go index fe8b5269..8f5fb966 100644 --- a/grade/internal/domain/specialist/specialist.go +++ b/grade/internal/domain/specialist/specialist.go @@ -9,7 +9,7 @@ import ( "github.com/emacsway/grade/grade/internal/domain/artifact" "github.com/emacsway/grade/grade/internal/domain/endorser" "github.com/emacsway/grade/grade/internal/domain/grade" - member "github.com/emacsway/grade/grade/internal/domain/member/values" + memberVal "github.com/emacsway/grade/grade/internal/domain/member/values" "github.com/emacsway/grade/grade/internal/domain/seedwork/aggregate" "github.com/emacsway/grade/grade/internal/domain/specialist/assignment" assignmentVal "github.com/emacsway/grade/grade/internal/domain/specialist/assignment/values" @@ -40,7 +40,7 @@ var ( // FIXME: Move this constructor to tenant aggregate func NewSpecialist( - id member.MemberId, + id memberVal.MemberId, createdAt time.Time, ) (*Specialist, error) { zeroGrade, _ := grade.DefaultConstructor(0) @@ -52,7 +52,7 @@ func NewSpecialist( } type Specialist struct { - id member.MemberId + id memberVal.MemberId grade grade.Grade receivedEndorsements []endorsement.Endorsement assignments []assignment.Assignment @@ -191,7 +191,7 @@ func (s Specialist) Export(ex SpecialistExporterSetter) { } type SpecialistExporterSetter interface { - SetId(member.MemberId) + SetId(memberVal.MemberId) SetGrade(grade.Grade) AddEndorsement(endorsement.Endorsement) AddAssignment(assignment.Assignment) diff --git a/grade/internal/infrastructure/repositories/specialist/queries/specialist_insert_query.go b/grade/internal/infrastructure/repositories/specialist/queries/specialist_insert_query.go index 06d3dd39..ce0a2681 100644 --- a/grade/internal/infrastructure/repositories/specialist/queries/specialist_insert_query.go +++ b/grade/internal/infrastructure/repositories/specialist/queries/specialist_insert_query.go @@ -1,5 +1,67 @@ package queries +import ( + "time" + + "github.com/emacsway/grade/grade/internal/domain/grade" + memberVal "github.com/emacsway/grade/grade/internal/domain/member/values" + "github.com/emacsway/grade/grade/internal/domain/seedwork/exporters" + "github.com/emacsway/grade/grade/internal/domain/specialist/assignment" + "github.com/emacsway/grade/grade/internal/domain/specialist/endorsement" + tenantVal "github.com/emacsway/grade/grade/internal/domain/tenant/values" + "github.com/emacsway/grade/grade/internal/infrastructure/seedwork/session" +) + type SpecialistInsertQuery struct { - // params [9]any + params [9]any +} + +func (q SpecialistInsertQuery) sql() string { + return ` + INSERT INTO specialist ( + tenant_id, member_id, grade, created_at, version + ) VALUES ($1, $2, $3, $4, $5) + ON CONFLICT DO NOTHING` +} + +func (q *SpecialistInsertQuery) SetId(val memberVal.MemberId) { + val.Export(q) +} + +func (q *SpecialistInsertQuery) SetTenantId(val tenantVal.TenantId) { + var v exporters.UintExporter + val.Export(&v) + q.params[0] = v +} + +func (q *SpecialistInsertQuery) SetMemberId(val memberVal.InternalMemberId) { + var v exporters.UintExporter + val.Export(&v) + q.params[1] = v +} + +func (q *SpecialistInsertQuery) SetGrade(val grade.Grade) { + var v exporters.Uint8Exporter + val.Export(&v) + q.params[2] = v +} + +func (q *SpecialistInsertQuery) AddEndorsement(endorsement.Endorsement) { + +} + +func (q *SpecialistInsertQuery) AddAssignment(assignment.Assignment) { + +} + +func (q *SpecialistInsertQuery) SetCreatedAt(val time.Time) { + q.params[3] = val +} + +func (q *SpecialistInsertQuery) SetVersion(val uint) { + q.params[4] = val +} + +func (q *SpecialistInsertQuery) Evaluate(s session.DbSessionExecutor) (session.Result, error) { + return s.Exec(q.sql(), q.params[:]...) } diff --git a/grade/internal/infrastructure/repositories/specialist/specialist_repository.go b/grade/internal/infrastructure/repositories/specialist/specialist_repository.go new file mode 100644 index 00000000..7dddaa43 --- /dev/null +++ b/grade/internal/infrastructure/repositories/specialist/specialist_repository.go @@ -0,0 +1,43 @@ +package specialist + +import ( + "fmt" + + "github.com/emacsway/grade/grade/internal/domain/specialist" + "github.com/emacsway/grade/grade/internal/infrastructure/repositories/specialist/queries" + "github.com/emacsway/grade/grade/internal/infrastructure/seedwork/session" +) + +func NewSpecialistRepository(currentSession session.DbSession) *SpecialistRepository { + return &SpecialistRepository{ + session: currentSession, + } +} + +type SpecialistRepository struct { + session session.DbSession +} + +func (r SpecialistRepository) Insert(agg *specialist.Specialist) error { + q := queries.SpecialistInsertQuery{} + agg.Export(&q) + result, err := q.Evaluate(r.session) + if err != nil { + return err + } + affectedRows, err := result.RowsAffected() + if err != nil { + return err + } + if affectedRows != 1 { + return fmt.Errorf("wrong rows affected: %d", affectedRows) + } + return nil +} + +/* +func (r *SpecialistRepository) Get(id memberVal.MemberId) (*specialist.Specialist, error) { + q := queries.SpecialistGetQuery{Id: id} + return q.Get(r.session) +} +*/