143 lines
3.7 KiB
Go
143 lines
3.7 KiB
Go
package rest
|
|
|
|
import (
|
|
"github.com/eyebluecn/tank/code/core"
|
|
"github.com/eyebluecn/tank/code/tool/builder"
|
|
"github.com/eyebluecn/tank/code/tool/i18n"
|
|
"github.com/eyebluecn/tank/code/tool/result"
|
|
"math"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
//@Service
|
|
type ShareService struct {
|
|
BaseBean
|
|
shareDao *ShareDao
|
|
matterDao *MatterDao
|
|
bridgeDao *BridgeDao
|
|
userDao *UserDao
|
|
}
|
|
|
|
func (this *ShareService) Init() {
|
|
this.BaseBean.Init()
|
|
|
|
b := core.CONTEXT.GetBean(this.shareDao)
|
|
if b, ok := b.(*ShareDao); ok {
|
|
this.shareDao = b
|
|
}
|
|
|
|
b = core.CONTEXT.GetBean(this.matterDao)
|
|
if b, ok := b.(*MatterDao); ok {
|
|
this.matterDao = b
|
|
}
|
|
|
|
b = core.CONTEXT.GetBean(this.bridgeDao)
|
|
if b, ok := b.(*BridgeDao); ok {
|
|
this.bridgeDao = b
|
|
}
|
|
|
|
b = core.CONTEXT.GetBean(this.userDao)
|
|
if b, ok := b.(*UserDao); ok {
|
|
this.userDao = b
|
|
}
|
|
|
|
}
|
|
|
|
func (this *ShareService) Detail(uuid string) *Share {
|
|
|
|
share := this.shareDao.CheckByUuid(uuid)
|
|
|
|
return share
|
|
}
|
|
|
|
// check whether shareUuid and shareCode matches. check whether user can access.
|
|
func (this *ShareService) CheckShare(request *http.Request, shareUuid string, code string, user *User) *Share {
|
|
|
|
share := this.shareDao.CheckByUuid(shareUuid)
|
|
//if self, not need shareCode
|
|
if user == nil || user.Uuid != share.UserUuid {
|
|
//if not login or not self's share, shareCode is required.
|
|
if code == "" {
|
|
panic(result.CustomWebResultI18n(request, result.NEED_SHARE_CODE, i18n.ShareCodeRequired))
|
|
} else if share.Code != code {
|
|
panic(result.CustomWebResultI18n(request, result.SHARE_CODE_ERROR, i18n.ShareCodeError))
|
|
} else {
|
|
if !share.ExpireInfinity {
|
|
if share.ExpireTime.Before(time.Now()) {
|
|
panic(result.BadRequest("share expired"))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return share
|
|
}
|
|
|
|
//check whether a user can access a matter. shareRootUuid is matter's parent(or parent's parent and so on)
|
|
func (this *ShareService) ValidateMatter(request *http.Request, shareUuid string, code string, user *User, shareRootUuid string, matter *Matter) {
|
|
|
|
if matter == nil {
|
|
panic(result.Unauthorized("matter cannot be nil"))
|
|
}
|
|
|
|
//if self's matter, ok.
|
|
if user != nil && matter.UserUuid == user.Uuid {
|
|
return
|
|
}
|
|
|
|
if shareUuid == "" || code == "" || shareRootUuid == "" {
|
|
panic(result.Unauthorized("shareUuid,code,shareRootUuid cannot be null"))
|
|
}
|
|
|
|
share := this.CheckShare(request, shareUuid, code, user)
|
|
|
|
shareOwner := this.userDao.FindByUuid(share.UserUuid)
|
|
if shareOwner.Status == USER_STATUS_DISABLED {
|
|
panic(result.BadRequestI18n(request, i18n.UserDisabled))
|
|
}
|
|
|
|
//if shareRootUuid is root. Bridge must has record.
|
|
if shareRootUuid == MATTER_ROOT {
|
|
|
|
this.bridgeDao.CheckByShareUuidAndMatterUuid(share.Uuid, matter.Uuid)
|
|
|
|
} else {
|
|
//check whether shareRootMatter is being sharing
|
|
shareRootMatter := this.matterDao.CheckByUuid(shareRootUuid)
|
|
this.bridgeDao.CheckByShareUuidAndMatterUuid(share.Uuid, shareRootMatter.Uuid)
|
|
|
|
// shareRootMatter is ancestor of matter.
|
|
child := strings.HasPrefix(matter.Path, shareRootMatter.Path)
|
|
if !child {
|
|
panic(result.BadRequest("%s is not %s's children", matter.Uuid, shareRootUuid))
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//delete user's shares and corresponding bridges.
|
|
func (this *ShareService) DeleteSharesByUser(request *http.Request, currentUser *User) {
|
|
|
|
//delete share and bridges.
|
|
pageSize := 100
|
|
var sortArray []builder.OrderPair
|
|
count, _ := this.shareDao.PlainPage(0, pageSize, currentUser.Uuid, sortArray)
|
|
if count > 0 {
|
|
var totalPages = int(math.Ceil(float64(count) / float64(pageSize)))
|
|
|
|
var page int
|
|
for page = 0; page < totalPages; page++ {
|
|
_, shares := this.shareDao.PlainPage(0, pageSize, currentUser.Uuid, sortArray)
|
|
for _, share := range shares {
|
|
this.bridgeDao.DeleteByShareUuid(share.Uuid)
|
|
|
|
//delete this share
|
|
this.shareDao.Delete(share)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|