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 ¬ificationTimeSpanRepository{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 }