diff --git a/modules/restapi/src/main/resources/docspell-openapi.yml b/modules/restapi/src/main/resources/docspell-openapi.yml index 91b6797d..9f70659c 100644 --- a/modules/restapi/src/main/resources/docspell-openapi.yml +++ b/modules/restapi/src/main/resources/docspell-openapi.yml @@ -4174,6 +4174,7 @@ components: - count - tagCloud - fieldStats + - folderStats properties: count: type: integer @@ -4184,6 +4185,10 @@ components: type: array items: $ref: "#/components/schemas/FieldStats" + folderStats: + type: array + items: + $ref: "#/components/schemas/FolderStats" ItemInsights: description: | Information about the items in docspell. @@ -4204,6 +4209,25 @@ components: format: int64 tagCloud: $ref: "#/components/schemas/TagCloud" + FolderStats: + description: | + Count of folder usage. + required: + - id + - name + - owner + - count + properties: + id: + type: string + format: ident + name: + type: string + owner: + $ref: "#/components/schemas/IdName" + count: + type: integer + format: int32 FieldStats: description: | Basic statistics about a custom field. diff --git a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala index 6b8c2880..eefaa9cb 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala @@ -28,7 +28,15 @@ import org.log4s.Logger trait Conversions { def mkSearchStats(sum: OItemSearch.SearchSummary): SearchStats = - SearchStats(sum.count, mkTagCloud(sum.tags), sum.fields.map(mkFieldStats)) + SearchStats( + sum.count, + mkTagCloud(sum.tags), + sum.fields.map(mkFieldStats), + sum.folders.map(mkFolderStats) + ) + + def mkFolderStats(fs: docspell.store.queries.FolderCount): FolderStats = + FolderStats(fs.id, fs.name, mkIdName(fs.owner), fs.count) def mkFieldStats(fs: docspell.store.queries.FieldStats): FieldStats = FieldStats( diff --git a/modules/store/src/main/scala/docspell/store/queries/FolderCount.scala b/modules/store/src/main/scala/docspell/store/queries/FolderCount.scala new file mode 100644 index 00000000..a1f93c55 --- /dev/null +++ b/modules/store/src/main/scala/docspell/store/queries/FolderCount.scala @@ -0,0 +1,5 @@ +package docspell.store.queries + +import docspell.common._ + +case class FolderCount(id: Ident, name: String, owner: IdRef, count: Int) diff --git a/modules/store/src/main/scala/docspell/store/queries/QItem.scala b/modules/store/src/main/scala/docspell/store/queries/QItem.scala index e5dbe4b9..b0184aaf 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QItem.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QItem.scala @@ -236,10 +236,11 @@ object QItem { def searchStats(q: Query): ConnectionIO[SearchSummary] = for { - count <- searchCountSummary(q) - tags <- searchTagSummary(q) - fields <- searchFieldSummary(q) - } yield SearchSummary(count, tags, fields) + count <- searchCountSummary(q) + tags <- searchTagSummary(q) + fields <- searchFieldSummary(q) + folders <- searchFolderSummary(q) + } yield SearchSummary(count, tags, fields, folders) def searchTagSummary(q: Query): ConnectionIO[List[TagCount]] = { val tagFrom = @@ -265,6 +266,18 @@ object QItem { .query[Int] .unique + def searchFolderSummary(q: Query): ConnectionIO[List[FolderCount]] = { + val fu = RUser.as("fu") + findItemsBase(q, 0).unwrap + .withSelect(select(f.id, f.name, f.owner, fu.login).append(count(i.id).as("num"))) + .changeFrom(_.innerJoin(fu, fu.uid === f.owner)) + .changeWhere(c => c && queryCondition(q)) + .groupBy(f.id, f.name, f.owner, fu.login) + .build + .query[FolderCount] + .to[List] + } + def searchFieldSummary(q: Query): ConnectionIO[List[FieldStats]] = { val fieldJoin = from(cv) diff --git a/modules/store/src/main/scala/docspell/store/queries/SearchSummary.scala b/modules/store/src/main/scala/docspell/store/queries/SearchSummary.scala index 36cd2a71..0530c211 100644 --- a/modules/store/src/main/scala/docspell/store/queries/SearchSummary.scala +++ b/modules/store/src/main/scala/docspell/store/queries/SearchSummary.scala @@ -1,3 +1,8 @@ package docspell.store.queries -case class SearchSummary(count: Int, tags: List[TagCount], fields: List[FieldStats]) +case class SearchSummary( + count: Int, + tags: List[TagCount], + fields: List[FieldStats], + folders: List[FolderCount] +)