Skip to content

Commit

Permalink
Merge pull request #1189 from matthieulapatate/AddDownloadAPI
Browse files Browse the repository at this point in the history
Download API add to init context
  • Loading branch information
pascalgrimaud authored Mar 30, 2022
2 parents b98fa43 + afc29db commit 0da1948
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public static void rename(String source, String sourceFilename, String destinati

public static byte[] convertFileToByte(String path) throws IOException {
try (InputStream inputStream = new FileInputStream(path);) {
return new byte[inputStream.available()];
return inputStream.readAllBytes();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@ public void addPrettier(Project project) {
public void gitInit(Project project) {
initService.gitInit(project);
}

public byte[] download(Project project) {
return initService.download(project);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,9 @@ public void addPrettier(Project project) {
public void gitInit(Project project) {
projectRepository.gitInit(project);
}

@Override
public byte[] download(Project project) {
return projectRepository.download(project);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ public interface InitService {
void addEditorConfiguration(Project project);
void addPrettier(Project project);
void gitInit(Project project);
byte[] download(Project project);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand Down Expand Up @@ -31,4 +36,21 @@ public void init(@RequestBody ProjectDTO projectDTO) {
Project project = ProjectDTO.toProject(projectDTO);
initApplicationService.init(project);
}

@Operation(summary = "Download project")
@ApiResponse(responseCode = "500", description = "An error occurred while downloading project")
@PostMapping("/download")
@GeneratorStep(id = "download")
public ResponseEntity<Resource> download(@RequestBody ProjectDTO projectDTO) {
Project project = ProjectDTO.toProject(projectDTO);
byte[] out = initApplicationService.download(project);
ByteArrayResource resource = new ByteArrayResource(out);
return ResponseEntity
.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + project.getBaseName().orElse("application") + ".zip")
.contentType(MediaType.parseMediaType("application/octet-stream"))
.contentLength(out.length)
.header("X-Suggested-Filename", project.getBaseName().orElse("application") + ".zip")
.body(resource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -751,4 +751,13 @@ void shouldNotRename() {

assertThatThrownBy(() -> FileUtils.rename(folder, "hello.world", "hello.beer")).isInstanceOf(IOException.class);
}

@Test
void shouldConvertFileToByte() throws IOException {
String folder = tmpDirForTest();
createFolder(folder);
Files.createFile(Paths.get(folder, "hello.world"));

assertThat(FileUtils.convertFileToByte(folder + "/hello.world")).isNotNull();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package tech.jhipster.lite.generator.init.application;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.common.domain.WordUtils.CRLF;
import static tech.jhipster.lite.generator.init.application.InitAssertFiles.*;
Expand Down Expand Up @@ -138,4 +139,11 @@ void shouldGitInit() {

assertFileGitInit(project);
}

@Test
void shouldDownloadProject() {
Project project = tmpProjectWithPomXml();

assertThat(initApplicationService.download(project)).isNotNull();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static tech.jhipster.lite.TestUtils.tmpProject;
import static tech.jhipster.lite.TestUtils.tmpProjectWithPomXml;

import java.util.Optional;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -100,4 +101,11 @@ void shouldAddPrettier() {
verify(projectRepository).template(any(Project.class), anyString(), anyString());
verify(projectRepository).setExecutable(any(Project.class), anyString(), anyString());
}

@Test
void shouldDownload() {
Project project = tmpProjectWithPomXml();

assertThatCode(() -> initDomainService.download(project)).doesNotThrowAnyException();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tech.jhipster.lite.generator.init.infrastructure.primary.rest;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.generator.init.application.InitAssertFiles.*;
import static tech.jhipster.lite.generator.project.domain.Constants.PACKAGE_JSON;
Expand Down Expand Up @@ -46,4 +46,19 @@ void shouldInit() throws Exception {
assertFileContent(project, ".prettierrc", "tabWidth: 2");
assertFileContent(project, PACKAGE_JSON, "chips");
}

@Test
void shouldDownload() throws Exception {
ProjectDTO projectDTO = readFileToObject("json/chips.json", ProjectDTO.class).folder(FileUtils.tmpDirForTest());
Project project = ProjectDTO.toProject(projectDTO);

initApplicationService.init(project);

mockMvc
.perform(post("/api/projects/download").contentType(MediaType.APPLICATION_JSON).content(convertObjectToJsonBytes(projectDTO)))
.andExpect(status().isOk())
.andExpect(header().string("Content-Disposition", "attachment; filename=" + project.getBaseName().orElse("application") + ".zip"))
.andExpect(header().string("X-Suggested-Filename", project.getBaseName().orElse("application") + ".zip"))
.andExpect(content().contentType("application/octet-stream"));
}
}

0 comments on commit 0da1948

Please sign in to comment.