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  }