@@ -37,18 +37,24 @@ import org.eclipse.apoapsis.ortserver.dao.repositories.ortrun.OrtRunsTable
3737import org.eclipse.apoapsis.ortserver.dao.repositories.repository.RepositoriesTable
3838import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.PackageCurationDataTable
3939import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.PackageCurationsTable
40+ import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.RepositoryConfigurationsTable
41+ import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.RepositoryConfigurationsVulnerabilityResolutionsTable
42+ import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.VulnerabilityResolutionsTable
4043import org.eclipse.apoapsis.ortserver.dao.repositories.resolvedconfiguration.ResolvedConfigurationsTable
4144import org.eclipse.apoapsis.ortserver.dao.repositories.resolvedconfiguration.ResolvedPackageCurationProvidersTable
4245import org.eclipse.apoapsis.ortserver.dao.repositories.resolvedconfiguration.ResolvedPackageCurationsTable
46+ import org.eclipse.apoapsis.ortserver.dao.tables.VulnerabilityResolutionDefinitionsTable
4347import org.eclipse.apoapsis.ortserver.dao.tables.shared.IdentifierDao
4448import org.eclipse.apoapsis.ortserver.dao.tables.shared.IdentifiersTable
4549import org.eclipse.apoapsis.ortserver.dao.utils.applyILike
50+ import org.eclipse.apoapsis.ortserver.model.AppliedVulnerabilityResolution
4651import org.eclipse.apoapsis.ortserver.model.CountByCategory
4752import org.eclipse.apoapsis.ortserver.model.VulnerabilityFilters
4853import org.eclipse.apoapsis.ortserver.model.VulnerabilityForRunsFilters
4954import org.eclipse.apoapsis.ortserver.model.VulnerabilityRating
5055import org.eclipse.apoapsis.ortserver.model.VulnerabilityWithAccumulatedData
5156import org.eclipse.apoapsis.ortserver.model.VulnerabilityWithDetails
57+ import org.eclipse.apoapsis.ortserver.model.runs.repository.VulnerabilityResolution as ModelVulnerabilityResolution
5258import org.eclipse.apoapsis.ortserver.model.util.ComparisonOperator
5359import org.eclipse.apoapsis.ortserver.model.util.ListQueryParameters
5460import org.eclipse.apoapsis.ortserver.model.util.ListQueryResult
@@ -85,7 +91,7 @@ import org.ossreviewtoolkit.model.utils.toPurl
8591 * A service to interact with vulnerabilities.
8692 */
8793class VulnerabilityService (private val db : Database , private val ortRunService : OrtRunService ) {
88- fun listForOrtRunId (
94+ suspend fun listForOrtRunId (
8995 ortRunId : Long ,
9096 parameters : ListQueryParameters = ListQueryParameters .DEFAULT ,
9197 vulnerabilityFilters : VulnerabilityFilters = VulnerabilityFilters ()
@@ -159,11 +165,61 @@ class VulnerabilityService(private val db: Database, private val ortRunService:
159165 .drop(parameters.offset?.toInt() ? : 0 )
160166 .take(parameters.limit ? : ListQueryParameters .DEFAULT_LIMIT )
161167
168+ val vulnerabilityResolutionDefinitions = db.dbQuery {
169+ RepositoryConfigurationsVulnerabilityResolutionsTable
170+ .innerJoin(VulnerabilityResolutionsTable )
171+ .innerJoin(RepositoryConfigurationsTable )
172+ .select(
173+ VulnerabilityResolutionsTable .externalId,
174+ VulnerabilityResolutionsTable .reason,
175+ VulnerabilityResolutionsTable .comment,
176+ RepositoryConfigurationsVulnerabilityResolutionsTable .vulnerabilityResolutionDefinitionId
177+ )
178+ .where {
179+ (RepositoryConfigurationsTable .ortRunId eq ortRunId) and
180+ (
181+ RepositoryConfigurationsVulnerabilityResolutionsTable .vulnerabilityResolutionDefinitionId
182+ .isNotNull()
183+ )
184+ }
185+ .map { row ->
186+ val definitionId = requireNotNull(
187+ row[RepositoryConfigurationsVulnerabilityResolutionsTable .vulnerabilityResolutionDefinitionId]
188+ ) {
189+ " vulnerabilityResolutionDefinitionId should never be null due to where clause."
190+ }
191+
192+ definitionId.value to ModelVulnerabilityResolution (
193+ row[VulnerabilityResolutionsTable .externalId],
194+ row[VulnerabilityResolutionsTable .reason],
195+ row[VulnerabilityResolutionsTable .comment]
196+ )
197+ }
198+ }
199+
162200 val vulnerabilitiesWithResolutions = limitedVulnerabilities.map { vulnerabilityWithDetails ->
163201 val matchingResolutions = resolutions.filter {
164202 it.matches(vulnerabilityWithDetails.vulnerability.mapToOrt())
165203 }
166- vulnerabilityWithDetails.copy(resolutions = matchingResolutions.map { it.mapToModel() })
204+ vulnerabilityWithDetails.copy(
205+ resolutions = matchingResolutions.map {
206+ val resolution = it.mapToModel()
207+
208+ val definitionId: Long? = vulnerabilityResolutionDefinitions
209+ .firstOrNull { (_, value) ->
210+ resolution == value
211+ }?.first
212+
213+ AppliedVulnerabilityResolution (
214+ resolution,
215+ definitionId?.let {
216+ db.dbQuery {
217+ VulnerabilityResolutionDefinitionsTable .get(definitionId)
218+ }
219+ }
220+ )
221+ }
222+ )
167223 }
168224
169225 return ListQueryResult (
0 commit comments