This commit is contained in:
nemunaire 2018-07-10 00:33:00 +02:00
parent 977a75819d
commit f25068075c
7 changed files with 113 additions and 22 deletions

View File

@ -15,35 +15,63 @@ func init() {
return ckh.GetChecks() return ckh.GetChecks()
})) }))
router.GET("/api/rooms/:rid/items/:iid/checks/", apiHandler(itemHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { router.GET("/api/items/:iid/checks/", apiHandler(itemHandler(func (item ckh.Item, _ []byte) (interface{}, error) {
return item.GetChecks() return item.GetChecks()
}))) })))
router.POST("/api/rooms/:rid/items/:iid/checks/", apiHandler(itemHandler(newCheck))) router.POST("/api/items/:iid/checks/", apiHandler(itemHandler(newCheck)))
router.GET("/api/rooms/:rid/items/:iid/checks/:cid", apiHandler(checkHandler(func (check ckh.Check, _ ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { router.GET("/api/items/:iid/checks/:cid", apiHandler(checkHandler(func (check ckh.Check, _ ckh.Item, _ []byte) (interface{}, error) {
return check, nil return check, nil
}))) })))
router.PUT("/api/rooms/:rid/items/:iid/checks/:cid", apiHandler(checkHandler(updateCheck))) router.PUT("/api/items/:iid/checks/:cid", apiHandler(checkHandler(updateCheck)))
router.DELETE("/api/rooms/:rid/items/:iid/checks/:cid", apiHandler(checkHandler(func (check ckh.Check, _ ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { router.DELETE("/api/items/:iid/checks/:cid", apiHandler(checkHandler(func (check ckh.Check, _ ckh.Item, _ []byte) (interface{}, error) {
return check.Delete()
})))
// in room
router.GET("/api/rooms/:rid/items/:iid/checks/", apiHandler(itemInRoomHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) {
return item.GetChecks()
})))
router.POST("/api/rooms/:rid/items/:iid/checks/", apiHandler(itemInRoomHandler(newCheckInRoom)))
router.GET("/api/rooms/:rid/items/:iid/checks/:cid", apiHandler(checkInRoomHandler(func (check ckh.Check, _ ckh.Item, _ []byte) (interface{}, error) {
return check, nil
})))
router.PUT("/api/rooms/:rid/items/:iid/checks/:cid", apiHandler(checkInRoomHandler(updateCheck)))
router.DELETE("/api/rooms/:rid/items/:iid/checks/:cid", apiHandler(checkInRoomHandler(func (check ckh.Check, _ ckh.Item, _ []byte) (interface{}, error) {
return check.Delete() return check.Delete()
}))) })))
} }
func checkHandler(f func(ckh.Check, ckh.Item, ckh.Room, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) { func checkHandler(f func(ckh.Check, ckh.Item, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) { return func(ps httprouter.Params, body []byte) (interface{}, error) {
return itemHandler(func (item ckh.Item, room ckh.Room, _ []byte) (interface{}, error) { return itemHandler(func (item ckh.Item, _ []byte) (interface{}, error) {
if cid, err := strconv.ParseInt(string(ps.ByName("cid")), 10, 64); err != nil { if cid, err := strconv.ParseInt(string(ps.ByName("cid")), 10, 64); err != nil {
return nil, err return nil, err
} else if check, err := item.GetCheck(cid); err != nil { } else if check, err := item.GetCheck(cid); err != nil {
return nil, err return nil, err
} else { } else {
return f(check, item, room, body) return f(check, item, body)
} }
})(ps, body) })(ps, body)
} }
} }
func newCheck(item ckh.Item, _ ckh.Room, body []byte) (interface{}, error) { func checkInRoomHandler(f func(ckh.Check, ckh.Item, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) {
return itemInRoomHandler(func (item ckh.Item, room ckh.Room, _ []byte) (interface{}, error) {
if cid, err := strconv.ParseInt(string(ps.ByName("cid")), 10, 64); err != nil {
return nil, err
} else if check, err := item.GetCheck(cid); err != nil {
return nil, err
} else {
return f(check, item, body)
}
})(ps, body)
}
}
func newCheck(item ckh.Item, body []byte) (interface{}, error) {
var uc ckh.Check var uc ckh.Check
if err := json.Unmarshal(body, &uc); err != nil { if err := json.Unmarshal(body, &uc); err != nil {
return nil, err return nil, err
@ -56,7 +84,11 @@ func newCheck(item ckh.Item, _ ckh.Room, body []byte) (interface{}, error) {
return item.NewCheck(ckh.User{}, uc.Passed, uc.Comment) return item.NewCheck(ckh.User{}, uc.Passed, uc.Comment)
} }
func updateCheck(check ckh.Check, _ ckh.Item, _ ckh.Room, body []byte) (interface{}, error) { func newCheckInRoom(item ckh.Item, _ ckh.Room, body []byte) (interface{}, error) {
return newCheck(item, body)
}
func updateCheck(check ckh.Check, _ ckh.Item, body []byte) (interface{}, error) {
var uc ckh.Check var uc ckh.Check
if err := json.Unmarshal(body, &uc); err != nil { if err := json.Unmarshal(body, &uc); err != nil {
return nil, err return nil, err

View File

@ -26,16 +26,28 @@ func init() {
return room.ClearItems() return room.ClearItems()
}))) })))
router.GET("/api/rooms/:rid/items/:iid/", apiHandler(itemHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { router.GET("/api/rooms/:rid/items/:iid/", apiHandler(itemInRoomHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) {
return item, nil return item, nil
}))) })))
router.PUT("/api/rooms/:rid/items/:iid/", apiHandler(itemHandler(updateItem))) router.PUT("/api/rooms/:rid/items/:iid/", apiHandler(itemInRoomHandler(updateItem)))
router.DELETE("/api/rooms/:rid/items/:iid/", apiHandler(itemHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { router.DELETE("/api/rooms/:rid/items/:iid/", apiHandler(itemInRoomHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) {
return item.Delete() return item.Delete()
}))) })))
} }
func itemHandler(f func(ckh.Item, ckh.Room, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) { func itemHandler(f func(ckh.Item, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) {
if iid, err := strconv.ParseInt(string(ps.ByName("iid")), 10, 64); err != nil {
return nil, err
} else if item, err := ckh.GetItem(iid); err != nil {
return nil, err
} else {
return f(item, body)
}
}
}
func itemInRoomHandler(f func(ckh.Item, ckh.Room, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) { return func(ps httprouter.Params, body []byte) (interface{}, error) {
return roomHandler(func (room ckh.Room, _ []byte) (interface{}, error) { return roomHandler(func (room ckh.Room, _ []byte) (interface{}, error) {
if iid, err := strconv.ParseInt(string(ps.ByName("iid")), 10, 64); err != nil { if iid, err := strconv.ParseInt(string(ps.ByName("iid")), 10, 64); err != nil {

View File

@ -24,7 +24,23 @@ func init() {
}))) })))
router.PUT("/api/tags/:tid", apiHandler(tagHandler(updateTag))) router.PUT("/api/tags/:tid", apiHandler(tagHandler(updateTag)))
router.DELETE("/api/tags/:tid", apiHandler(tagHandler(func (tag ckh.Tag, _ []byte) (interface{}, error) { router.DELETE("/api/tags/:tid", apiHandler(tagHandler(func (tag ckh.Tag, _ []byte) (interface{}, error) {
return tag.Delete() if _, err := tag.Delete(); err != nil {
return nil, err
} else {
return map[string]int{}, nil
}
})))
// Item's tags
router.GET("/api/items/:iid/tags", apiHandler(itemHandler(func (item ckh.Item, _ []byte) (interface{}, error) {
return item.GetTags()
})))
router.PUT("/api/items/:iid/tags/:tid", apiHandler(itemTagHandler(func (item ckh.Item, tag ckh.Tag, _ []byte) (interface{}, error) {
_, err := tag.AddItem(item)
return tag, err
})))
router.DELETE("/api/items/:iid/tags/:tid", apiHandler(itemTagHandler(func (item ckh.Item, tag ckh.Tag, _ []byte) (interface{}, error) {
return tag.DeleteItem(item)
}))) })))
} }
@ -40,6 +56,16 @@ func tagHandler(f func(ckh.Tag, []byte) (interface{}, error)) func(httprouter.Pa
} }
} }
func itemTagHandler(f func(ckh.Item, ckh.Tag, []byte) (interface{}, error)) func(httprouter.Params, []byte) (interface{}, error) {
return func(ps httprouter.Params, body []byte) (interface{}, error) {
return itemHandler(func (item ckh.Item, _ []byte) (interface{}, error) {
return tagHandler(func (tag ckh.Tag, _ []byte) (interface{}, error) {
return f(item, tag, body)
})(ps, body)
})(ps, body)
}
}
func newTag(_ httprouter.Params, body []byte) (interface{}, error) { func newTag(_ httprouter.Params, body []byte) (interface{}, error) {
var ut ckh.Tag var ut ckh.Tag
if err := json.Unmarshal(body, &ut); err != nil { if err := json.Unmarshal(body, &ut); err != nil {

View File

@ -72,12 +72,11 @@ func updateUser(user ckh.User, body []byte) (interface{}, error) {
return nil, errors.New("Username cannot be empty") return nil, errors.New("Username cannot be empty")
} }
if len(uu.Password) == 0 {
return nil, errors.New("Password cannot be empty")
}
user.Username = uu.Username user.Username = uu.Username
if len(uu.Password) != 0 {
user.ChangePassword(uu.Password) user.ChangePassword(uu.Password)
}
if _, err := user.Update(); err != nil { if _, err := user.Update(); err != nil {
return nil, err return nil, err

View File

@ -18,7 +18,7 @@ import (
"git.nemunai.re/checkhome/struct" "git.nemunai.re/checkhome/struct"
) )
var StaticDir string var StaticDir string = "./static/"
type ResponseWriterPrefix struct { type ResponseWriterPrefix struct {
real http.ResponseWriter real http.ResponseWriter

View File

@ -65,7 +65,7 @@ func (i Item) GetCheck(id int64) (c Check, err error) {
} }
func (i Item) NewCheck(user User, state string, comment string) (Check, error) { func (i Item) NewCheck(user User, state string, comment string) (Check, error) {
if res, err := DBExec("INSERT INTO checks (id_item, id_user, passed, comment) VALUES (?, ?, ?)", i.Id, user.Id, state, comment); err != nil { if res, err := DBExec("INSERT INTO checks (id_item, id_user, passed, comment) VALUES (?, ?, ?, ?)", i.Id, user.Id, state, comment); err != nil {
return Check{}, err return Check{}, err
} else if cid, err := res.LastInsertId(); err != nil { } else if cid, err := res.LastInsertId(); err != nil {
return Check{}, err return Check{}, err

View File

@ -53,6 +53,28 @@ func ClearItemTags() (int64, error) {
} }
} }
func (i Item) GetTags() (tags []Tag, err error) {
if rows, errr := DBQuery("SELECT T.id_tag, T.label FROM item_tag IT INNER JOIN tags T ON T.id_tag = IT.id_tag WHERE id_item = ?", i.Id); errr != nil {
return nil, errr
} else {
defer rows.Close()
tags = make([]Tag, 0)
for rows.Next() {
var t Tag
if err = rows.Scan(&t.Id, &t.Label); err != nil {
return
}
tags = append(tags, t)
}
if err = rows.Err(); err != nil {
return
}
return
}
}
func (i Item) ClearItemTags() (int64, error) { func (i Item) ClearItemTags() (int64, error) {
if res, err := DBExec("DELETE FROM item_tag WHERE id_item = ?", i.Id); err != nil { if res, err := DBExec("DELETE FROM item_tag WHERE id_item = ?", i.Id); err != nil {
return 0, err return 0, err