From d05ea66f4bbcf0cc5c8908f3435c68de1b070fa1 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Sat, 12 Oct 2024 02:52:22 +0300 Subject: Начальная версия MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/service/crud/crud.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 pkg/service/crud/crud.go (limited to 'pkg/service/crud') diff --git a/pkg/service/crud/crud.go b/pkg/service/crud/crud.go new file mode 100644 index 0000000..799eacb --- /dev/null +++ b/pkg/service/crud/crud.go @@ -0,0 +1,87 @@ +package crud + +import ( + "context" + "errors" + + "github.com/uptrace/bun" + "github.com/uptrace/bun/driver/pgdriver" +) + +var ErrRecordAlreadyExists = errors.New("record already exists") + +type Service[T any] struct { + db *bun.DB +} + +func NewService[T any](db *bun.DB) *Service[T] { + return &Service[T]{ + db: db, + } +} + +func (s *Service[T]) Insert(ctx context.Context, model *T) error { + if _, err := s.db.NewInsert().Model(model).Returning("*").Exec(ctx); err != nil { + pqErr := pgdriver.Error{} + if errors.As(err, &pqErr) { + if pqErr.Field('C') == "23505" { + return ErrRecordAlreadyExists + } + } + + return err + } + + return nil +} + +func (s *Service[T]) UpdatePk(ctx context.Context, model *T, columns []string) error { + if _, err := s.db.NewUpdate().Model(model).WherePK(columns...).Column(columns...).Exec(ctx); err != nil { + pqErr := pgdriver.Error{} + if errors.As(err, &pqErr) { + if pqErr.Field('C') == "23505" { + return ErrRecordAlreadyExists + } + } + + return err + } + + return nil +} + +//nolint:revive +func (s *Service[T]) Update(ctx context.Context, model *T, columns []string, query string, args ...any) error { + if _, err := s.db.NewUpdate().Model(model).Where(query, args...).Column(columns...).Exec(ctx); err != nil { + pqErr := pgdriver.Error{} + if errors.As(err, &pqErr) { + if pqErr.Field('C') == "23505" { + return ErrRecordAlreadyExists + } + } + + return err + } + + return nil +} + +func (s *Service[T]) FindOne(ctx context.Context, query string, args ...any) (*T, error) { + m := new(T) + + return m, s.db.NewSelect().Model(m).Where(query, args...).Scan(ctx, m) +} + +//nolint:revive +func (s *Service[T]) Find(ctx context.Context, query string, args ...any) ([]T, int, error) { + m := make([]T, 0) + c, err := s.db.NewSelect().Model(m).Where(query, args...).ScanAndCount(ctx, &m) + + return m, c, err +} + +func (s *Service[T]) Delete(ctx context.Context, query string, args ...any) error { + _, err := s.db.NewDelete().Model((*T)(nil)).Where(query, args...).Exec(ctx) + + return err +} -- cgit v1.2.3