mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
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:
@ -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 = {
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user