From f25068075c33425ec3d05cbb0d2c634b7fac321f Mon Sep 17 00:00:00 2001 From: nemunaire Date: Tue, 10 Jul 2018 00:33:00 +0200 Subject: [PATCH] wip1 --- api/check.go | 52 ++++++++++++++++++++++++++++++++++++++--------- api/item.go | 20 ++++++++++++++---- api/tag.go | 28 ++++++++++++++++++++++++- api/user.go | 9 ++++---- main.go | 2 +- struct/check.go | 2 +- struct/itemtag.go | 22 ++++++++++++++++++++ 7 files changed, 113 insertions(+), 22 deletions(-) diff --git a/api/check.go b/api/check.go index ddcbbca..14fe77c 100644 --- a/api/check.go +++ b/api/check.go @@ -15,35 +15,63 @@ func init() { 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() }))) - 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 }))) - router.PUT("/api/rooms/:rid/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.PUT("/api/items/:iid/checks/:cid", apiHandler(checkHandler(updateCheck))) + 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() }))) } -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 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 { return nil, err } else if check, err := item.GetCheck(cid); err != nil { return nil, err } else { - return f(check, item, room, body) + return f(check, item, 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 if err := json.Unmarshal(body, &uc); err != nil { 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) } -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 if err := json.Unmarshal(body, &uc); err != nil { return nil, err diff --git a/api/item.go b/api/item.go index 7046fc2..1c9b2f0 100644 --- a/api/item.go +++ b/api/item.go @@ -26,16 +26,28 @@ func init() { 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 }))) - router.PUT("/api/rooms/:rid/items/:iid/", apiHandler(itemHandler(updateItem))) - router.DELETE("/api/rooms/:rid/items/:iid/", apiHandler(itemHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { + router.PUT("/api/rooms/:rid/items/:iid/", apiHandler(itemInRoomHandler(updateItem))) + router.DELETE("/api/rooms/:rid/items/:iid/", apiHandler(itemInRoomHandler(func (item ckh.Item, _ ckh.Room, _ []byte) (interface{}, error) { 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 roomHandler(func (room ckh.Room, _ []byte) (interface{}, error) { if iid, err := strconv.ParseInt(string(ps.ByName("iid")), 10, 64); err != nil { diff --git a/api/tag.go b/api/tag.go index d1d341f..48b1435 100644 --- a/api/tag.go +++ b/api/tag.go @@ -24,7 +24,23 @@ func init() { }))) router.PUT("/api/tags/:tid", apiHandler(tagHandler(updateTag))) 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) { var ut ckh.Tag if err := json.Unmarshal(body, &ut); err != nil { diff --git a/api/user.go b/api/user.go index 2c9e956..5aecae3 100644 --- a/api/user.go +++ b/api/user.go @@ -72,12 +72,11 @@ func updateUser(user ckh.User, body []byte) (interface{}, error) { 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.ChangePassword(uu.Password) + + if len(uu.Password) != 0 { + user.ChangePassword(uu.Password) + } if _, err := user.Update(); err != nil { return nil, err diff --git a/main.go b/main.go index 4766062..69a9c73 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,7 @@ import ( "git.nemunai.re/checkhome/struct" ) -var StaticDir string +var StaticDir string = "./static/" type ResponseWriterPrefix struct { real http.ResponseWriter diff --git a/struct/check.go b/struct/check.go index 96c5d9c..250a33a 100644 --- a/struct/check.go +++ b/struct/check.go @@ -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) { - 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 } else if cid, err := res.LastInsertId(); err != nil { return Check{}, err diff --git a/struct/itemtag.go b/struct/itemtag.go index 8ecffbf..858128b 100644 --- a/struct/itemtag.go +++ b/struct/itemtag.go @@ -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) { if res, err := DBExec("DELETE FROM item_tag WHERE id_item = ?", i.Id); err != nil { return 0, err