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 }