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[_]] {
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))

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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]
}