github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/mysql/notification_time_span.go (about)

     1  package mysql
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  
     7  	"github.com/volatiletech/sqlboiler/v4/boil"
     8  	"github.com/volatiletech/sqlboiler/v4/queries/qm"
     9  	"go.opentelemetry.io/otel"
    10  	"go.opentelemetry.io/otel/attribute"
    11  
    12  	"github.com/oinume/lekcije/backend/domain/config"
    13  	"github.com/oinume/lekcije/backend/domain/repository"
    14  	"github.com/oinume/lekcije/backend/errors"
    15  	"github.com/oinume/lekcije/backend/model"
    16  	"github.com/oinume/lekcije/backend/model2"
    17  )
    18  
    19  type notificationTimeSpanRepository struct {
    20  	db *sql.DB
    21  }
    22  
    23  func NewNotificationTimeSpanRepository(db *sql.DB) repository.NotificationTimeSpan {
    24  	return &notificationTimeSpanRepository{db: db}
    25  }
    26  
    27  func (r *notificationTimeSpanRepository) FindByUserID(ctx context.Context, userID uint) ([]*model2.NotificationTimeSpan, error) {
    28  	ctx, span := otel.Tracer(config.DefaultTracerName).Start(ctx, "NotificationTimeSpanService.FindByUserID")
    29  	span.SetAttributes(attribute.KeyValue{
    30  		Key:   "userID",
    31  		Value: attribute.Int64Value(int64(userID)),
    32  	})
    33  	defer span.End()
    34  
    35  	timeSpans, err := model2.NotificationTimeSpans(qm.Where("user_id = ?", userID)).All(ctx, r.db)
    36  	if err != nil {
    37  		return nil, errors.NewInternalError(
    38  			errors.WithError(err),
    39  			errors.WithMessage("FindByUserID select failed"),
    40  			errors.WithResource(errors.NewResource((&model.NotificationTimeSpan{}).TableName(), "userID", userID)),
    41  		)
    42  	}
    43  	return timeSpans, nil
    44  }
    45  
    46  func (r *notificationTimeSpanRepository) UpdateAll(ctx context.Context, userID uint, timeSpans []*model2.NotificationTimeSpan) error {
    47  	for _, ts := range timeSpans {
    48  		if userID != ts.UserID {
    49  			return errors.NewInvalidArgumentError(
    50  				errors.WithMessage("Given userID and userID of timeSpans must be same"),
    51  			)
    52  		}
    53  	}
    54  	if err := repository.Transaction(ctx, r.db, func(exec repository.Executor) error {
    55  		if _, err := model2.NotificationTimeSpans(qm.Where("user_id = ?", userID)).DeleteAll(ctx, exec); err != nil {
    56  			return errors.NewInternalError(
    57  				errors.WithError(err),
    58  				errors.WithMessage("UpdateAll delete failed"),
    59  				errors.WithResource(errors.NewResource("notification_time_spans", "userID", userID)),
    60  			)
    61  		}
    62  		for _, ts := range timeSpans {
    63  			if err := ts.Insert(ctx, exec, boil.Infer()); err != nil {
    64  				return errors.NewInternalError(
    65  					errors.WithError(err),
    66  					errors.WithMessage("UpdateAll insert failed"),
    67  					errors.WithResource(errors.NewResource("notification_time_spans", "userID", userID)),
    68  				)
    69  			}
    70  		}
    71  		return nil
    72  	}); err != nil {
    73  		return errors.NewInternalError(
    74  			errors.WithError(err),
    75  			errors.WithMessage("UpdateAll commit failed"),
    76  			errors.WithResource(errors.NewResource("notification_time_spans", "userID", userID)),
    77  		)
    78  	}
    79  	return nil
    80  }