From 9514e104550d52b48ea27a63c3f6a3d8e7b7ccfe Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Wed, 23 Oct 2024 10:20:54 +0530 Subject: [PATCH] [server][api] Add /my/bookmarks/list and add routes --- server/internal/api/v1/my/routes.go | 65 ++++++++++++++++++----- server/internal/command/user/bookmarks.go | 2 +- server/internal/core/user/user.go | 4 +- server/internal/core/user/user_lists.go | 8 +-- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/server/internal/api/v1/my/routes.go b/server/internal/api/v1/my/routes.go index 9ff1b66d..5d9dbbdc 100644 --- a/server/internal/api/v1/my/routes.go +++ b/server/internal/api/v1/my/routes.go @@ -1,29 +1,44 @@ package my import ( + "net/http" + "github.com/gin-gonic/gin" + "github.com/google/uuid" "github.com/shroff/phylum/server/internal/api/auth" fsapi "github.com/shroff/phylum/server/internal/api/v1/fs" + "github.com/shroff/phylum/server/internal/core/errors" "github.com/shroff/phylum/server/internal/core/fs" "github.com/shroff/phylum/server/internal/core/user" ) -type myHomeResponse struct { +var errInvalidParams = errors.NewError(http.StatusBadRequest, "invalid_parameters", "Invalid Request Parameters") + +type homeResponse struct { User user.User `json:"user"` Home fsapi.ResourceLsResponse `json:"home"` } -type mySharedResponse struct { +type sharedResponse struct { Shared []fs.Resource `json:"shared"` } +type bookmarksResponse struct { + Bookmarks []fs.Resource `json:"bookmarks"` +} +type addBookmarkParams struct { + ID uuid.UUID `json:"id" binding:"required"` +} + func SetupRoutes(r *gin.RouterGroup) { group := r.Group("/my") - group.GET("/home", handleMyHomeRoute) - group.GET("/shared", createMySharedRouteHandler()) + group.GET("/home", handleHomeRoute) + group.GET("/shared", handleSharedRoute) + group.GET("/bookmarks/list", handleBookmarksGetRoute) + group.POST("/bookmarks/add", handleBookmarksAddRoute) } -func handleMyHomeRoute(c *gin.Context) { +func handleHomeRoute(c *gin.Context) { user := auth.GetUser(c) f := auth.GetFileSystem(c) r, err := f.ResourceByID(user.Home) @@ -31,19 +46,41 @@ func handleMyHomeRoute(c *gin.Context) { panic(err) } - c.JSON(200, myHomeResponse{ + c.JSON(200, homeResponse{ User: user, Home: fsapi.LsResponseFromResource(f, r), }) } -func createMySharedRouteHandler() func(*gin.Context) { - return func(c *gin.Context) { - // u := auth.GetUser(c) - // // shared, err := user.CreateManager(c.Request.Context()).GetSharedResources(u) - // if err != nil { - // panic(err) - // } - // c.JSON(200, mySharedResponse{Shared: shared}) +func handleSharedRoute(c *gin.Context) { + u := auth.GetUser(c) + shared, err := user.CreateManager(c.Request.Context()).SharedResources(u) + if err != nil { + panic(err) } + c.JSON(200, sharedResponse{Shared: shared}) +} + +func handleBookmarksGetRoute(c *gin.Context) { + u := auth.GetUser(c) + bookmarks, err := user.CreateManager(c.Request.Context()).Bookmarks(u) + if err != nil { + panic(err) + } + c.JSON(200, bookmarksResponse{Bookmarks: bookmarks}) +} + +func handleBookmarksAddRoute(c *gin.Context) { + var params addBookmarkParams + err := c.ShouldBindJSON(¶ms) + if err != nil || params.ID == uuid.Nil { + panic(errInvalidParams) + } + + u := auth.GetUser(c) + err = user.CreateManager(c.Request.Context()).AddBookmark(u, params.ID) + if err != nil { + panic(err) + } + c.JSON(200, gin.H{}) } diff --git a/server/internal/command/user/bookmarks.go b/server/internal/command/user/bookmarks.go index 7410be58..a37c0d82 100644 --- a/server/internal/command/user/bookmarks.go +++ b/server/internal/command/user/bookmarks.go @@ -52,7 +52,7 @@ func setupBookmarksListCommand() *cobra.Command { Short: "List Bookmarks", Args: cobra.ExactArgs(0), Run: func(cmd *cobra.Command, args []string) { - if bookmarks, err := user.CreateManager(context.Background()).ListBookmarks(common.User(cmd)); err != nil { + if bookmarks, err := user.CreateManager(context.Background()).Bookmarks(common.User(cmd)); err != nil { fmt.Println("unable to list bookmark: " + err.Error()) os.Exit(1) } else { diff --git a/server/internal/core/user/user.go b/server/internal/core/user/user.go index e4b97f46..7117badd 100644 --- a/server/internal/core/user/user.go +++ b/server/internal/core/user/user.go @@ -41,7 +41,7 @@ type Manager interface { ReadAccessToken(accessToken string) (User, error) // user_lists.go - GetSharedResources(u User) (result []fs.Resource, err error) + SharedResources(u User) (result []fs.Resource, err error) AddBookmark(u User, id uuid.UUID) error - ListBookmarks(u User) ([]fs.Resource, error) + Bookmarks(u User) ([]fs.Resource, error) } diff --git a/server/internal/core/user/user_lists.go b/server/internal/core/user/user_lists.go index 3f987483..a4a71a5f 100644 --- a/server/internal/core/user/user_lists.go +++ b/server/internal/core/user/user_lists.go @@ -6,8 +6,8 @@ import ( "github.com/shroff/phylum/server/internal/core/fs" ) -func (m manager) GetSharedResources(u User) ([]fs.Resource, error) { - // TODO: This doesn't take permissions into account. is this okay? +func (m manager) SharedResources(u User) ([]fs.Resource, error) { + // TODO: #permissions This doesn't take permissions into account. is this okay? res, err := m.db.Queries.SharedResources(m.ctx, db.SharedResourcesParams{Username: u.Username, UserHome: u.Home}) if err != nil { return nil, err @@ -21,10 +21,12 @@ func (m manager) GetSharedResources(u User) ([]fs.Resource, error) { } func (m manager) AddBookmark(u User, id uuid.UUID) error { + // TODO: #permissions This doesn't check that the resource even exists, let alone permissions return m.db.Queries.AddBookmark(m.ctx, db.AddBookmarkParams{Username: u.Username, ID: id}) } -func (m manager) ListBookmarks(u User) ([]fs.Resource, error) { +func (m manager) Bookmarks(u User) ([]fs.Resource, error) { + // TODO: #permissions This doesn't take permissions into account. is this okay? res, err := m.db.Queries.ListBookmarks(m.ctx, u.Username) if err != nil { return nil, err