mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-01-06 19:49:56 -06:00
Stop using app.Db directly
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user