github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/mysql/teacher.go (about) 1 package mysql 2 3 import ( 4 "context" 5 "database/sql" 6 "fmt" 7 8 "github.com/morikuni/failure" 9 "github.com/volatiletech/sqlboiler/v4/boil" 10 "github.com/volatiletech/sqlboiler/v4/queries" 11 "github.com/volatiletech/sqlboiler/v4/queries/qm" 12 13 "github.com/oinume/lekcije/backend/domain/repository" 14 "github.com/oinume/lekcije/backend/model2" 15 ) 16 17 type teacherRepository struct { 18 db *sql.DB 19 } 20 21 func NewTeacherRepository(db *sql.DB) repository.Teacher { 22 return &teacherRepository{ 23 db: db, 24 } 25 } 26 27 func (r *teacherRepository) Create(ctx context.Context, teacher *model2.Teacher) error { 28 return teacher.Insert(ctx, r.db, boil.Infer()) 29 } 30 31 func (r *teacherRepository) CreateOrUpdate(ctx context.Context, teacher *model2.Teacher) error { 32 return teacher.Upsert(ctx, r.db, boil.Infer(), boil.Infer()) 33 } 34 35 func (r *teacherRepository) FindByID(ctx context.Context, id uint) (*model2.Teacher, error) { 36 return model2.Teachers(qm.WhereIn("id = ?", id)).One(ctx, r.db) 37 } 38 39 func (r *teacherRepository) FindByIDs(ctx context.Context, ids []uint) ([]*model2.Teacher, error) { 40 return model2.Teachers(qm.WhereIn("id IN ?", fromUintSlice(ids)...)).All(ctx, r.db) 41 } 42 43 func (r *teacherRepository) IncrementFetchErrorCount(ctx context.Context, id uint, value int) error { 44 sql := `UPDATE teacher SET fetch_error_count = fetch_error_count + ?, updated_at = NOW() WHERE id = ?` 45 if _, err := queries.Raw(sql, value, id).ExecContext(ctx, r.db); err != nil { 46 return failure.Wrap(err, failure.Context{"id": fmt.Sprint(id)}) 47 } 48 return nil 49 } 50 51 func fromUintSlice(values []uint) []interface{} { 52 ret := make([]interface{}, len(values)) 53 for i, value := range values { 54 ret[i] = interface{}(value) 55 } 56 return ret 57 }