/
LiveResourceInfoRepo.scala
47 lines (39 loc) · 1.69 KB
/
LiveResourceInfoRepo.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package org.knora.webapi.slice.resourceinfo.repo
import zio.UIO
import zio.ZIO
import zio.ZLayer
import java.time.Instant
import org.knora.webapi.IRI
import org.knora.webapi.messages.twirl.queries.sparql.v2.txt.resourcesByCreationDate
import org.knora.webapi.messages.util.rdf.SparqlSelectResult
import org.knora.webapi.messages.util.rdf.VariableResultsRow
import org.knora.webapi.slice.resourceinfo.repo
import org.knora.webapi.slice.resourceinfo.repo.ResourceInfoRepo.Order
import org.knora.webapi.slice.resourceinfo.repo.ResourceInfoRepo.OrderBy
import org.knora.webapi.store.triplestore.api.TriplestoreService
final case class LiveResourceInfoRepo(ts: TriplestoreService) extends ResourceInfoRepo {
override def findByProjectAndResourceClass(
projectIri: IRI,
resourceClass: IRI,
ordering: (OrderBy, Order)
): UIO[List[ResourceInfo]] = {
val query = resourcesByCreationDate(resourceClass, projectIri, ordering._1.toString, ordering._2.toString).toString
ZIO.debug(query) *> ts.sparqlHttpSelect(query).map(toResourceInfoList)
}
private def toResourceInfoList(result: SparqlSelectResult): List[ResourceInfo] =
result.results.bindings.map(toResourceInfo).toList
private def toResourceInfo(row: VariableResultsRow): ResourceInfo = {
val rowMap = row.rowMap
repo.ResourceInfo(
rowMap("resource"),
Instant.parse(rowMap("creationDate")),
Instant.parse(rowMap("lastModificationDate")),
rowMap.get("deleteDate").map(Instant.parse),
rowMap("isDeleted").toBoolean
)
}
}
object LiveResourceInfoRepo {
val layer: ZLayer[TriplestoreService, Nothing, LiveResourceInfoRepo] =
ZLayer.fromZIO(ZIO.service[TriplestoreService].map(LiveResourceInfoRepo(_)))
}