mirror of
https://github.com/eyebluecn/tank.git
synced 2024-04-21 12:32:16 +00:00
feat: finish the basic space things.
This commit is contained in:
@@ -238,7 +238,7 @@ func (this *AlienController) Upload(writer http.ResponseWriter, request *http.Re
|
||||
|
||||
dirMatter := this.matterDao.CheckWithRootByUuid(uploadToken.FolderUuid, space)
|
||||
|
||||
matter := this.matterService.Upload(request, file, user, space, dirMatter, uploadToken.Filename, uploadToken.Privacy)
|
||||
matter := this.matterService.Upload(request, file, handler, user, space, dirMatter, uploadToken.Filename, uploadToken.Privacy)
|
||||
|
||||
//expire the upload token.
|
||||
uploadToken.ExpireTime = time.Now()
|
||||
|
||||
@@ -347,7 +347,7 @@ func (this *DavService) HandlePut(writer http.ResponseWriter, request *http.Requ
|
||||
this.matterService.AtomicDelete(request, srcMatter, user, space)
|
||||
}
|
||||
|
||||
this.matterService.Upload(request, request.Body, user, space, dirMatter, filename, true)
|
||||
this.matterService.Upload(request, request.Body, nil, user, space, dirMatter, filename, true)
|
||||
|
||||
//set the status code 201
|
||||
writer.WriteHeader(http.StatusCreated)
|
||||
|
||||
@@ -77,7 +77,8 @@ func (this *MatterController) RegisterRoutes() map[string]func(writer http.Respo
|
||||
|
||||
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/page"] = this.Wrap(this.Page, USER_ROLE_USER)
|
||||
routeMap["/api/matter/share/page"] = this.Wrap(this.SharePage, USER_ROLE_USER)
|
||||
|
||||
routeMap["/api/matter/create/directory"] = this.Wrap(this.CreateDirectory, USER_ROLE_USER)
|
||||
routeMap["/api/matter/upload"] = this.Wrap(this.Upload, USER_ROLE_USER)
|
||||
@@ -105,7 +106,7 @@ func (this *MatterController) Detail(writer http.ResponseWriter, request *http.R
|
||||
uuid := util.ExtractRequestString(request, "uuid")
|
||||
user := this.checkUser(request)
|
||||
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
|
||||
space := this.spaceService.CheckWritableByUuid(request, user, spaceUuid)
|
||||
space := this.spaceService.CheckReadableByUuid(request, user, spaceUuid)
|
||||
|
||||
matter := this.matterService.Detail(request, uuid)
|
||||
|
||||
@@ -117,6 +118,7 @@ func (this *MatterController) Detail(writer http.ResponseWriter, request *http.R
|
||||
|
||||
}
|
||||
|
||||
// TODO: 分享的列表接口不走这个接口了。
|
||||
func (this *MatterController) Page(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
||||
|
||||
page := util.ExtractRequestOptionalInt(request, "page", 0)
|
||||
@@ -134,40 +136,11 @@ func (this *MatterController) Page(writer http.ResponseWriter, request *http.Req
|
||||
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", "")
|
||||
|
||||
user := this.checkUser(request)
|
||||
spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid)
|
||||
space := this.spaceService.CheckReadableByUuid(request, user, spaceUuid)
|
||||
|
||||
var userUuid string
|
||||
|
||||
if shareUuid != "" {
|
||||
|
||||
if puuid == "" {
|
||||
panic(result.BadRequest("puuid cannot be null"))
|
||||
}
|
||||
|
||||
dirMatter := this.matterDao.CheckByUuid(puuid)
|
||||
if !dirMatter.Dir {
|
||||
panic(result.BadRequest("puuid is not a directory"))
|
||||
}
|
||||
|
||||
user := this.findUser(request)
|
||||
|
||||
this.shareService.ValidateMatter(request, shareUuid, shareCode, user, shareRootUuid, dirMatter)
|
||||
puuid = dirMatter.Uuid
|
||||
|
||||
} else {
|
||||
//if cannot auth by share. Then login is required.
|
||||
user := this.checkUser(request)
|
||||
userUuid = user.Uuid
|
||||
|
||||
}
|
||||
|
||||
var extensions []string
|
||||
if extensionsStr != "" {
|
||||
extensions = strings.Split(extensionsStr, ",")
|
||||
@@ -208,7 +181,89 @@ func (this *MatterController) Page(writer http.ResponseWriter, request *http.Req
|
||||
},
|
||||
}
|
||||
|
||||
pager := this.matterDao.Page(page, pageSize, puuid, userUuid, space.Uuid, name, dir, deleted, extensions, sortArray)
|
||||
pager := this.matterDao.Page(page, pageSize, puuid, "", space.Uuid, name, dir, deleted, extensions, sortArray)
|
||||
|
||||
return this.Success(pager)
|
||||
}
|
||||
|
||||
// 分享的列表接口走这个接口了。 FIXME: 这个接口还没有测试。
|
||||
func (this *MatterController) SharePage(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
||||
|
||||
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.ExtractRequestString(request, "shareUuid")
|
||||
shareCode := util.ExtractRequestString(request, "shareCode")
|
||||
shareRootUuid := util.ExtractRequestString(request, "shareRootUuid")
|
||||
|
||||
if puuid == "" {
|
||||
panic(result.BadRequest("puuid cannot be null"))
|
||||
}
|
||||
|
||||
dirMatter := this.matterDao.CheckByUuid(puuid)
|
||||
if !dirMatter.Dir {
|
||||
panic(result.BadRequest("puuid is not a directory"))
|
||||
}
|
||||
|
||||
user := this.findUser(request)
|
||||
|
||||
this.shareService.ValidateMatter(request, shareUuid, shareCode, user, shareRootUuid, dirMatter)
|
||||
puuid = dirMatter.Uuid
|
||||
|
||||
var extensions []string
|
||||
if extensionsStr != "" {
|
||||
extensions = strings.Split(extensionsStr, ",")
|
||||
}
|
||||
|
||||
sortArray := []builder.OrderPair{
|
||||
{
|
||||
Key: "dir",
|
||||
Value: orderDir,
|
||||
},
|
||||
{
|
||||
Key: "create_time",
|
||||
Value: orderCreateTime,
|
||||
},
|
||||
{
|
||||
Key: "update_time",
|
||||
Value: orderUpdateTime,
|
||||
},
|
||||
{
|
||||
Key: "delete_time",
|
||||
Value: orderDeleteTime,
|
||||
},
|
||||
{
|
||||
Key: "sort",
|
||||
Value: orderSort,
|
||||
},
|
||||
{
|
||||
Key: "size",
|
||||
Value: orderSize,
|
||||
},
|
||||
{
|
||||
Key: "name",
|
||||
Value: orderName,
|
||||
},
|
||||
{
|
||||
Key: "times",
|
||||
Value: orderTimes,
|
||||
},
|
||||
}
|
||||
|
||||
pager := this.matterDao.Page(page, pageSize, puuid, "", dirMatter.SpaceUuid, name, dir, deleted, extensions, sortArray)
|
||||
|
||||
return this.Success(pager)
|
||||
}
|
||||
@@ -259,7 +314,7 @@ func (this *MatterController) Upload(writer http.ResponseWriter, request *http.R
|
||||
dirMatter := this.matterDao.CheckWithRootByUuid(puuid, space)
|
||||
|
||||
//support upload simultaneously
|
||||
matter := this.matterService.Upload(request, file, user, space, dirMatter, fileName, privacy)
|
||||
matter := this.matterService.Upload(request, file, handler, user, space, dirMatter, fileName, privacy)
|
||||
|
||||
return this.Success(matter)
|
||||
}
|
||||
|
||||
+48
-24
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/eyebluecn/tank/code/tool/util"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
@@ -350,7 +351,7 @@ func (this *MatterService) AtomicRecovery(request *http.Request, matter *Matter,
|
||||
}
|
||||
|
||||
// upload files.
|
||||
func (this *MatterService) Upload(request *http.Request, file io.Reader, user *User, space *Space, dirMatter *Matter, filename string, privacy bool) *Matter {
|
||||
func (this *MatterService) Upload(request *http.Request, file io.Reader, fileHeader *multipart.FileHeader, user *User, space *Space, dirMatter *Matter, filename string, privacy bool) *Matter {
|
||||
|
||||
if user == nil {
|
||||
panic(result.BadRequest("user cannot be nil."))
|
||||
@@ -368,6 +369,23 @@ func (this *MatterService) Upload(request *http.Request, file io.Reader, user *U
|
||||
panic(result.BadRequestI18n(request, i18n.MatterNameLengthExceedLimit, len(filename), MATTER_NAME_MAX_LENGTH))
|
||||
}
|
||||
|
||||
//if fileHeader.Size not nill . check size in advance.
|
||||
if fileHeader != nil {
|
||||
//check the size limit.
|
||||
if space.SizeLimit >= 0 {
|
||||
if fileHeader.Size > space.SizeLimit {
|
||||
panic(result.BadRequestI18n(request, i18n.MatterSizeExceedLimit, util.HumanFileSize(fileHeader.Size), util.HumanFileSize(space.SizeLimit)))
|
||||
}
|
||||
}
|
||||
|
||||
//check total size.
|
||||
if space.TotalSizeLimit >= 0 {
|
||||
if space.TotalSize+fileHeader.Size > space.TotalSizeLimit {
|
||||
panic(result.BadRequestI18n(request, i18n.MatterSizeExceedTotalLimit, util.HumanFileSize(space.TotalSize), util.HumanFileSize(space.TotalSizeLimit)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dirAbsolutePath := dirMatter.AbsolutePath()
|
||||
|
||||
count := this.matterDao.CountBySpaceUuidAndPuuidAndDirAndName(space.Uuid, dirMatter.Uuid, false, filename)
|
||||
@@ -389,39 +407,45 @@ func (this *MatterService) Upload(request *http.Request, file io.Reader, user *U
|
||||
|
||||
destFile, err := os.OpenFile(fileAbsolutePath, os.O_WRONLY|os.O_CREATE, 0777)
|
||||
this.PanicError(err)
|
||||
|
||||
defer func() {
|
||||
closeDestFile := func() {
|
||||
err := destFile.Close()
|
||||
this.PanicError(err)
|
||||
}()
|
||||
}
|
||||
|
||||
fileSize, err := io.Copy(destFile, file)
|
||||
this.PanicError(err)
|
||||
|
||||
this.logger.Info("upload %s %v ", filename, util.HumanFileSize(fileSize))
|
||||
|
||||
//check the size limit.
|
||||
if space.SizeLimit >= 0 {
|
||||
if fileSize > space.SizeLimit {
|
||||
//delete the file on disk.
|
||||
err = os.Remove(fileAbsolutePath)
|
||||
this.PanicError(err)
|
||||
if fileHeader == nil {
|
||||
//check the size limit.
|
||||
if space.SizeLimit >= 0 {
|
||||
if fileSize > space.SizeLimit {
|
||||
closeDestFile()
|
||||
|
||||
panic(result.BadRequestI18n(request, i18n.MatterSizeExceedLimit, util.HumanFileSize(fileSize), util.HumanFileSize(space.SizeLimit)))
|
||||
//delete the file on disk.
|
||||
err = os.Remove(fileAbsolutePath)
|
||||
this.PanicError(err)
|
||||
|
||||
panic(result.BadRequestI18n(request, i18n.MatterSizeExceedLimit, util.HumanFileSize(fileSize), util.HumanFileSize(space.SizeLimit)))
|
||||
}
|
||||
}
|
||||
|
||||
//check total size.
|
||||
if space.TotalSizeLimit >= 0 {
|
||||
if space.TotalSize+fileSize > space.TotalSizeLimit {
|
||||
closeDestFile()
|
||||
|
||||
//delete the file on disk.
|
||||
err = os.Remove(fileAbsolutePath)
|
||||
this.PanicError(err)
|
||||
|
||||
panic(result.BadRequestI18n(request, i18n.MatterSizeExceedTotalLimit, util.HumanFileSize(space.TotalSize), util.HumanFileSize(space.TotalSizeLimit)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//check total size.
|
||||
if space.TotalSizeLimit >= 0 {
|
||||
if space.TotalSize+fileSize > space.TotalSizeLimit {
|
||||
|
||||
//delete the file on disk.
|
||||
err = os.Remove(fileAbsolutePath)
|
||||
this.PanicError(err)
|
||||
|
||||
panic(result.BadRequestI18n(request, i18n.MatterSizeExceedTotalLimit, util.HumanFileSize(space.TotalSize), util.HumanFileSize(space.TotalSizeLimit)))
|
||||
}
|
||||
}
|
||||
closeDestFile()
|
||||
|
||||
matter := this.createNonDirMatter(dirMatter, filename, fileSize, privacy, user, space)
|
||||
|
||||
@@ -1036,7 +1060,7 @@ func (this *MatterService) mirror(request *http.Request, srcPath string, destDir
|
||||
this.PanicError(err)
|
||||
}()
|
||||
|
||||
this.Upload(request, file, user, space, destDirMatter, fileStat.Name(), true)
|
||||
this.Upload(request, file, nil, user, space, destDirMatter, fileStat.Name(), true)
|
||||
|
||||
}
|
||||
|
||||
@@ -1157,7 +1181,7 @@ func (this *MatterService) AtomicCrawl(request *http.Request, url string, filena
|
||||
resp, err := http.Get(url)
|
||||
this.PanicError(err)
|
||||
|
||||
return this.Upload(request, resp.Body, user, space, dirMatter, filename, privacy)
|
||||
return this.Upload(request, resp.Body, nil, user, space, dirMatter, filename, privacy)
|
||||
}
|
||||
|
||||
// adjust a matter's path.
|
||||
|
||||
Reference in New Issue
Block a user