mirror of https://github.com/cloudreve/Cloudreve
				
				
				
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
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"`
 | 
						|
	}
 | 
						|
	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,
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		return "", err
 | 
						|
	}
 | 
						|
 | 
						|
	base := dep.SettingProvider().SiteURL(c)
 | 
						|
	return explorer.BuildShareLink(share, dep.HashIDEncoder(), base), 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
 | 
						|
}
 |