@@ -81,6 +81,7 @@ import org.eclipse.apoapsis.ortserver.api.v1.model.VulnerabilityForRunsFilters
8181import org.eclipse.apoapsis.ortserver.api.v1.model.VulnerabilityRating
8282import org.eclipse.apoapsis.ortserver.components.authorization.api.ProductRole as ApiProductRole
8383import org.eclipse.apoapsis.ortserver.components.authorization.rights.ProductRole
84+ import org.eclipse.apoapsis.ortserver.components.authorization.rights.RepositoryRole
8485import org.eclipse.apoapsis.ortserver.components.authorization.routes.mapToModel
8586import org.eclipse.apoapsis.ortserver.components.authorization.service.AuthorizationService
8687import org.eclipse.apoapsis.ortserver.components.authorization.service.DbAuthorizationService
@@ -94,6 +95,7 @@ import org.eclipse.apoapsis.ortserver.model.JobStatus
9495import org.eclipse.apoapsis.ortserver.model.OrganizationId
9596import org.eclipse.apoapsis.ortserver.model.OrtRunStatus
9697import org.eclipse.apoapsis.ortserver.model.ProductId
98+ import org.eclipse.apoapsis.ortserver.model.RepositoryId
9799import org.eclipse.apoapsis.ortserver.model.RepositoryType
98100import org.eclipse.apoapsis.ortserver.model.Severity
99101import org.eclipse.apoapsis.ortserver.model.runs.Identifier
@@ -148,7 +150,8 @@ class ProductsRouteIntegrationTest : AbstractIntegrationTest({
148150 dbExtension.db,
149151 dbExtension.fixtures.productRepository,
150152 dbExtension.fixtures.repositoryRepository,
151- dbExtension.fixtures.ortRunRepository
153+ dbExtension.fixtures.ortRunRepository,
154+ authorizationService
152155 )
153156
154157 orgId = organizationService.createOrganization(name = "name", description = "description").id
@@ -299,6 +302,71 @@ class ProductsRouteIntegrationTest : AbstractIntegrationTest({
299302 }
300303 }
301304
305+ " return the repositories a user has access to" {
306+ integrationTestApplication {
307+ val createdProduct = createProduct()
308+
309+ val type = RepositoryType .GIT
310+ val url1 = " https://example.com/repo1.git"
311+ val url2 = " https://example.com/repo2.git"
312+ val description = " description"
313+
314+ val createdRepository1 = productService.createRepository(
315+ type = type,
316+ url = url1,
317+ productId = createdProduct.id,
318+ description = description
319+ )
320+ val createdRepository2 = productService.createRepository(
321+ type = type,
322+ url = url2,
323+ productId = createdProduct.id,
324+ description = description
325+ )
326+ productService.createRepository(
327+ type = type,
328+ url = "https://example.com/hidden-repo.git",
329+ productId = createdProduct.id,
330+ description = "You cannot see me"
331+ )
332+
333+ authorizationService.assignRole(
334+ TEST_USER .username.value,
335+ RepositoryRole .READER ,
336+ CompoundHierarchyId .forRepository(
337+ OrganizationId (createdProduct.organizationId),
338+ ProductId (createdProduct.id),
339+ RepositoryId (createdRepository1.id)
340+ )
341+ )
342+ authorizationService.assignRole(
343+ TEST_USER .username.value,
344+ RepositoryRole .READER ,
345+ CompoundHierarchyId .forRepository(
346+ OrganizationId (createdProduct.organizationId),
347+ ProductId (createdProduct.id),
348+ RepositoryId (createdRepository2.id)
349+ )
350+ )
351+
352+ val response = testUserClient.get("/api/v1/products/${createdProduct.id}/repositories")
353+
354+ response shouldHaveStatus HttpStatusCode .OK
355+ response shouldHaveBody PagedResponse (
356+ listOf(
357+ Repository (createdRepository1.id, orgId, createdProduct.id, type.mapToApi(), url1, description),
358+ Repository (createdRepository2.id, orgId, createdProduct.id, type.mapToApi(), url2, description)
359+ ),
360+ PagingData (
361+ limit = DEFAULT_LIMIT ,
362+ offset = 0,
363+ totalCount = 2,
364+ sortProperties = listOf(SortProperty ("url", SortDirection .ASCENDING ))
365+ )
366+ )
367+ }
368+ }
369+
302370 " support query parameters" {
303371 integrationTestApplication {
304372 val createdProduct = createProduct()
0 commit comments