Skip to content

Commit

Permalink
Merge pull request eclipse-sw360#1895 from siemens/fix/summaryandadmi…
Browse files Browse the repository at this point in the history
…nistrativeInfo

fix(rest): Added endpoint url for summary and administration page info

Reviewed by: [email protected]
Tested by: [email protected]
  • Loading branch information
ag4ums authored and keerthi-bl committed Jun 26, 2023
2 parents 77608ba + 9d79b28 commit 4cd6d24
Show file tree
Hide file tree
Showing 11 changed files with 436 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<Project> 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<Project> 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<Project> 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());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
}
12 changes: 12 additions & 0 deletions libraries/datahandler/src/main/thrift/projects.thrift
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
45 changes: 45 additions & 0 deletions rest/resource-server/src/docs/asciidoc/projects.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -664,3 +664,48 @@ include::{snippets}/should_document_get_project_count/response-fields.adoc[]

===== Example response
include::{snippets}/should_document_get_project_count/http-response.adoc[]

[[resources-project-get-summaryadministraion-project]]
==== Administration and Summary Info

A `GET` request will get summary and administration page of project tab.

===== Response structure
include::{snippets}/should_document_create_summary_administration/response-fields.adoc[]

===== Example request
include::{snippets}/should_document_create_summary_administration/curl-request.adoc[]

===== Example response
include::{snippets}/should_document_create_summary_administration/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[]
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,11 @@ static abstract class MultiStatusMixin extends MultiStatus {
"setConsiderReleasesFromExternalList",
"externalUrlsSize",
"setExternalUrls",
"externalUrls",
"setVendor",
"setVendorId",
"setSpdxId",
"setModifiedOn",
"modifiedOn",
"setModifiedBy",
"modifiedBy"
})
static abstract class ProjectMixin extends Project {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1106,7 +1106,7 @@ private HalResource<Project> createHalProject(Project sw360Project, User sw360Us

if (sw360Project.getVendor() != null) {
Vendor vendor = sw360Project.getVendor();
HalResource<Vendor> vendorHalResource = restControllerHelper.addEmbeddedVendor(vendor.getFullname());
Vendor vendorHalResource = restControllerHelper.convertToEmbeddedVendor(vendor);
halProject.addEmbeddedResource("sw360:vendors", vendorHalResource);
sw360Project.setVendor(null);
}
Expand Down Expand Up @@ -1227,4 +1227,20 @@ public void getUserProjectCount(HttpServletResponse response) throws TException
throw new SW360Exception(e.getMessage());
}
}
@RequestMapping(value = PROJECTS_URL + "/{id}/summaryAdministration", method = RequestMethod.GET)
public ResponseEntity<EntityModel<Project>> getAdministration(
@PathVariable("id") String id) throws TException {
User sw360User = restControllerHelper.getSw360UserFromAuthentication();
Project sw360Project = projectService.getProjectForUserById(id, sw360User);
Map<String, String> sortedExternalURLs = CommonUtils.getSortedMap(sw360Project.getExternalUrls(), true);
sw360Project.setExternalUrls(sortedExternalURLs);
sw360Project.setReleaseIdToUsage(null);
sw360Project.setLinkedProjects(null);
HalResource<Project> userHalResource = createHalProject(sw360Project, sw360User);
sw360Project.unsetLinkedProjects();
sw360Project.unsetReleaseIdToUsage();

return new ResponseEntity<>(userHalResource, HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -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<RepositoryLinksResource>{

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<String> 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());
}
}

}
Loading

0 comments on commit 4cd6d24

Please sign in to comment.