/
guest_cart.go
142 lines (132 loc) · 4.08 KB
/
guest_cart.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package dao
import (
"database/sql"
"e-food/api/models"
"errors"
"fmt"
"github.com/google/martian/log"
"strings"
)
type GuestCartHandler interface {
GetGuestCart(db *sql.DB, sessionId string) (models.CartPreview, error)
AddItemToGuestCart(db *sql.DB, prodHandler ProductHandler, sessionId string, totalQty, productId int64) (*models.CartSuccessResponse, error)
DeleteExistingGuestCartItemIfAny(db *sql.DB, sessionId string, productId int64) error
RemoveItemFromGuestCart(db *sql.DB, productId int64, sessionId string) error
InsertItemInGuestCart(db *sql.DB, totalQty, productId int64, sessionId string) error
EmptyGuestCartItem(db *sql.DB, sessionId string) error
}
type guestCart struct{}
func CreateGuestCartHandler() GuestCartHandler {
return &guestCart{}
}
func (g *guestCart) GetGuestCart(db *sql.DB, sessionId string) (models.CartPreview, error) {
q := fmt.Sprintf("SELECT p.productId,p.name,p.currency, gc.totalQty,p.unitPrice, p.imageUrl FROM guest_cart_item gc INNER JOIN product p where gc.productId = p.productId and gc.sessionId='%s'", sessionId)
rows, err := db.Query(q)
if err != nil {
log.Errorf(err.Error())
return nil, err
}
defer rows.Close()
if err := rows.Err(); err != nil {
log.Errorf(err.Error())
return nil, err
}
var cart models.CartPreview
for rows.Next() {
item := models.CartItem{}
_ = rows.Scan(
&item.ProductID,
&item.ProductName,
&item.Currency,
&item.Quantity,
&item.UnitPrice,
&item.ImageURL,
)
cart = append(cart, &item)
}
return cart, nil
}
func (g *guestCart) AddItemToGuestCart(db *sql.DB, prodHandler ProductHandler, sessionId string, totalQty, productId int64) (*models.CartSuccessResponse, error) {
msg := "Item added to cart"
unitsInStock, err := prodHandler.GetUnitsInStock(db, productId)
if err != nil {
return nil, err
}
if unitsInStock < 1 {
return nil, errors.New("item out of stock")
}
if totalQty > unitsInStock {
totalQty = unitsInStock
msg = "Reached max stock quantity"
}
err = g.DeleteExistingGuestCartItemIfAny(db, sessionId, productId)
if err != nil {
return nil, err
}
err = g.InsertItemInGuestCart(db, totalQty, productId, sessionId)
if err != nil {
return nil, err
}
var retVal = &models.CartSuccessResponse{
Success: true,
Message: msg,
QtyAdded: totalQty,
}
return retVal, nil
}
func (g *guestCart) DeleteExistingGuestCartItemIfAny(db *sql.DB, sessionId string, productId int64) error {
res, err := db.Exec("DELETE from guest_cart_item where productId = ? and sessionId = ?", productId, sessionId)
if err != nil && !strings.Contains(err.Error(), "no row") {
log.Errorf(err.Error())
return nil
}
deletedRow, err := res.RowsAffected()
if err != nil {
return err
}
if deletedRow == 1 || deletedRow == 0 {
return nil
} else {
return errors.New("found more than 1 item to delete")
}
}
func (g *guestCart) RemoveItemFromGuestCart(db *sql.DB, productId int64, sessionId string) error {
err := g.DeleteExistingGuestCartItemIfAny(db, sessionId, productId)
if err != nil {
return err
}
return nil
}
//func GetItemQtyInGuestCart(db *sql.DB, sessionId string, productId int64) (int64, error) {
// addedQty := 0
// row := db.QueryRow("SELECT totalQty from guest_cart_item where productId = ? and sessionId = ?", productId, sessionId)
// err := row.Scan(&addedQty)
// if err != nil && !strings.Contains(err.Error(), "no row") {
// log.Errorf(err.Error())
// return 0, err
// }
// return int64(addedQty), nil
//}
func (g *guestCart) InsertItemInGuestCart(db *sql.DB, totalQty, productId int64, sessionId string) error {
res, err := db.Exec("INSERT INTO guest_cart_item (sessionId,totalQty,productId) VALUES (?, ?, ?)", sessionId, totalQty, productId)
if err != nil {
return err
}
insertedRow, err := res.RowsAffected()
if err != nil {
return err
}
if insertedRow == 1 {
return nil
} else {
return errors.New("cart insert transaction failed")
}
}
func (g *guestCart) EmptyGuestCartItem(db *sql.DB, sessionId string) error {
_, err := db.Exec("DELETE from guest_cart_item where sessionId = ? ", sessionId)
if err != nil {
return err
}
//fmt.Println(row.RowsAffected())
return nil
}