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  }