feat: finish the basic file operation.

This commit is contained in:
lishuang
2023-05-27 15:43:38 +08:00
parent 9e6d2c1043
commit a9a3b524eb
12 changed files with 273 additions and 212 deletions
+2 -2
View File
@@ -236,7 +236,7 @@ func (this *AlienController) Upload(writer http.ResponseWriter, request *http.Re
panic(result.BadRequest("file size doesn't the one in uploadToken"))
}
dirMatter := this.matterDao.CheckWithRootByUuid(uploadToken.FolderUuid, user, space)
dirMatter := this.matterDao.CheckWithRootByUuid(uploadToken.FolderUuid, space)
matter := this.matterService.Upload(request, file, user, space, dirMatter, uploadToken.Filename, uploadToken.Privacy)
@@ -273,7 +273,7 @@ func (this *AlienController) CrawlToken(writer http.ResponseWriter, request *htt
user := this.userDao.CheckByUuid(uploadToken.UserUuid)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
dirMatter := this.matterDao.CheckWithRootByUuid(uploadToken.FolderUuid, user, space)
dirMatter := this.matterDao.CheckWithRootByUuid(uploadToken.FolderUuid, space)
matter := this.matterService.AtomicCrawl(request, url, uploadToken.Filename, user, space, dirMatter, uploadToken.Privacy)
+14 -3
View File
@@ -13,9 +13,10 @@ import (
type BaseController struct {
BaseBean
userDao *UserDao
spaceDao *SpaceDao
sessionDao *SessionDao
userDao *UserDao
spaceDao *SpaceDao
spaceService *SpaceService
sessionDao *SessionDao
}
func (this *BaseController) Init() {
@@ -27,6 +28,16 @@ func (this *BaseController) Init() {
this.userDao = b
}
b = core.CONTEXT.GetBean(this.spaceDao)
if b, ok := b.(*SpaceDao); ok {
this.spaceDao = b
}
b = core.CONTEXT.GetBean(this.spaceService)
if b, ok := b.(*SpaceService); ok {
this.spaceService = b
}
b = core.CONTEXT.GetBean(this.sessionDao)
if b, ok := b.(*SessionDao); ok {
this.sessionDao = b
+1 -1
View File
@@ -413,7 +413,7 @@ func (this *DavService) HandleMkcol(writer http.ResponseWriter, request *http.Re
panic(result.CustomWebResult(result.METHOD_NOT_ALLOWED, fmt.Sprintf("%s file already exists", dirPath)))
}
this.matterService.AtomicCreateDirectory(request, dirMatter, thisDirName, user)
this.matterService.AtomicCreateDirectory(request, dirMatter, thisDirName, user, space)
}
+117 -150
View File
@@ -5,8 +5,8 @@ import (
"github.com/eyebluecn/tank/code/tool/builder"
"github.com/eyebluecn/tank/code/tool/i18n"
"github.com/eyebluecn/tank/code/tool/result"
"github.com/eyebluecn/tank/code/tool/util"
"net/http"
"strconv"
"strings"
)
@@ -76,6 +76,8 @@ func (this *MatterController) Init() {
func (this *MatterController) RegisterRoutes() map[string]func(writer http.ResponseWriter, request *http.Request) {
routeMap := make(map[string]func(writer http.ResponseWriter, request *http.Request))
routeMap["/api/matter/detail"] = this.Wrap(this.Detail, USER_ROLE_USER)
routeMap["/api/matter/page"] = this.Wrap(this.Page, USER_ROLE_GUEST)
routeMap["/api/matter/create/directory"] = this.Wrap(this.CreateDirectory, USER_ROLE_USER)
routeMap["/api/matter/upload"] = this.Wrap(this.Upload, USER_ROLE_USER)
@@ -90,8 +92,6 @@ func (this *MatterController) RegisterRoutes() map[string]func(writer http.Respo
routeMap["/api/matter/rename"] = this.Wrap(this.Rename, USER_ROLE_USER)
routeMap["/api/matter/change/privacy"] = this.Wrap(this.ChangePrivacy, USER_ROLE_USER)
routeMap["/api/matter/move"] = this.Wrap(this.Move, USER_ROLE_USER)
routeMap["/api/matter/detail"] = this.Wrap(this.Detail, USER_ROLE_USER)
routeMap["/api/matter/page"] = this.Wrap(this.Page, USER_ROLE_GUEST)
//mirror local files.
routeMap["/api/matter/mirror"] = this.Wrap(this.Mirror, USER_ROLE_USER)
@@ -102,15 +102,14 @@ func (this *MatterController) RegisterRoutes() map[string]func(writer http.Respo
func (this *MatterController) Detail(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
uuid := util.ExtractRequestString(request, "uuid")
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
matter := this.matterService.Detail(request, uuid)
user := this.checkUser(request)
if matter.UserUuid != user.Uuid {
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -120,29 +119,32 @@ func (this *MatterController) Detail(writer http.ResponseWriter, request *http.R
func (this *MatterController) Page(writer http.ResponseWriter, request *http.Request) *result.WebResult {
pageStr := request.FormValue("page")
pageSizeStr := request.FormValue("pageSize")
orderCreateTime := request.FormValue("orderCreateTime")
orderUpdateTime := request.FormValue("orderUpdateTime")
orderDeleteTime := request.FormValue("orderDeleteTime")
orderSort := request.FormValue("orderSort")
orderTimes := request.FormValue("orderTimes")
page := util.ExtractRequestOptionalInt(request, "page", 0)
pageSize := util.ExtractRequestOptionalInt(request, "pageSize", 200)
orderCreateTime := util.ExtractRequestOptionalString(request, "orderCreateTime", "")
orderUpdateTime := util.ExtractRequestOptionalString(request, "orderUpdateTime", "")
orderDeleteTime := util.ExtractRequestOptionalString(request, "orderDeleteTime", "")
orderSort := util.ExtractRequestOptionalString(request, "orderSort", "")
orderTimes := util.ExtractRequestOptionalString(request, "orderTimes", "")
puuid := util.ExtractRequestOptionalString(request, "puuid", "")
name := util.ExtractRequestOptionalString(request, "name", "")
dir := util.ExtractRequestOptionalString(request, "dir", "")
deleted := util.ExtractRequestOptionalString(request, "deleted", "")
orderDir := util.ExtractRequestOptionalString(request, "orderDir", "")
orderSize := util.ExtractRequestOptionalString(request, "orderSize", "")
orderName := util.ExtractRequestOptionalString(request, "orderName", "")
extensionsStr := util.ExtractRequestOptionalString(request, "extensions", "")
//auth by shareUuid.
shareUuid := util.ExtractRequestOptionalString(request, "shareUuid", "")
shareCode := util.ExtractRequestOptionalString(request, "shareCode", "")
shareRootUuid := util.ExtractRequestOptionalString(request, "shareRootUuid", "")
puuid := request.FormValue("puuid")
name := request.FormValue("name")
dir := request.FormValue("dir")
deleted := request.FormValue("deleted")
orderDir := request.FormValue("orderDir")
orderSize := request.FormValue("orderSize")
orderName := request.FormValue("orderName")
extensionsStr := request.FormValue("extensions")
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckReadableByUuid(request, user, spaceUuid)
var userUuid string
//auth by shareUuid.
shareUuid := request.FormValue("shareUuid")
shareCode := request.FormValue("shareCode")
shareRootUuid := request.FormValue("shareRootUuid")
if shareUuid != "" {
if puuid == "" {
@@ -166,19 +168,6 @@ func (this *MatterController) Page(writer http.ResponseWriter, request *http.Req
}
var page int
if pageStr != "" {
page, _ = strconv.Atoi(pageStr)
}
pageSize := 200
if pageSizeStr != "" {
tmp, err := strconv.Atoi(pageSizeStr)
if err == nil {
pageSize = tmp
}
}
var extensions []string
if extensionsStr != "" {
extensions = strings.Split(extensionsStr, ",")
@@ -219,29 +208,33 @@ func (this *MatterController) Page(writer http.ResponseWriter, request *http.Req
},
}
pager := this.matterDao.Page(page, pageSize, puuid, userUuid, name, dir, deleted, extensions, sortArray)
pager := this.matterDao.Page(page, pageSize, puuid, userUuid, space.Uuid, name, dir, deleted, extensions, sortArray)
return this.Success(pager)
}
func (this *MatterController) CreateDirectory(writer http.ResponseWriter, request *http.Request) *result.WebResult {
puuid := request.FormValue("puuid")
name := request.FormValue("name")
puuid := util.ExtractRequestString(request, "puuid")
name := util.ExtractRequestString(request, "name")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
var dirMatter = this.matterDao.CheckWithRootByUuid(puuid, user, space)
var dirMatter = this.matterDao.CheckWithRootByUuid(puuid, space)
matter := this.matterService.AtomicCreateDirectory(request, dirMatter, name, user)
matter := this.matterService.AtomicCreateDirectory(request, dirMatter, name, user, space)
return this.Success(matter)
}
func (this *MatterController) Upload(writer http.ResponseWriter, request *http.Request) *result.WebResult {
puuid := util.ExtractRequestString(request, "puuid")
privacy := util.ExtractRequestOptionalBool(request, "privacy", true)
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
puuid := request.FormValue("puuid")
privacyStr := request.FormValue("privacy")
file, handler, err := request.FormFile("file")
this.PanicError(err)
defer func() {
@@ -249,15 +242,10 @@ func (this *MatterController) Upload(writer http.ResponseWriter, request *http.R
this.PanicError(err)
}()
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
privacy := privacyStr == TRUE
err = request.ParseMultipartForm(32 << 20)
this.PanicError(err)
//for IE browser. filename may contains filepath.
//for IE browser. filename may contain filepath.
fileName := handler.Filename
pos := strings.LastIndex(fileName, "\\")
if pos != -1 {
@@ -268,7 +256,7 @@ func (this *MatterController) Upload(writer http.ResponseWriter, request *http.R
fileName = fileName[pos+1:]
}
dirMatter := this.matterDao.CheckWithRootByUuid(puuid, user, space)
dirMatter := this.matterDao.CheckWithRootByUuid(puuid, space)
//support upload simultaneously
matter := this.matterService.Upload(request, file, user, space, dirMatter, fileName, privacy)
@@ -279,22 +267,20 @@ func (this *MatterController) Upload(writer http.ResponseWriter, request *http.R
// crawl a file by url.
func (this *MatterController) Crawl(writer http.ResponseWriter, request *http.Request) *result.WebResult {
url := request.FormValue("url")
destPath := request.FormValue("destPath")
filename := request.FormValue("filename")
url := util.ExtractRequestString(request, "url")
destPath := util.ExtractRequestString(request, "destPath")
filename := util.ExtractRequestString(request, "filename")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
dirMatter := this.matterService.CreateDirectories(request, user, space, destPath)
if url == "" || (!strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://")) {
panic(" url must start with http:// or https://")
}
if filename == "" {
panic("filename cannot be null")
}
matter := this.matterService.AtomicCrawl(request, url, filename, user, space, dirMatter, true)
return this.Success(matter)
@@ -303,16 +289,14 @@ func (this *MatterController) Crawl(writer http.ResponseWriter, request *http.Re
// soft delete.
func (this *MatterController) SoftDelete(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
matter := this.matterDao.CheckByUuid(uuid)
uuid := util.ExtractRequestString(request, "uuid")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
if matter.UserUuid != user.Uuid {
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
matter := this.matterDao.CheckByUuid(uuid)
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -323,12 +307,11 @@ func (this *MatterController) SoftDelete(writer http.ResponseWriter, request *ht
func (this *MatterController) SoftDeleteBatch(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuids := request.FormValue("uuids")
if uuids == "" {
panic(result.BadRequest("uuids cannot be null"))
}
uuids := util.ExtractRequestString(request, "uuids")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
uuidArray := strings.Split(uuids, ",")
@@ -359,15 +342,15 @@ func (this *MatterController) SoftDeleteBatch(writer http.ResponseWriter, reques
// recovery delete.
func (this *MatterController) Recovery(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
uuid := util.ExtractRequestString(request, "uuid")
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
matter := this.matterDao.CheckByUuid(uuid)
user := this.checkUser(request)
if matter.UserUuid != user.Uuid {
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -378,11 +361,11 @@ func (this *MatterController) Recovery(writer http.ResponseWriter, request *http
// recovery batch.
func (this *MatterController) RecoveryBatch(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuids := util.ExtractRequestString(request, "uuids")
uuids := request.FormValue("uuids")
if uuids == "" {
panic(result.BadRequest("uuids cannot be null"))
}
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
uuidArray := strings.Split(uuids, ",")
@@ -395,8 +378,7 @@ func (this *MatterController) RecoveryBatch(writer http.ResponseWriter, request
continue
}
user := this.checkUser(request)
if matter.UserUuid != user.Uuid {
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -410,16 +392,14 @@ func (this *MatterController) RecoveryBatch(writer http.ResponseWriter, request
// complete delete.
func (this *MatterController) Delete(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
matter := this.matterDao.CheckByUuid(uuid)
uuid := util.ExtractRequestString(request, "uuid")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
if matter.UserUuid != user.Uuid {
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
matter := this.matterDao.CheckByUuid(uuid)
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -430,14 +410,13 @@ func (this *MatterController) Delete(writer http.ResponseWriter, request *http.R
func (this *MatterController) DeleteBatch(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuids := request.FormValue("uuids")
if uuids == "" {
panic(result.BadRequest("uuids cannot be null"))
}
uuids := util.ExtractRequestString(request, "uuids")
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
uuidArray := strings.Split(uuids, ",")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
matters := make([]*Matter, 0)
for _, uuid := range uuidArray {
@@ -448,7 +427,7 @@ func (this *MatterController) DeleteBatch(writer http.ResponseWriter, request *h
continue
}
if matter.UserUuid != user.Uuid {
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -473,14 +452,16 @@ func (this *MatterController) CleanExpiredDeletedMatters(writer http.ResponseWri
func (this *MatterController) Rename(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
name := request.FormValue("name")
uuid := util.ExtractRequestString(request, "uuid")
name := util.ExtractRequestString(request, "name")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
matter := this.matterDao.CheckByUuid(uuid)
if matter.UserUuid != user.Uuid {
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -490,12 +471,13 @@ func (this *MatterController) Rename(writer http.ResponseWriter, request *http.R
}
func (this *MatterController) ChangePrivacy(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
privacyStr := request.FormValue("privacy")
privacy := false
if privacyStr == TRUE {
privacy = true
}
uuid := util.ExtractRequestString(request, "uuid")
privacy := util.ExtractRequestOptionalBool(request, "privacy", false)
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
matter := this.matterDao.CheckByUuid(uuid)
@@ -507,8 +489,7 @@ func (this *MatterController) ChangePrivacy(writer http.ResponseWriter, request
panic(result.BadRequest("not changed. Invalid operation."))
}
user := this.checkUser(request)
if matter.UserUuid != user.Uuid {
if matter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -519,25 +500,21 @@ func (this *MatterController) ChangePrivacy(writer http.ResponseWriter, request
}
func (this *MatterController) Move(writer http.ResponseWriter, request *http.Request) *result.WebResult {
srcUuidsStr := request.FormValue("srcUuids")
destUuid := request.FormValue("destUuid")
srcUuidsStr := util.ExtractRequestString(request, "srcUuids")
destUuid := util.ExtractRequestString(request, "destUuid")
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
var srcUuids []string
if srcUuidsStr == "" {
panic(result.BadRequest("srcUuids cannot be null"))
} else {
srcUuids = strings.Split(srcUuidsStr, ",")
}
srcUuids = strings.Split(srcUuidsStr, ",")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
var destMatter = this.matterDao.CheckWithRootByUuid(destUuid, user, space)
var destMatter = this.matterDao.CheckWithRootByUuid(destUuid, space)
if !destMatter.Dir {
panic(result.BadRequest("destination is not a directory"))
}
if destMatter.UserUuid != user.Uuid {
if destMatter.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
}
@@ -579,21 +556,13 @@ func (this *MatterController) Move(writer http.ResponseWriter, request *http.Req
// mirror local files to EyeblueTank
func (this *MatterController) Mirror(writer http.ResponseWriter, request *http.Request) *result.WebResult {
srcPath := request.FormValue("srcPath")
destPath := request.FormValue("destPath")
overwriteStr := request.FormValue("overwrite")
srcPath := util.ExtractRequestString(request, "srcPath")
destPath := util.ExtractRequestString(request, "destPath")
overwrite := util.ExtractRequestOptionalBool(request, "overwrite", false)
if srcPath == "" {
panic(result.BadRequest("srcPath cannot be null"))
}
overwrite := false
if overwriteStr == TRUE {
overwrite = true
}
user := this.userDao.checkUser(request)
space := this.spaceDao.CheckByUuid(user.SpaceUuid)
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
this.matterService.AtomicMirror(request, srcPath, destPath, overwrite, user, space)
@@ -603,11 +572,10 @@ func (this *MatterController) Mirror(writer http.ResponseWriter, request *http.R
// download zip.
func (this *MatterController) Zip(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuids := request.FormValue("uuids")
if uuids == "" {
panic(result.BadRequest("uuids cannot be null"))
}
uuids := util.ExtractRequestString(request, "uuids")
user := this.checkUser(request)
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
uuidArray := strings.Split(uuids, ",")
@@ -623,11 +591,10 @@ func (this *MatterController) Zip(writer http.ResponseWriter, request *http.Requ
}
}
user := this.checkUser(request)
puuid := matters[0].Puuid
for _, m := range matters {
if m.UserUuid != user.Uuid {
if m.SpaceUuid != space.Uuid {
panic(result.UNAUTHORIZED)
} else if m.Puuid != puuid {
panic(result.BadRequest("puuid not same"))
+15 -9
View File
@@ -56,7 +56,7 @@ func (this *MatterDao) CheckByUuid(uuid string) *Matter {
}
// find by uuid. if uuid=root, then return the Root Matter
func (this *MatterDao) CheckWithRootByUuid(uuid string, user *User, space *Space) *Matter {
func (this *MatterDao) CheckWithRootByUuid(uuid string, space *Space) *Matter {
if uuid == "" {
panic(result.BadRequest("uuid cannot be null."))
@@ -64,10 +64,10 @@ func (this *MatterDao) CheckWithRootByUuid(uuid string, user *User, space *Space
var matter *Matter
if uuid == MATTER_ROOT {
if user == nil {
if space == nil {
panic(result.BadRequest("user cannot be null."))
}
matter = NewRootMatter(user, space)
matter = NewRootMatter(space)
} else {
matter = this.CheckByUuid(uuid)
}
@@ -85,7 +85,7 @@ func (this *MatterDao) CheckWithRootByPath(path string, user *User, space *Space
}
if path == "" || path == "/" {
matter = NewRootMatter(user, space)
matter = NewRootMatter(space)
} else {
matter = this.checkByUserUuidAndPath(user.Uuid, path)
}
@@ -103,7 +103,7 @@ func (this *MatterDao) FindWithRootByPath(path string, user *User, space *Space)
}
if path == "" || path == "/" {
matter = NewRootMatter(user, space)
matter = NewRootMatter(space)
} else {
matter = this.findByUserUuidAndPath(user.Uuid, path)
}
@@ -290,6 +290,7 @@ func (this *MatterDao) PlainPage(
pageSize int,
puuid string,
userUuid string,
spaceUuid string,
name string,
dir string,
deleted string,
@@ -307,6 +308,10 @@ func (this *MatterDao) PlainPage(
wp = wp.And(&builder.WherePair{Query: "user_uuid = ?", Args: []interface{}{userUuid}})
}
if spaceUuid != "" {
wp = wp.And(&builder.WherePair{Query: "space_uuid = ?", Args: []interface{}{spaceUuid}})
}
if name != "" {
wp = wp.And(&builder.WherePair{Query: "name LIKE ?", Args: []interface{}{"%" + name + "%"}})
}
@@ -350,9 +355,9 @@ func (this *MatterDao) PlainPage(
return int(count), matters
}
func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, name string, dir string, deleted string, extensions []string, sortArray []builder.OrderPair) *Pager {
func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, spaceUuid string, name string, dir string, deleted string, extensions []string, sortArray []builder.OrderPair) *Pager {
count, matters := this.PlainPage(page, pageSize, puuid, userUuid, name, dir, deleted, nil, extensions, sortArray)
count, matters := this.PlainPage(page, pageSize, puuid, userUuid, spaceUuid, name, dir, deleted, nil, extensions, sortArray)
pager := NewPager(page, pageSize, count, matters)
return pager
@@ -362,6 +367,7 @@ func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid strin
func (this *MatterDao) PageHandle(
puuid string,
userUuid string,
spaceUuid string,
name string,
dir string,
deleted string,
@@ -379,13 +385,13 @@ func (this *MatterDao) PageHandle(
}
}
count, _ := this.PlainPage(0, pageSize, puuid, userUuid, name, dir, deleted, deleteTimeBefore, nil, sortArray)
count, _ := this.PlainPage(0, pageSize, puuid, userUuid, spaceUuid, name, dir, deleted, deleteTimeBefore, nil, sortArray)
if count > 0 {
var totalPages = int(math.Ceil(float64(count) / float64(pageSize)))
var page int
for page = 0; page < totalPages; page++ {
_, matters := this.PlainPage(0, pageSize, puuid, userUuid, name, dir, deleted, deleteTimeBefore, nil, sortArray)
_, matters := this.PlainPage(0, pageSize, puuid, userUuid, spaceUuid, name, dir, deleted, deleteTimeBefore, nil, sortArray)
for _, matter := range matters {
fun(matter)
}
+6 -5
View File
@@ -64,16 +64,17 @@ func (this *Matter) MimeType() string {
}
// Create a root matter. It's convenient for copy and move
func NewRootMatter(user *User, space *Space) *Matter {
func NewRootMatter(space *Space) *Matter {
matter := &Matter{}
matter.Uuid = MATTER_ROOT
matter.UserUuid = user.Uuid
matter.UserUuid = space.UserUuid
matter.SpaceUuid = space.Uuid
matter.SpaceName = space.Name
matter.Dir = true
matter.Path = ""
matter.CreateTime = user.CreateTime
matter.UpdateTime = user.UpdateTime
matter.VisitTime = user.UpdateTime
matter.CreateTime = space.CreateTime
matter.UpdateTime = space.UpdateTime
matter.VisitTime = space.UpdateTime
return matter
}
+20 -18
View File
@@ -438,6 +438,7 @@ func (this *MatterService) createNonDirMatter(dirMatter *Matter, filename string
Puuid: dirMatter.Uuid,
UserUuid: user.Uuid,
SpaceName: space.Name,
SpaceUuid: space.Uuid,
Dir: false,
Name: filename,
Md5: "",
@@ -513,7 +514,7 @@ func (this *MatterService) ComputeAllDirSize(user *User, space *Space) {
this.logger.Info("Compute all dir's size for user %s %s", user.Uuid, user.Username)
rootMatter := NewRootMatter(user, space)
rootMatter := NewRootMatter(space)
this.ComputeDirSize(rootMatter, user, space)
}
@@ -553,7 +554,7 @@ func (this *MatterService) ComputeDirSize(dirMatter *Matter, user *User, space *
}
// inner create directory.
func (this *MatterService) createDirectory(request *http.Request, dirMatter *Matter, name string, user *User) *Matter {
func (this *MatterService) createDirectory(request *http.Request, dirMatter *Matter, name string, user *User, space *Space) *Matter {
if dirMatter == nil {
panic(result.BadRequest("dirMatter cannot be nil"))
@@ -567,9 +568,9 @@ func (this *MatterService) createDirectory(request *http.Request, dirMatter *Mat
panic(result.BadRequest("Dir has been deleted. Cannot create dir under it."))
}
if dirMatter.UserUuid != user.Uuid {
if dirMatter.SpaceUuid != space.Uuid {
panic(result.BadRequest("file's user not the same"))
panic(result.BadRequest("file's space not the same"))
}
name = strings.TrimSpace(name)
@@ -599,7 +600,7 @@ func (this *MatterService) createDirectory(request *http.Request, dirMatter *Mat
panic(result.BadRequestI18n(request, i18n.MatterDepthExceedLimit, len(parts), MATTER_NAME_MAX_DEPTH))
}
absolutePath := GetSpaceMatterRootDir(user.Username) + dirMatter.Path + "/" + name
absolutePath := GetSpaceMatterRootDir(space.Name) + dirMatter.Path + "/" + name
relativePath := dirMatter.Path + "/" + name
@@ -611,6 +612,7 @@ func (this *MatterService) createDirectory(request *http.Request, dirMatter *Mat
matter = &Matter{
Puuid: dirMatter.Uuid,
UserUuid: user.Uuid,
SpaceUuid: space.Uuid,
SpaceName: user.Username,
Dir: true,
Name: name,
@@ -623,7 +625,7 @@ func (this *MatterService) createDirectory(request *http.Request, dirMatter *Mat
return matter
}
func (this *MatterService) AtomicCreateDirectory(request *http.Request, dirMatter *Matter, name string, user *User) *Matter {
func (this *MatterService) AtomicCreateDirectory(request *http.Request, dirMatter *Matter, name string, user *User, space *Space) *Matter {
if dirMatter.Deleted {
panic(result.BadRequest("Dir has been deleted. Cannot create sub dir under it."))
@@ -632,7 +634,7 @@ func (this *MatterService) AtomicCreateDirectory(request *http.Request, dirMatte
this.userService.MatterLock(user.Uuid)
defer this.userService.MatterUnlock(user.Uuid)
matter := this.createDirectory(request, dirMatter, name, user)
matter := this.createDirectory(request, dirMatter, name, user, space)
return matter
}
@@ -999,7 +1001,7 @@ func (this *MatterService) mirror(request *http.Request, srcPath string, destDir
srcDirMatter := this.matterDao.FindByUserUuidAndPuuidAndDirAndName(user.Uuid, destDirMatter.Uuid, TRUE, fileStat.Name())
if srcDirMatter == nil {
srcDirMatter = this.createDirectory(request, destDirMatter, fileStat.Name(), user)
srcDirMatter = this.createDirectory(request, destDirMatter, fileStat.Name(), user, space)
}
fileInfos, err := ioutil.ReadDir(srcPath)
@@ -1046,7 +1048,7 @@ func (this *MatterService) CreateDirectories(request *http.Request, user *User,
dirPath = path.Clean(dirPath)
if dirPath == "/" {
return NewRootMatter(user, space)
return NewRootMatter(space)
}
//ignore the last slash.
@@ -1071,11 +1073,11 @@ func (this *MatterService) CreateDirectories(request *http.Request, user *User,
//ignore the first element.
if k == 0 {
dirMatter = NewRootMatter(user, space)
dirMatter = NewRootMatter(space)
continue
}
dirMatter = this.createDirectory(request, dirMatter, name, user)
dirMatter = this.createDirectory(request, dirMatter, name, user, space)
}
return dirMatter
@@ -1190,7 +1192,7 @@ func (this *MatterService) DeleteByPhysics(request *http.Request, user *User, sp
}
//scan user's file. scan level by level.
rootMatter := NewRootMatter(user, space)
rootMatter := NewRootMatter(space)
this.deleteFolderByPhysics(request, rootMatter, user, space)
}
@@ -1198,7 +1200,7 @@ func (this *MatterService) DeleteByPhysics(request *http.Request, user *User, sp
func (this *MatterService) deleteFolderByPhysics(request *http.Request, dirMatter *Matter, user *User, space *Space) {
//scan user's file. scan level by level.
this.matterDao.PageHandle(dirMatter.Uuid, user.Uuid, "", "", "", nil, nil, func(matter *Matter) {
this.matterDao.PageHandle(dirMatter.Uuid, "", space.Uuid, "", "", "", nil, nil, func(matter *Matter) {
if matter.Dir {
//delete children first.
@@ -1232,7 +1234,7 @@ func (this *MatterService) ScanPhysics(request *http.Request, user *User, space
panic(result.BadRequest("cannot get root file info."))
}
rootMatter := NewRootMatter(user, space)
rootMatter := NewRootMatter(space)
this.scanPhysicsFolder(request, rootFileInfo, rootMatter, user, space)
}
@@ -1242,7 +1244,7 @@ func (this *MatterService) scanPhysicsFolder(request *http.Request, dirInfo os.F
}
//fetch all matters under this folder.
_, matters := this.matterDao.PlainPage(0, 1000, dirMatter.Uuid, user.Uuid, "", "", "", nil, nil, nil)
_, matters := this.matterDao.PlainPage(0, 1000, dirMatter.Uuid, "", space.Uuid, "", "", "", nil, nil, nil)
nameMatterMap := make(map[string]*Matter)
for _, m := range matters {
nameMatterMap[m.Name] = m
@@ -1286,7 +1288,7 @@ func (this *MatterService) scanPhysicsFolder(request *http.Request, dirInfo os.F
if fileInfo.IsDir() {
//create folder.
matter = this.createDirectory(request, dirMatter, name, user)
matter = this.createDirectory(request, dirMatter, name, user, space)
//recursive scan this folder.
this.scanPhysicsFolder(request, fileInfo, matter, user, space)
@@ -1321,7 +1323,7 @@ func (this *MatterService) CleanExpiredDeletedMatters() {
}
//first remove all the matter(not dir).
this.matterDao.PageHandle("", "", "", FALSE, TRUE, &thenDate, nil, func(matter *Matter) {
this.matterDao.PageHandle("", "", "", "", FALSE, TRUE, &thenDate, nil, func(matter *Matter) {
this.Delete(request, matter, user, space)
})
@@ -1333,7 +1335,7 @@ func (this *MatterService) CleanExpiredDeletedMatters() {
}
//remove all the deleted directories. sort by path.
this.matterDao.PageHandle("", "", "", TRUE, TRUE, &thenDate, sortArray, func(matter *Matter) {
this.matterDao.PageHandle("", "", "", "", TRUE, TRUE, &thenDate, sortArray, func(matter *Matter) {
this.Delete(request, matter, user, space)
})
+8 -8
View File
@@ -70,9 +70,9 @@ func (this *SpaceController) RegisterRoutes() map[string]func(writer http.Respon
func (this *SpaceController) Create(writer http.ResponseWriter, request *http.Request) *result.WebResult {
//space's name
name := util.ExtractRequestString(request, "name", "name is required")
sizeLimit := util.ExtractRequestInt64(request, "sizeLimit", "space's limit size is required")
totalSizeLimit := util.ExtractRequestInt64(request, "totalSizeLimit", "space's total limit size is required")
name := util.ExtractRequestString(request, "name")
sizeLimit := util.ExtractRequestInt64(request, "sizeLimit")
totalSizeLimit := util.ExtractRequestInt64(request, "totalSizeLimit")
//create related space.
space := this.spaceService.CreateSpace(request, name, nil, sizeLimit, totalSizeLimit, SPACE_TYPE_SHARED)
@@ -82,9 +82,9 @@ func (this *SpaceController) Create(writer http.ResponseWriter, request *http.Re
func (this *SpaceController) Edit(writer http.ResponseWriter, request *http.Request) *result.WebResult {
//space's name
uuid := util.ExtractRequestString(request, "uuid", "uuid is required")
sizeLimit := util.ExtractRequestInt64(request, "sizeLimit", "space's limit size is required")
totalSizeLimit := util.ExtractRequestInt64(request, "totalSizeLimit", "space's total limit size is required")
uuid := util.ExtractRequestString(request, "uuid")
sizeLimit := util.ExtractRequestInt64(request, "sizeLimit")
totalSizeLimit := util.ExtractRequestInt64(request, "totalSizeLimit")
space := this.spaceDao.CheckByUuid(uuid)
@@ -99,7 +99,7 @@ func (this *SpaceController) Edit(writer http.ResponseWriter, request *http.Requ
func (this *SpaceController) Delete(writer http.ResponseWriter, request *http.Request) *result.WebResult {
//space's name
uuid := util.ExtractRequestString(request, "uuid", "uuid is required")
uuid := util.ExtractRequestString(request, "uuid")
space := this.spaceDao.CheckByUuid(uuid)
//when space has members, cannot delete.
@@ -118,7 +118,7 @@ func (this *SpaceController) Delete(writer http.ResponseWriter, request *http.Re
func (this *SpaceController) Detail(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := util.ExtractRequestString(request, "uuid", "uuid is required")
uuid := util.ExtractRequestString(request, "uuid")
user := this.checkUser(request)
space := this.spaceDao.CheckByUuid(uuid)
+8 -8
View File
@@ -69,9 +69,9 @@ func (this *SpaceMemberController) RegisterRoutes() map[string]func(writer http.
func (this *SpaceMemberController) Create(writer http.ResponseWriter, request *http.Request) *result.WebResult {
spaceUuid := util.ExtractRequestString(request, "spaceUuid", "spaceUuid is required")
userUuid := util.ExtractRequestString(request, "userUuid", "userUuid is required")
spaceRole := util.ExtractRequestString(request, "spaceRole", "spaceRole is required")
spaceUuid := util.ExtractRequestString(request, "spaceUuid")
userUuid := util.ExtractRequestString(request, "userUuid")
spaceRole := util.ExtractRequestString(request, "spaceRole")
if spaceRole != SPACE_MEMBER_ROLE_READ_ONLY && spaceRole != SPACE_MEMBER_ROLE_READ_WRITE && spaceRole != SPACE_MEMBER_ROLE_ADMIN {
panic("spaceRole is not correct")
@@ -99,8 +99,8 @@ func (this *SpaceMemberController) Create(writer http.ResponseWriter, request *h
}
func (this *SpaceMemberController) Edit(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := util.ExtractRequestString(request, "uuid", "uuid is required")
spaceRole := util.ExtractRequestString(request, "spaceRole", "spaceRole is required")
uuid := util.ExtractRequestString(request, "uuid")
spaceRole := util.ExtractRequestString(request, "spaceRole")
if spaceRole != SPACE_MEMBER_ROLE_READ_ONLY && spaceRole != SPACE_MEMBER_ROLE_READ_WRITE && spaceRole != SPACE_MEMBER_ROLE_ADMIN {
panic("spaceRole is not correct")
@@ -121,7 +121,7 @@ func (this *SpaceMemberController) Edit(writer http.ResponseWriter, request *htt
}
func (this *SpaceMemberController) Delete(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := util.ExtractRequestString(request, "uuid", "uuid is required")
uuid := util.ExtractRequestString(request, "uuid")
spaceMember := this.spaceMemberDao.CheckByUuid(uuid)
user := this.checkUser(request)
@@ -137,7 +137,7 @@ func (this *SpaceMemberController) Delete(writer http.ResponseWriter, request *h
func (this *SpaceMemberController) Detail(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := util.ExtractRequestString(request, "uuid", "uuid is required")
uuid := util.ExtractRequestString(request, "uuid")
spaceMember := this.spaceMemberDao.CheckByUuid(uuid)
@@ -156,7 +156,7 @@ func (this *SpaceMemberController) Page(writer http.ResponseWriter, request *htt
page := util.ExtractRequestOptionalInt(request, "page", 0)
pageSize := util.ExtractRequestOptionalInt(request, "pageSize", 20)
orderCreateTime := util.ExtractRequestOptionalString(request, "orderCreateTime", "")
spaceUuid := util.ExtractRequestString(request, "spaceUuid", "spaceUuid is required")
spaceUuid := util.ExtractRequestString(request, "spaceUuid")
user := this.checkUser(request)
canRead := this.spaceMemberService.canRead(user, spaceUuid)
+40 -4
View File
@@ -11,10 +11,11 @@ import (
// @Service
type SpaceService struct {
BaseBean
spaceDao *SpaceDao
matterDao *MatterDao
bridgeDao *BridgeDao
userDao *UserDao
spaceDao *SpaceDao
spaceMemberService *SpaceMemberService
matterDao *MatterDao
bridgeDao *BridgeDao
userDao *UserDao
}
func (this *SpaceService) Init() {
@@ -25,6 +26,11 @@ func (this *SpaceService) Init() {
this.spaceDao = b
}
b = core.CONTEXT.GetBean(this.spaceMemberService)
if b, ok := b.(*SpaceMemberService); ok {
this.spaceMemberService = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
@@ -98,3 +104,33 @@ func (this *SpaceService) CreateSpace(
return space
}
// checkout a writable space.
func (this *SpaceService) CheckWritableByUuid(request *http.Request, user *User, spaceUuid string) *Space {
space := this.spaceDao.CheckByUuid(spaceUuid)
if space.Type == SPACE_TYPE_PRIVATE && user.Uuid == space.UserUuid {
return space
}
manage := this.spaceMemberService.canManage(user, spaceUuid)
if !manage {
panic(result.BadRequestI18n(request, i18n.PermissionDenied))
}
return space
}
// checkout a readable space.
func (this *SpaceService) CheckReadableByUuid(request *http.Request, user *User, spaceUuid string) *Space {
space := this.spaceDao.CheckByUuid(spaceUuid)
if space.Type == SPACE_TYPE_PRIVATE && user.Uuid == space.UserUuid {
return space
}
manage := this.spaceMemberService.canRead(user, spaceUuid)
if !manage {
panic(result.BadRequestI18n(request, i18n.PermissionDenied))
}
return space
}
+2 -2
View File
@@ -193,8 +193,8 @@ func (this *UserController) Create(writer http.ResponseWriter, request *http.Req
password := request.FormValue("password")
role := request.FormValue("role")
sizeLimit := util.ExtractRequestInt64(request, "sizeLimit", "space's limit size is required")
totalSizeLimit := util.ExtractRequestInt64(request, "totalSizeLimit", "space's total limit size is required")
sizeLimit := util.ExtractRequestInt64(request, "sizeLimit")
totalSizeLimit := util.ExtractRequestInt64(request, "totalSizeLimit")
//validation work.
if m, _ := regexp.MatchString(USERNAME_PATTERN, username); !m {
+40 -2
View File
@@ -1,12 +1,23 @@
package util
import (
"fmt"
"net/http"
"strconv"
)
// param is required. when missing, panic error.
func ExtractRequestString(request *http.Request, key string, errorHint string) string {
func ExtractRequestString(request *http.Request, key string) string {
str := request.FormValue(key)
if str == "" {
panic(fmt.Sprintf("%s is required", key))
} else {
return str
}
}
// param is required. when missing, panic error.
func ExtractRequestStringWithErrorHint(request *http.Request, key string, errorHint string) string {
str := request.FormValue(key)
if str == "" {
panic(errorHint)
@@ -16,7 +27,24 @@ func ExtractRequestString(request *http.Request, key string, errorHint string) s
}
// param is required. when missing, panic error.
func ExtractRequestInt64(request *http.Request, key string, errorHint string) int64 {
func ExtractRequestInt64(request *http.Request, key string) int64 {
keyStr := request.FormValue(key)
var num int64 = 0
if keyStr == "" {
panic(fmt.Sprintf("%s is required", key))
} else {
intVal, err := strconv.Atoi(keyStr)
if err != nil {
panic(err)
}
num = int64(intVal)
return num
}
}
// param is required. when missing, panic error.
func ExtractRequestInt64WithErrorHint(request *http.Request, key string, errorHint string) int64 {
keyStr := request.FormValue(key)
var num int64 = 0
@@ -55,3 +83,13 @@ func ExtractRequestOptionalString(request *http.Request, key string, defaultValu
return str
}
}
// param is required. when missing, panic error.
func ExtractRequestOptionalBool(request *http.Request, key string, defaultValue bool) bool {
str := request.FormValue(key)
if str == "" {
return defaultValue
} else {
return str == "true"
}
}