Skip to content
Snippets Groups Projects
Unverified Commit 6af2b72e authored by meskio's avatar meskio :tent:
Browse files

Add arrived and collected status for oders

parent ee516091
Branches
No related tags found
No related merge requests found
......@@ -67,8 +67,12 @@ func Init(dbPath string, signKey string, mail *Mail, r *mux.Router) error {
r.HandleFunc("/order/{id:[0-9]+}", a.authNum(a.GetOrder)).Methods("GET")
r.HandleFunc("/order/{id:[0-9]+}", a.authNumRole(a.UpdateOrder)).Methods("PUT")
r.HandleFunc("/order/{id:[0-9]+}", a.authNumRole(a.DeleteOrder)).Methods("DELETE")
r.HandleFunc("/order/{id:[0-9]+}/arrive", a.authNumRole(a.ArrivedOrder)).Methods("PUT")
r.HandleFunc("/order/{id:[0-9]+}/collected", a.authNum(a.CollectOrder)).Methods("PUT")
r.HandleFunc("/order/active", a.auth(a.ListActiveOrders)).Methods("GET")
r.HandleFunc("/order/picks", a.authOrderNum(a.ListOrderPicks)).Methods("GET")
r.HandleFunc("/order/unarrived", a.authNum(a.ListOrderUnarrived)).Methods("GET")
r.HandleFunc("/order/collectable", a.authNum(a.ListOrderCollectable)).Methods("GET")
r.HandleFunc("/order/{id:[0-9]+}/purchase", a.authNum(a.AddOrderPurchase)).Methods("POST")
return nil
}
......@@ -9,6 +9,10 @@ import (
"gorm.io/gorm/clause"
)
const (
updateOrderDuration = 5 * 24 * time.Hour
)
type Order struct {
gorm.Model
Name string `json:"name"`
......@@ -17,6 +21,7 @@ type Order struct {
Member *Member `json:"member,omitempty" gorm:"foreignKey:MemberNum;references:Num"`
Deadline time.Time `json:"deadline"`
Active bool `json:"active" gorm:"index"`
Arrived *time.Time `json:"arrived,omitempty"`
Products []OrderProduct `json:"products"`
Transactions []Transaction `json:"transactions" gorm:"foreignKey:OrderID"`
......@@ -60,6 +65,29 @@ func (d *DB) ListOrderPicks(num int) (orders []Order, err error) {
return
}
func (d *DB) ListOrderUnarrived(memberNum int) (orders []Order, err error) {
err = d.db.Preload(clause.Associations).
Preload("Transactions.OrderPurchase").
Where("member = ?", memberNum).
Where("deadline >= ?", time.Now().Add(-updateOrderDuration)).
Where("active is false").
Where("arrived is null").
Find(&orders).Error
return
}
func (d *DB) ListOrderCollectable(memberNum int) (transactions []Transaction, err error) {
err = d.db.Preload("OrderPurchase.OrderProduct.Product").
Preload("Order").
Joins("left join orders on transactions.order_id = orders.id").
Where("transactions.member = ?", memberNum).
Where("collected is null or collected = false").
Where("orders.Arrived is not null").
Find(&transactions).
Error
return
}
func (d *DB) GetOrder(memberNum int, id int) (order Order, transaction Transaction, err error) {
err = d.db.Preload(clause.Associations).
Preload("Products.Product").
......@@ -96,7 +124,7 @@ func (d *DB) UpdateOrder(memberNum int, id int, order *Order) error {
if memberNum != 0 && dbOrder.MemberNum != memberNum {
return ErrorInvalidRequest
}
if dbOrder.Deadline.Add(5 * 24 * time.Hour).Before(time.Now()) {
if dbOrder.Deadline.Add(updateOrderDuration).Before(time.Now()) {
return ErrorInvalidRequest
}
for _, p := range order.Products {
......@@ -193,6 +221,7 @@ func updateOrderTransaction(tx *gorm.DB, id int, total int, order *Order) error
return err
}
order.Active = true
order.Arrived = nil
order.TransactionID = nil
} else {
totalDiff := total - transaction.Total
......@@ -434,3 +463,35 @@ func (d *DB) DeactivateOrders() []Order {
}
return deactivatedOrders
}
func (d *DB) ArrivedOrder(memberNum int, id int) error {
dbOrder, _, err := d.GetOrder(0, id)
if err != nil {
return err
}
if memberNum != 0 && dbOrder.MemberNum != memberNum {
return ErrorInvalidRequest
}
if dbOrder.Deadline.Add(updateOrderDuration).Before(time.Now()) {
return ErrorInvalidRequest
}
if dbOrder.Active {
return ErrorInvalidRequest
}
return d.db.Model(&Order{}).Where("id = ?", id).Update("arrived", time.Now()).Error
}
func (d *DB) CollectOrder(memberNum int, id int) error {
dbOrder, t, err := d.GetOrder(memberNum, id)
if err != nil {
return err
}
if dbOrder.Active || dbOrder.Arrived == nil {
return ErrorInvalidRequest
}
return d.db.Model(&Transaction{}).Where("id = ?", t.ID).Update("collected", true).Error
}
......@@ -32,6 +32,7 @@ type Transaction struct {
Order *Order `json:"order,omitempty" gorm:"constraint:OnDelete:CASCADE"`
OrderID *uint `json:"-"`
Refund *Order `json:"refund,omitempty" gorm:"foreignKey:TransactionID"`
Collected *bool `json:"collected,omitempty"`
}
type Topup struct {
......
......@@ -73,6 +73,40 @@ func (a *api) ListOrderPicks(num int, w http.ResponseWriter, req *http.Request)
}
}
func (a *api) ListOrderUnarrived(num int, w http.ResponseWriter, req *http.Request) {
orders, err := a.db.ListOrderUnarrived(num)
if err != nil {
log.Printf("Can't list unarrived orders: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
err = json.NewEncoder(w).Encode(orders)
if err != nil {
log.Printf("Can't encode unarrived orders: %v", err)
w.WriteHeader(http.StatusInternalServerError)
}
}
func (a *api) ListOrderCollectable(num int, w http.ResponseWriter, req *http.Request) {
transactions, err := a.db.ListOrderCollectable(num)
if err != nil {
log.Printf("Can't list collectable orders: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
err = json.NewEncoder(w).Encode(transactions)
if err != nil {
log.Printf("Can't encode collectable orders: %v", err)
w.WriteHeader(http.StatusInternalServerError)
}
}
func (a *api) GetOrder(num int, w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
id, _ := strconv.Atoi(vars["id"])
......@@ -230,3 +264,50 @@ func (a *api) AddOrderPurchase(num int, w http.ResponseWriter, req *http.Request
w.WriteHeader(http.StatusInternalServerError)
}
}
func (a *api) ArrivedOrder(num int, role string, w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
id, _ := strconv.Atoi(vars["id"])
if role == "admin" {
num = 0
}
err := a.db.ArrivedOrder(num, id)
if err != nil {
if errors.Is(err, db.ErrorNotFound) {
w.WriteHeader(http.StatusNotFound)
return
}
if errors.Is(err, db.ErrorInvalidRequest) {
w.WriteHeader(http.StatusUnauthorized)
return
}
log.Printf("Can't arrive order %s: %v", vars["id"], err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusAccepted)
}
func (a *api) CollectOrder(num int, w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
id, _ := strconv.Atoi(vars["id"])
err := a.db.CollectOrder(num, id)
if err != nil {
if errors.Is(err, db.ErrorNotFound) {
w.WriteHeader(http.StatusNotFound)
return
}
if errors.Is(err, db.ErrorInvalidRequest) {
w.WriteHeader(http.StatusUnauthorized)
return
}
log.Printf("Can't collect order %s: %v", vars["id"], err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusAccepted)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment