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

OZG-4087 OZG-4144 implement api for exporting Vorgang

parent 6a33a469
No related branches found
No related tags found
No related merge requests found
......@@ -19,3 +19,5 @@ goofy-client/apps/coverage/
.attach**
.factorypath
http-client.private.env.json
\ No newline at end of file
......@@ -10,5 +10,5 @@ import lombok.ToString;
@Builder(toBuilder = true)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
class ExportData {
public class ExportData {
}
package de.ozgcloud.xdomea;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
......@@ -10,19 +10,16 @@ import org.springframework.stereotype.Service;
import de.itvsh.kop.common.errorhandling.TechnicalException;
@Service
class XDomeaService {
public class XDomeaService {
public ByteArrayOutputStream createExport(ExportData exportData) {
ByteArrayOutputStream outputBytes = new ByteArrayOutputStream();
try (ZipOutputStream zipOutputStream = new ZipOutputStream(outputBytes)) {
public void writeExport(ExportData exportData, OutputStream out) {
try (ZipOutputStream zipOutputStream = new ZipOutputStream(out)) {
putZipEntry("export_test.txt", "test", zipOutputStream);
} catch (IOException ioe) {
throw new TechnicalException("Error creating zip file with Vorgang export", ioe);
}
return outputBytes;
}
private void putZipEntry(String fileName, String fileData, ZipOutputStream zipOutputStream) throws IOException {
......
......@@ -2,6 +2,8 @@ package de.ozgcloud.xdomea;
import static org.assertj.core.api.Assertions.*;
import java.io.ByteArrayOutputStream;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
......@@ -10,14 +12,15 @@ class XDomeaServiceTest {
private XDomeaService service = new XDomeaService();
@Nested
class TestCreateExport {
class TestWriteExport {
@Test
void shouldCreate() {
var zipBytesStream = service.createExport(ExportDataTestFactory.create());
void shouldWriteBytes() {
var out = new ByteArrayOutputStream();
service.writeExport(ExportDataTestFactory.create(), out);
assertThat(zipBytesStream).isNotNull();
assertThat(zipBytesStream.toByteArray()).hasSizeGreaterThan(100);
assertThat(out).isNotNull();
assertThat(out.toByteArray()).hasSizeGreaterThan(100);
}
}
......
......@@ -44,10 +44,17 @@
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest</spring-boot.build-image.imageName>
<spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest
</spring-boot.build-image.imageName>
</properties>
<dependencies>
<dependency>
<groupId>de.itvsh.ozg</groupId>
<artifactId>alfa-xdomea</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework.boot</groupId>
......@@ -239,7 +246,8 @@
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/META-INF/resources</outputDirectory>
<outputDirectory>${project.build.directory}/classes/META-INF/resources
</outputDirectory>
<resources>
<resource>
<directory>../${project.parent.artifactId}-client/dist/apps/goofy/</directory>
......
package de.ozgcloud.alfa.vorgangexport;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import de.ozgcloud.xdomea.ExportData;
import de.ozgcloud.xdomea.XDomeaService;
@RestController
@RequestMapping(VorgangExportByVorgangController.BASE_PATH)
class VorgangExportByVorgangController {
public static final String BASE_PATH = "/api/vorgangs"; // NOSONAR
public static final String EXPORT_VORGANG_SUB_PATH = "/{vorgangId}/export"; // NOSONAR
public static final String EXPORT_VORGANG_PATH = BASE_PATH + EXPORT_VORGANG_SUB_PATH;
@Autowired
private XDomeaService xDomeaService;
@GetMapping(value = EXPORT_VORGANG_SUB_PATH, produces = "application/zip")
public ResponseEntity<StreamingResponseBody> exportVorgang(@PathVariable String vorgangId) {
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s", generateVorgangExportFilename()))
.contentType(MediaType.valueOf("application/zip"))
.body(out -> xDomeaService.writeExport(ExportData.builder().build(), out));
}
String generateVorgangExportFilename() {
return String.format("%s_Abgabe.Abgabe.0401.xdomea", UUID.randomUUID());
}
}
package de.ozgcloud.alfa.vorgangexport;
import static org.assertj.core.api.AssertionsForInterfaceTypes.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import java.io.IOException;
import java.util.regex.Pattern;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.springframework.http.HttpHeaders;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
import de.ozgcloud.xdomea.ExportData;
import de.ozgcloud.xdomea.XDomeaService;
class VorgangExportByVorgangControllerTest {
@Spy
@InjectMocks
private VorgangExportByVorgangController controller;
@Mock
private XDomeaService xDomeaService;
private MockMvc mockMvc;
@BeforeEach
void init() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Nested
class TestExportVorgang {
private static final String VORGANG_EXPORT_FILENAME = "00000000-0000-0000-0000-000000000000_Abgabe.Abgabe.0401.xml";
@BeforeEach
void init() throws IOException {
doReturn(VORGANG_EXPORT_FILENAME).when(controller).generateVorgangExportFilename();
}
@Captor
private ArgumentCaptor<ExportData> exportDataArgumentCaptor;
@Test
void shouldHaveContentDispositonHeader() throws Exception {
doRequest().andExpect(header().string(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + VORGANG_EXPORT_FILENAME));
}
@Test
void shouldCallXDomeaService() throws Exception {
doRequest();
verify(xDomeaService).writeExport(exportDataArgumentCaptor.capture(), any());
assertThat(exportDataArgumentCaptor.getValue()).isNotNull();
}
private ResultActions doRequest() throws Exception {
return mockMvc.perform(get(VorgangExportByVorgangController.EXPORT_VORGANG_PATH, VorgangHeaderTestFactory.ID)).andExpect(status().isOk());
}
}
@Nested
class TestGenerateVorgangExportFilename {
@Test
void shouldMatchPattern() {
var filename = controller.generateVorgangExportFilename();
assertThat(filename).matches(
Pattern.compile("^[0-9a-f]{8,8}-[0-9a-f]{4,4}-[0-9a-f]{4,4}-[0-9a-f]{4,4}-[0-9a-f]{12,12}_Abgabe.Abgabe.0401.xdomea"));
}
}
}
\ No newline at end of file
### get token
POST {{keycloak-url }}/realms/by-kiel-dev/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded
client_id = alfa &
grant_type = password &
scope = openid &
username = {{ user_sabine }} &
password = {{ pass_sabine }}
> {%
client.global.set("jwt", response.body.access_token)
%}
\ No newline at end of file
GET {{ alfa-url }}/api/vorgangs/abc/export
Authorization: Bearer {{ jwt }}
\ No newline at end of file
{
"remotekc": {
"keycloak-url": "https://sso.dev.by.ozg-cloud.de"
},
"local": {
"alfa-url": "http://localhost:4300"
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment