[server] Add basic scaffold for copying files

This commit is contained in:
Neeraj Gupta 2024-04-17 15:43:48 +05:30
parent aabb884828
commit c124cde471
4 changed files with 49 additions and 3 deletions

View file

@ -5,6 +5,7 @@ import (
"database/sql"
b64 "encoding/base64"
"fmt"
"github.com/ente-io/museum/pkg/controller/file_copy"
"net/http"
"os"
"os/signal"
@ -389,9 +390,11 @@ func main() {
timeout.WithHandler(healthCheckHandler.PingDBStats),
timeout.WithResponse(timeOutResponse),
))
fileCopyCtrl := &file_copy.FileCopyController{FileController: fileController, CollectionCtrl: collectionController, S3Config: s3Config}
fileHandler := &api.FileHandler{
Controller: fileController,
FileCopyCtrl: fileCopyCtrl,
}
privateAPI.GET("/files/upload-urls", fileHandler.GetUploadURLs)
privateAPI.GET("/files/multipart-upload-urls", fileHandler.GetMultipartUploadURLs)
@ -400,6 +403,7 @@ func main() {
privateAPI.GET("/files/preview/:fileID", fileHandler.GetThumbnail)
privateAPI.GET("/files/preview/v2/:fileID", fileHandler.GetThumbnail)
privateAPI.POST("/files", fileHandler.CreateOrUpdate)
privateAPI.POST("/files/copy", fileHandler.CopyFiles)
privateAPI.PUT("/files/update", fileHandler.Update)
privateAPI.POST("/files/trash", fileHandler.Trash)
privateAPI.POST("/files/size", fileHandler.GetSize)

View file

@ -1,6 +1,7 @@
package api
import (
"github.com/ente-io/museum/pkg/controller/file_copy"
"net/http"
"os"
"strconv"
@ -21,6 +22,7 @@ import (
// FileHandler exposes request handlers for all encrypted file related requests
type FileHandler struct {
Controller *controller.FileController
FileCopyCtrl *file_copy.FileCopyController
}
// DefaultMaxBatchSize is the default maximum API batch size unless specified otherwise
@ -58,6 +60,21 @@ func (h *FileHandler) CreateOrUpdate(c *gin.Context) {
c.JSON(http.StatusOK, response)
}
// CopyFiles copies files that are owned by another user
func (h *FileHandler) CopyFiles(c *gin.Context) {
var req ente.CopyFileSyncRequest
if err := c.ShouldBindJSON(&req); err != nil {
handler.Error(c, stacktrace.Propagate(err, ""))
return
}
response, err := h.FileCopyCtrl.CopyFiles(c, req)
if err != nil {
handler.Error(c, stacktrace.Propagate(err, ""))
return
}
c.JSON(http.StatusOK, response)
}
// Update updates already existing file
func (h *FileHandler) Update(c *gin.Context) {
enteApp := auth.GetApp(c)

View file

@ -464,7 +464,7 @@ func (c *CollectionController) isRemoveAllowed(ctx *gin.Context, actorUserID int
return nil
}
func (c *CollectionController) isCopyAllowed(ctx *gin.Context, actorUserID int64, req ente.CopyFileSyncRequest) error {
func (c *CollectionController) IsCopyAllowed(ctx *gin.Context, actorUserID int64, req ente.CopyFileSyncRequest) error {
// verify that srcCollectionID is accessible by actorUserID
if _, err := c.AccessCtrl.GetCollection(ctx, &access.GetCollectionParams{
CollectionID: req.SrcCollectionID,

View file

@ -0,0 +1,25 @@
package file_copy
import (
"github.com/ente-io/museum/ente"
"github.com/ente-io/museum/pkg/controller"
"github.com/ente-io/museum/pkg/utils/auth"
"github.com/ente-io/museum/pkg/utils/s3config"
"github.com/gin-gonic/gin"
)
type FileCopyController struct {
S3Config *s3config.S3Config
FileController *controller.FileController
CollectionCtrl *controller.CollectionController
}
func (fc *FileCopyController) CopyFiles(c *gin.Context, req ente.CopyFileSyncRequest) (interface{}, error) {
userID := auth.GetUserID(c.Request.Header)
err := fc.CollectionCtrl.IsCopyAllowed(c, userID, req)
if err != nil {
return nil, err
}
return nil, ente.NewInternalError("yet to implement actual copy")
}