Cloudreve/service/explorer/pin.go

76 lines
2.0 KiB
Go

package explorer
import (
"github.com/cloudreve/Cloudreve/v4/application/dependency"
"github.com/cloudreve/Cloudreve/v4/inventory"
"github.com/cloudreve/Cloudreve/v4/inventory/types"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
"github.com/gin-gonic/gin"
"github.com/samber/lo"
)
type (
PinFileService struct {
Uri string `json:"uri" binding:"required"`
Name string `json:"name"`
}
PinFileParameterCtx struct{}
)
// PinFileService pins new uri to sidebar
func (service *PinFileService) PinFile(c *gin.Context) error {
dep := dependency.FromContext(c)
user := inventory.UserFromContext(c)
userClient := dep.UserClient()
uri, err := fs.NewUriFromString(service.Uri)
if err != nil {
return serializer.NewError(serializer.CodeParamErr, "unknown uri", err)
}
uriStr := uri.String()
for _, pin := range user.Settings.Pined {
if pin.Uri == uriStr {
if pin.Name != service.Name {
return serializer.NewError(serializer.CodeObjectExist, "uri already pinned with different name", nil)
}
return nil
}
}
user.Settings.Pined = append(user.Settings.Pined, types.PinedFile{
Uri: uriStr,
Name: service.Name,
})
if err := userClient.SaveSettings(c, user); err != nil {
return serializer.NewError(serializer.CodeDBError, "failed to save settings", err)
}
return nil
}
// UnpinFile removes uri from sidebar
func (service *PinFileService) UnpinFile(c *gin.Context) error {
dep := dependency.FromContext(c)
user := inventory.UserFromContext(c)
userClient := dep.UserClient()
uri, err := fs.NewUriFromString(service.Uri)
if err != nil {
return serializer.NewError(serializer.CodeParamErr, "unknown uri", err)
}
uriStr := uri.String()
user.Settings.Pined = lo.Filter(user.Settings.Pined, func(pin types.PinedFile, index int) bool {
return pin.Uri != uriStr
})
if err := userClient.SaveSettings(c, user); err != nil {
return serializer.NewError(serializer.CodeDBError, "failed to save settings", err)
}
return nil
}