From b74463d9e5e1dd89ed2ce8a54cd21a10abc5cf04 Mon Sep 17 00:00:00 2001 From: lishuang Date: Sat, 20 Jul 2024 16:09:26 +0800 Subject: [PATCH] feat: search dfs. --- code/rest/matter_controller.go | 29 ++++++++++++++++++ code/rest/matter_dao.go | 2 ++ code/rest/matter_service.go | 56 ++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/code/rest/matter_controller.go b/code/rest/matter_controller.go index e1ef0c8..aa9bfd0 100644 --- a/code/rest/matter_controller.go +++ b/code/rest/matter_controller.go @@ -77,6 +77,7 @@ 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_USER) + routeMap["/api/matter/search"] = this.Wrap(this.Search, 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) @@ -174,6 +175,34 @@ func (this *MatterController) Page(writer http.ResponseWriter, request *http.Req return this.Success(pager) } +//DFS search. +func (this *MatterController) Search(writer http.ResponseWriter, request *http.Request) *result.WebResult { + + limit := util.ExtractRequestOptionalInt(request, "limit", 200) + puuid := util.ExtractRequestString(request, "puuid") + keyword := util.ExtractRequestString(request, "keyword") + deletedStr := util.ExtractRequestOptionalString(request, "deleted", "") + var deleted = false + if deletedStr == TRUE { + deleted = true + } + + user := this.checkUser(request) + spaceUuid := util.ExtractRequestOptionalString(request, "spaceUuid", user.SpaceUuid) + this.spaceService.CheckReadableByUuid(request, user, spaceUuid) + + matters := this.matterService.DfsSearch( + request, + limit, + puuid, + keyword, + spaceUuid, + deleted, + ) + + return this.Success(matters) +} + func (this *MatterController) CreateDirectory(writer http.ResponseWriter, request *http.Request) *result.WebResult { puuid := util.ExtractRequestString(request, "puuid") diff --git a/code/rest/matter_dao.go b/code/rest/matter_dao.go index 9511e07..577ccfb 100644 --- a/code/rest/matter_dao.go +++ b/code/rest/matter_dao.go @@ -354,6 +354,8 @@ func (this *MatterDao) FindByUuids(uuids []string, sortArray []builder.OrderPair return matters } + +// pagination is 0 base. func (this *MatterDao) PlainPage( page int, pageSize int, diff --git a/code/rest/matter_service.go b/code/rest/matter_service.go index edc9c10..aa551e5 100644 --- a/code/rest/matter_service.go +++ b/code/rest/matter_service.go @@ -137,6 +137,62 @@ func (this *MatterService) Page( return pager } +// search files by dfs. +func (this *MatterService) DfsSearch( + request *http.Request, + limit int, + puuid string, + keyword string, + spaceUuid string, + deleted bool, +) []*Matter { + + deletedStr := FALSE + if deleted { + deletedStr = FALSE + } + + //find all matters including dir and files. + _, matters := this.matterDao.PlainPage(0, limit, puuid, "", spaceUuid, keyword, "", deletedStr, nil, nil, nil) + if len(matters) >= limit { + return matters + } + + var resultList []*Matter + for _, matter := range matters { + if !matter.Dir { + resultList = append(resultList, matter) + } + } + + //dfs from puuid. + _, dirMatters := this.matterDao.PlainPage(0, 1000, puuid, "", spaceUuid, keyword, "", "", nil, nil, nil) + for _, dirMatter := range dirMatters { + + //add dir if match. + if strings.Contains(dirMatter.Name, keyword) { + if deleted == dirMatter.Deleted { + resultList = append(resultList, dirMatter) + } + } + + remainLimit := limit - len(resultList) + subMatters := this.DfsSearch(request, remainLimit, dirMatter.Uuid, keyword, spaceUuid, deleted) + for _, subMatter := range subMatters { + resultList = append(resultList, subMatter) + } + + //enough then return + if len(resultList) >= limit { + return resultList + } + + } + + //not enough ,return. + return resultList +} + // Download. Support chunk download. func (this *MatterService) DownloadFile( writer http.ResponseWriter,