Add UpdateFilePath method to update file name and path while preserving ID
This commit is contained in:
@@ -982,6 +982,17 @@ func (db *DB) UpdateFileSize(ctx context.Context, fileID uuid.UUID, size int64,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateFilePath updates the path and name of a file while preserving its ID
|
||||||
|
// This is used when moving/renaming files to ensure WOPI sessions remain valid
|
||||||
|
func (db *DB) UpdateFilePath(ctx context.Context, fileID uuid.UUID, newName, newPath string) error {
|
||||||
|
_, err := db.ExecContext(ctx, `
|
||||||
|
UPDATE files
|
||||||
|
SET name = $1, path = $2, last_modified = NOW()
|
||||||
|
WHERE id = $3
|
||||||
|
`, newName, newPath, fileID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// DeleteFileByPath removes a file or folder matching path for a given org or user
|
// DeleteFileByPath removes a file or folder matching path for a given org or user
|
||||||
func (db *DB) DeleteFileByPath(ctx context.Context, orgID *uuid.UUID, userID *uuid.UUID, path string) error {
|
func (db *DB) DeleteFileByPath(ctx context.Context, orgID *uuid.UUID, userID *uuid.UUID, path string) error {
|
||||||
var res sql.Result
|
var res sql.Result
|
||||||
|
|||||||
@@ -2280,6 +2280,9 @@ func moveOrgFileHandler(w http.ResponseWriter, r *http.Request, db *database.DB,
|
|||||||
newPath = req.TargetPath
|
newPath = req.TargetPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Determine new filename from the path
|
||||||
|
newName := path.Base(newPath)
|
||||||
|
|
||||||
// Get or create user's WebDAV client and move in Nextcloud
|
// Get or create user's WebDAV client and move in Nextcloud
|
||||||
storageClient, err := getUserWebDAVClient(r.Context(), db, userID, cfg.NextcloudURL, cfg.NextcloudUser, cfg.NextcloudPass)
|
storageClient, err := getUserWebDAVClient(r.Context(), db, userID, cfg.NextcloudURL, cfg.NextcloudUser, cfg.NextcloudPass)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -2294,14 +2297,11 @@ func moveOrgFileHandler(w http.ResponseWriter, r *http.Request, db *database.DB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete old file record
|
// Update file record path and name in-place (preserves file ID for WOPI sessions)
|
||||||
if err := db.DeleteFileByPath(r.Context(), &orgID, nil, req.SourcePath); err != nil {
|
if err := db.UpdateFilePath(r.Context(), sourceFile.ID, newName, newPath); err != nil {
|
||||||
errors.LogError(r, err, "Failed to delete old file record")
|
errors.LogError(r, err, "Failed to update file path")
|
||||||
}
|
errors.WriteError(w, errors.CodeInternal, "Server error", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
// Create new file record at the new location
|
|
||||||
if _, err := db.CreateFile(r.Context(), &orgID, nil, sourceFile.Name, newPath, sourceFile.Type, sourceFile.Size); err != nil {
|
|
||||||
errors.LogError(r, err, "Failed to create new file record at destination")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auditLogger.Log(r.Context(), audit.Entry{
|
auditLogger.Log(r.Context(), audit.Entry{
|
||||||
@@ -2508,6 +2508,9 @@ func moveUserFileHandler(w http.ResponseWriter, r *http.Request, db *database.DB
|
|||||||
newPath = req.TargetPath
|
newPath = req.TargetPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Determine new filename from the path
|
||||||
|
newName := path.Base(newPath)
|
||||||
|
|
||||||
// Get or create user's WebDAV client and move in Nextcloud
|
// Get or create user's WebDAV client and move in Nextcloud
|
||||||
storageClient, err := getUserWebDAVClient(r.Context(), db, userID, cfg.NextcloudURL, cfg.NextcloudUser, cfg.NextcloudPass)
|
storageClient, err := getUserWebDAVClient(r.Context(), db, userID, cfg.NextcloudURL, cfg.NextcloudUser, cfg.NextcloudPass)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -2521,14 +2524,11 @@ func moveUserFileHandler(w http.ResponseWriter, r *http.Request, db *database.DB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete old file record
|
// Update file record path and name in-place (preserves file ID for WOPI sessions)
|
||||||
if err := db.DeleteFileByPath(r.Context(), nil, &userID, req.SourcePath); err != nil {
|
if err := db.UpdateFilePath(r.Context(), sourceFile.ID, newName, newPath); err != nil {
|
||||||
errors.LogError(r, err, "Failed to delete old file record")
|
errors.LogError(r, err, "Failed to update file path")
|
||||||
}
|
errors.WriteError(w, errors.CodeInternal, "Server error", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
// Create new file record at the new location
|
|
||||||
if _, err := db.CreateFile(r.Context(), nil, &userID, sourceFile.Name, newPath, sourceFile.Type, sourceFile.Size); err != nil {
|
|
||||||
errors.LogError(r, err, "Failed to create new file record at destination")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auditLogger.Log(r.Context(), audit.Entry{
|
auditLogger.Log(r.Context(), audit.Entry{
|
||||||
|
|||||||
Reference in New Issue
Block a user