Add needs management

This commit is contained in:
nemunaire 2015-07-05 18:21:37 +02:00
parent 3d2525dd83
commit b503493bfc
3 changed files with 174 additions and 0 deletions

1
api.go
View File

@ -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) {

102
api_needs.go Normal file
View File

@ -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
}
}
}

71
need.go Normal file
View File

@ -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
}
}