Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(Rest): new endpoint will help to get the package details by projectID #2893

Merged
merged 1 commit into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion rest/resource-server/src/docs/asciidoc/projects.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -1251,4 +1251,18 @@ include::{snippets}/should_document_get_projects_by_advance_search/curl-request.
include::{snippets}/should_document_get_projects_by_advance_search/http-response.adoc[]

===== Links
include::{snippets}/should_document_get_projects_by_advance_search/links.adoc[]
include::{snippets}/should_document_get_projects_by_advance_search/links.adoc[]

[[resources-package-get-by-project]]
==== Get Package by ProjectId

A GET request is used to retrieve a package using a given projectId.

===== Request parameter
include::{snippets}/should_document_get_package_by_project_id/request-parameters.adoc[]

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

===== Example response
include::{snippets}/should_document_get_package_by_project_id-id/http-response.adoc[]
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,16 @@
import org.eclipse.sw360.datahandler.thrift.licenseinfo.OutputFormatVariant;
import org.eclipse.sw360.datahandler.thrift.licenses.License;
import org.eclipse.sw360.datahandler.thrift.projects.*;
import org.eclipse.sw360.datahandler.thrift.packages.Package;
import org.eclipse.sw360.datahandler.thrift.projects.ObligationList;
import org.eclipse.sw360.datahandler.thrift.projects.ObligationStatusInfo;
import org.eclipse.sw360.datahandler.thrift.projects.Project;
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.ProjectRelationship;
import org.eclipse.sw360.datahandler.thrift.projects.ProjectDTO;
import org.eclipse.sw360.datahandler.thrift.projects.ClearingRequest;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.datahandler.thrift.users.UserGroup;
import org.eclipse.sw360.datahandler.thrift.vendors.Vendor;
Expand All @@ -98,6 +108,7 @@
import org.eclipse.sw360.rest.resourceserver.release.ReleaseController;
import org.eclipse.sw360.rest.resourceserver.release.Sw360ReleaseService;
import org.eclipse.sw360.rest.resourceserver.user.Sw360UserService;
import org.eclipse.sw360.rest.resourceserver.vendor.Sw360VendorService;
import org.eclipse.sw360.rest.resourceserver.vulnerability.Sw360VulnerabilityService;
import org.eclipse.sw360.rest.resourceserver.vulnerability.VulnerabilityController;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -226,6 +237,9 @@ public class ProjectController implements RepresentationModelProcessor<Repositor
@NonNull
private final Sw360ModerationRequestService moderationRequestService;

@NonNull
private final Sw360VendorService vendorService;

@NonNull
private final com.fasterxml.jackson.databind.Module sw360Module;

Expand Down Expand Up @@ -484,6 +498,58 @@ public ResponseEntity<EntityModel<Project>> getProject(
return new ResponseEntity<>(userHalResource, HttpStatus.OK);
}

@Operation(
description = "Get a package with project id.",
tags = {"Projects"}
)
@RequestMapping(value = PROJECTS_URL + "/{id}/packages", method = RequestMethod.GET)
public ResponseEntity<List<HalResource<Project>>> getPackagesByProjectId(
@Parameter(description = "Project ID", example = "376576")
@PathVariable("id") String id) throws TException {

User sw360User = restControllerHelper.getSw360UserFromAuthentication();
Project sw360Project = projectService.getProjectForUserById(id, sw360User);
List<HalResource<Package>> halPackages = new ArrayList<>();
if (sw360Project.getPackageIdsSize() > 0) {
for (String packageId : sw360Project.getPackageIds()) {
Package sw360Package = packageService.getPackageForUserById(packageId);
HalResource<Package> halPackage = createHalPackage(sw360Package, sw360User);
halPackages.add(halPackage);
}
}
return new ResponseEntity(halPackages, HttpStatus.OK);
}

private HalResource<Package> createHalPackage(Package sw360Package, User sw360User) throws TException {
HalResource<Package> halPackage = new HalResource<>(sw360Package);
User packageCreator = restControllerHelper.getUserByEmail(sw360Package.getCreatedBy());
String linkedRelease = sw360Package.getReleaseId();

restControllerHelper.addEmbeddedUser(halPackage, packageCreator, "createdBy");
if (CommonUtils.isNotNullEmptyOrWhitespace(linkedRelease)) {
Release release = releaseService.getReleaseForUserById(linkedRelease, sw360User);

if (release != null) {
restControllerHelper.addEmbeddedSingleRelease(halPackage, release);
} else {
log.warn("Release not found for ID: {}", linkedRelease);
}
}
if (sw360Package.getModifiedBy() != null) {
restControllerHelper.addEmbeddedModifiedBy(halPackage, sw360User, "modifiedBy");
}
if (sw360Package.getVendorId() != null) {
Vendor vendor = vendorService.getVendorById(sw360Package.getVendorId());
if (vendor != null) {
Vendor vendorHalResource = restControllerHelper.convertToEmbeddedVendor(vendor);
halPackage.addEmbeddedResource("sw360:vendors", vendorHalResource);
} else {
log.warn("Vendor not found for ID: {}", sw360Package.getVendorId());
}
}
return halPackage;
}

@Operation(
description = "Get linked projects of a single project.",
tags = {"Projects"}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ public void before() throws TException, IOException {
project.setSpecialRisks3rdParty("Lorem Ipsum");
project.setLicenseInfoHeaderText("Lorem Ipsum");
project.setDeliveryChannels("Lorem Ipsum");
project.setPackageIds(new HashSet<>(Arrays.asList("pkg-001", "pkg-002", "pkg-003")));
project.setVendor(new Vendor());
project.setRemarksAdditionalRequirements("Lorem Ipsum");
ReleaseClearingStateSummary clearingCount = new ReleaseClearingStateSummary();
Expand Down Expand Up @@ -3242,4 +3243,35 @@ public void should_document_get_projects_by_advance_search() throws Exception {
fieldWithPath("page.number").description("Number of the current page")
)));
}

@Test
public void should_document_get_package_by_project_id() throws Exception {
Set<String> licenseIds = new HashSet<>();
licenseIds.add("MIT");
licenseIds.add("GPL");

Package packages = new Package("angular-sanitize", "1.8.2", "pkg:npm/[email protected]",
CycloneDxComponentType.FRAMEWORK)
.setId("122357345")
.setCreatedBy("[email protected]")
.setCreatedOn("2023-01-02")
.setVcs("git+https://github.com/angular/angular.js.git")
.setHomepageUrl("http://angularjs.org")
.setLicenseIds(licenseIds)
.setReleaseId("12345678")
.setPackageManager(PackageManager.NPM)
.setDescription("Sanitizes an html string by stripping all potentially dangerous tokens.");

given(this.packageServiceMock.getPackageForUserById(eq(packages.getId()))).willReturn(packages);

Project sw360Project = new Project();
sw360Project.setId(project.getId());
sw360Project.setPackageIds(new HashSet<>(Collections.singleton("122357345")));

given(this.projectServiceMock.getProjectForUserById(eq(project.getId()), any())).willReturn(sw360Project);

mockMvc.perform(get("/api/projects/" + project.getId() + "/packages")
.header("Authorization", TestHelper.generateAuthHeader(testUserId, testUserPassword))
.accept(MediaTypes.HAL_JSON)).andExpect(status().isOk());
}
}