fix HsHostingAssetRepository.findAllByCriteriaImpl query (#69)
Co-authored-by: Michael Hoennig <michael@hoennig.de> Reviewed-on: #69 Reviewed-by: Marc Sandlus <marc.sandlus@hostsharing.net>
This commit is contained in:
parent
409f5e97c7
commit
c5722e494f
@ -14,12 +14,26 @@ public interface HsHostingAssetRepository extends Repository<HsHostingAssetEntit
|
|||||||
|
|
||||||
List<HsHostingAssetEntity> findByIdentifier(String assetIdentifier);
|
List<HsHostingAssetEntity> findByIdentifier(String assetIdentifier);
|
||||||
|
|
||||||
@Query("""
|
@Query(value = """
|
||||||
SELECT asset FROM HsHostingAssetEntity asset
|
select ha.uuid,
|
||||||
WHERE (:projectUuid IS NULL OR asset.bookingItem.project.uuid = :projectUuid)
|
ha.alarmcontactuuid,
|
||||||
AND (:parentAssetUuid IS NULL OR asset.parentAsset.uuid = :parentAssetUuid)
|
ha.assignedtoassetuuid,
|
||||||
AND (:type IS NULL OR :type = CAST(asset.type AS String))
|
ha.bookingitemuuid,
|
||||||
""")
|
ha.caption,
|
||||||
|
ha.config,
|
||||||
|
ha.identifier,
|
||||||
|
ha.parentassetuuid,
|
||||||
|
ha.type,
|
||||||
|
ha.version
|
||||||
|
from hs_hosting_asset_rv ha
|
||||||
|
left join hs_booking_item bi on bi.uuid = ha.bookingitemuuid
|
||||||
|
left join hs_hosting_asset pha on pha.uuid = ha.parentassetuuid
|
||||||
|
where (:projectUuid is null or bi.projectuuid=:projectUuid)
|
||||||
|
and (:parentAssetUuid is null or pha.uuid=:parentAssetUuid)
|
||||||
|
and (:type is null or :type=cast(ha.type as text))
|
||||||
|
""", nativeQuery = true)
|
||||||
|
// The JPQL query did not generate "left join" but just "join".
|
||||||
|
// I also optimized the query by not using the _rv for hs_booking_item and hs_hosting_asset, only for hs_hosting_asset_rv.
|
||||||
List<HsHostingAssetEntity> findAllByCriteriaImpl(UUID projectUuid, UUID parentAssetUuid, String type);
|
List<HsHostingAssetEntity> findAllByCriteriaImpl(UUID projectUuid, UUID parentAssetUuid, String type);
|
||||||
default List<HsHostingAssetEntity> findAllByCriteria(final UUID projectUuid, final UUID parentAssetUuid, final HsHostingAssetType type) {
|
default List<HsHostingAssetEntity> findAllByCriteria(final UUID projectUuid, final UUID parentAssetUuid, final HsHostingAssetType type) {
|
||||||
return findAllByCriteriaImpl(projectUuid, parentAssetUuid, HsHostingAssetType.asString(type));
|
return findAllByCriteriaImpl(projectUuid, parentAssetUuid, HsHostingAssetType.asString(type));
|
||||||
|
@ -7,13 +7,13 @@ get:
|
|||||||
parameters:
|
parameters:
|
||||||
- $ref: 'auth.yaml#/components/parameters/currentUser'
|
- $ref: 'auth.yaml#/components/parameters/currentUser'
|
||||||
- $ref: 'auth.yaml#/components/parameters/assumedRoles'
|
- $ref: 'auth.yaml#/components/parameters/assumedRoles'
|
||||||
- name: debitorUuid
|
- name: projectUuid
|
||||||
in: query
|
in: query
|
||||||
required: false
|
required: false
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
format: uuid
|
format: uuid
|
||||||
description: The UUID of the debitor, whose hosting assets are to be listed.
|
description: The UUID of the project, whose hosting assets are to be listed.
|
||||||
- name: parentAssetUuid
|
- name: parentAssetUuid
|
||||||
in: query
|
in: query
|
||||||
required: false
|
required: false
|
||||||
|
@ -89,23 +89,11 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
.contentType("application/json")
|
.contentType("application/json")
|
||||||
.body("", lenientlyEquals("""
|
.body("", lenientlyEquals("""
|
||||||
[
|
[
|
||||||
{
|
|
||||||
"type": "MANAGED_WEBSPACE",
|
|
||||||
"identifier": "sec01",
|
|
||||||
"caption": "some Webspace",
|
|
||||||
"config": {}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "MANAGED_WEBSPACE",
|
"type": "MANAGED_WEBSPACE",
|
||||||
"identifier": "fir01",
|
"identifier": "fir01",
|
||||||
"caption": "some Webspace",
|
"caption": "some Webspace",
|
||||||
"config": {}
|
"config": {}
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "MANAGED_WEBSPACE",
|
|
||||||
"identifier": "thi01",
|
|
||||||
"caption": "some Webspace",
|
|
||||||
"config": {}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
"""));
|
"""));
|
||||||
|
@ -174,7 +174,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu
|
|||||||
final var result = assetRepo.findAllByCriteria(null, null, MANAGED_WEBSPACE);
|
final var result = assetRepo.findAllByCriteria(null, null, MANAGED_WEBSPACE);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
allTheseServersAreReturned(
|
exactlyTheseAssetsAreReturned(
|
||||||
result,
|
result,
|
||||||
"HsHostingAssetEntity(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)",
|
"HsHostingAssetEntity(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)",
|
||||||
"HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)",
|
"HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)",
|
||||||
@ -202,18 +202,19 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu
|
|||||||
public void normalUser_canFilterAssetsRelatedToParentAsset() {
|
public void normalUser_canFilterAssetsRelatedToParentAsset() {
|
||||||
// given
|
// given
|
||||||
context("superuser-alex@hostsharing.net");
|
context("superuser-alex@hostsharing.net");
|
||||||
final var parentAssetUuid = assetRepo.findAllByCriteria(null, null, MANAGED_SERVER).stream()
|
final var parentAssetUuid = assetRepo.findByIdentifier("vm1012").stream()
|
||||||
|
.filter(ha -> ha.getType() == MANAGED_SERVER)
|
||||||
.findAny().orElseThrow().getUuid();
|
.findAny().orElseThrow().getUuid();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
|
context("superuser-alex@hostsharing.net", "hs_hosting_asset#vm1012:AGENT");
|
||||||
final var result = assetRepo.findAllByCriteria(null, parentAssetUuid, null);
|
final var result = assetRepo.findAllByCriteria(null, parentAssetUuid, null);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
allTheseServersAreReturned(
|
exactlyTheseAssetsAreReturned(
|
||||||
result,
|
result,
|
||||||
"HsHostingAssetEntity(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)");
|
"HsHostingAssetEntity(MANAGED_WEBSPACE, sec01, some Webspace, MANAGED_SERVER:vm1012, D-1000212:D-1000212 default project:separate ManagedWebspace)");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@ -411,11 +412,4 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu
|
|||||||
.extracting(input -> input.replaceAll("\"", ""))
|
.extracting(input -> input.replaceAll("\"", ""))
|
||||||
.containsExactlyInAnyOrder(serverNames);
|
.containsExactlyInAnyOrder(serverNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
void allTheseServersAreReturned(final List<HsHostingAssetEntity> actualResult, final String... serverNames) {
|
|
||||||
assertThat(actualResult)
|
|
||||||
.extracting(HsHostingAssetEntity::toString)
|
|
||||||
.contains(serverNames);
|
|
||||||
actualResult.forEach(loadedEntity -> assertThat(loadedEntity.isLoaded()).isTrue());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user