|
|
|
package share
|
|
|
|
|
|
|
|
import (
|
|
|
|
model "github.com/HFO4/cloudreve/models"
|
|
|
|
"github.com/HFO4/cloudreve/pkg/hashid"
|
|
|
|
"github.com/HFO4/cloudreve/pkg/serializer"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"net/url"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ShareCreateService 创建新分享服务
|
|
|
|
type ShareCreateService struct {
|
|
|
|
SourceID uint `json:"id" binding:"required"`
|
|
|
|
IsDir bool `json:"is_dir"`
|
|
|
|
Password string `json:"password" binding:"max=255"`
|
|
|
|
RemainDownloads int `json:"downloads"`
|
|
|
|
Expire int `json:"expire"`
|
|
|
|
Score int `json:"score" binding:"gte=0"`
|
|
|
|
Preview bool `json:"preview"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create 创建新分享
|
|
|
|
func (service *ShareCreateService) Create(c *gin.Context) serializer.Response {
|
|
|
|
user := currentUser(c)
|
|
|
|
|
|
|
|
// 是否拥有权限
|
|
|
|
if !user.Group.ShareEnabled {
|
|
|
|
return serializer.Err(serializer.CodeNoPermissionErr, "您无权创建分享链接", nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 对象是否存在
|
|
|
|
exist := true
|
|
|
|
if service.IsDir {
|
|
|
|
folder, err := model.GetFoldersByIDs([]uint{service.SourceID}, user.ID)
|
|
|
|
if err != nil || len(folder) == 0 {
|
|
|
|
exist = false
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
file, err := model.GetFilesByIDs([]uint{service.SourceID}, user.ID)
|
|
|
|
if err != nil || len(file) == 0 {
|
|
|
|
exist = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !exist {
|
|
|
|
return serializer.Err(serializer.CodeNotFound, "原始资源不存在", nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
newShare := model.Share{
|
|
|
|
Password: service.Password,
|
|
|
|
IsDir: service.IsDir,
|
|
|
|
UserID: user.ID,
|
|
|
|
SourceID: service.SourceID,
|
|
|
|
Score: service.Score,
|
|
|
|
RemainDownloads: -1,
|
|
|
|
PreviewEnabled: service.Preview,
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果开启了自动过期
|
|
|
|
if service.RemainDownloads > 0 {
|
|
|
|
expires := time.Now().Add(time.Duration(service.Expire) * time.Second)
|
|
|
|
newShare.RemainDownloads = service.RemainDownloads
|
|
|
|
newShare.Expires = &expires
|
|
|
|
}
|
|
|
|
|
|
|
|
// 创建分享
|
|
|
|
id, err := newShare.Create()
|
|
|
|
if err != nil {
|
|
|
|
return serializer.Err(serializer.CodeDBError, "分享链接创建失败", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取分享的唯一id
|
|
|
|
uid := hashid.HashID(id, hashid.ShareID)
|
|
|
|
// 最终得到分享链接
|
|
|
|
siteURL := model.GetSiteURL()
|
|
|
|
sharePath, _ := url.Parse("/#/s/" + uid)
|
|
|
|
shareURL := siteURL.ResolveReference(sharePath)
|
|
|
|
|
|
|
|
return serializer.Response{
|
|
|
|
Code: 0,
|
|
|
|
Data: shareURL.String(),
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func currentUser(c *gin.Context) *model.User {
|
|
|
|
var user *model.User
|
|
|
|
if userCtx, ok := c.Get("user"); ok {
|
|
|
|
user = userCtx.(*model.User)
|
|
|
|
} else {
|
|
|
|
user = model.NewAnonymousUser()
|
|
|
|
}
|
|
|
|
return user
|
|
|
|
}
|