package share import ( "context" "time" "github.com/cloudreve/Cloudreve/v4/application/dependency" "github.com/cloudreve/Cloudreve/v4/ent" "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/filemanager/manager" "github.com/cloudreve/Cloudreve/v4/pkg/serializer" "github.com/cloudreve/Cloudreve/v4/service/explorer" "github.com/gin-gonic/gin" ) type ( // ShareCreateService 创建新分享服务 ShareCreateService struct { Uri string `json:"uri" binding:"required"` IsPrivate bool `json:"is_private"` Password string `json:"password" binding:"omitempty,max=32,alphanum"` RemainDownloads int `json:"downloads"` Expire int `json:"expire"` ShareView bool `json:"share_view"` ShowReadMe bool `json:"show_readme"` } ShareCreateParamCtx struct{} ) // Upsert 创建或更新分享 func (service *ShareCreateService) Upsert(c *gin.Context, existed int) (string, error) { dep := dependency.FromContext(c) user := inventory.UserFromContext(c) m := manager.NewFileManager(dep, user) defer m.Recycle() // Check group permission for creating share link if !user.Edges.Group.Permissions.Enabled(int(types.GroupPermissionShare)) { return "", serializer.NewError(serializer.CodeGroupNotAllowed, "Group permission denied", nil) } uri, err := fs.NewUriFromString(service.Uri) if err != nil { return "", serializer.NewError(serializer.CodeParamErr, "unknown uri", err) } var expires *time.Time if service.Expire > 0 { expires = new(time.Time) *expires = time.Now().Add(time.Duration(service.Expire) * time.Second) } share, err := m.CreateOrUpdateShare(c, uri, &manager.CreateShareArgs{ IsPrivate: service.IsPrivate, Password: service.Password, RemainDownloads: service.RemainDownloads, Expire: expires, ExistedShareID: existed, ShareView: service.ShareView, ShowReadMe: service.ShowReadMe, }) if err != nil { return "", err } base := dep.SettingProvider().SiteURL(c) return explorer.BuildShareLink(share, dep.HashIDEncoder(), base, true), nil } func DeleteShare(c *gin.Context, shareId int) error { dep := dependency.FromContext(c) user := inventory.UserFromContext(c) shareClient := dep.ShareClient() ctx := context.WithValue(c, inventory.LoadShareFile{}, true) var ( share *ent.Share err error ) if user.Edges.Group.Permissions.Enabled(int(types.GroupPermissionIsAdmin)) { share, err = shareClient.GetByID(ctx, shareId) } else { share, err = shareClient.GetByIDUser(ctx, shareId, user.ID) } if err != nil { return serializer.NewError(serializer.CodeNotFound, "share not found", err) } if err := shareClient.Delete(c, share.ID); err != nil { return serializer.NewError(serializer.CodeDBError, "Failed to delete share", err) } return nil }