mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-05-08 05:10:29 -05:00
[server][core] Streamline db.Resource => fs.Resource
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
})
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user