From 1a440e1f67622d2700c3132a6265a1df5ab862c9 Mon Sep 17 00:00:00 2001 From: lishuang Date: Sat, 27 May 2023 16:21:35 +0800 Subject: [PATCH] feat: finish the basic space things. --- code/rest/alien_controller.go | 2 +- code/rest/dav_service.go | 2 +- code/rest/matter_controller.go | 121 ++++++++++++++++++++++++--------- code/rest/matter_service.go | 72 +++++++++++++------- 4 files changed, 138 insertions(+), 59 deletions(-) diff --git a/code/rest/alien_controller.go b/code/rest/alien_controller.go index a2a22c3..ab1649a 100644 --- a/code/rest/alien_controller.go +++ b/code/rest/alien_controller.go @@ -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() diff --git a/code/rest/dav_service.go b/code/rest/dav_service.go index 3db51bb..5046e45 100644 --- a/code/rest/dav_service.go +++ b/code/rest/dav_service.go @@ -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) diff --git a/code/rest/matter_controller.go b/code/rest/matter_controller.go index b4e7dab..49b7e63 100644 --- a/code/rest/matter_controller.go +++ b/code/rest/matter_controller.go @@ -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) } diff --git a/code/rest/matter_service.go b/code/rest/matter_service.go index 08e29ac..8b650e2 100644 --- a/code/rest/matter_service.go +++ b/code/rest/matter_service.go @@ -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.