diff --git a/api/api.go b/api/api.go index 88bb569945f8b99c714e4c1fc4e430a1cae20b50..39fafa779cc91518ea14d8347756e3dbcd113674 100644 --- a/api/api.go +++ b/api/api.go @@ -61,6 +61,7 @@ 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.DeleteOrder)).Methods("DELETE") r.HandleFunc("/order/active", a.auth(a.ListActiveOrders)).Methods("GET") + r.HandleFunc("/order/picks", a.authNum(a.ListOrderPicks)).Methods("GET") r.HandleFunc("/order/{id:[0-9]+}/purchase", a.authNum(a.AddOrderPurchase)).Methods("POST") return nil } diff --git a/api/db/order.go b/api/db/order.go index 72936c00c646f7169624c1adafe17fdcf8ba971d..015b1408f254762257091ea6f8fe652dd5dd1492 100644 --- a/api/db/order.go +++ b/api/db/order.go @@ -43,6 +43,15 @@ func (d *DB) ListOrders(active bool) (orders []Order, err error) { return } +func (d *DB) ListOrderPicks(num int) (orders []Order, err error) { + err = d.db.Select("*, member = ? as member_selected", num). + Table("(?) as orders", d.db.Model(&Order{}).Order("deadline desc")). + Group("name").Order("member_selected desc, deadline desc").Limit(15). + Preload(clause.Associations). + Find(&orders).Error + return +} + func (d *DB) GetOrder(memberNum int, id int) (order Order, transaction Transaction, err error) { err = d.db.Preload(clause.Associations). Preload("Transactions.OrderPurchase"). diff --git a/api/order.go b/api/order.go index 1945e24693315b5d5c6a45529da42b933f221c73..dddd9c15481b857fb8a1517bcf451de9e2458a22 100644 --- a/api/order.go +++ b/api/order.go @@ -56,6 +56,23 @@ func (a *api) listOrders(active bool, w http.ResponseWriter, req *http.Request) } } +func (a *api) ListOrderPicks(num int, w http.ResponseWriter, req *http.Request) { + orders, err := a.db.ListOrderPicks(num) + if err != nil { + log.Printf("Can't list order picks: %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 order picks: %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"]) diff --git a/api/order_test.go b/api/order_test.go index 53da7de5f06fd0887dc863029116b055eea46fd7..eae2fa976862ad805278d5b2ac1d624374f5d72f 100644 --- a/api/order_test.go +++ b/api/order_test.go @@ -24,6 +24,7 @@ func TestOrderAddList(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() tapi.addTestOrder() var orders []db.Order @@ -50,6 +51,7 @@ func TestOrderActive(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() tapi.addTestOrder() var orders []db.Order @@ -70,6 +72,7 @@ func TestOrderDelete(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() order := testOrder order.Deadline = time.Now().Add(-24 * time.Hour) @@ -95,12 +98,7 @@ func TestOrderDelete(t *testing.T) { t.Fatal("Can't create order purchase:", resp.Status) } - dbPath := path.Join(tapi.testPath, "test.db") - database, err := db.Init(dbPath) - if err != nil { - t.Fatal("Can't initialize the db:", err) - } - orders = database.DeactivateOrders() + orders = tapi.deactivateOrders() if len(orders) != 1 { t.Error("Deactivated wrong orders:", orders) } @@ -195,6 +193,7 @@ func TestOrderNoDeactivation(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() order := testOrder now := time.Now() @@ -213,12 +212,7 @@ func TestOrderNoDeactivation(t *testing.T) { t.Fatal("Didn't find my new order") } - dbPath := path.Join(tapi.testPath, "test.db") - database, err := db.Init(dbPath) - if err != nil { - t.Fatal("Can't initialize the db:", err) - } - orders = database.DeactivateOrders() + orders = tapi.deactivateOrders() if len(orders) != 0 { t.Error("Deactivated some orders:", orders) } @@ -236,6 +230,7 @@ func TestOrderDeactivation(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() order := testOrder order.Deadline = time.Now().Add(-24 * time.Hour) @@ -313,6 +308,7 @@ func TestGetOrder(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() tapi.addTestOrder() var orders []db.Order @@ -364,6 +360,7 @@ func TestUpdateOrderPurchase(t *testing.T) { tapi := newTestAPI(t) defer tapi.close() tapi.addTestMember() + tapi.addTestProducts() tapi.addTestOrder() var orders []db.Order @@ -423,9 +420,49 @@ func TestUpdateOrderPurchase(t *testing.T) { } } +func TestOrderPicks(t *testing.T) { + tapi := newTestAPI(t) + defer tapi.close() + tapi.addTestMember() + tapi.addTestProducts() + tapi.addTestOrder() + + testOrderOld := testOrder + testOrderOld.Deadline = time.Now().Add(-24 * time.Hour) + resp := tapi.do("POST", "/order", testOrderOld, nil) + if resp.StatusCode != http.StatusCreated { + tapi.t.Fatal("Can't create old order:", resp.Status) + } + + var orders []db.Order + resp = tapi.do("GET", "/order/picks", nil, &orders) + if resp.StatusCode != http.StatusOK { + t.Fatal("Can't get orders picks:", resp.Status) + } + + if len(orders) != 1 { + t.Fatal("Wrong number of orders", len(orders), orders) + } + if orders[0].Name != testOrder.Name { + t.Error("Wrong name:", orders[0].Name) + } + if orders[0].Deadline.Day() != testOrder.Deadline.Day() { + t.Fatal("Wrong deadline", orders[0].Deadline, "!=", testOrder.Deadline) + } +} + func (tapi *testAPI) addTestOrder() { resp := tapi.do("POST", "/order", testOrder, nil) if resp.StatusCode != http.StatusCreated { tapi.t.Fatal("Can't create order:", resp.Status) } } + +func (tapi *testAPI) deactivateOrders() []db.Order { + dbPath := path.Join(tapi.testPath, "test.db") + database, err := db.Init(dbPath) + if err != nil { + tapi.t.Fatal("Can't initialize the db:", err) + } + return database.DeactivateOrders() +}