package mysql import ( richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "git.gocasts.ir/ebhomengo/niki/purchaseapp/entity" "git.gocasts.ir/ebhomengo/niki/repository/mysql" "git.gocasts.ir/ebhomengo/niki/types" ) type DB struct { conn *mysql.DB } func New(db *mysql.DB) *DB { return &DB{conn: db} } func (d *DB) CreateOrder(order entity.Order, orderItems []entity.OrderItem) (types.ID, error) { const Op = "repository.mysql.order.createorder" 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, shipping_id," + " payment_method, payment_status, process_status," + " total_amount, total_discount) values (?, ?, ?, ?, ?, ?, ?, ?);" res, oErr := tx.Exec(query, order.UserID, order.Address, 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 = "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 }