From 9f0475b173d5a607ff895f040f25d080f9d25bd2 Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Fri, 9 Aug 2024 22:53:50 +0530 Subject: [PATCH] Mobile Home response --- server/internal/api/api.go | 1 + server/internal/api/routes/mobile.go | 37 +++++++++++++++++++++++++ server/internal/api/routes/resources.go | 36 +++++++++++------------- 3 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 server/internal/api/routes/mobile.go diff --git a/server/internal/api/api.go b/server/internal/api/api.go index 7b24ba9d..1e6a5b57 100644 --- a/server/internal/api/api.go +++ b/server/internal/api/api.go @@ -15,4 +15,5 @@ func Setup(r *gin.RouterGroup, a *core.App) { r.Use(auth.CreateBearerAuthHandler(a)) routes.SetupResourceRoutes(r) routes.SetupUserRoutes(r) + routes.SetupMobileRoutes(r) } diff --git a/server/internal/api/routes/mobile.go b/server/internal/api/routes/mobile.go new file mode 100644 index 00000000..c6cd3729 --- /dev/null +++ b/server/internal/api/routes/mobile.go @@ -0,0 +1,37 @@ +package routes + +import ( + iofs "io/fs" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/shroff/phylum/server/internal/api/auth" + "github.com/shroff/phylum/server/internal/api/errors" +) + +type mobileHomeResponse struct { + User userResponse `json:"user"` + Home resourceDetailResponse `json:"home"` +} + +func SetupMobileRoutes(r *gin.RouterGroup) { + group := r.Group("/mobile") + group.GET("/home", handleMobileHomeRoute) +} + +func handleMobileHomeRoute(c *gin.Context) { + user := auth.GetUser(c) + fs := auth.GetFileSystem(c) + r, err := fs.ResourceByID(user.Home()) + if err != nil { + if errors.Is(err, iofs.ErrNotExist) { + err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "") + } + panic(err) + } + + c.JSON(200, mobileHomeResponse{ + User: responseFromUser(user), + Home: detailedResponseFromResource(fs, r), + }) +} diff --git a/server/internal/api/routes/resources.go b/server/internal/api/routes/resources.go index 74ff782b..e855c4b4 100644 --- a/server/internal/api/routes/resources.go +++ b/server/internal/api/routes/resources.go @@ -16,13 +16,6 @@ const errCodeResourceNotFound = "resource_not_found" const errCodeResourceIdInvalid = "resource_id_invalid" const errCodeResourceNotCollection = "resource_not_collection" -type resourceInfoResponse struct { - Metadata resourceResponse `json:"metadata"` - Children []resourceResponse `json:"children"` - InheritedPermissions map[int32]core.Permission `json:"inherited"` - LocalPermissions map[int32]core.Permission `json:"local"` -} - type resourceResponse struct { ID uuid.UUID `json:"id"` Parent *uuid.UUID `json:"parent"` @@ -34,11 +27,18 @@ type resourceResponse struct { Etag string `json:"etag"` } +type resourceDetailResponse struct { + Metadata resourceResponse `json:"metadata"` + Children []resourceResponse `json:"children"` + InheritedPermissions map[int32]core.Permission `json:"inherited"` + LocalPermissions map[int32]core.Permission `json:"local"` +} + func SetupResourceRoutes(r *gin.RouterGroup) { group := r.Group("/resources") group.GET("/ls/:id", handleResourceLsRoute) group.GET("/metadata/:id", handleResourceMetadataRoute) - group.GET("/info/:id", handleResourceInfoRoute) + group.GET("/details/:id", handleResourceDetailsRoute) } func handleResourceMetadataRoute(c *gin.Context) { @@ -83,20 +83,12 @@ func handleResourceLsRoute(c *gin.Context) { } results := make([]resourceResponse, len(children)) for i, c := range children { - results[i] = resourceResponse{ - ID: c.ID(), - Parent: c.ParentID(), - Name: c.Name(), - Dir: c.IsDir(), - Modified: c.ModTime(), - Size: c.Size(), - Etag: c.ETag(), - } + results[i] = responseFromResource(c) } c.JSON(200, results) } -func handleResourceInfoRoute(c *gin.Context) { +func handleResourceDetailsRoute(c *gin.Context) { resourceID, err := uuid.Parse(c.Param("id")) if err != nil { panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, "")) @@ -111,7 +103,11 @@ func handleResourceInfoRoute(c *gin.Context) { panic(err) } - response := resourceInfoResponse{} + c.JSON(200, detailedResponseFromResource(fs, r)) +} + +func detailedResponseFromResource(fs core.FileSystem, r core.Resource) resourceDetailResponse { + response := resourceDetailResponse{} response.Metadata = responseFromResource(r) if r.IsDir() { children, err := fs.ReadDir(r) @@ -135,7 +131,7 @@ func handleResourceInfoRoute(c *gin.Context) { response.LocalPermissions = p } } - c.JSON(200, response) + return response } func responseFromResource(r core.Resource) resourceResponse {