@@ -28,10 +28,15 @@ import io.kotest.matchers.shouldBe
2828import org.eclipse.apoapsis.ortserver.dao.UniqueConstraintException
2929import org.eclipse.apoapsis.ortserver.dao.test.DatabaseTestExtension
3030import org.eclipse.apoapsis.ortserver.dao.test.Fixtures
31+ import org.eclipse.apoapsis.ortserver.model.CompoundHierarchyId
3132import org.eclipse.apoapsis.ortserver.model.Hierarchy
33+ import org.eclipse.apoapsis.ortserver.model.OrganizationId
34+ import org.eclipse.apoapsis.ortserver.model.ProductId
3235import org.eclipse.apoapsis.ortserver.model.Repository
36+ import org.eclipse.apoapsis.ortserver.model.RepositoryId
3337import org.eclipse.apoapsis.ortserver.model.RepositoryType
3438import org.eclipse.apoapsis.ortserver.model.util.FilterParameter
39+ import org.eclipse.apoapsis.ortserver.model.util.HierarchyFilter
3540import org.eclipse.apoapsis.ortserver.model.util.ListQueryParameters
3641import org.eclipse.apoapsis.ortserver.model.util.ListQueryResult
3742import org.eclipse.apoapsis.ortserver.model.util.OptionalValue
@@ -121,7 +126,7 @@ class DaoRepositoryRepositoryTest : StringSpec({
121126 fixtures.createRepository(url = "https://example.com/repo3.git")
122127 fixtures.createRepository(url = "https://example.com/repo4.git")
123128
124- repositoryRepository.list(filter = FilterParameter ("repository.git$")) shouldBe ListQueryResult (
129+ repositoryRepository.list(urlFilter = FilterParameter ("repository.git$")) shouldBe ListQueryResult (
125130 data = listOf(
126131 Repository (repo1.id, orgId, repo1.productId, repo1.type, repo1.url, repo1.description),
127132 Repository (repo2.id, orgId, repo2.productId, repo2.type, repo2.url, repo2.description),
@@ -142,7 +147,7 @@ class DaoRepositoryRepositoryTest : StringSpec({
142147 url = "https://subdomain.example.com/repo.git"
143148 )
144149
145- val result = repositoryRepository.list(filter = FilterParameter ("example\\.com"))
150+ val result = repositoryRepository.list(urlFilter = FilterParameter ("example\\.com"))
146151
147152 result shouldBe ListQueryResult (
148153 data = listOf(
@@ -155,6 +160,102 @@ class DaoRepositoryRepositoryTest : StringSpec({
155160 )
156161 }
157162
163+ " list should apply a hierarchy filter on repository level" {
164+ val repo1 = fixtures.createRepository(url = "https://example.com/repo1.git")
165+ val repo1Id = CompoundHierarchyId .forRepository(
166+ OrganizationId (fixtures.organization.id),
167+ ProductId (fixtures.product.id),
168+ RepositoryId (repo1.id)
169+ )
170+ val repo2 = fixtures.createRepository(url = "https://example.com/repo2.git")
171+ val repo2Id = CompoundHierarchyId .forRepository(
172+ OrganizationId (fixtures.organization.id),
173+ ProductId (fixtures.product.id),
174+ RepositoryId (repo2.id)
175+ )
176+ fixtures.createRepository(url = "https://example.com/repo3.git")
177+
178+ val hierarchyFilter = HierarchyFilter (
179+ transitiveIncludes = mapOf(CompoundHierarchyId .REPOSITORY_LEVEL to listOf(repo1Id, repo2Id)),
180+ nonTransitiveIncludes = emptyMap()
181+ )
182+ val result = repositoryRepository.list(hierarchyFilter = hierarchyFilter)
183+
184+ result shouldBe ListQueryResult (
185+ data = listOf(
186+ Repository (repo1.id, orgId, repo1.productId, repo1.type, repo1.url, repo1.description),
187+ Repository (repo2.id, orgId, repo2.productId, repo2.type, repo2.url, repo2.description),
188+ ),
189+ params = ListQueryParameters .DEFAULT ,
190+ totalCount = 2
191+ )
192+ }
193+
194+ " list should apply a hierarchy filter on product level" {
195+ val product1 = fixtures.createProduct(name = "product1")
196+ val product1Id = CompoundHierarchyId .forProduct(
197+ OrganizationId (fixtures.organization.id),
198+ ProductId (product1.id)
199+ )
200+ val repo1 = fixtures.createRepository(url = "https://example.com/repo1.git", productId = product1.id)
201+ val product2 = fixtures.createProduct(name = "product2")
202+ val product2Id = CompoundHierarchyId .forProduct(
203+ OrganizationId (fixtures.organization.id),
204+ ProductId (product2.id)
205+ )
206+ val repo2 = fixtures.createRepository(url = "https://example.com/repo2.git", productId = product2.id)
207+ fixtures.createRepository(url = "https://example.com/repo3.git")
208+
209+ val hierarchyFilter = HierarchyFilter (
210+ transitiveIncludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(product1Id, product2Id)),
211+ nonTransitiveIncludes = emptyMap()
212+ )
213+ val result = repositoryRepository.list(hierarchyFilter = hierarchyFilter)
214+
215+ result shouldBe ListQueryResult (
216+ data = listOf(
217+ Repository (repo1.id, orgId, repo1.productId, repo1.type, repo1.url, repo1.description),
218+ Repository (repo2.id, orgId, repo2.productId, repo2.type, repo2.url, repo2.description),
219+ ),
220+ params = ListQueryParameters .DEFAULT ,
221+ totalCount = 2
222+ )
223+ }
224+
225+ " list should apply a hierarchy filter on organization level" {
226+ val organization1 = fixtures.createOrganization(name = "testOrganization")
227+ val organization1Id = CompoundHierarchyId .forOrganization(OrganizationId (organization1.id))
228+ val product1 = fixtures.createProduct(name = "product1", organizationId = organization1.id)
229+ val repo1 = fixtures.createRepository(url = "https://example.com/repo1.git", productId = product1.id)
230+
231+ val organization2 = fixtures.createOrganization(name = "organization2")
232+ val organization2Id = CompoundHierarchyId .forOrganization(OrganizationId (organization2.id))
233+ val product2 = fixtures.createProduct(name = "product2", organizationId = organization2.id)
234+ val repo2 = fixtures.createRepository(url = "https://example.com/repo2.git", productId = product2.id)
235+
236+ fixtures.createRepository(url = "https://example.com/repo3.git")
237+
238+ val hierarchyFilter = HierarchyFilter (
239+ transitiveIncludes = mapOf(
240+ CompoundHierarchyId .ORGANIZATION_LEVEL to listOf(
241+ organization1Id,
242+ organization2Id
243+ )
244+ ),
245+ nonTransitiveIncludes = emptyMap()
246+ )
247+ val result = repositoryRepository.list(hierarchyFilter = hierarchyFilter)
248+
249+ result shouldBe ListQueryResult (
250+ data = listOf(
251+ Repository (repo1.id, organization1.id, repo1.productId, repo1.type, repo1.url, repo1.description),
252+ Repository (repo2.id, organization2.id, repo2.productId, repo2.type, repo2.url, repo2.description),
253+ ),
254+ params = ListQueryParameters .DEFAULT ,
255+ totalCount = 2
256+ )
257+ }
258+
158259 " listForProduct should return all repositories for a product" {
159260 val type = RepositoryType .GIT
160261
0 commit comments