forked from ebhomengo/niki
93 lines
2.4 KiB
Go
93 lines
2.4 KiB
Go
package mysql
|
|
|
|
import (
|
|
entity "git.gocasts.ir/ebhomengo/niki/domain/order/entity"
|
|
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
|
"git.gocasts.ir/ebhomengo/niki/types"
|
|
)
|
|
|
|
func (d *DB) CreateOrder(order entity.Order, orderItems []entity.OrderItem) (types.ID, error) {
|
|
|
|
const Op = "domain.repository.mysql.order.create-order"
|
|
tx, err := d.conn.Conn().Begin()
|
|
|
|
if err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
defer tx.Rollback()
|
|
|
|
query := "insert into orders(user_id, address_id, shipping_id," +
|
|
" payment_method, payment_status, process_status," +
|
|
" total_amount, total_discount) values (?, ?, ?, ?, ?, ?, ?, ?);"
|
|
res, oErr := tx.Exec(query, order.UserID, order.AddressID, order.ShippingID,
|
|
order.PaymentMethod, order.PaymentStatus, order.ProcessStatus,
|
|
order.TotalAmount, order.TotalDiscount)
|
|
|
|
if oErr != nil {
|
|
return 0, richerror.New(Op).WithErr(oErr)
|
|
}
|
|
orderID, insertIDErr := res.LastInsertId()
|
|
if insertIDErr != nil {
|
|
return 0, richerror.New(Op).WithErr(insertIDErr)
|
|
}
|
|
|
|
orderItemQuery := "insert into order_items(order_id, product_id, quantity, price, price_with_discount) values(?, ?, ?, ?, ?);"
|
|
for _, item := range orderItems {
|
|
_, iErr := tx.Exec(orderItemQuery, orderID, item.ProductID, item.Quantity, item.Price, item.PriceWithDiscount)
|
|
if iErr != nil {
|
|
return 0, richerror.New(Op).WithErr(iErr)
|
|
}
|
|
}
|
|
|
|
if err := tx.Commit(); err != nil {
|
|
return 0, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
return types.ID(orderID), nil
|
|
}
|
|
|
|
func (d *DB) UpdateOrderProcessStatus(orderID types.ID, status string) (bool, error) {
|
|
const Op = "domain.repository.mysql.order.update-order-process-status"
|
|
_, err := d.conn.Conn().Exec("update orders set process_status=? where id=?;", status, orderID)
|
|
|
|
if err != nil {
|
|
return false, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
func (d *DB) GetShipping() ([]entity.Shipping, error) {
|
|
const Op = "domain.repository.mysql.order.get-shipping"
|
|
rows, err := d.conn.Conn().Query("select * from shippings where is_active=1")
|
|
|
|
if err != nil {
|
|
return []entity.Shipping{}, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
var shippings []entity.Shipping
|
|
|
|
for rows.Next() {
|
|
var s entity.Shipping
|
|
|
|
err := rows.Scan(
|
|
&s.ID,
|
|
&s.Name,
|
|
&s.Price,
|
|
&s.IsActive,
|
|
)
|
|
if err != nil {
|
|
return nil, richerror.New(Op).WithErr(err)
|
|
}
|
|
|
|
shippings = append(shippings, s)
|
|
}
|
|
|
|
return shippings, nil
|
|
|
|
}
|