[server][core] Streamline db.Resource => fs.Resource

This commit is contained in:
Abhishek Shroff
2024-10-23 01:24:17 +05:30
parent 9d84920056
commit 5835305de1
10 changed files with 118 additions and 139 deletions
+25 -6
View File
@@ -105,22 +105,41 @@ func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, e
}
const listBookmarks = `-- name: ListBookmarks :many
SELECT jsonb_array_elements(bookmarks) FROM users WHERE username = $1::text
WITH ids(id) AS(
SELECT jsonb_array_elements_text(bookmarks)::uuid
FROM users
WHERE username = $1::text
) SELECT r.id, r.permissions, r.name, r.parent, r.dir, r.created, r.modified, r.deleted, r.content_size, r.content_type, r.content_sha256
FROM ids i
JOIN resources r
ON i.id = r.id
`
func (q *Queries) ListBookmarks(ctx context.Context, username string) ([][]byte, error) {
func (q *Queries) ListBookmarks(ctx context.Context, username string) ([]Resource, error) {
rows, err := q.db.Query(ctx, listBookmarks, username)
if err != nil {
return nil, err
}
defer rows.Close()
var items [][]byte
var items []Resource
for rows.Next() {
var jsonb_array_elements []byte
if err := rows.Scan(&jsonb_array_elements); err != nil {
var i Resource
if err := rows.Scan(
&i.ID,
&i.Permissions,
&i.Name,
&i.Parent,
&i.Dir,
&i.Created,
&i.Modified,
&i.Deleted,
&i.ContentSize,
&i.ContentType,
&i.ContentSha256,
); err != nil {
return nil, err
}
items = append(items, jsonb_array_elements)
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
+1 -21
View File
@@ -56,27 +56,7 @@ func (f filesystem) Move(r Resource, target string, overwrite bool) (Resource, b
}
return err
} else {
var deleted *time.Time
if r.Deleted.Valid {
deleted = &r.Deleted.Time
}
result = Resource{
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,
Created: r.Created.Time,
Modified: r.Modified.Time,
Deleted: deleted,
Dir: r.Dir,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSha256,
Permissions: string(r.Permissions),
// Not Needed
// Path: ??,
// UserPermissions: ??,
// InheritedPermissions: ??,
}
result = ResourceFromDB(r, 0, "", "")
return nil
}
})
+2 -17
View File
@@ -59,21 +59,6 @@ func (f filesystem) CreateMemberResource(r Resource, id uuid.UUID, name string,
if err != nil {
return Resource{}, err
}
return Resource{
ID: result.ID,
ParentID: result.Parent,
Name: result.Name,
Dir: result.Dir,
Created: result.Created.Time,
Modified: result.Modified.Time,
Deleted: nil, // Cannot be deleted when created
ContentType: result.ContentType,
ContentSize: result.ContentSize,
ContentSHA256: result.ContentSha256,
Permissions: string(result.Permissions),
UserPermissions: r.UserPermissions,
// Not Needed
// Path: r.Path + "/" + result.Name,
// InheritedPermissions: "",
}, nil
// TODO: #badbehavior Inherited permissions should include r.Permissions as well
return ResourceFromDB(result, r.UserPermissions, r.Path+"/"+result.Name, r.InheritedPermissions), nil
}
+2 -17
View File
@@ -15,28 +15,13 @@ func (f filesystem) DeleteChildRecursive(r Resource, name string, hardDelete boo
}
return err
} else {
child := Resource{
ID: result.ID,
ParentID: result.Parent,
Name: result.Name,
Dir: result.Dir,
Created: result.Created.Time,
Modified: result.Modified.Time,
Deleted: nil,
ContentType: result.ContentType,
ContentSize: result.ContentSize,
ContentSHA256: result.ContentSha256,
Permissions: string(result.Permissions),
UserPermissions: r.UserPermissions,
Path: r.Path,
// Not Needed
// InheritedPermissions: "",
}
child := ResourceFromDB(result, r.UserPermissions, r.Path+"/"+result.Name, r.InheritedPermissions)
return f.DeleteRecursive(child, hardDelete)
}
}
func (f filesystem) DeleteRecursive(r Resource, hardDelete bool) error {
// TODO: #badbehavior This should check parent permissions, not self
if !r.hasPermission(PermissionWrite) {
return ErrInsufficientPermissions
}
+24
View File
@@ -4,6 +4,7 @@ import (
"time"
"github.com/google/uuid"
"github.com/shroff/phylum/server/internal/core/db"
)
type Resource struct {
@@ -22,3 +23,26 @@ type Resource struct {
UserPermissions int32 `json:"-"`
InheritedPermissions string `json:"-"`
}
func ResourceFromDB(r db.Resource, userPermissions int32, path, inheritedPermissions string) Resource {
var deleted *time.Time
if r.Deleted.Valid {
deleted = &r.Deleted.Time
}
return Resource{
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,
Created: r.Created.Time,
Modified: r.Modified.Time,
Deleted: deleted,
Dir: r.Dir,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSha256,
Permissions: string(r.Permissions),
Path: path,
UserPermissions: userPermissions,
InheritedPermissions: inheritedPermissions,
}
}
+12 -44
View File
@@ -1,36 +1,24 @@
package fs
import (
"time"
"strings"
"github.com/shroff/phylum/server/internal/core/db"
)
func (f filesystem) UpdateName(r Resource, name string) (Resource, error) {
if r, err := f.db.UpdateResourceName(f.ctx, db.UpdateResourceNameParams{ID: r.ID, Name: name}); err != nil {
// TODO: #badbehavior This should check parent permissions, not self
if !r.hasPermission(PermissionWrite) {
return Resource{}, ErrInsufficientPermissions
}
if name == "" || checkNameInvalid(name) {
return Resource{}, ErrResourceNameInvalid
}
if res, err := f.db.UpdateResourceName(f.ctx, db.UpdateResourceNameParams{ID: r.ID, Name: name}); err != nil {
return Resource{}, err
} else {
var deleted *time.Time
if r.Deleted.Valid {
deleted = &r.Deleted.Time
}
return Resource{
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,
Created: r.Created.Time,
Modified: r.Modified.Time,
Deleted: deleted,
Dir: r.Dir,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSha256,
Permissions: string(r.Permissions),
// Not Needed
// Path: r.Path,
// UserPermissions: 0,
// InheritedPermissions: "",
}, nil
return ResourceFromDB(res, r.UserPermissions, r.Path[0:strings.LastIndex(r.Path, "/")]+"/"+name, r.InheritedPermissions), nil
}
}
@@ -58,25 +46,5 @@ func (f filesystem) UpdatePermissions(r Resource, username string, permission Pe
if err != nil {
return Resource{}, err
}
var deleted *time.Time
if res.Deleted.Valid {
deleted = &res.Deleted.Time
}
return Resource{
ID: res.ID,
ParentID: res.Parent,
Name: res.Name,
Created: res.Created.Time,
Modified: res.Modified.Time,
Deleted: deleted,
Dir: res.Dir,
ContentSize: res.ContentSize,
ContentType: res.ContentType,
ContentSHA256: res.ContentSha256,
Permissions: string(res.Permissions),
// Not Needed
// Path: r.Path,
// UserPermissions: 0,
// InheritedPermissions: "",
}, nil
return ResourceFromDB(res, r.UserPermissions, r.Path, r.InheritedPermissions), nil
}
+1 -1
View File
@@ -43,5 +43,5 @@ type Manager interface {
// user_lists.go
GetSharedResources(u User) (result []fs.Resource, err error)
AddBookmark(u User, id uuid.UUID) error
ListBookmarks(u User) ([][]byte, error)
ListBookmarks(u User) ([]fs.Resource, error)
}
+16 -29
View File
@@ -1,51 +1,38 @@
package user
import (
"time"
"github.com/google/uuid"
"github.com/shroff/phylum/server/internal/core/db"
"github.com/shroff/phylum/server/internal/core/fs"
)
func (m manager) GetSharedResources(u User) (result []fs.Resource, err error) {
func (m manager) GetSharedResources(u User) ([]fs.Resource, error) {
// TODO: This doesn't take permissions into account. is this okay?
res, err := m.db.Queries.SharedResources(m.ctx, db.SharedResourcesParams{Username: u.Username, UserHome: u.Home})
if err != nil {
return
return nil, err
}
result = make([]fs.Resource, len(res))
result := make([]fs.Resource, len(res))
for i, r := range res {
var deleted *time.Time
if r.Deleted.Valid {
deleted = &r.Deleted.Time
}
result[i] = fs.Resource{
ID: r.ID,
ParentID: r.Parent,
Name: r.Name,
Dir: r.Dir,
Created: r.Created.Time,
Modified: r.Modified.Time,
Deleted: deleted,
ContentSize: r.ContentSize,
ContentType: r.ContentType,
ContentSHA256: r.ContentSha256,
Permissions: string(r.Permissions),
// Not Needed
// Path: "",
// UserPermissions: 0,
// InheritedPermissions: "",
}
result[i] = fs.ResourceFromDB(r, 0, "", "")
}
return
return result, err
}
func (m manager) AddBookmark(u User, id uuid.UUID) error {
return m.db.Queries.AddBookmark(m.ctx, db.AddBookmarkParams{Username: u.Username, ID: id})
}
func (m manager) ListBookmarks(u User) ([][]byte, error) {
return m.db.Queries.ListBookmarks(m.ctx, u.Username)
func (m manager) ListBookmarks(u User) ([]fs.Resource, error) {
res, err := m.db.Queries.ListBookmarks(m.ctx, u.Username)
if err != nil {
return nil, err
}
result := make([]fs.Resource, len(res))
for i, r := range res {
result[i] = fs.ResourceFromDB(r, 0, "", "")
}
return result, err
}