github.com/timoth-y/kicksware-api/order-service@v0.0.0-20201002192818-87b546a7ae5a/usecase/storage/postgres/repository.go (about)

     1  package postgres
     2  
     3  import (
     4  	"context"
     5  
     6  	sqb "github.com/Masterminds/squirrel"
     7  	_ "github.com/jackc/pgx/v4/stdlib"
     8  	"github.com/jmoiron/sqlx"
     9  	"github.com/pkg/errors"
    10  	"github.com/timoth-y/kicksware-api/service-common/util"
    11  
    12  	"github.com/timoth-y/kicksware-api/service-common/core/meta"
    13  	"github.com/timoth-y/kicksware-api/order-service/core/model"
    14  	"github.com/timoth-y/kicksware-api/order-service/core/repo"
    15  	"github.com/timoth-y/kicksware-api/order-service/env"
    16  	"github.com/timoth-y/kicksware-api/order-service/usecase/business"
    17  )
    18  
    19  type repository struct {
    20  	db *sqlx.DB
    21  	table string
    22  }
    23  
    24  func NewRepository(config env.DataStoreConfig) (repo.OrderRepository, error) {
    25  	db, err := newPostgresClient(config.URL)
    26  	if err != nil {
    27  		return nil, errors.Wrap(err, "repository.NewRepository")
    28  	}
    29  	repo := &repository{
    30  		db: db,
    31  		table:  config.Collection,
    32  	}
    33  	return repo, nil
    34  }
    35  
    36  func newPostgresClient(url string) (*sqlx.DB, error) {
    37  	ctx, cancel := context.WithCancel(context.Background())
    38  	defer cancel()
    39  	db, err := sqlx.ConnectContext(ctx,"pgx", url)
    40  	if err != nil {
    41  		return nil, errors.Wrap(err, "repository.newPostgresClient")
    42  	}
    43  	if err = db.PingContext(ctx); err != nil {
    44  		return nil, errors.Wrap(err, "repository.newPostgresClient")
    45  	}
    46  	return db, nil
    47  }
    48  
    49  func (r *repository) FetchOne(code string, params *meta.RequestParams) (*model.Order, error) {
    50  	ctx, cancel := context.WithCancel(context.Background())
    51  	defer cancel()
    52  	order := &model.Order{}
    53  	cmd, args, err := sqb.Select("*").From(r.table).
    54  		Where(sqb.Eq{"UniqueID":code}).PlaceholderFormat(sqb.Dollar).ToSql()
    55  	if err != nil {
    56  		return nil, errors.Wrap(err, "repository.Order.FetchOne")
    57  	}
    58  	if err = r.db.GetContext(ctx, order, cmd, args); err != nil {
    59  		return nil, errors.Wrap(err, "repository.Order.FetchOne")
    60  	}
    61  	return order, nil
    62  }
    63  
    64  func (r *repository) Fetch(codes []string, params *meta.RequestParams) ([]*model.Order, error) {
    65  	ctx, cancel := context.WithCancel(context.Background())
    66  	defer cancel()
    67  	orders := make([]*model.Order, 0)
    68  	cmd, args, err := sqb.Select("*").From(r.table).
    69  		Where(sqb.Eq{"UniqueID":codes}).PlaceholderFormat(sqb.Dollar).ToSql()
    70  	if err != nil {
    71  		return nil, errors.Wrap(err, "repository.Order.Fetch")
    72  	}
    73  	if err = r.db.SelectContext(ctx, &orders, cmd, args); err != nil {
    74  		return nil, errors.Wrap(err, "repository.Order.Fetch")
    75  	}
    76  	if orders == nil || len(orders) == 0 {
    77  		return nil, errors.Wrap(business.ErrOrderNotFound, "repository.Order.Fetch")
    78  	}
    79  	return orders, nil
    80  }
    81  
    82  func (r *repository) FetchAll(params *meta.RequestParams) ([]*model.Order, error) {
    83  	ctx, cancel := context.WithCancel(context.Background())
    84  	defer cancel()
    85  	orders := make([]*model.Order, 0)
    86  	cmd, args, err := sqb.Select("*").From(r.table).PlaceholderFormat(sqb.Dollar).ToSql(); if err != nil {
    87  		return nil, errors.Wrap(err, "repository.Order.FetchAll")
    88  	}
    89  	if err = r.db.SelectContext(ctx, &orders, cmd, args); err != nil {
    90  		return nil, errors.Wrap(err, "repository.Order.FetchAll")
    91  	}
    92  	if orders == nil || len(orders) == 0 {
    93  		return nil, errors.Wrap(business.ErrOrderNotFound, "repository.Order.FetchAll")
    94  	}
    95  	return orders, nil
    96  }
    97  
    98  func (r *repository) FetchQuery(query meta.RequestQuery, params *meta.RequestParams) ([]*model.Order, error) {
    99  	ctx, cancel := context.WithCancel(context.Background())
   100  	defer cancel()
   101  	orders := make([]*model.Order, 0)
   102  	where, err := query.ToSql(); if err != nil {
   103  		return nil, err
   104  	}
   105  	cmd, args, err := sqb.Select("*").From(r.table).
   106  		Where(where).PlaceholderFormat(sqb.Dollar).ToSql()
   107  	if err != nil {
   108  		return nil, errors.Wrap(err, "repository.Order.FetchQuery")
   109  	}
   110  	if err = r.db.SelectContext(ctx, &orders, cmd, args); err != nil {
   111  		return nil, errors.Wrap(err, "repository.Order.FetchQuery")
   112  	}
   113  	if orders == nil || len(orders) == 0 {
   114  		return nil, errors.Wrap(business.ErrOrderNotFound, "repository.Order.FetchQuery")
   115  	}
   116  	return orders, nil
   117  }
   118  
   119  func (r *repository) StoreOne(order *model.Order) error {
   120  	ctx, cancel := context.WithCancel(context.Background())
   121  	defer cancel()
   122  	cmd, args, err := sqb.Insert(r.table).SetMap(util.ToMap(order)).PlaceholderFormat(sqb.Dollar).ToSql()
   123  	if err != nil {
   124  		return errors.Wrap(err, "repository.Order.Store")
   125  	}
   126  	if _, err := r.db.ExecContext(ctx, cmd, args); err != nil {
   127  		return errors.Wrap(err, "repository.Order.Store")
   128  	}
   129  	return nil
   130  }
   131  
   132  func (r *repository) Modify(order *model.Order) error {
   133  	ctx, cancel := context.WithCancel(context.Background())
   134  	defer cancel()
   135  	cmd, args, err := sqb.Update(r.table).SetMap(util.ToMap(order)).
   136  		Where(sqb.Eq{"UniqueID": order.UniqueID}).PlaceholderFormat(sqb.Dollar).ToSql()
   137  	if err != nil {
   138  		return errors.Wrap(err, "repository.Order.Modify")
   139  	}
   140  	if _, err := r.db.ExecContext(ctx, cmd, args); err != nil {
   141  		return errors.Wrap(err, "repository.Order.Modify")
   142  	}
   143  	return nil
   144  }
   145  
   146  func (r *repository) Remove(code string) error {
   147  	ctx, cancel := context.WithCancel(context.Background())
   148  	defer cancel()
   149  	cmd, args, err := sqb.Delete(r.table).Where(sqb.Eq{"UniqueId":code}).PlaceholderFormat(sqb.Dollar).ToSql()
   150  	if err != nil {
   151  		return errors.Wrap(err, "repository.SneakerProduct.Remove")
   152  	}
   153  	if _, err := r.db.ExecContext(ctx, cmd, args); err != nil {
   154  		return errors.Wrap(err, "repository.SneakerProduct.Remove")
   155  	}
   156  	return nil
   157  }
   158  
   159  func (r *repository) Count(query meta.RequestQuery, params *meta.RequestParams) (count int, err error) {
   160  	ctx, cancel := context.WithCancel(context.Background())
   161  	defer cancel()
   162  	where, err := query.ToSql(); if err != nil {
   163  		return 0, err
   164  	}
   165  	cmd, args, err := sqb.Select("COUNT(*)").From(r.table).
   166  		Where(where).PlaceholderFormat(sqb.Dollar).ToSql()
   167  	if err != nil {
   168  		return 0, errors.Wrap(err, "repository.Order.FetchQuery")
   169  	}
   170  	if err = r.db.SelectContext(ctx, &count, cmd, args); err != nil {
   171  		return 0, errors.Wrap(err, "repository.Order.FetchQuery")
   172  	}
   173  	return
   174  }
   175  
   176  func (r *repository) CountAll() (count int, err error) {
   177  	ctx, cancel := context.WithCancel(context.Background())
   178  	defer cancel()
   179  	cmd, args, err := sqb.Select("COUNT(*)").From(r.table).
   180  		PlaceholderFormat(sqb.Dollar).ToSql()
   181  	if err != nil {
   182  		return 0, errors.Wrap(err, "repository.Order.FetchQuery")
   183  	}
   184  	if err = r.db.SelectContext(ctx, &count, cmd, args); err != nil {
   185  		return 0, errors.Wrap(err, "repository.Order.FetchQuery")
   186  	}
   187  	return
   188  }