-
Notifications
You must be signed in to change notification settings - Fork 0
/
ReportController.kt
67 lines (62 loc) · 2.34 KB
/
ReportController.kt
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.aamdigital.aambackendservice.reporting.report.controller
import com.aamdigital.aambackendservice.domain.DomainReference
import com.aamdigital.aambackendservice.error.NotFoundException
import com.aamdigital.aambackendservice.reporting.report.core.ReportingStorage
import com.aamdigital.aambackendservice.reporting.report.dto.ReportDto
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import reactor.core.publisher.Mono
@RestController
@RequestMapping("/v1/reporting/report")
@Validated
class ReportController(
private val reportingStorage: ReportingStorage,
) {
@GetMapping
fun fetchReports(): Mono<List<ReportDto>> {
return reportingStorage.fetchAllReports("sql")
.zipWith(
reportingStorage.fetchPendingCalculations()
).map { results ->
val reports = results.t1
val calculations = results.t2
reports.map { report ->
ReportDto(
id = report.id,
name = report.name,
schema = report.schema,
calculationPending = calculations.any {
it.id == report.id
}
)
}
}
}
@GetMapping("/{reportId}")
fun fetchReport(
@PathVariable reportId: String
): Mono<ReportDto> {
return reportingStorage
.fetchReport(DomainReference(id = reportId))
.zipWith(
reportingStorage.fetchPendingCalculations()
).map { results ->
val reportOptional = results.t1
val calculations = results.t2
val report = reportOptional.orElseThrow {
NotFoundException()
}
ReportDto(
id = report.id,
name = report.name,
schema = report.schema,
calculationPending = calculations.any {
it.id == report.id
}
)
}
}
}