Simplify resource routes

This commit is contained in:
Abhishek Shroff
2024-08-06 23:48:02 +05:30
parent 9b706e784f
commit d8a2a19536
2 changed files with 63 additions and 68 deletions

View File

@@ -16,7 +16,7 @@ func Setup(r *gin.RouterGroup, a *app.App) {
// Authenticated routes
r.Use(auth.CreateBearerAuthHandler(a))
routes.SetupResourceRoutes(r, a)
routes.SetupResourceRoutes(r)
}
func handleApiError(c *gin.Context) {

View File

@@ -9,7 +9,6 @@ import (
"github.com/google/uuid"
"github.com/shroff/phylum/server/internal/api/auth"
"github.com/shroff/phylum/server/internal/api/errors"
"github.com/shroff/phylum/server/internal/app"
)
const errCodeResourceNotFound = "resource_not_found"
@@ -27,77 +26,73 @@ type resourceResponse struct {
Etag string `json:"etag"`
}
func SetupResourceRoutes(r *gin.RouterGroup, a *app.App) {
func SetupResourceRoutes(r *gin.RouterGroup) {
group := r.Group("/resources")
group.GET("/:id/ls", createResourceLsRouteHandler(a))
group.GET("/:id/metadata", createResourceMetadataRouteHandler(a))
group.GET("/ls/:id", handleResourceLsRoute)
group.GET("/metadata/:id", handleResourceMetadataRoute)
}
func createResourceMetadataRouteHandler(a *app.App) func(c *gin.Context) {
return func(c *gin.Context) {
resourceId, err := uuid.Parse(c.Param("id"))
if err != nil {
panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, ""))
}
fs := auth.GetFileSystem(c)
resource, err := fs.ResourceByID(resourceId)
if err != nil {
if errors.Is(err, iofs.ErrNotExist) {
err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "")
}
panic(err)
}
response := resourceResponse{
ID: resource.ID(),
Parent: resource.ParentID(),
Name: resource.Name(),
Dir: resource.IsDir(),
Modified: resource.ModTime(),
Deleted: resource.DelTime(),
Size: resource.Size(),
Etag: resource.ETag(),
}
c.JSON(200, response)
func handleResourceMetadataRoute(c *gin.Context) {
resourceId, err := uuid.Parse(c.Param("id"))
if err != nil {
panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, ""))
}
}
func createResourceLsRouteHandler(a *app.App) func(c *gin.Context) {
return func(c *gin.Context) {
resourceId, err := uuid.Parse(c.Param("id"))
if err != nil {
panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, ""))
fs := auth.GetFileSystem(c)
resource, err := fs.ResourceByID(resourceId)
if err != nil {
if errors.Is(err, iofs.ErrNotExist) {
err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "")
}
fs := auth.GetFileSystem(c)
resource, err := fs.ResourceByID(resourceId)
if err != nil {
if errors.Is(err, iofs.ErrNotExist) {
err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "")
}
panic(err)
}
if !resource.IsDir() {
panic(errors.New(http.StatusBadRequest, errCodeResourceNotCollection, ""))
}
children, err := fs.ReadDir(resource)
if err != nil {
panic(err)
}
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(),
}
}
c.JSON(200, results)
panic(err)
}
response := resourceResponse{
ID: resource.ID(),
Parent: resource.ParentID(),
Name: resource.Name(),
Dir: resource.IsDir(),
Modified: resource.ModTime(),
Deleted: resource.DelTime(),
Size: resource.Size(),
Etag: resource.ETag(),
}
c.JSON(200, response)
}
func handleResourceLsRoute(c *gin.Context) {
resourceId, err := uuid.Parse(c.Param("id"))
if err != nil {
panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, ""))
}
fs := auth.GetFileSystem(c)
resource, err := fs.ResourceByID(resourceId)
if err != nil {
if errors.Is(err, iofs.ErrNotExist) {
err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "")
}
panic(err)
}
if !resource.IsDir() {
panic(errors.New(http.StatusBadRequest, errCodeResourceNotCollection, ""))
}
children, err := fs.ReadDir(resource)
if err != nil {
panic(err)
}
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(),
}
}
c.JSON(200, results)
}