Add needs management
This commit is contained in:
parent
3d2525dd83
commit
b503493bfc
1
api.go
1
api.go
|
@ -14,6 +14,7 @@ type DispatchFunction func([]string, []byte) ([]byte, error)
|
|||
var apiRouting = map[string]*(map[string]DispatchFunction){
|
||||
"version": &ApiVersionRouting,
|
||||
"products": &ApiProductsRouting,
|
||||
"needs": &ApiNeedsRouting,
|
||||
}
|
||||
|
||||
func ApiRouting(w http.ResponseWriter, r *http.Request) {
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/url"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var ApiNeedsRouting = map[string]DispatchFunction{
|
||||
"GET": listNeeds,
|
||||
"PUT": addNeed,
|
||||
"DELETE": delNeed,
|
||||
"PATCH": editNeed,
|
||||
}
|
||||
|
||||
func listNeeds(args []string, body []byte) ([]byte, error) {
|
||||
if len(args) < 1 {
|
||||
if needs, err := GetNeeds(); err != nil {
|
||||
return nil, err
|
||||
} else if ret, err := json.Marshal(needs); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return ret, nil
|
||||
}
|
||||
} else if i, err := strconv.ParseInt(args[0], 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
if need, err := GetNeed(i); err != nil {
|
||||
return nil, err
|
||||
} else if ret, err := json.Marshal(need); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return ret, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func addNeed(args []string, body []byte) ([]byte, error) {
|
||||
if m, err := url.ParseQuery(string(body)); err != nil {
|
||||
return nil, err
|
||||
} else if idp := m.Get("product"); idp == "" {
|
||||
return nil, errors.New("No product identifier given")
|
||||
} else if id_product, err := strconv.ParseInt(idp, 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else if product, err := GetProduct(id_product); err != nil {
|
||||
return nil, err
|
||||
} else if q := m.Get("quantity"); q == "" {
|
||||
return nil, errors.New("No quantity given")
|
||||
} else if quantity, err := strconv.ParseInt(q, 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else if id, err := CreateNeed(product, quantity); err != nil {
|
||||
return nil, err
|
||||
} else if r, err := json.Marshal(map[string]int64{"id": id}); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
|
||||
func delNeed(args []string, body []byte) ([]byte, error) {
|
||||
if len(args) < 1 {
|
||||
return nil, errors.New("Need a need identifier to delete")
|
||||
} else if id, err := strconv.ParseInt(args[0], 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else if need, err := GetNeed(id); err != nil {
|
||||
return nil, err
|
||||
} else if err := need.Delete(); err != nil {
|
||||
return nil, err
|
||||
} else if r, err := json.Marshal(map[string]int64{"id": id}); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
|
||||
func editNeed(args []string, body []byte) ([]byte, error) {
|
||||
if len(args) < 1 {
|
||||
return nil, errors.New("Need a need identifier to patch")
|
||||
} else if id, err := strconv.ParseInt(args[0], 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else if need, err := GetNeed(id); err != nil {
|
||||
return nil, err
|
||||
} else if m, err := url.ParseQuery(string(body)); err != nil {
|
||||
return nil, err
|
||||
} else if idp, err := strconv.ParseInt(m.Get("product"), 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else if nproduct, err := GetProduct(idp); err != nil {
|
||||
return nil, err
|
||||
} else if quantity, err := strconv.ParseInt(m.Get("quantity"), 10, 64); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
need.SetProduct(nproduct)
|
||||
need.Quantity = quantity
|
||||
|
||||
if err := need.Save(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return nil, nil
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package main
|
||||
|
||||
type Need struct {
|
||||
id int64
|
||||
idProduct int64
|
||||
Quantity int64
|
||||
}
|
||||
|
||||
func GetNeeds() ([]Need, error) {
|
||||
if rows, err := DBQuery("SELECT id_need, id_product, quantity FROM needs ORDER BY id_need"); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
|
||||
var needs = make([]Need, 0)
|
||||
for rows.Next() {
|
||||
var n Need
|
||||
if err := rows.Scan(&n.id, &n.idProduct, &n.Quantity); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
needs = append(needs, n)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return needs, nil
|
||||
}
|
||||
}
|
||||
|
||||
func GetNeed(id int64) (Need, error) {
|
||||
var n Need
|
||||
if err := DBQueryRow("SELECT id_need, id_product, quantity FROM needs WHERE id_need=?", id).Scan(&n.id, &n.idProduct, &n.Quantity); err != nil {
|
||||
return n, err
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
||||
func (this Need) Product() (Product, error) {
|
||||
return GetProduct(this.idProduct)
|
||||
}
|
||||
|
||||
func (this Need) SetProduct(p Product) {
|
||||
this.idProduct = p.Id
|
||||
}
|
||||
|
||||
func (this Need) Save() error {
|
||||
if _, err := DBExec("UPDATE needs SET id_product=?, quantity=? WHERE id_need=?", this.idProduct, this.Quantity, this.id); err != nil {
|
||||
return err
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (this Need) Delete() error {
|
||||
if _, err := DBExec("DELETE FROM needs WHERE id_need=?", this.id); err != nil {
|
||||
return err
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func CreateNeed(p Product, quantity int64) (int64, error) {
|
||||
if res, err := DBExec("INSERT INTO needs (id_product, quantity) VALUES (?, ?)", p.Id, quantity); err != nil {
|
||||
return 0, err
|
||||
} else if id, err := res.LastInsertId(); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return id, nil
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue