From bed9003a39cd0dfc6e50825fdf3f837b51afebfb Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Tue, 6 Aug 2024 22:16:10 +0530 Subject: [PATCH] Stop using app.Db directly --- server/internal/api/routes/resources.go | 62 +++++++++++----------- server/internal/app/core/filesystem.go | 68 ++++++++++++++----------- server/internal/app/core/resource.go | 4 ++ 3 files changed, 70 insertions(+), 64 deletions(-) diff --git a/server/internal/api/routes/resources.go b/server/internal/api/routes/resources.go index 447386d9..ad8b81d9 100644 --- a/server/internal/api/routes/resources.go +++ b/server/internal/api/routes/resources.go @@ -1,16 +1,15 @@ package routes import ( - "context" + iofs "io/fs" "net/http" "time" "github.com/gin-gonic/gin" "github.com/google/uuid" - "github.com/jackc/pgx/v5" + "github.com/shroff/phylum/server/internal/api/auth" "github.com/shroff/phylum/server/internal/api/errors" "github.com/shroff/phylum/server/internal/app" - "github.com/shroff/phylum/server/internal/sql" ) const errCodeResourceNotFound = "resource_not_found" @@ -22,7 +21,6 @@ type resourceResponse struct { Parent uuid.UUID `json:"parent"` Name string `json:"name"` Dir bool `json:"dir"` - Created time.Time `json:"created"` Modified time.Time `json:"modified"` Deleted *time.Time `json:"deleted,omitempty"` Size int64 `json:"size"` @@ -42,28 +40,24 @@ func createResourceMetadataRouteHandler(a *app.App) func(c *gin.Context) { panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, "")) } - resource, err := a.Db.Queries().ResourceById(context.Background(), resourceId) + fs := auth.GetFileSystem(c) + resource, err := fs.ResourceByID(resourceId) if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - panic(errors.New(http.StatusNotFound, errCodeResourceNotFound, "")) + if errors.Is(err, iofs.ErrNotExist) { + err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "") } panic(err) } - deleted := &resource.Deleted.Time - if !resource.Deleted.Valid { - deleted = nil - } response := resourceResponse{ - ID: resource.ID, - Parent: resource.Parent, - Name: resource.Name, - Dir: resource.Dir, - Created: resource.Created.Time, - Modified: resource.Modified.Time, - Deleted: deleted, - Size: resource.Size.Int64, - Etag: resource.Etag.String, + 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) } @@ -75,31 +69,33 @@ func createResourceLsRouteHandler(a *app.App) func(c *gin.Context) { if err != nil { panic(errors.New(http.StatusBadRequest, errCodeResourceIdInvalid, "")) } - resource, err := a.Db.Queries().ResourceById(context.Background(), resourceId) + + fs := auth.GetFileSystem(c) + resource, err := fs.ResourceByID(resourceId) if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - panic(errors.New(http.StatusNotFound, errCodeResourceNotFound, "")) + if errors.Is(err, iofs.ErrNotExist) { + err = errors.New(http.StatusNotFound, errCodeResourceNotFound, "") } panic(err) } - if !resource.Dir { + + if !resource.IsDir() { panic(errors.New(http.StatusBadRequest, errCodeResourceNotCollection, "")) } - children, err := a.Db.Queries().ReadDir(context.Background(), sql.ReadDirParams{IncludeRoot: false, ID: resource.ID, Recursive: false}) + 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.Parent, - Name: c.Name, - Dir: c.Dir, - Created: c.Created.Time, - Modified: c.Modified.Time, - Size: c.Size.Int64, - Etag: c.Etag.String, + 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) diff --git a/server/internal/app/core/filesystem.go b/server/internal/app/core/filesystem.go index 6c78976d..3e3b071a 100644 --- a/server/internal/app/core/filesystem.go +++ b/server/internal/app/core/filesystem.go @@ -5,6 +5,7 @@ import ( "io" "io/fs" "strings" + "time" "github.com/google/uuid" "github.com/jackc/pgx/v5" @@ -51,6 +52,7 @@ func OpenFileSystem(db *db.DbHandler, ctx context.Context, cs storage.Storage, r size: 0, collection: true, modTime: res.Modified.Time, + delTime: nil, etag: "", } } else { @@ -85,36 +87,9 @@ func (f filesystem) ResourceByPath(path string) (Resource, error) { } res, err := f.db.Queries().ResourceByPath(f.ctx, sql.ResourceByPathParams{Root: f.root.ID(), Permission: f.root.Permission(), Search: segments, UserID: f.user}) - if err != nil { - return nil, fs.ErrNotExist - } - - if res.Permission == 0 { - return nil, ErrInsufficientPermissions - } - - return resource{ - id: res.ID, - owner: res.Owner, - permission: res.Permission, - parentID: res.Parent, - name: res.Name, - size: res.Size.Int64, - collection: res.Dir, - modTime: res.Modified.Time, - etag: res.Etag.String, - }, nil -} - -func (f filesystem) ResourceByID(id uuid.UUID) (Resource, error) { - res, err := f.db.Queries().ResourceByID(f.ctx, sql.ResourceByIDParams{Root: f.root.ID(), Permission: f.root.Permission(), ResourceID: id, UserID: f.user}) - // TODO: check found - if err == pgx.ErrNoRows || !res.Found { + if err == pgx.ErrNoRows || res.Permission == 0 { err = fs.ErrNotExist } - if res.Permission == 0 { - err = ErrInsufficientPermissions - } if err != nil { return nil, err } @@ -128,6 +103,35 @@ func (f filesystem) ResourceByID(id uuid.UUID) (Resource, error) { size: res.Size.Int64, collection: res.Dir, modTime: res.Modified.Time, + delTime: nil, + etag: res.Etag.String, + }, nil +} + +func (f filesystem) ResourceByID(id uuid.UUID) (Resource, error) { + res, err := f.db.Queries().ResourceByID(f.ctx, sql.ResourceByIDParams{Root: f.root.ID(), Permission: f.root.Permission(), ResourceID: id, UserID: f.user}) + // TODO: check found + if err == pgx.ErrNoRows || !res.Found || res.Permission == 0 { + err = fs.ErrNotExist + } + if err != nil { + return nil, err + } + + var delTime *time.Time + if res.Deleted.Valid { + delTime = &res.Deleted.Time + } + return resource{ + id: res.ID, + owner: res.Owner, + permission: res.Permission, + parentID: res.Parent, + name: res.Name, + size: res.Size.Int64, + collection: res.Dir, + modTime: res.Modified.Time, + delTime: delTime, etag: res.Etag.String, }, nil } @@ -176,6 +180,7 @@ func (f filesystem) ReadDir(r Resource) ([]Resource, error) { name: c.Name, size: c.Size.Int64, modTime: c.Modified.Time, + delTime: nil, collection: c.Dir, etag: c.Etag.String, } @@ -184,12 +189,12 @@ func (f filesystem) ReadDir(r Resource) ([]Resource, error) { } func (f filesystem) CreateMemberResource(r Resource, id uuid.UUID, name string, dir bool) (Resource, error) { + if !r.IsDir() { + return nil, ErrResourceNotCollection + } if r.Permission() < PermissionReadWrite { return nil, ErrInsufficientPermissions } - if !r.IsDir() { - return resource{}, ErrResourceNotCollection - } var result sql.Resource err := f.db.RunInTx(f.ctx, func(q *sql.Queries) error { var err error @@ -208,6 +213,7 @@ func (f filesystem) CreateMemberResource(r Resource, id uuid.UUID, name string, name: result.Name, size: 0, modTime: result.Modified.Time, + delTime: nil, collection: dir, etag: "", }, nil diff --git a/server/internal/app/core/resource.go b/server/internal/app/core/resource.go index cd258a74..557c3018 100644 --- a/server/internal/app/core/resource.go +++ b/server/internal/app/core/resource.go @@ -32,6 +32,7 @@ type Resource interface { Size() int64 Permission() int32 ModTime() time.Time + DelTime() *time.Time IsDir() bool ETag() string ContentType() string @@ -46,6 +47,7 @@ type resource struct { size int64 collection bool modTime time.Time + delTime *time.Time etag string } @@ -63,6 +65,8 @@ func (r resource) Size() int64 { return r.size } func (r resource) ModTime() time.Time { return r.modTime } +func (r resource) DelTime() *time.Time { return r.delTime } + func (r resource) IsDir() bool { return r.collection } func (r resource) ETag() string {