diff --git a/api-lib-core/pom.xml b/api-lib-core/pom.xml index 41dcf5efaf4dce890f0a92eb689382e8b84b00e2..18560a62b52216ef90809ed4c2e5ed1e8bc04533 100644 --- a/api-lib-core/pom.xml +++ b/api-lib-core/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>de.ozgcloud.api-lib</groupId> <artifactId>api-lib-parent</artifactId> - <version>0.1.0-SNAPSHOT</version> + <version>0.2.0-SNAPSHOT</version> </parent> <artifactId>api-lib-core</artifactId> diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/FileId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/FileId.java deleted file mode 100644 index 6cb26d1f78a73e31b633b73950801b21099ed248..0000000000000000000000000000000000000000 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/FileId.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.apilib.file; - -import de.itvsh.kop.common.datatype.StringBasedValue; - -public class FileId extends StringBasedValue { - - FileId(String id) { - super(id); - } - - public FileId from(String id) { - return new FileId(id); - } -} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java index 61f97f6897423cfa5a492ab407b058cb76ad9f19..1464584244e36b67bffb1982def55256b6fcddd7 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java @@ -9,7 +9,7 @@ import lombok.ToString; @ToString public class OzgCloudFile { - private FileId id; + private OzgCloudFileId id; private String name; private String contentType; diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java new file mode 100644 index 0000000000000000000000000000000000000000..d0f0d5bc98533c336f0cae3c7ac876f1a77fb35a --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java @@ -0,0 +1,14 @@ +package de.ozgcloud.apilib.file; + +import de.itvsh.kop.common.datatype.StringBasedValue; + +public class OzgCloudFileId extends StringBasedValue { + + public OzgCloudFileId(String id) { + super(id); + } + + public static OzgCloudFileId from(String id) { + return new OzgCloudFileId(id); + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java new file mode 100644 index 0000000000000000000000000000000000000000..dc5f3852f2f4c538b782c0d0adf60a7f120b74b5 --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java @@ -0,0 +1,10 @@ +package de.ozgcloud.apilib.file; + +import java.io.OutputStream; + +public interface OzgCloudFileService { + + OzgCloudFile getFile(OzgCloudFileId id); + + void writeFileDataToStream(OzgCloudFileId id, OutputStream streamToWriteData); +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java new file mode 100644 index 0000000000000000000000000000000000000000..3fc5f890bd55abd80f2a55c892fa52858d8f00ce --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java @@ -0,0 +1,95 @@ +package de.ozgcloud.apilib.file.grpc; + +import java.io.OutputStream; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Service; + +import de.itvsh.kop.common.binaryfile.FileId; +import de.itvsh.kop.common.errorhandling.TechnicalException; +import de.itvsh.ozg.pluto.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceBlockingStub; +import de.itvsh.ozg.pluto.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; +import de.itvsh.ozg.pluto.grpc.binaryFile.GrpcBinaryFilesRequest; +import de.itvsh.ozg.pluto.grpc.binaryFile.GrpcFindFilesResponse; +import de.itvsh.ozg.pluto.grpc.binaryFile.GrpcGetBinaryFileDataRequest; +import de.itvsh.ozg.pluto.grpc.file.GrpcOzgFile; +import de.ozgcloud.apilib.errorhandling.NotFoundException; +import de.ozgcloud.apilib.file.OzgCloudFile; +import de.ozgcloud.apilib.file.OzgCloudFileId; +import de.ozgcloud.apilib.file.OzgCloudFileService; +import lombok.RequiredArgsConstructor; +import lombok.extern.java.Log; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@Service +@ConditionalOnProperty("ozgcloud.file-manager.address") +@RequiredArgsConstructor +@Log +public class GrpcOzgCloudFileService implements OzgCloudFileService { + + @GrpcClient("file-manager") + private final BinaryFileServiceBlockingStub blockingStub; + @GrpcClient("file-manager") + private final BinaryFileServiceStub asyncServiceStub; + + @Autowired + private final OzgCloudFileMapper mapper; + + static final int CHUNK_SIZE = 255 * 1024; + + @Override + public OzgCloudFile getFile(OzgCloudFileId id) { + var response = blockingStub.findBinaryFilesMetaData(buildFindFileRequest(id)); + + return mapper.fromGrpc(getSingleResponse(response, id)); + } + + GrpcBinaryFilesRequest buildFindFileRequest(OzgCloudFileId id) { + return GrpcBinaryFilesRequest.newBuilder() + .addFileId(id.toString()) + .build(); + } + + GrpcOzgFile getSingleResponse(GrpcFindFilesResponse response, OzgCloudFileId id) { + var responseCount = response.getFileCount(); + if (responseCount == 0) { + throw new NotFoundException(id, "OzgCloudFile"); + } + if (responseCount > 1) { + LOG.log(Level.WARNING, () -> "Found more then one file with id '%s'. Returning first one, only.".formatted(id.toString())); + } + return response.getFile(0); + } + + @Override + public void writeFileDataToStream(OzgCloudFileId id, OutputStream streamToWriteData) { + var fileId = FileId.from(id.toString()); + var streamFuture = new CompletableFuture<Boolean>(); + var responseObserver = new OzgCloudFileDownloadStreamObserver(streamFuture, streamToWriteData); + + asyncServiceStub.getBinaryFileContent(buildGrpcGetBinaryFileDataRequest(fileId), responseObserver); + + waitUntilFutureToComplete(streamFuture); + } + + private GrpcGetBinaryFileDataRequest buildGrpcGetBinaryFileDataRequest(FileId fileId) { + return GrpcGetBinaryFileDataRequest.newBuilder().setFileId(fileId.toString()).build(); + } + + void waitUntilFutureToComplete(CompletableFuture<Boolean> streamFuture) { + try { + streamFuture.get(10, TimeUnit.MINUTES); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new TechnicalException(e.getMessage(), e); + } catch (ExecutionException | TimeoutException e) { + throw new TechnicalException(e.getMessage(), e); + } + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..3a9826da742b4a1a3421ba2c86f11d528e6218c4 --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java @@ -0,0 +1,41 @@ +package de.ozgcloud.apilib.file.grpc; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.concurrent.CompletableFuture; + +import de.itvsh.kop.common.errorhandling.TechnicalException; +import de.itvsh.ozg.pluto.grpc.binaryFile.GrpcGetBinaryFileDataResponse; +import io.grpc.stub.StreamObserver; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +class OzgCloudFileDownloadStreamObserver implements StreamObserver<GrpcGetBinaryFileDataResponse> { + + private final CompletableFuture<Boolean> streamFuture; + private final OutputStream out; + + @Override + public void onNext(GrpcGetBinaryFileDataResponse response) { + writeToStream(response.getFileContent().toByteArray()); + } + + void writeToStream(byte[] contentPart) { + try { + out.write(contentPart); + } catch (IOException e) { + throw new TechnicalException("Download file error writing on OutputStream", e); + } + } + + @Override + public void onError(Throwable t) { + streamFuture.completeExceptionally(t); + } + + @Override + public void onCompleted() { + streamFuture.complete(true); + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f8e5c3bcefedd4a04709c6f5e843e0cd32ac7bf3 --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java @@ -0,0 +1,15 @@ +package de.ozgcloud.apilib.file.grpc; + +import org.mapstruct.Mapper; + +import de.itvsh.ozg.pluto.grpc.file.GrpcOzgFile; +import de.ozgcloud.apilib.file.OzgCloudFile; +import de.ozgcloud.apilib.file.OzgCloudFileId; + +@Mapper +public interface OzgCloudFileMapper { + + OzgCloudFile fromGrpc(GrpcOzgFile grpcFile); + + OzgCloudFileId toOzgCloudFileId(String string); +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java new file mode 100644 index 0000000000000000000000000000000000000000..8c89abfad47e6505ff743a3f25675dad4a757a9b --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java @@ -0,0 +1,14 @@ +package de.ozgcloud.apilib.user; + +import de.itvsh.kop.common.datatype.StringBasedValue; + +public class OzgCloudUserId extends StringBasedValue { + + OzgCloudUserId(String id) { + super(id); + } + + public static OzgCloudUserId from(String id) { + return new OzgCloudUserId(id); + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserId.java deleted file mode 100644 index a8d4e3f4a28f84a2c2d08c8d4256e1fdbaf01f50..0000000000000000000000000000000000000000 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserId.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.apilib.user; - -import de.itvsh.kop.common.datatype.StringBasedValue; - -public class UserId extends StringBasedValue { - - UserId(String id) { - super(id); - } - - public static UserId from(String id) { - return new UserId(id); - } -} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java index a6af8c35a0046752ba002ba8ecfa98bcdd374b0c..f8396cfb6dc9cef9c93c3ed1963e159299c19c82 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java @@ -2,7 +2,7 @@ package de.ozgcloud.apilib.vorgang; import java.time.ZonedDateTime; -import de.ozgcloud.apilib.user.UserId; +import de.ozgcloud.apilib.user.OzgCloudUserId; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -11,11 +11,11 @@ import lombok.ToString; @Getter public class OzgCloudVorgangHeader { - private VorgangStatus status; + private OzgCloudVorgangStatus status; private ZonedDateTime createdAt; - private UserId assignedTo; + private OzgCloudUserId assignedTo; private String aktenzeichen; diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..2a3080dd0efba72cc99171241258861e16e7bb5b --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java @@ -0,0 +1,14 @@ +package de.ozgcloud.apilib.vorgang; + +import de.itvsh.kop.common.datatype.StringBasedValue; + +public class OzgCloudVorgangStatus extends StringBasedValue { + + OzgCloudVorgangStatus(String status) { + super(status); + } + + public static OzgCloudVorgangStatus from(String status) { + return new OzgCloudVorgangStatus(status); + } +} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/VorgangStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/VorgangStatus.java deleted file mode 100644 index 5babf8a46b1492fa74c5541c437f0ed79fdd4418..0000000000000000000000000000000000000000 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/VorgangStatus.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.apilib.vorgang; - -import de.itvsh.kop.common.datatype.StringBasedValue; - -public class VorgangStatus extends StringBasedValue { - - VorgangStatus(String status) { - super(status); - } - - public static VorgangStatus from(String status) { - return new VorgangStatus(status); - } -} diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java index 5e31042e11e2438aec672f5880e89eb086aa4bb4..761d910ff63eb162e90cdc72f4233fe9fd30f9ce 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java @@ -15,9 +15,9 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgang; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangHeader; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStatus; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub; import de.ozgcloud.apilib.vorgang.Page; -import de.ozgcloud.apilib.vorgang.VorgangStatus; @Service @ConditionalOnMissingBean(OzgCloudVorgangService.class) @@ -29,7 +29,7 @@ public class DummyVorgangService implements OzgCloudVorgangService { private static final String VORGANG_NAME_1 = "Antrag auf einen Waffelschein"; private static final String VORGANG_NR_1 = "1234"; private static final OzgCloudVorgangHeader HEADER_1 = OzgCloudVorgangHeader.builder() - .status(VorgangStatus.from("NEU")) + .status(OzgCloudVorgangStatus.from("NEU")) .createdAt(ZonedDateTime.now()) .aktenzeichen("ABC-123-04") .build(); @@ -38,7 +38,7 @@ public class DummyVorgangService implements OzgCloudVorgangService { private static final String VORGANG_NAME_2 = "Antrag auf Führung eines Kampfhamsters"; private static final String VORGANG_NR_2 = "5678"; private static final OzgCloudVorgangHeader HEADER_2 = OzgCloudVorgangHeader.builder() - .status(VorgangStatus.from("IN_BEARBEITUNG")) + .status(OzgCloudVorgangStatus.from("IN_BEARBEITUNG")) .createdAt(ZonedDateTime.now().minus(1, ChronoUnit.DAYS)) .aktenzeichen("ABC-546-12") .build(); diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java index 007daf04e89105cbde9f8a1cb6f440dafe98080a..3973f7921f2383a8d1d8a477f8358d73f3f84cb4 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java @@ -6,11 +6,11 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import de.itvsh.ozg.pluto.vorgang.GrpcVorgangWithEingang; -import de.ozgcloud.apilib.user.UserId; +import de.ozgcloud.apilib.user.OzgCloudUserId; import de.ozgcloud.apilib.vorgang.OzgCloudServiceKontoType; import de.ozgcloud.apilib.vorgang.OzgCloudVorgang; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper; -import de.ozgcloud.apilib.vorgang.VorgangStatus; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStatus; @Mapper(uses = { OzgCloudEingangMapper.class, OzgCloudVorgangIdMapper.class }) public interface OzgCloudVorgangMapper { @@ -28,11 +28,11 @@ public interface OzgCloudVorgangMapper { return Optional.ofNullable(type).map(OzgCloudServiceKontoType::from).orElse(null); } - default UserId toUserId(String userId) { - return Optional.ofNullable(userId).map(UserId::from).orElse(null); + default OzgCloudUserId toUserId(String userId) { + return Optional.ofNullable(userId).map(OzgCloudUserId::from).orElse(null); } - default VorgangStatus toVorgangId(String status) { - return Optional.ofNullable(status).map(VorgangStatus::from).orElse(null); + default OzgCloudVorgangStatus toVorgangId(String status) { + return Optional.ofNullable(status).map(OzgCloudVorgangStatus::from).orElse(null); } } diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..04b41dc2577759935c667bbbc9e11928f846e135 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java @@ -0,0 +1,23 @@ +package de.ozgcloud.apilib.file; + +import java.util.UUID; + +public class OzgCloudFileTestFactory { + + public static final OzgCloudFileId ID = OzgCloudFileId.from(UUID.randomUUID().toString()); + public static final String NAME = "testfile.pdf"; + public static final String CONTENT_TYPE = "application/pdf"; + public static final long SIZE = 1024; + + public static OzgCloudFile create() { + return createBuilder().build(); + } + + public static OzgCloudFile.OzgCloudFileBuilder createBuilder() { + return OzgCloudFile.builder() + .id(ID) + .name(NAME) + .contentType(CONTENT_TYPE) + .size(SIZE); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..d64013a46530597d03e91eec8c1fd822f25e9f31 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java @@ -0,0 +1,15 @@ +package de.ozgcloud.apilib.file.grpc; + +import de.itvsh.ozg.pluto.grpc.binaryFile.GrpcFindFilesResponse; + +public class GrpcFindFilesResponseTestFactory { + + public static GrpcFindFilesResponse create() { + return createBuilder().build(); + } + + public static GrpcFindFilesResponse.Builder createBuilder() { + return GrpcFindFilesResponse.newBuilder() + .addFile(GrpcOzgFileTestFactory.create()); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ddc2304030486d3a6d5bda8b08f6e9b8fa08aff5 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java @@ -0,0 +1,95 @@ +package de.ozgcloud.apilib.file.grpc; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +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.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.itvsh.ozg.pluto.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceBlockingStub; +import de.itvsh.ozg.pluto.grpc.binaryFile.GrpcFindFilesResponse; +import de.ozgcloud.apilib.errorhandling.NotFoundException; +import de.ozgcloud.apilib.file.OzgCloudFileTestFactory; + +class GrpcOzgCloudFileServiceTest { + + @InjectMocks + private GrpcOzgCloudFileService service; + + @Mock + private BinaryFileServiceBlockingStub blockingStub; + @Spy + private OzgCloudFileMapper mapper = Mappers.getMapper(OzgCloudFileMapper.class); + + @Nested + class TestGetFile { + + @Nested + class CallGetFile { + @BeforeEach + void init() { + when(blockingStub.findBinaryFilesMetaData(any())).thenReturn(GrpcFindFilesResponse.newBuilder().addFile(GrpcOzgFileTestFactory.create()).build()); + } + + @Test + void shouldCallStub() { + service.getFile(OzgCloudFileTestFactory.ID); + + verify(blockingStub).findBinaryFilesMetaData(any()); + } + + @Test + void shouldCallMapper() { + service.getFile(OzgCloudFileTestFactory.ID); + + verify(mapper).fromGrpc(any()); + } + } + + @Nested + class BuildFindFileRequest { + + @Test + void shouldAddFileId() { + var request = service.buildFindFileRequest(OzgCloudFileTestFactory.ID); + + assertThat(request.getFileIdList()).hasSize(1).first().isEqualTo(OzgCloudFileTestFactory.ID.toString()); + } + } + + @Nested + class GetSingleResponse { + @Test + void shouldReturnSingleFile() { + var result = service.getSingleResponse(GrpcFindFilesResponseTestFactory.create(), OzgCloudFileTestFactory.ID); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcOzgFileTestFactory.create()); + } + + @Test + void shouldReturnFirstFile() { + var response = GrpcFindFilesResponseTestFactory.createBuilder().addFile(GrpcOzgFileTestFactory.createBuilder().setId("2").build()) + .build(); + + var result = service.getSingleResponse(response, OzgCloudFileTestFactory.ID); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcOzgFileTestFactory.create()); + } + + @Test + void shouldThrowNotFound() { + var response = GrpcFindFilesResponseTestFactory.createBuilder().clearFile().build(); + + assertThatThrownBy(() -> service.getSingleResponse(response, OzgCloudFileTestFactory.ID)) + .isInstanceOf(NotFoundException.class); + } + } + } + +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c7f9179abb0bed90e0dfc213a1ffa6891cf30ef8 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java @@ -0,0 +1,19 @@ +package de.ozgcloud.apilib.file.grpc; + +import de.itvsh.ozg.pluto.grpc.file.GrpcOzgFile; +import de.ozgcloud.apilib.file.OzgCloudFileTestFactory; + +public class GrpcOzgFileTestFactory { + + static GrpcOzgFile create() { + return createBuilder().build(); + } + + static GrpcOzgFile.Builder createBuilder() { + return GrpcOzgFile.newBuilder() + .setId(OzgCloudFileTestFactory.ID.toString()) + .setName(OzgCloudFileTestFactory.NAME) + .setContentType(OzgCloudFileTestFactory.CONTENT_TYPE) + .setSize(OzgCloudFileTestFactory.SIZE); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java index 94a01f745ce2139755b3a23cbd8fb8b837df3505..3af1c6b618ec8cfd1211cc9b56fae2e2ba91dc41 100644 --- a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java @@ -3,14 +3,14 @@ package de.ozgcloud.apilib.vorgang; import java.time.ZonedDateTime; import java.util.UUID; -import de.ozgcloud.apilib.user.UserId; +import de.ozgcloud.apilib.user.OzgCloudUserId; public class OzgCloudVorgangHeaderTestFactory { - public static VorgangStatus STATUS = VorgangStatus.from("WORKING"); + public static OzgCloudVorgangStatus STATUS = OzgCloudVorgangStatus.from("WORKING"); public static String CREATED_AT_STR = "2023-04-01T10:00:15Z"; public static ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR); - public static UserId ASSIGNED_TO = UserId.from(UUID.randomUUID().toString()); + public static OzgCloudUserId ASSIGNED_TO = OzgCloudUserId.from(UUID.randomUUID().toString()); public static String AKTENZEICHEN = "DE_12345_XY"; public static OzgCloudVorgangHeader create() { diff --git a/api-lib-demo/pom.xml b/api-lib-demo/pom.xml index 64e08d0228ab7de91c8032c1d914a297f6b6b93c..53dc4c274e2989f256a556b677e082530365aa0b 100644 --- a/api-lib-demo/pom.xml +++ b/api-lib-demo/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>de.ozgcloud.api-lib</groupId> <artifactId>api-lib-parent</artifactId> - <version>0.1.0-SNAPSHOT</version> + <version>0.2.0-SNAPSHOT</version> </parent> <artifactId>api-lib-demo</artifactId> diff --git a/ozg-cloud-spring-boot-starter/pom.xml b/ozg-cloud-spring-boot-starter/pom.xml index a75449d2de987b4460914cfd715faba9563059c0..16b2d2c239db087c62776a766ca82e167a078373 100644 --- a/ozg-cloud-spring-boot-starter/pom.xml +++ b/ozg-cloud-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>de.ozgcloud.api-lib</groupId> <artifactId>api-lib-parent</artifactId> - <version>0.1.0-SNAPSHOT</version> + <version>0.2.0-SNAPSHOT</version> </parent> <artifactId>ozg-cloud-spring-boot-starter</artifactId> diff --git a/pom.xml b/pom.xml index 78abf2c1677f80a2f7af5a180107d0092c33dbdb..d27fbb956d0761e4614d96fbf85ff11dee6c59da 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ <groupId>de.ozgcloud.api-lib</groupId> <artifactId>api-lib-parent</artifactId> - <version>0.1.0-SNAPSHOT</version> + <version>0.2.0-SNAPSHOT</version> <description>Library project to use the OZG-Cloud API</description> <packaging>pom</packaging>