From 935c99be45799eb17bc892464e578c3e0338edfc Mon Sep 17 00:00:00 2001 From: konrad Date: Wed, 18 Jul 2018 22:06:29 +0200 Subject: [PATCH] implemented read all method for namespace teams --- models/error.go | 16 ++++++++++++++++ models/team_namespace_readall.go | 23 +++++++++++++++++++++++ routes/crud/read_all.go | 6 ++++++ 3 files changed, 45 insertions(+) create mode 100644 models/team_namespace_readall.go diff --git a/models/error.go b/models/error.go index 9908c04543..dd950bed20 100644 --- a/models/error.go +++ b/models/error.go @@ -354,6 +354,22 @@ func (err ErrNeedToBeNamespaceAdmin) Error() string { return fmt.Sprintf("You need to be namespace owner to do that [NamespaceID: %d, UserID: %d]", err.NamespaceID, err.UserID) } +// ErrNeedToHaveNamespaceReadAccess represents an error, where the user is not the owner of that namespace (used i.e. when deleting a namespace) +type ErrNeedToHaveNamespaceReadAccess struct { + NamespaceID int64 + UserID int64 +} + +// IsErrNeedToHaveNamespaceReadAccess checks if an error is a ErrNamespaceDoesNotExist. +func IsErrNeedToHaveNamespaceReadAccess(err error) bool { + _, ok := err.(ErrNeedToHaveNamespaceReadAccess) + return ok +} + +func (err ErrNeedToHaveNamespaceReadAccess) Error() string { + return fmt.Sprintf("You need to be namespace owner to do that [NamespaceID: %d, UserID: %d]", err.NamespaceID, err.UserID) +} + // ============ // Team errors // ============ diff --git a/models/team_namespace_readall.go b/models/team_namespace_readall.go new file mode 100644 index 0000000000..2ac2e8af48 --- /dev/null +++ b/models/team_namespace_readall.go @@ -0,0 +1,23 @@ +package models + +func (tn *TeamNamespace) ReadAll(user *User) (interface{}, error) { + // Check if the user can read the namespace + n, err := GetNamespaceByID(tn.NamespaceID) + if err != nil { + return nil, err + } + if !n.CanRead(user) { + return nil, ErrNeedToHaveNamespaceReadAccess{NamespaceID:tn.NamespaceID, UserID:user.ID} + } + + // Get the teams + all := []*Team{} + + err = x.Select("teams.*"). + Table("teams"). + Join("INNER", "team_namespaces", "team_id = teams.id"). + Where("team_namespaces.namespace_id = ?", tn.NamespaceID). + Find(&all) + + return all, err +} \ No newline at end of file diff --git a/routes/crud/read_all.go b/routes/crud/read_all.go index 8d84762d74..86274036cb 100644 --- a/routes/crud/read_all.go +++ b/routes/crud/read_all.go @@ -14,6 +14,12 @@ func (c *WebHandler) ReadAllWeb(ctx echo.Context) error { return echo.NewHTTPError(http.StatusInternalServerError, "Could not determine the current user.") } + // Get the object & bind params to struct + if err := ParamBinder(c.CObject, ctx); err != nil { + fmt.Println(err) + return echo.NewHTTPError(http.StatusBadRequest, "No or invalid model provided.") + } + lists, err := c.CObject.ReadAll(¤tUser) if err != nil { fmt.Println(err)