[server] /my/shared end-point

This commit is contained in:
Abhishek Shroff
2024-09-17 07:42:36 +05:30
parent 4d8518d7e0
commit 32a013e053
6 changed files with 124 additions and 37 deletions

View File

@@ -15,5 +15,5 @@ func Setup(r *gin.RouterGroup, a *core.App) {
r.Use(auth.CreateApiAuthHandler(a))
routes.SetupResourceRoutes(r)
routes.SetupUserRoutes(r)
routes.SetupMobileRoutes(r)
routes.SetupMyRoutes(r, a)
}

View File

@@ -1,36 +0,0 @@
package routes
import (
iofs "io/fs"
"github.com/gin-gonic/gin"
"github.com/shroff/phylum/server/internal/api/auth"
"github.com/shroff/phylum/server/internal/api/errors"
)
type mobileHomeResponse struct {
User userResponse `json:"user"`
Home resourceDetailResponse `json:"home"`
}
func SetupMobileRoutes(r *gin.RouterGroup) {
group := r.Group("/mobile")
group.GET("/home", handleMobileHomeRoute)
}
func handleMobileHomeRoute(c *gin.Context) {
user := auth.GetUser(c)
fs := auth.GetFileSystem(c)
r, err := fs.ResourceByID(user.Home)
if err != nil {
if errors.Is(err, iofs.ErrNotExist) {
err = errResourceNotFound
}
panic(err)
}
c.JSON(200, mobileHomeResponse{
User: responseFromUser(user),
Home: detailedResponseFromResource(fs, r),
})
}

View File

@@ -0,0 +1,58 @@
package routes
import (
iofs "io/fs"
"github.com/gin-gonic/gin"
"github.com/shroff/phylum/server/internal/api/auth"
"github.com/shroff/phylum/server/internal/api/errors"
"github.com/shroff/phylum/server/internal/core"
)
type myHomeResponse struct {
User userResponse `json:"user"`
Home resourceDetailResponse `json:"home"`
}
type mySharedResponse struct {
Shared []resourceResponse `json:"shared"`
}
func SetupMyRoutes(r *gin.RouterGroup, a *core.App) {
group := r.Group("/my")
group.GET("/home", handleMyHomeRoute)
group.GET("/shared", createMySharedRouteHandler(a))
}
func handleMyHomeRoute(c *gin.Context) {
user := auth.GetUser(c)
fs := auth.GetFileSystem(c)
r, err := fs.ResourceByID(user.Home)
if err != nil {
if errors.Is(err, iofs.ErrNotExist) {
err = errResourceNotFound
}
panic(err)
}
c.JSON(200, myHomeResponse{
User: responseFromUser(user),
Home: detailedResponseFromResource(fs, r),
})
}
func createMySharedRouteHandler(a *core.App) func(*gin.Context) {
return func(c *gin.Context) {
user := auth.GetUser(c)
shared, err := a.GetSharedResources(c.Request.Context(), user)
if err != nil {
panic(err)
}
result := make([]resourceResponse, len(shared))
for i, r := range shared {
result[i] = responseFromResource(r)
}
c.JSON(200, mySharedResponse{Shared: result})
}
}

View File

@@ -103,3 +103,25 @@ func (a *App) populateData(ctx context.Context) (user db.User, e error) {
func (a App) OpenFileSystem(ctx context.Context, user User) FileSystem {
return OpenFileSystem(a.db, ctx, a.cs, user.ID, user.Root)
}
func (a App) GetSharedResources(ctx context.Context, user User) (result []Resource, err error) {
res, err := a.db.Queries.SharedResources(ctx, db.SharedResourcesParams{UserID: user.ID, UserHome: user.Home})
if err != nil {
return
}
result = make([]Resource, len(res))
for i, r := range res {
result[i] = resource{
id: r.ID,
parentID: r.Parent,
name: r.Name,
size: r.Size.Int64,
collection: r.Dir,
modTime: r.Modified.Time,
sha256sum: r.Sha256sum.String,
permissions: r.Permissions,
}
}
return
}

View File

@@ -119,6 +119,46 @@ func (q *Queries) HardDeleteRecursive(ctx context.Context, id uuid.UUID) ([]uuid
return items, nil
}
const sharedResources = `-- name: SharedResources :many
SELECT id, parent, name, dir, created, modified, deleted, size, sha256sum, permissions FROM resources where permissions ? ($1::int)::text AND id <> $2::uuid
`
type SharedResourcesParams struct {
UserID int32
UserHome uuid.UUID
}
func (q *Queries) SharedResources(ctx context.Context, arg SharedResourcesParams) ([]Resource, error) {
rows, err := q.db.Query(ctx, sharedResources, arg.UserID, arg.UserHome)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Resource
for rows.Next() {
var i Resource
if err := rows.Scan(
&i.ID,
&i.Parent,
&i.Name,
&i.Dir,
&i.Created,
&i.Modified,
&i.Deleted,
&i.Size,
&i.Sha256sum,
&i.Permissions,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const updateResourceContents = `-- name: UpdateResourceContents :exec
UPDATE resources
SET

View File

@@ -63,3 +63,6 @@ WITH RECURSIVE nodes(id, parent) AS (
DELETE FROM resources
WHERE id in (SELECT id FROM nodes)
RETURNING id;
-- name: SharedResources :many
SELECT * FROM resources where permissions ? (@user_id::int)::text AND id <> @user_home::uuid AND deleted IS NULL;