Add endpoint to search for items and return their tags

This is a more expensive query, since the tags must be resolved per
item. This is now implemented by doing additional queries while
caching each resolved tag.
This commit is contained in:
Eike Kettner
2020-06-07 15:18:28 +02:00
parent 0382ff2308
commit 1d2a6e6caa
6 changed files with 117 additions and 14 deletions

View File

@ -135,6 +135,17 @@ trait Conversions {
ItemLightList(gs)
}
def mkItemListWithTags(v: Vector[OItem.ListItemWithTags]): ItemLightList = {
val groups = v.groupBy(ti => ti.item.date.toUtcDate.toString.substring(0, 7))
def mkGroup(g: (String, Vector[OItem.ListItemWithTags])): ItemLightGroup =
ItemLightGroup(g._1, g._2.map(mkItemLightWithTags).toList)
val gs =
groups.map(mkGroup _).toList.sortWith((g1, g2) => g1.name.compareTo(g2.name) >= 0)
ItemLightList(gs)
}
def mkItemLight(i: OItem.ListItem): ItemLight =
ItemLight(
i.id,
@ -148,9 +159,13 @@ trait Conversions {
i.corrPerson.map(mkIdName),
i.concPerson.map(mkIdName),
i.concEquip.map(mkIdName),
i.fileCount
i.fileCount,
Nil
)
def mkItemLightWithTags(i: OItem.ListItemWithTags): ItemLight =
mkItemLight(i.item).copy(tags = i.tags.map(mkTag))
// job
def mkJobQueueState(state: OJob.CollectiveQueueState): JobQueueState = {
def desc(f: JobDetail => Option[Timestamp])(j1: JobDetail, j2: JobDetail): Boolean = {

View File

@ -36,6 +36,19 @@ object ItemRoutes {
resp <- Ok(Conversions.mkItemList(items))
} yield resp
case req @ POST -> Root / "searchWithTags" =>
for {
mask <- req.as[ItemSearch]
_ <- logger.ftrace(s"Got search mask: $mask")
query = Conversions.mkQuery(mask, user.account.collective)
_ <- logger.ftrace(s"Running query: $query")
items <- backend.item.findItemsWithTags(
query,
Batch(mask.offset, mask.limit).restrictLimitTo(500)
)
resp <- Ok(Conversions.mkItemListWithTags(items))
} yield resp
case GET -> Root / Ident(id) =>
for {
item <- backend.item.findItem(id, user.account.collective)