github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/mysql/stat_notifier.go (about) 1 package mysql 2 3 import ( 4 "context" 5 "database/sql" 6 7 "github.com/morikuni/failure" 8 "github.com/volatiletech/sqlboiler/v4/boil" 9 10 "github.com/oinume/lekcije/backend/domain/repository" 11 "github.com/oinume/lekcije/backend/errors" 12 "github.com/oinume/lekcije/backend/model2" 13 ) 14 15 type statNotifierRepository struct { 16 db *sql.DB 17 } 18 19 func NewStatNotifierRepository(db *sql.DB) repository.StatNotifier { 20 return &statNotifierRepository{db: db} 21 } 22 23 func (r *statNotifierRepository) CreateOrUpdate(ctx context.Context, statNotifier *model2.StatNotifier) error { 24 err := transaction(ctx, r.db, func(exec repository.Executor) error { 25 _, err := model2.FindStatNotifier(ctx, exec, statNotifier.Datetime, statNotifier.Interval) 26 if err != nil { 27 if !errors.IsNotFound(err) { 28 return err 29 } 30 return statNotifier.Insert(ctx, exec, boil.Infer()) 31 } 32 _, err = statNotifier.Update(ctx, exec, boil.Infer()) 33 if err != nil { 34 return err 35 } 36 return nil 37 }) 38 if err != nil { 39 return failure.Wrap(err, failure.Message("statNotifierRepository.CreateOrUpdate failed")) 40 } 41 return nil 42 }