diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java index 232aa8ee53..650bdfaa80 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java @@ -73,6 +73,9 @@ import static org.eclipse.sw360.datahandler.common.SW360Utils.printName; import static org.eclipse.sw360.datahandler.common.WrappedException.wrapTException; import static org.eclipse.sw360.datahandler.permissions.PermissionUtils.makePermission; +import org.apache.commons.io.IOUtils; +import org.eclipse.sw360.exporter.ProjectExporter; +import java.nio.ByteBuffer; /** * Class for accessing the CouchDB database @@ -1907,4 +1910,44 @@ public ProjectData searchByTag(String tag, User user) { public ProjectData searchByType(String type, User user) { return repository.searchByType(type, user); } + + public ByteBuffer getReportDataStream(User user, boolean extendedByReleases) throws TException { + try { + List documents = getAccessibleProjectsSummary(user); + ProjectExporter exporter = getProjectExporterObject(documents, user, extendedByReleases); + InputStream stream = exporter.makeExcelExport(documents); + return ByteBuffer.wrap(IOUtils.toByteArray(stream)); + }catch (IOException e) { + throw new SW360Exception(e.getMessage()); + } + } + + private ProjectExporter getProjectExporterObject(List documents, User user, boolean extendedByReleases) throws SW360Exception { + ThriftClients thriftClients = new ThriftClients(); + return new ProjectExporter(thriftClients.makeComponentClient(), + thriftClients.makeProjectClient(), user, documents, extendedByReleases); + } + + public String getReportInEmail(User user, + boolean extendedByReleases) throws TException { + try { + List documents = getAccessibleProjectsSummary(user); + ProjectExporter exporter = getProjectExporterObject(documents, user, extendedByReleases); + return exporter.makeExcelExportForProject(documents, user); + }catch (IOException e) { + throw new SW360Exception(e.getMessage()); + } + } + + public ByteBuffer downloadExcel(User user, boolean extendedByReleases, String token) throws SW360Exception { + ThriftClients thriftClients = new ThriftClients(); + ProjectExporter exporter = new ProjectExporter(thriftClients.makeComponentClient(), + thriftClients.makeProjectClient(), user, extendedByReleases); + try { + InputStream stream = exporter.downloadExcelSheet(token); + return ByteBuffer.wrap(IOUtils.toByteArray(stream)); + } catch (IOException e) { + throw new SW360Exception(e.getMessage()); + } + } } diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectRepository.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectRepository.java index e4129f4a48..3a98ab671b 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectRepository.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectRepository.java @@ -10,6 +10,7 @@ */ package org.eclipse.sw360.datahandler.db; +import org.apache.thrift.TException; import org.eclipse.sw360.components.summary.ProjectSummary; import org.eclipse.sw360.components.summary.SummaryType; import org.eclipse.sw360.datahandler.cloudantclient.DatabaseConnectorCloudant; @@ -19,8 +20,10 @@ import org.eclipse.sw360.datahandler.permissions.PermissionUtils; import org.eclipse.sw360.datahandler.permissions.ProjectPermissions; import org.eclipse.sw360.datahandler.thrift.PaginationData; +import org.eclipse.sw360.datahandler.thrift.ThriftClients; import org.eclipse.sw360.datahandler.thrift.projects.Project; import org.eclipse.sw360.datahandler.thrift.projects.ProjectData; +import org.eclipse.sw360.datahandler.thrift.projects.ProjectService; import org.eclipse.sw360.datahandler.thrift.users.User; import org.eclipse.sw360.datahandler.thrift.users.UserGroup; import org.jetbrains.annotations.NotNull; diff --git a/backend/src/src-projects/src/main/java/org/eclipse/sw360/projects/ProjectHandler.java b/backend/src/src-projects/src/main/java/org/eclipse/sw360/projects/ProjectHandler.java index 0a849eb005..4ef086eecd 100644 --- a/backend/src/src-projects/src/main/java/org/eclipse/sw360/projects/ProjectHandler.java +++ b/backend/src/src-projects/src/main/java/org/eclipse/sw360/projects/ProjectHandler.java @@ -43,6 +43,7 @@ import java.util.function.Supplier; import static org.eclipse.sw360.datahandler.common.SW360Assert.*; +import java.nio.ByteBuffer; /** * Implementation of the Thrift service @@ -462,4 +463,22 @@ public int getMyAccessibleProjectCounts(User user) throws TException { public void sendExportSpreadsheetSuccessMail(String url, String recepient) throws TException { handler.sendExportSpreadsheetSuccessMail(url, recepient); } + + @Override + public ByteBuffer downloadExcel(User user, boolean extendedByReleases, String token) + throws TException { + return handler.downloadExcel(user, extendedByReleases,token); + } + + @Override + public ByteBuffer getReportDataStream(User user, boolean extendedByReleases) + throws TException { + return handler.getReportDataStream(user, extendedByReleases); + } + + @Override + public String getReportInEmail(User user, boolean extendedByReleases) + throws TException { + return handler.getReportInEmail(user, extendedByReleases); + } } diff --git a/libraries/datahandler/src/main/thrift/projects.thrift b/libraries/datahandler/src/main/thrift/projects.thrift index bd5a5e3a78..5950f08464 100644 --- a/libraries/datahandler/src/main/thrift/projects.thrift +++ b/libraries/datahandler/src/main/thrift/projects.thrift @@ -530,4 +530,16 @@ service ProjectService { * Send email to the user once spreadsheet export completed */ void sendExportSpreadsheetSuccessMail(1: string url, 2: string userEmail); + /* + * make excel export + */ + binary getReportDataStream(1: User user,2: bool extendedByReleases) throws (1: SW360Exception exp); + /* + * excel export - return the filepath + */ + string getReportInEmail(1: User user, 2: bool extendedByReleases) throws (1: SW360Exception exp); + /* + * download excel + */ + binary downloadExcel(1:User user,2:bool extendedByReleases,3:string token) throws (1: SW360Exception exc); } diff --git a/rest/resource-server/src/docs/asciidoc/projects.adoc b/rest/resource-server/src/docs/asciidoc/projects.adoc index ebe757be91..2f788cfd3d 100644 --- a/rest/resource-server/src/docs/asciidoc/projects.adoc +++ b/rest/resource-server/src/docs/asciidoc/projects.adoc @@ -650,3 +650,48 @@ include::{snippets}/should_document_import_sbom/curl-request.adoc[] ===== Example response include::{snippets}/should_document_import_sbom/http-response.adoc[] + +[[resources-project-getprojectcount]] +==== Get project count of a user + +A `GET` request will get project count of a user. + +===== Example request +include::{snippets}/should_document_get_project_count/curl-request.adoc[] + +===== Response structure +include::{snippets}/should_document_get_project_count/response-fields.adoc[] + +===== Example response +include::{snippets}/should_document_get_project_count/http-response.adoc[] + +[[resources-projects-download-report]] +==== Downloading project report + +A `GET` request help to download the projects report with mail request false. + +===== Request parameter +include::{snippets}/should_document_get_project_report_without_mail_req/request-parameters.adoc[] + +===== Example request +include::{snippets}/should_document_get_project_report_without_mail_req/curl-request.adoc[] + +===== Example response +include::{snippets}/should_document_get_project_report_without_mail_req/http-response.adoc[] + +[[resources-projects-download-report-mail-request]] +==== Downloading project report with mail request + +A `GET` request help to download the projects report with mail request true. + +===== Request parameter +include::{snippets}/should_document_get_project_report/request-parameters.adoc[] + +===== Response structure +include::{snippets}/should_document_get_project_report/response-fields.adoc[] + +===== Example request +include::{snippets}/should_document_get_project_report/curl-request.adoc[] + +===== Example response +include::{snippets}/should_document_get_project_report/http-response.adoc[] diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java index 4529e50140..f2048fcf94 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java @@ -17,6 +17,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.google.gson.JsonObject; + import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.apache.commons.lang.StringUtils; @@ -39,7 +41,9 @@ import org.eclipse.sw360.datahandler.thrift.ReleaseRelationship; import org.eclipse.sw360.datahandler.thrift.RequestStatus; import org.eclipse.sw360.datahandler.thrift.RequestSummary; +import org.eclipse.sw360.datahandler.thrift.SW360Exception; import org.eclipse.sw360.datahandler.thrift.Source; +import org.eclipse.sw360.datahandler.thrift.ThriftClients; import org.eclipse.sw360.datahandler.thrift.attachments.Attachment; import org.eclipse.sw360.datahandler.thrift.attachments.AttachmentContent; import org.eclipse.sw360.datahandler.thrift.attachments.AttachmentType; @@ -58,6 +62,7 @@ import org.eclipse.sw360.datahandler.thrift.projects.ProjectClearingState; import org.eclipse.sw360.datahandler.thrift.projects.ProjectLink; import org.eclipse.sw360.datahandler.thrift.projects.ProjectProjectRelationship; +import org.eclipse.sw360.datahandler.thrift.projects.ProjectService; import org.eclipse.sw360.datahandler.thrift.users.User; import org.eclipse.sw360.datahandler.thrift.vendors.Vendor; import org.eclipse.sw360.datahandler.thrift.vulnerabilities.ProjectVulnerabilityRating; @@ -1209,4 +1214,17 @@ public static TSerializer getJsonSerializer() { } return null; } + + @RequestMapping(value = PROJECTS_URL + "/projectcount", method = RequestMethod.GET) + public void getUserProjectCount(HttpServletResponse response) throws TException { + User sw360User = restControllerHelper.getSw360UserFromAuthentication(); + try { + JsonObject resultJson = new JsonObject(); + resultJson.addProperty("status", "success"); + resultJson.addProperty("count", projectService.getMyAccessibleProjectCounts(sw360User)); + response.getWriter().write(resultJson.toString()); + }catch (IOException e) { + throw new SW360Exception(e.getMessage()); + } + } } diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java new file mode 100644 index 0000000000..2bd989c026 --- /dev/null +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java @@ -0,0 +1,142 @@ +/* +SPDX-FileCopyrightText: © 2023 Siemens AG +SPDX-License-Identifier: EPL-2.0 +*/ + +package org.eclipse.sw360.rest.resourceserver.report; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; + +import java.io.IOException; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.thrift.TException; +import org.eclipse.sw360.datahandler.common.CommonUtils; +import org.eclipse.sw360.datahandler.common.SW360Utils; +import org.eclipse.sw360.datahandler.thrift.users.User; +import org.eclipse.sw360.rest.resourceserver.core.RestControllerHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.BasePathAwareController; +import org.springframework.data.rest.webmvc.RepositoryLinksResource; +import org.springframework.hateoas.server.RepresentationModelProcessor; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.google.gson.JsonObject; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@BasePathAwareController +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class SW360ReportController implements RepresentationModelProcessor{ + + public static final String REPORTS_URL = "/reports"; + + private static String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + + @NonNull + private final RestControllerHelper restControllerHelper; + + @NonNull + private final SW360ReportService sw360ReportService; + + @Override + public RepositoryLinksResource process(RepositoryLinksResource resource) { + resource.add(linkTo(SW360ReportController.class).slash("api/" + REPORTS_URL).withRel("reports")); + return resource; + } + + private List mimeTypeList = Arrays.asList("xls","xlsx"); + + @RequestMapping(value = REPORTS_URL + "/myprojectreports", method = RequestMethod.GET) + public void getProjectReport(@RequestParam(value = "withlinkedreleases", required = false, defaultValue = "false") boolean withLinkedReleases, + @RequestParam(value = "mimetype", required = false, defaultValue = "xlsx") String mimeType, + @RequestParam(value = "mailrequest", required = false, defaultValue="false") boolean mailRequest, HttpServletRequest request, + HttpServletResponse response) throws TException{ + + final User sw360User = restControllerHelper.getSw360UserFromAuthentication(); + try { + if(validateMimeType(mimeType)) { + if(mailRequest) { + StringBuffer url = request.getRequestURL(); + String uri = request.getRequestURI(); + String ctx = request.getContextPath(); + String base = url.substring(0, url.length() - uri.length() + ctx.length()) + "/"; + + String projectPath = sw360ReportService.getUploadedProjectPath(sw360User, withLinkedReleases); + + String backendURL = base + "api/reports/download?user="+sw360User.getEmail()+"&extendedByReleases="+withLinkedReleases+"&token="; + URL emailURL = new URL(backendURL+projectPath); + + if(!CommonUtils.isNullEmptyOrWhitespace(projectPath)) { + sw360ReportService.sendExportSpreadsheetSuccessMail(emailURL.toString(), sw360User.getEmail()); + } + JsonObject responseJson = new JsonObject(); + responseJson.addProperty("response", "E-mail sent succesfully to the end user."); + responseJson.addProperty("url", emailURL.toString()); + responseJson.toString(); + response.getWriter().write(responseJson.toString()); + }else { + downloadExcelReport(withLinkedReleases, response, sw360User); + } + }else { + throw new TException("Error : Mimetype either should be : xls/xlsx"); + } + }catch (Exception e) { + throw new TException(e.getMessage()); + } + } + + private void downloadExcelReport(boolean withLinkedReleases, HttpServletResponse response, + User user) throws TException, IOException { + try { + ByteBuffer buffer = sw360ReportService.getProjectBuffer(user,withLinkedReleases); + if(null==buffer) { + throw new TException("No data available for the user "+ user.getEmail()); + } + response.setContentType(CONTENT_TYPE); + String filename = String.format("projects-%s.xlsx", SW360Utils.getCreatedOn()); + response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", filename)); + copyDataStreamToResponse(response, buffer); + }catch(Exception e) { + throw new TException(e.getMessage()); + } + } + + private void copyDataStreamToResponse(HttpServletResponse response, ByteBuffer buffer) throws IOException { + FileCopyUtils.copy(buffer.array(), response.getOutputStream()); + } + + private boolean validateMimeType(String mimeType) { + return mimeTypeList.contains(mimeType); + } + + @RequestMapping(value = REPORTS_URL + "/download", method = RequestMethod.GET) + public void downloadExcel(HttpServletRequest request,HttpServletResponse response) throws TException{ + final User sw360User = restControllerHelper.getSw360UserFromAuthentication(); + String token = request.getParameter("token"); + String extendedByReleases = request.getParameter("extendedByReleases"); + User user=restControllerHelper.getUserByEmail(sw360User.getEmail()); + try { + ByteBuffer buffer = sw360ReportService.getReportStreamFromURl(user,Boolean.valueOf(extendedByReleases), token); + String filename = String.format("projects-%s.xlsx", SW360Utils.getCreatedOn()); + response.setContentType(CONTENT_TYPE); + response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", filename)); + copyDataStreamToResponse(response, buffer); + } catch (Exception e) { + throw new TException(e.getMessage()); + } + } + +} diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportService.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportService.java new file mode 100644 index 0000000000..3057c754cc --- /dev/null +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportService.java @@ -0,0 +1,43 @@ +/* +SPDX-FileCopyrightText: © 2023 Siemens AG +SPDX-License-Identifier: EPL-2.0 +*/ +package org.eclipse.sw360.rest.resourceserver.report; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.apache.thrift.TException; +import org.eclipse.sw360.datahandler.thrift.ThriftClients; +import org.eclipse.sw360.datahandler.thrift.projects.ProjectService; +import org.eclipse.sw360.datahandler.thrift.users.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class SW360ReportService { + + ThriftClients thriftClients = new ThriftClients(); + ProjectService.Iface client = thriftClients.makeProjectClient(); + + public ByteBuffer getProjectBuffer(User user, boolean extendedByReleases) + throws TException { + return client.getReportDataStream(user, extendedByReleases); + } + + public String getUploadedProjectPath(User user, boolean extendedByReleases) throws TException{ + return client.getReportInEmail(user, extendedByReleases); + } + + public ByteBuffer getReportStreamFromURl(User user,boolean extendedByReleases, String token) + throws TException{ + return client.downloadExcel(user,extendedByReleases, token); + } + + public void sendExportSpreadsheetSuccessMail(String emailURL, String email) throws TException{ + client.sendExportSpreadsheetSuccessMail(emailURL, email); + } +} diff --git a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ApiSpecTest.java b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ApiSpecTest.java index d0456ae0a9..d699893c3c 100644 --- a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ApiSpecTest.java +++ b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ApiSpecTest.java @@ -166,6 +166,7 @@ public void should_document_index() throws Exception { .andDo(this.documentationHandler.document( links( linkWithRel("sw360:users").description("The <>"), + linkWithRel("sw360:reports").description("The <>"), linkWithRel("sw360:projects").description("The <>"), linkWithRel("sw360:components").description("The <>"), linkWithRel("sw360:releases").description("The <>"), diff --git a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java index 5f8c6bb200..04efa6cd53 100644 --- a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java +++ b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java @@ -55,6 +55,7 @@ import org.eclipse.sw360.rest.resourceserver.licenseinfo.Sw360LicenseInfoService; import org.eclipse.sw360.rest.resourceserver.project.Sw360ProjectService; import org.eclipse.sw360.rest.resourceserver.release.Sw360ReleaseService; +import org.eclipse.sw360.rest.resourceserver.report.SW360ReportService; import org.eclipse.sw360.rest.resourceserver.user.Sw360UserService; import org.eclipse.sw360.rest.resourceserver.vulnerability.Sw360VulnerabilityService; import org.hamcrest.Matchers; @@ -74,6 +75,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import java.io.IOException; +import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -89,6 +91,7 @@ import static org.eclipse.sw360.datahandler.thrift.MainlineState.OPEN; import static org.eclipse.sw360.datahandler.thrift.ReleaseRelationship.CONTAINED; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.when; @@ -134,6 +137,9 @@ public class ProjectSpecTest extends TestRestDocsSpecBase { @MockBean private Sw360VulnerabilityService vulnerabilityMockService; + @MockBean + private SW360ReportService sw360ReportServiceMock; + private Project project; private Project sBOMProject; private Set projectList = new HashSet<>(); @@ -313,6 +319,7 @@ public void before() throws TException, IOException { requestSummary.setRequestStatus(RequestStatus.SUCCESS); given(this.projectServiceMock.importSBOM(any(),any())).willReturn(requestSummary); + given(this.sw360ReportServiceMock.getProjectBuffer(any(),anyBoolean())).willReturn(ByteBuffer.allocate(10000)); given(this.projectServiceMock.getProjectsForUser(any(), any())).willReturn(projectList); given(this.projectServiceMock.getProjectForUserById(eq(project.getId()), any())).willReturn(project); given(this.projectServiceMock.getProjectForUserById(eq(project2.getId()), any())).willReturn(project2); @@ -1666,4 +1673,57 @@ public void should_document_import_sbom() throws Exception { .queryParam("type", "SPDX"); this.mockMvc.perform(builder).andExpect(status().isOk()).andDo(this.documentationHandler.document()); } + + @Test + public void should_document_get_project_count() throws Exception { + String accessToken = TestHelper.getAccessToken(mockMvc, testUserId, testUserPassword); + this.mockMvc.perform(get("/api/projects/projectcount") + .header("Authorization", "Bearer " + accessToken) + .accept(MediaTypes.HAL_JSON) + .contentType(MediaTypes.HAL_JSON)) + .andExpect(status().isOk()) + .andDo(this.documentationHandler.document( + responseFields( + fieldWithPath("status").description("status of the API. Possible values are ``").optional(), + fieldWithPath("count").description("Count of projects for a user.").optional() + ))); + } + public void should_document_get_project_report() throws Exception{ + String accessToken = TestHelper.getAccessToken(mockMvc, testUserId, testUserPassword); + mockMvc.perform(get("/api/reports/myprojectreports") + .header("Authorization", "Bearer " + accessToken) + .param("withlinkedreleases", "true") + .param("mimetype", "xlsx") + .param("mailrequest", "true") + .accept(MediaTypes.HAL_JSON)) + .andExpect(status().isOk()) + .andDo(this.documentationHandler.document( + requestParameters( + parameterWithName("withlinkedreleases").description("Projects with linked releases. Possible values are ``"), + parameterWithName("mimetype").description("Projects download format. Possible values are ``"), + parameterWithName("mailrequest").description("Downloading project report requirted mail link. Possible values are ``") + ),responseFields( + subsectionWithPath("response").description("The response message displayed").optional(), + subsectionWithPath("url").description("The project download path will be displayed").optional() + ) + )); + } + + @Test + public void should_document_get_project_report_without_mail_req() throws Exception{ + String accessToken = TestHelper.getAccessToken(mockMvc, testUserId, testUserPassword); + mockMvc.perform(get("/api/reports/myprojectreports") + .header("Authorization", "Bearer " + accessToken) + .param("withlinkedreleases", "true") + .param("mimetype", "xlsx") + .param("mailrequest", "false") + .accept("application/xhtml+xml")) + .andExpect(status().isOk()) + .andDo(this.documentationHandler.document( + requestParameters( + parameterWithName("withlinkedreleases").description("Projects with linked releases. Possible values are ``"), + parameterWithName("mimetype").description("Projects download format. Possible values are ``"), + parameterWithName("mailrequest").description("Downloading project report requirted mail link. Possible values are ``") + ))); + } }