diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OSpace.scala b/modules/backend/src/main/scala/docspell/backend/ops/OSpace.scala index b42522bb..efec5b46 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/OSpace.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/OSpace.scala @@ -9,7 +9,11 @@ import docspell.store.queries.QSpace trait OSpace[F[_]] { - def findAll(collective: Ident, nameQuery: Option[String]): F[Vector[OSpace.SpaceItem]] + def findAll( + collective: Ident, + ownerLogin: Option[Ident], + nameQuery: Option[String] + ): F[Vector[OSpace.SpaceItem]] def findById(id: Ident, collective: Ident): F[Option[OSpace.SpaceDetail]] @@ -55,9 +59,10 @@ object OSpace { Resource.pure[F, OSpace[F]](new OSpace[F] { def findAll( collective: Ident, + ownerLogin: Option[Ident], nameQuery: Option[String] ): F[Vector[SpaceItem]] = - store.transact(QSpace.findAll(collective, None, nameQuery)) + store.transact(QSpace.findAll(collective, None, ownerLogin, nameQuery)) def findById(id: Ident, collective: Ident): F[Option[SpaceDetail]] = store.transact(QSpace.findById(id, collective)) diff --git a/modules/restapi/src/main/resources/docspell-openapi.yml b/modules/restapi/src/main/resources/docspell-openapi.yml index d1e30503..fd352df6 100644 --- a/modules/restapi/src/main/resources/docspell-openapi.yml +++ b/modules/restapi/src/main/resources/docspell-openapi.yml @@ -811,6 +811,7 @@ paths: - authTokenHeader: [] parameters: - $ref: "#/components/parameters/q" + - $ref: "#/components/parameters/owning" responses: 200: description: Ok @@ -3983,6 +3984,13 @@ components: required: false schema: type: boolean + owning: + name: full + in: query + description: Whether to get owning spaces + required: false + schema: + type: boolean checksum: name: checksum in: path diff --git a/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala b/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala index 1c8ff477..b83296a1 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala @@ -24,6 +24,8 @@ object QueryParam { object FullOpt extends OptionalQueryParamDecoderMatcher[Boolean]("full") + object OwningOpt extends OptionalQueryParamDecoderMatcher[Boolean]("owning") + object ContactKindOpt extends OptionalQueryParamDecoderMatcher[ContactKind]("kind") object QueryOpt extends OptionalQueryParamDecoderMatcher[QueryString]("q") diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/SpaceRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/SpaceRoutes.scala index 480d41d2..b51fefa0 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/SpaceRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/SpaceRoutes.scala @@ -25,9 +25,11 @@ object SpaceRoutes { import dsl._ HttpRoutes.of { - case GET -> Root :? QueryParam.QueryOpt(q) => + case GET -> Root :? QueryParam.QueryOpt(q) :? QueryParam.OwningOpt(owning) => + val login = + owning.filter(identity).map(_ => user.account.user) for { - all <- backend.space.findAll(user.account.collective, q.map(_.q)) + all <- backend.space.findAll(user.account.collective, login, q.map(_.q)) resp <- Ok(SpaceList(all.map(mkSpace).toList)) } yield resp diff --git a/modules/store/src/main/scala/docspell/store/queries/QSpace.scala b/modules/store/src/main/scala/docspell/store/queries/QSpace.scala index bd3febe3..696ad9fe 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QSpace.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QSpace.scala @@ -149,7 +149,7 @@ object QSpace { ).query[IdRef].to[Vector] (for { - space <- OptionT(findAll(collective, Some(id), None).map(_.headOption)) + space <- OptionT(findAll(collective, Some(id), None, None).map(_.headOption)) memb <- OptionT.liftF(memberQ) } yield space.withMembers(memb.toList)).value } @@ -157,9 +157,11 @@ object QSpace { def findAll( collective: Ident, idQ: Option[Ident], + ownerLogin: Option[Ident], nameQ: Option[String] ): ConnectionIO[Vector[SpaceItem]] = { val uId = RUser.Columns.uid.prefix("u") + val uLogin = RUser.Columns.login.prefix("u") val sId = RSpace.Columns.id.prefix("s") val sOwner = RSpace.Columns.owner.prefix("s") val sName = RSpace.Columns.name.prefix("s") @@ -178,7 +180,7 @@ object QSpace { val where = sColl.is(collective) :: idQ.toList.map(id => sId.is(id)) ::: nameQ.toList.map(q => sName.lowerLike(s"%${q.toLowerCase}%") - ) + ) ::: ownerLogin.toList.map(login => uLogin.is(login)) selectSimple(cols, from, and(where) ++ orderBy(sName.asc)).query[SpaceItem].to[Vector] }