From d5eb2f08e3746cfac0add3523df0fd5e0074ff9b Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 8 Jul 2018 22:50:01 +0200 Subject: [PATCH] Implemented CRUD Helper, every struct needs its own methods --- models/crudable.go | 9 ++++++ models/helper.go | 9 +++++- models/lists.go | 40 ++++++++++++++++++++++---- models/rights.go | 5 ++++ routes/CRUD/CRUD_helper.go | 56 ++++++++++++++++++++++++++++++++++++ routes/api/v1/CRUD_helper.go | 56 ------------------------------------ routes/routes.go | 9 +++--- 7 files changed, 116 insertions(+), 68 deletions(-) create mode 100644 models/crudable.go create mode 100644 models/rights.go create mode 100644 routes/CRUD/CRUD_helper.go delete mode 100644 routes/api/v1/CRUD_helper.go diff --git a/models/crudable.go b/models/crudable.go new file mode 100644 index 00000000..d0586538 --- /dev/null +++ b/models/crudable.go @@ -0,0 +1,9 @@ +package models + +type CRUDable interface { + Create() + ReadOne(int64) error + ReadAll(*User) (interface{}, error) + Update() + Delete() +} diff --git a/models/helper.go b/models/helper.go index fad4813d..8e55e74e 100644 --- a/models/helper.go +++ b/models/helper.go @@ -1,6 +1,7 @@ package models import ( + "fmt" "github.com/labstack/echo" "strconv" ) @@ -26,4 +27,10 @@ func GetByID(id int64, result interface{}) (err error) { } return -} \ No newline at end of file +} + +func GetAllByUser(user *User, result interface{}) (err error) { + fmt.Println(result) + err = x.Where("owner_id = ", user.ID).Find(result) + return +} diff --git a/models/lists.go b/models/lists.go index 686eb22e..e803103e 100644 --- a/models/lists.go +++ b/models/lists.go @@ -13,6 +13,8 @@ type List struct { Created int64 `xorm:"created" json:"created"` Updated int64 `xorm:"updated" json:"updated"` + + CRUDable `xorm:"-" json:"-"` } func (l *List) AfterLoad() { @@ -35,12 +37,6 @@ func GetListByID(id int64) (list List, err error) { return list, ErrListDoesNotExist{ID: id} } - /*items, err := GetItemsByListID(list.ID) - if err != nil { - return - } - list.Items = items*/ - return list, nil } @@ -67,3 +63,35 @@ func GetListsByNamespaceID(nID int64) (lists []*List, err error) { err = x.Where("namespace_id = ?", nID).Find(&lists) return lists, err } + +func (list *List) ReadAll(user *User) (interface{}, error) { + lists := Lists{} + err := lists.ReadAll(user) + return lists, err +} + +type Lists []List + +func (lists *Lists) ReadAll(user *User) (err error) { + fullUser, _, err := GetUserByID(user.ID) + if err != nil { + return + } + + err = x.Select("list.*"). + Join("LEFT", "team_list", "list.id = team_list.list_id"). + Join("LEFT", "team_members", "team_members.team_id = team_list.team_id"). + Where("team_members.user_id = ?", fullUser.ID). + Or("list.owner_id = ?", fullUser.ID). + Find(lists) + if err != nil { + return + } + + return +} + +func (l *List) ReadOne(id int64) (err error) { + *l, err = GetListByID(id) + return +} diff --git a/models/rights.go b/models/rights.go new file mode 100644 index 00000000..20831437 --- /dev/null +++ b/models/rights.go @@ -0,0 +1,5 @@ +package models + +type Rights interface { + IsAdmin(*User) bool +} diff --git a/routes/CRUD/CRUD_helper.go b/routes/CRUD/CRUD_helper.go new file mode 100644 index 00000000..10c3990c --- /dev/null +++ b/routes/CRUD/CRUD_helper.go @@ -0,0 +1,56 @@ +package CRUD + +import ( + "fmt" + "git.kolaente.de/konrad/list/models" + "github.com/labstack/echo" + "net/http" + "strconv" +) + +// This does web stuff, aka returns json etc. Uses CRUDable Methods to get the data +type CRUDWebHandler struct { + CObject interface{ models.CRUDable } +} + +// This does json, handles the request +func (c *CRUDWebHandler) ReadOneWeb(ctx echo.Context) error { + + // Get the ID + id, err := strconv.ParseInt(ctx.Param("id"), 10, 64) + if err != nil { + return ctx.JSON(http.StatusBadRequest, models.Message{"Invalid ID."}) + } + + // TODO check rights + + // Get our object + err = c.CObject.ReadOne(id) + if err != nil { + if models.IsErrListDoesNotExist(err) { + return ctx.JSON(http.StatusNotFound, models.Message{"Not found."}) + } + + return ctx.JSON(http.StatusInternalServerError, models.Message{"An error occured."}) + } + + return ctx.JSON(http.StatusOK, c.CObject) +} + +// +func (c *CRUDWebHandler) ReadAllWeb(ctx echo.Context) error { + currentUser, err := models.GetCurrentUser(ctx) + if err != nil { + return ctx.JSON(http.StatusInternalServerError, models.Message{"Could not determine the current user."}) + } + + //c.CObject.IsAdmin() + + lists, err := c.CObject.ReadAll(¤tUser) + if err != nil { + fmt.Println(err) + return ctx.JSON(http.StatusInternalServerError, models.Message{"Could not get."}) + } + + return ctx.JSON(http.StatusOK, lists) +} diff --git a/routes/api/v1/CRUD_helper.go b/routes/api/v1/CRUD_helper.go deleted file mode 100644 index e8048d3c..00000000 --- a/routes/api/v1/CRUD_helper.go +++ /dev/null @@ -1,56 +0,0 @@ -package v1 - -import ( - "git.kolaente.de/konrad/list/models" - "github.com/labstack/echo" - "net/http" - "strconv" -) - -// Basic Method definitions -type CRUD interface { - Create() - Read(int64) (error) - Update() - Delete() -} - -// We use this to acces the default methods -type DefaultCRUD struct { - CRUD - Target interface{} -} - -// This method gets our data, which will be called by ReadWeb() -func (d *DefaultCRUD) Read(id int64) (err error) { - return models.GetByID(id, d.Target) -} - -// This does web stuff, aka returns json etc. Uses DefaultCRUD Methods to get the data -type CRUDWebHandler struct { - CObject *DefaultCRUD -} - -// This does json, handles the request -func (c *CRUDWebHandler) ReadOneWeb(ctx echo.Context) error { - - // Get the ID - id, err := strconv.ParseInt(ctx.Param("id"), 10, 64) - if err != nil { - return ctx.JSON(http.StatusBadRequest, models.Message{"Invalid ID."}) - } - - // TODO check rights - - // Get our object - err = c.CObject.Read(id) - if err != nil { - if models.IsErrListDoesNotExist(err) { - return ctx.JSON(http.StatusNotFound, models.Message{"Not found."}) - } - - return ctx.JSON(http.StatusInternalServerError, models.Message{"An error occured."}) - } - - return ctx.JSON(http.StatusOK, c.CObject.Target) -} diff --git a/routes/routes.go b/routes/routes.go index a726df01..befcaa87 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -30,6 +30,7 @@ import ( "github.com/labstack/echo/middleware" "git.kolaente.de/konrad/list/models" + CRUD "git.kolaente.de/konrad/list/routes/CRUD" apiv1 "git.kolaente.de/konrad/list/routes/api/v1" _ "git.kolaente.de/konrad/list/routes/api/v1/swagger" // for docs generation ) @@ -83,12 +84,10 @@ func RegisterRoutes(e *echo.Echo) { a.Use(middleware.JWT(models.Config.JWTLoginSecret)) a.POST("/tokenTest", apiv1.CheckToken) - a.GET("/lists", apiv1.GetListsByUser) - listHandler := &apiv1.CRUDWebHandler{ - CObject: &apiv1.DefaultCRUD{ - Target: &models.List{}, - }, + listHandler := &CRUD.CRUDWebHandler{ + CObject: &models.List{}, } + a.GET("/lists", listHandler.ReadAllWeb) a.GET("/lists/:id", listHandler.ReadOneWeb) a.POST("/lists/:id", apiv1.UpdateList) a.PUT("/lists/:id", apiv1.AddListItem)