Allow to only return owning spaces

This commit is contained in:
Eike Kettner 2020-07-09 23:23:02 +02:00
parent 6c304b4e7a
commit ea4ab11195
5 changed files with 25 additions and 6 deletions

View File

@ -9,7 +9,11 @@ import docspell.store.queries.QSpace
trait OSpace[F[_]] { 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]] def findById(id: Ident, collective: Ident): F[Option[OSpace.SpaceDetail]]
@ -55,9 +59,10 @@ object OSpace {
Resource.pure[F, OSpace[F]](new OSpace[F] { Resource.pure[F, OSpace[F]](new OSpace[F] {
def findAll( def findAll(
collective: Ident, collective: Ident,
ownerLogin: Option[Ident],
nameQuery: Option[String] nameQuery: Option[String]
): F[Vector[SpaceItem]] = ): 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]] = def findById(id: Ident, collective: Ident): F[Option[SpaceDetail]] =
store.transact(QSpace.findById(id, collective)) store.transact(QSpace.findById(id, collective))

View File

@ -811,6 +811,7 @@ paths:
- authTokenHeader: [] - authTokenHeader: []
parameters: parameters:
- $ref: "#/components/parameters/q" - $ref: "#/components/parameters/q"
- $ref: "#/components/parameters/owning"
responses: responses:
200: 200:
description: Ok description: Ok
@ -3983,6 +3984,13 @@ components:
required: false required: false
schema: schema:
type: boolean type: boolean
owning:
name: full
in: query
description: Whether to get owning spaces
required: false
schema:
type: boolean
checksum: checksum:
name: checksum name: checksum
in: path in: path

View File

@ -24,6 +24,8 @@ object QueryParam {
object FullOpt extends OptionalQueryParamDecoderMatcher[Boolean]("full") object FullOpt extends OptionalQueryParamDecoderMatcher[Boolean]("full")
object OwningOpt extends OptionalQueryParamDecoderMatcher[Boolean]("owning")
object ContactKindOpt extends OptionalQueryParamDecoderMatcher[ContactKind]("kind") object ContactKindOpt extends OptionalQueryParamDecoderMatcher[ContactKind]("kind")
object QueryOpt extends OptionalQueryParamDecoderMatcher[QueryString]("q") object QueryOpt extends OptionalQueryParamDecoderMatcher[QueryString]("q")

View File

@ -25,9 +25,11 @@ object SpaceRoutes {
import dsl._ import dsl._
HttpRoutes.of { 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 { 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)) resp <- Ok(SpaceList(all.map(mkSpace).toList))
} yield resp } yield resp

View File

@ -149,7 +149,7 @@ object QSpace {
).query[IdRef].to[Vector] ).query[IdRef].to[Vector]
(for { (for {
space <- OptionT(findAll(collective, Some(id), None).map(_.headOption)) space <- OptionT(findAll(collective, Some(id), None, None).map(_.headOption))
memb <- OptionT.liftF(memberQ) memb <- OptionT.liftF(memberQ)
} yield space.withMembers(memb.toList)).value } yield space.withMembers(memb.toList)).value
} }
@ -157,9 +157,11 @@ object QSpace {
def findAll( def findAll(
collective: Ident, collective: Ident,
idQ: Option[Ident], idQ: Option[Ident],
ownerLogin: Option[Ident],
nameQ: Option[String] nameQ: Option[String]
): ConnectionIO[Vector[SpaceItem]] = { ): ConnectionIO[Vector[SpaceItem]] = {
val uId = RUser.Columns.uid.prefix("u") val uId = RUser.Columns.uid.prefix("u")
val uLogin = RUser.Columns.login.prefix("u")
val sId = RSpace.Columns.id.prefix("s") val sId = RSpace.Columns.id.prefix("s")
val sOwner = RSpace.Columns.owner.prefix("s") val sOwner = RSpace.Columns.owner.prefix("s")
val sName = RSpace.Columns.name.prefix("s") val sName = RSpace.Columns.name.prefix("s")
@ -178,7 +180,7 @@ object QSpace {
val where = val where =
sColl.is(collective) :: idQ.toList.map(id => sId.is(id)) ::: nameQ.toList.map(q => sColl.is(collective) :: idQ.toList.map(id => sId.is(id)) ::: nameQ.toList.map(q =>
sName.lowerLike(s"%${q.toLowerCase}%") sName.lowerLike(s"%${q.toLowerCase}%")
) ) ::: ownerLogin.toList.map(login => uLogin.is(login))
selectSimple(cols, from, and(where) ++ orderBy(sName.asc)).query[SpaceItem].to[Vector] selectSimple(cols, from, and(where) ++ orderBy(sName.asc)).query[SpaceItem].to[Vector]
} }