mirror of https://github.com/cloudreve/Cloudreve
119 lines
3.3 KiB
Go
119 lines
3.3 KiB
Go
package explorer
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/cloudreve/Cloudreve/v4/application/dependency"
|
|
"github.com/cloudreve/Cloudreve/v4/inventory"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/cluster/routes"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/manager"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/manager/entitysource"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type (
|
|
EntityDownloadParameterCtx struct{}
|
|
EntityDownloadService struct {
|
|
Name string `uri:"name" binding:"required"`
|
|
SpeedLimit int64 `uri:"speed"`
|
|
Src string `uri:"src"`
|
|
}
|
|
)
|
|
|
|
// Serve serves file content
|
|
func (s *EntityDownloadService) Serve(c *gin.Context) error {
|
|
dep := dependency.FromContext(c)
|
|
user := inventory.UserFromContext(c)
|
|
m := manager.NewFileManager(dep, user)
|
|
defer m.Recycle()
|
|
|
|
entitySource, err := m.GetEntitySource(c, hashid.FromContext(c))
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get entity source: %w", err)
|
|
}
|
|
|
|
defer entitySource.Close()
|
|
|
|
// Set cache header for public resource
|
|
settings := dep.SettingProvider()
|
|
maxAge := settings.PublicResourceMaxAge(c)
|
|
c.Header("Cache-Control", fmt.Sprintf("public, max-age=%d", maxAge))
|
|
|
|
isDownload := c.Query(routes.IsDownloadQuery) != ""
|
|
isThumb := c.Query(routes.IsThumbQuery) != ""
|
|
entitySource.Serve(c.Writer, c.Request,
|
|
entitysource.WithSpeedLimit(s.SpeedLimit),
|
|
entitysource.WithDownload(isDownload),
|
|
entitysource.WithDisplayName(s.Name),
|
|
entitysource.WithContext(c),
|
|
entitysource.WithThumb(isThumb),
|
|
)
|
|
return nil
|
|
}
|
|
|
|
type (
|
|
SetCurrentVersionParamCtx struct{}
|
|
SetCurrentVersionService struct {
|
|
Uri string `uri:"uri" binding:"required"`
|
|
Version string `uri:"version" binding:"required"`
|
|
}
|
|
)
|
|
|
|
// Set sets the current version of the file
|
|
func (s *SetCurrentVersionService) Set(c *gin.Context) error {
|
|
dep := dependency.FromContext(c)
|
|
user := inventory.UserFromContext(c)
|
|
m := manager.NewFileManager(dep, user)
|
|
defer m.Recycle()
|
|
|
|
uri, err := fs.NewUriFromString(s.Uri)
|
|
if err != nil {
|
|
return serializer.NewError(serializer.CodeParamErr, "unknown uri", err)
|
|
}
|
|
|
|
versionId, err := dep.HashIDEncoder().Decode(s.Version, hashid.EntityID)
|
|
if err != nil {
|
|
return serializer.NewError(serializer.CodeParamErr, "unknown version id", err)
|
|
}
|
|
|
|
if err := m.SetCurrentVersion(c, uri, versionId); err != nil {
|
|
return fmt.Errorf("failed to set current version: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type (
|
|
DeleteVersionParamCtx struct{}
|
|
DeleteVersionService struct {
|
|
Uri string `uri:"uri" binding:"required"`
|
|
Version string `uri:"version" binding:"required"`
|
|
}
|
|
)
|
|
|
|
// Delete deletes the version of the file
|
|
func (s *DeleteVersionService) Delete(c *gin.Context) error {
|
|
dep := dependency.FromContext(c)
|
|
user := inventory.UserFromContext(c)
|
|
m := manager.NewFileManager(dep, user)
|
|
defer m.Recycle()
|
|
|
|
uri, err := fs.NewUriFromString(s.Uri)
|
|
if err != nil {
|
|
return serializer.NewError(serializer.CodeParamErr, "unknown uri", err)
|
|
}
|
|
|
|
versionId, err := dep.HashIDEncoder().Decode(s.Version, hashid.EntityID)
|
|
if err != nil {
|
|
return serializer.NewError(serializer.CodeParamErr, "unknown version id", err)
|
|
}
|
|
|
|
if err := m.DeleteVersion(c, uri, versionId); err != nil {
|
|
return fmt.Errorf("failed to delete version: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|