Skip to content
Snippets Groups Projects
Commit 3cb385b6 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6867 OZG-6899 implement remote service

parent 4a1bc046
No related branches found
No related tags found
No related merge requests found
Showing
with 318 additions and 9 deletions
...@@ -26,9 +26,17 @@ ...@@ -26,9 +26,17 @@
<mongock.version>5.4.0</mongock.version> <mongock.version>5.4.0</mongock.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
<mapstruct-processor.version>${mapstruct.version}</mapstruct-processor.version> <mapstruct-processor.version>${mapstruct.version}</mapstruct-processor.version>
<zufi-manager.version>1.5.0-SNAPSHOT</zufi-manager.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- OZG Cloud API -->
<dependency>
<groupId>de.ozgcloud.zufi</groupId>
<artifactId>zufi-manager-interface</artifactId>
<version>${zufi-manager.version}</version>
</dependency>
<!-- Spring --> <!-- Spring -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
...@@ -72,6 +80,10 @@ ...@@ -72,6 +80,10 @@
<artifactId>spring-boot-configuration-processor</artifactId> <artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>
<!-- Keycloak --> <!-- Keycloak -->
<dependency> <dependency>
......
package de.ozgcloud.admin.common;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Optional;
import java.util.stream.StreamSupport;
import io.grpc.Metadata;
import io.grpc.Metadata.Key;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class GrpcUtil {
public static final String ZUFI_MANAGER_GRPC_CLIENT = "zufi-manager";
public static final String SERVICE_KEY = "GRPC_SERVICE";
public static Key<String> keyOfString(String key) {
return Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
}
public static Key<byte[]> createKeyOf(String key) {
return Key.of(key, Metadata.BINARY_BYTE_MARSHALLER);
}
public static String getFromHeaders(String key, Metadata headers) {
return Optional.ofNullable(headers.get(createKeyOf(key)))
.map(GrpcUtil::byteToString)
.orElse(null);
}
public static Collection<String> getCollection(String key, Metadata headers) {
return StreamSupport.stream(headers.getAll(createKeyOf(key)).spliterator(), false)
.map(GrpcUtil::byteToString)
.toList();
}
private static String byteToString(byte[] bytes) {
return new String(bytes, StandardCharsets.UTF_8);
}
}
\ No newline at end of file
...@@ -25,7 +25,6 @@ public class OrganisationsEinheit { ...@@ -25,7 +25,6 @@ public class OrganisationsEinheit {
@Id @Id
private String id; private String id;
private String name; private String name;
private String anschrift;
private String organisationsEinheitId; private String organisationsEinheitId;
private String uebergeordneteOrganisationseinheitId; private String uebergeordneteOrganisationseinheitId;
private List<String> untergeordneteOrganisationseinheitIds; private List<String> untergeordneteOrganisationseinheitIds;
......
package de.ozgcloud.admin.organisationseinheit;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit;
@Mapper
interface OrganisationsEinheitMapper {
@Mapping(target = "organisationsEinheitId", source = "xzufiId.id")
@Mapping(target = "zufiId", source = "id")
OrganisationsEinheit fromGrpc(GrpcOrganisationsEinheit grpcOrganisationsEinheit);
}
package de.ozgcloud.admin.organisationseinheit;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.admin.common.GrpcUtil;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdRequest;
import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class OrganisationsEinheitRemoteService {
@GrpcClient(GrpcUtil.ZUFI_MANAGER_GRPC_CLIENT)
private OrganisationsEinheitServiceBlockingStub serviceStub;
@Autowired
private OrganisationsEinheitMapper organisationsEinheitMapper;
public List<OrganisationsEinheit> getByOrganisationsEinheitId(String organisationsEinheitId) {
var request = buildGetByOrganisationsEinheitIdRequest(organisationsEinheitId);
var response = serviceStub.getByOrganisationsEinheitId(request);
return response.getOrganisationsEinheitenList().stream().map(organisationsEinheitMapper::fromGrpc).toList();
}
GrpcGetByOrganisationsEinheitIdRequest buildGetByOrganisationsEinheitIdRequest(String organisationsEinheitId) {
return GrpcGetByOrganisationsEinheitIdRequest.newBuilder().setOrganisationsEinheitId(organisationsEinheitId).build();
}
}
...@@ -12,3 +12,8 @@ ozgcloud: ...@@ -12,3 +12,8 @@ ozgcloud:
auth-server-url: http://localhost:8088 auth-server-url: http://localhost:8088
realm: by-kiel-dev realm: by-kiel-dev
resource: admin resource: admin
grpc:
client:
zufi-manager:
negotiationType: PLAINTEXT
\ No newline at end of file
...@@ -82,3 +82,9 @@ ozgcloud: ...@@ -82,3 +82,9 @@ ozgcloud:
realm: ${ozgcloud.oauth2.realm} realm: ${ozgcloud.oauth2.realm}
client: ${ozgcloud.oauth2.resource} client: ${ozgcloud.oauth2.resource}
organisations-einheit-id-key: organisationseinheitId organisations-einheit-id-key: organisationseinheitId
grpc:
client:
zufi-manager:
address: static://127.0.0.1:9190
negotiationType: TLS
\ No newline at end of file
package de.ozgcloud.admin.organisationseinheit;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdRequest;
public class GrpcGetByOrganisationsEinheitIdRequestTestFactory {
public static final String ORGANISATIONS_EINHEIT_ID = OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID;
public static GrpcGetByOrganisationsEinheitIdRequest create() {
return createBuilder().build();
}
public static GrpcGetByOrganisationsEinheitIdRequest.Builder createBuilder() {
return GrpcGetByOrganisationsEinheitIdRequest.newBuilder()
.setOrganisationsEinheitId(ORGANISATIONS_EINHEIT_ID);
}
}
package de.ozgcloud.admin.organisationseinheit;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdResponse;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit;
public class GrpcGetByOrganisationsEinheitIdResponseTestFactory {
public static final GrpcOrganisationsEinheit GRPC_ORGANISATIONS_EINHEIT = GrpcOrganisationsEinheitTestFactory.create();
public static GrpcGetByOrganisationsEinheitIdResponse create() {
return createBuilder().build();
}
public static GrpcGetByOrganisationsEinheitIdResponse.Builder createBuilder() {
return GrpcGetByOrganisationsEinheitIdResponse.newBuilder()
.addOrganisationsEinheiten(GRPC_ORGANISATIONS_EINHEIT);
}
}
package de.ozgcloud.admin.organisationseinheit;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcXzufiId;
public class GrpcOrganisationsEinheitTestFactory {
public static final String ID = OrganisationsEinheitTestFactory.ZUFI_ID;
public static final String NAME = OrganisationsEinheitTestFactory.NAME;
public static final GrpcXzufiId XZUFI_ID = GrpcXzufiIdTestFactory.create();
public static GrpcOrganisationsEinheit create() {
return createBuilder().build();
}
public static GrpcOrganisationsEinheit.Builder createBuilder() {
return GrpcOrganisationsEinheit.newBuilder()
.setId(ID)
.setName(NAME)
.setXzufiId(XZUFI_ID);
}
}
package de.ozgcloud.admin.organisationseinheit;
import java.util.UUID;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcXzufiId;
public class GrpcXzufiIdTestFactory {
public static final String ORGANISATIONS_EINHEIT_ID = OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID;
public static final String SCHEME_AGENCY_ID = UUID.randomUUID().toString();
public static GrpcXzufiId create() {
return createBuilder().build();
}
public static GrpcXzufiId.Builder createBuilder() {
return GrpcXzufiId.newBuilder()
.setId(ORGANISATIONS_EINHEIT_ID)
.setSchemeAgencyId(SCHEME_AGENCY_ID);
}
}
...@@ -67,7 +67,6 @@ class OrganisationsEinheitITCase { ...@@ -67,7 +67,6 @@ class OrganisationsEinheitITCase {
void shouldContainOrganisationsEinheit() { void shouldContainOrganisationsEinheit() {
mockMvc.perform(get(PATH)) mockMvc.perform(get(PATH))
.andExpect(jsonPath("$._embedded.organisationsEinheitList[0].name").value(OrganisationsEinheitTestFactory.NAME)) .andExpect(jsonPath("$._embedded.organisationsEinheitList[0].name").value(OrganisationsEinheitTestFactory.NAME))
.andExpect(jsonPath("$._embedded.organisationsEinheitList[0].anschrift").value(OrganisationsEinheitTestFactory.ANSCHRIFT))
.andExpect(jsonPath("$._embedded.organisationsEinheitList[0].organisationsEinheitId").value( .andExpect(jsonPath("$._embedded.organisationsEinheitList[0].organisationsEinheitId").value(
OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID)) OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID))
.andExpect(jsonPath("$._embedded.organisationsEinheitList[0].uebergeordneteOrganisationseinheitId").value( .andExpect(jsonPath("$._embedded.organisationsEinheitList[0].uebergeordneteOrganisationseinheitId").value(
...@@ -98,7 +97,6 @@ class OrganisationsEinheitITCase { ...@@ -98,7 +97,6 @@ class OrganisationsEinheitITCase {
response response
.andExpect(jsonPath("$.name").value(OrganisationsEinheitTestFactory.NAME)) .andExpect(jsonPath("$.name").value(OrganisationsEinheitTestFactory.NAME))
.andExpect(jsonPath("$.anschrift").value(OrganisationsEinheitTestFactory.ANSCHRIFT))
.andExpect(jsonPath("$.organisationsEinheitId").value( .andExpect(jsonPath("$.organisationsEinheitId").value(
OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID)) OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID))
.andExpect(jsonPath("$.uebergeordneteOrganisationseinheitId").value( .andExpect(jsonPath("$.uebergeordneteOrganisationseinheitId").value(
......
package de.ozgcloud.admin.organisationseinheit;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
class OrganisationsEinheitMapperTest {
private final OrganisationsEinheitMapper mapper = Mappers.getMapper(OrganisationsEinheitMapper.class);
@Nested
class TestFromGrpc {
@Test
void shouldMap() {
var mapped = mapper.fromGrpc(GrpcOrganisationsEinheitTestFactory.create());
assertThat(mapped).extracting(
OrganisationsEinheit::getName,
OrganisationsEinheit::getOrganisationsEinheitId,
OrganisationsEinheit::getZufiId,
OrganisationsEinheit::getUntergeordneteOrganisationseinheitIds,
OrganisationsEinheit::getUebergeordneteOrganisationseinheitId,
OrganisationsEinheit::getSyncResult
).containsExactly(
OrganisationsEinheitTestFactory.NAME,
OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID,
OrganisationsEinheitTestFactory.ZUFI_ID,
null,
null,
null
);
}
}
}
\ No newline at end of file
package de.ozgcloud.admin.organisationseinheit;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdRequest;
import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdResponse;
import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub;
class OrganisationsEinheitRemoteServiceTest {
@Spy
@InjectMocks
private OrganisationsEinheitRemoteService service;
@Mock
private OrganisationsEinheitServiceBlockingStub serviceStub;
@Mock
private OrganisationsEinheitMapper mapper;
@Nested
class TestGetByOrganisationsEinheitId {
private final GrpcGetByOrganisationsEinheitIdRequest request = GrpcGetByOrganisationsEinheitIdRequestTestFactory.create();
private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.create();
private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create();
@BeforeEach
void setUp() {
doReturn(request).when(service).buildGetByOrganisationsEinheitIdRequest(OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID);
when(serviceStub.getByOrganisationsEinheitId(request)).thenReturn(response);
when(mapper.fromGrpc(GrpcGetByOrganisationsEinheitIdResponseTestFactory.GRPC_ORGANISATIONS_EINHEIT)).thenReturn(organisationsEinheit);
}
@Test
void shouldBuildRequest() {
service.getByOrganisationsEinheitId(OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID);
verify(service).buildGetByOrganisationsEinheitIdRequest(OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID);
}
@Test
void shouldCallServiceStub() {
service.getByOrganisationsEinheitId(OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID);
verify(serviceStub).getByOrganisationsEinheitId(request);
}
@Test
void shouldMapResponse() {
service.getByOrganisationsEinheitId(OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID);
verify(mapper).fromGrpc(GrpcGetByOrganisationsEinheitIdResponseTestFactory.GRPC_ORGANISATIONS_EINHEIT);
}
@Test
void shouldReturnOrganisationsEinheiten() {
var organisationsEinheiten = service.getByOrganisationsEinheitId(OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID);
assertThat(organisationsEinheiten).containsExactly(organisationsEinheit);
}
}
@Nested
class TestBuildGetByOrganisationsEinheitIdRequest {
@Test
void shouldBuild() {
var request = service.buildGetByOrganisationsEinheitIdRequest(OrganisationsEinheitTestFactory.ID);
assertThat(request.getOrganisationsEinheitId()).isEqualTo(OrganisationsEinheitTestFactory.ID);
}
}
}
\ No newline at end of file
...@@ -9,7 +9,6 @@ public class OrganisationsEinheitTestFactory { ...@@ -9,7 +9,6 @@ public class OrganisationsEinheitTestFactory {
public static final String ID = UUID.randomUUID().toString(); public static final String ID = UUID.randomUUID().toString();
public static final String NAME = LoremIpsum.getInstance().getName(); public static final String NAME = LoremIpsum.getInstance().getName();
public static final String ANSCHRIFT = LoremIpsum.getInstance().getCity();
public static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString(); public static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString();
public static final String UEBERGEORDNETE_ORGANISATIONSEINHEIT_ID = UUID.randomUUID().toString(); public static final String UEBERGEORDNETE_ORGANISATIONSEINHEIT_ID = UUID.randomUUID().toString();
public static final List<String> UNTERGEORDNETE_ORGANISATIONSEINHEIT_ID = List.of(UUID.randomUUID().toString()); public static final List<String> UNTERGEORDNETE_ORGANISATIONSEINHEIT_ID = List.of(UUID.randomUUID().toString());
...@@ -24,7 +23,6 @@ public class OrganisationsEinheitTestFactory { ...@@ -24,7 +23,6 @@ public class OrganisationsEinheitTestFactory {
return OrganisationsEinheit.builder() return OrganisationsEinheit.builder()
.id(ID) .id(ID)
.name(NAME) .name(NAME)
.anschrift(ANSCHRIFT)
.organisationsEinheitId(ORGANISATIONS_EINHEIT_ID) .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID)
.uebergeordneteOrganisationseinheitId(UEBERGEORDNETE_ORGANISATIONSEINHEIT_ID) .uebergeordneteOrganisationseinheitId(UEBERGEORDNETE_ORGANISATIONSEINHEIT_ID)
.untergeordneteOrganisationseinheitIds(UNTERGEORDNETE_ORGANISATIONSEINHEIT_ID) .untergeordneteOrganisationseinheitIds(UNTERGEORDNETE_ORGANISATIONSEINHEIT_ID)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment