/
repository.go
100 lines (87 loc) · 2.95 KB
/
repository.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package cart
import (
"context"
"encoding/json"
"time"
"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/ext"
"github.com/opentracing/opentracing-go/log"
"gorm.io/gorm"
)
// Repository is the interface that describes a cart repository
// object.
type Repository interface {
SaveCartItem(ctx context.Context, item *CartItem) error
GetUserCartItems(ctx context.Context, userId string) ([]CartItem, error)
BulkRemoveItemsFromUserCart(ctx context.Context, userId string, itemIds []string) error
}
// CartRepo is the default implementation for Repository interface.
type CartRepo struct {
orm *gorm.DB
tracer opentracing.Tracer
}
// NewRepository returns a new cart repository object.
func NewRepository(orm *gorm.DB, tracer opentracing.Tracer) *CartRepo {
return &CartRepo{
orm: orm,
tracer: tracer,
}
}
func (r *CartRepo) setPostGresComponentTags(span opentracing.Span, tableName string) {
ext.DBInstance.Set(span, tableName)
ext.DBType.Set(span, "postgres")
ext.SpanKindRPCClient.Set(span)
}
// SaveCartItem saves a cart item to the database.
func (r *CartRepo) SaveCartItem(ctx context.Context, item *CartItem) error {
item.TimeAdded = time.Now()
item.LastUpdated = time.Now()
span, _ := opentracing.StartSpanFromContextWithTracer(ctx, r.tracer, "SaveCartItem")
defer span.Finish()
r.setPostGresComponentTags(span, "cart")
span.LogFields(log.Object("param.item", toJSON(item)))
tx := r.orm.Save(item)
if tx.Error != nil {
ext.Error.Set(span, true)
span.LogFields(log.Error(tx.Error), log.Event("gorm.db.Save"))
return tx.Error
}
return nil
}
// GetUserCartItems retrieves cart items from the database, filtering by userId.
func (r *CartRepo) GetUserCartItems(ctx context.Context, userId string) ([]CartItem, error) {
span, _ := opentracing.StartSpanFromContextWithTracer(ctx, r.tracer, "GetUserCartItems")
defer span.Finish()
r.setPostGresComponentTags(span, "cart")
span.SetTag("param.userId", userId)
var cartItems []CartItem
result := r.orm.Where("user_id = ?", userId).Find(&cartItems)
if result.Error != nil {
ext.Error.Set(span, true)
span.LogFields(log.Error(result.Error), log.Event("gorm.db.Where.Find"))
return nil, result.Error
}
return cartItems, nil
}
// BulkRemoveItemsFromUserCart removes multiple items from user by ids.
func (r *CartRepo) BulkRemoveItemsFromUserCart(ctx context.Context, userId string, itemIds []string) error {
span, _ := opentracing.StartSpanFromContextWithTracer(ctx, r.tracer, "BulkRemoveItemsFromUserCart")
defer span.Finish()
r.setPostGresComponentTags(span, "cart")
span.SetTag("param.userId", userId)
span.SetTag("param.itemIds", itemIds)
result := r.orm.Where("user_id = ?", userId).Delete(&CartItem{}, itemIds)
if result.Error != nil {
ext.Error.Set(span, true)
span.LogFields(
log.Error(result.Error),
log.Event("gorm.db.Delete"),
)
return result.Error
}
return nil
}
func toJSON(i interface{}) string {
iJSON, _ := json.Marshal(i)
return string(iJSON)
}