Stop using app.Db directly

This commit is contained in:
Abhishek Shroff
2024-08-06 22:16:10 +05:30
parent 151555be7b
commit bed9003a39
3 changed files with 70 additions and 64 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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 {