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

[GLT-4321] adapted Projects list page for external users #259

Merged
merged 1 commit into from
Jan 28, 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
1 change: 1 addition & 0 deletions changes/add_external_projList.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
External view of Projects list page
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ca.on.oicr.gsi.dimsum.controller.rest.external;
package ca.on.oicr.gsi.dimsum.controller.rest.common;

import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -9,8 +9,8 @@
import ca.on.oicr.gsi.dimsum.service.CaseService;

@RestController
@RequestMapping("/rest/external/autocomplete")
public class ExternalAutocompleteRestController {
@RequestMapping("/rest/common/autocomplete")
public class CommonAutocompleteRestController {

// Note: CaseService filters all below results based on the user's authorized projects

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ca.on.oicr.gsi.dimsum.controller.rest.external;

import static ca.on.oicr.gsi.dimsum.controller.mvc.MvcUtils.*;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ca.on.oicr.gsi.dimsum.controller.rest.request.DataQuery;
import ca.on.oicr.gsi.dimsum.data.external.ExternalProjectSummary;
import ca.on.oicr.gsi.dimsum.service.CaseService;
import ca.on.oicr.gsi.dimsum.service.filtering.ProjectSummaryFilter;
import ca.on.oicr.gsi.dimsum.service.filtering.ProjectSummarySort;
import ca.on.oicr.gsi.dimsum.service.filtering.TableData;


@RestController
@RequestMapping("/rest/external/projects")
public class ExternalProjectRestController {

@Autowired
private CaseService caseService;

@PostMapping
public TableData<ExternalProjectSummary> query(@RequestBody DataQuery query) {
validateDataQuery(query);
ProjectSummarySort sort = parseSort(query, ProjectSummarySort::getByLabel);
boolean descending = parseDescending(query);
List<ProjectSummaryFilter> filters = parseProjectSummaryFilters(query);
return caseService.getExternalProjects(query.getPageSize(), query.getPageNumber(), sort,
descending, filters);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,8 @@ public class AutocompleteRestController {
@Autowired
private CaseService caseService;

@GetMapping("/assay-names")
public Set<String> queryAssays(@RequestParam String q) {
return caseService.getMatchingAssayNames(q);
}

@GetMapping("/requisition-names")
public Set<String> queryRequisitions(@RequestParam String q) {
return caseService.getMatchingRequisitionNames(q);
}

@GetMapping("/project-names")
public Set<String> queryProjects(@RequestParam String q) {
return caseService.getMatchingProjectNames(q);
}

@GetMapping("/donor-names")
public Set<String> queryDonors(@RequestParam String q) {
return caseService.getMatchingDonorNames(q);
}

@GetMapping("/run-names")
public Set<String> queryRuns(@RequestParam String q) {
return caseService.getMatchingRunNames(q);
}

@GetMapping("/test-names")
public Set<String> queryTests(@RequestParam String q) {
return caseService.getMatchingTestNames(q);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ca.on.oicr.gsi.dimsum.data.external;

import ca.on.oicr.gsi.dimsum.data.ProjectSummary;

public record ExternalProjectSummary(String name, String pipeline, int totalTestCount,
int receiptCompletedCount, int extractionCompletedCount, int libraryPrepCompletedCount,
int libraryQualCompletedCount, int fullDepthSeqCompletedCount, int analysisReviewCompletedCount,
int releaseApprovalCompletedCount, int releaseCompletedCount) {

public ExternalProjectSummary(ProjectSummary from) {
this(from.getName(),
from.getPipeline(),
from.getTotalTestCount(),
from.getReceiptCompletedCount(),
from.getExtractionCompletedCount(),
from.getLibraryPrepCompletedCount(),
from.getLibraryQualCompletedCount(),
from.getFullDepthSeqCompletedCount(),
from.getAnalysisReviewCompletedCount(),
from.getReleaseApprovalCompletedCount(),
from.getReleaseCompletedCount());
}
}
32 changes: 30 additions & 2 deletions src/main/java/ca/on/oicr/gsi/dimsum/service/CaseService.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import ca.on.oicr.gsi.dimsum.data.RunAndLibraries;
import ca.on.oicr.gsi.dimsum.data.TestTableView;
import ca.on.oicr.gsi.dimsum.data.external.ExternalCase;
import ca.on.oicr.gsi.dimsum.data.external.ExternalProjectSummary;
import ca.on.oicr.gsi.dimsum.data.external.ExternalSample;
import ca.on.oicr.gsi.dimsum.data.external.ExternalTestTableView;
import ca.on.oicr.gsi.dimsum.security.DimsumPrincipal;
Expand Down Expand Up @@ -496,8 +497,8 @@ public TableData<OmittedSample> getOmittedSamples(int pageSize, int pageNumber,
}

public TableData<ProjectSummary> getProjects(int pageSize, int pageNumber,
ProjectSummarySort sort,
boolean descending, Collection<ProjectSummaryFilter> filters) {
ProjectSummarySort sort, boolean descending, Collection<ProjectSummaryFilter> filters) {
authorizeInternalOnly();
List<ProjectSummary> baseProjectSummaries = caseData.getProjectSummaries().stream().toList();
Stream<ProjectSummary> stream = filterProjectSummaries(baseProjectSummaries, filters);

Expand All @@ -517,6 +518,33 @@ public TableData<ProjectSummary> getProjects(int pageSize, int pageNumber,
return data;
}

public TableData<ExternalProjectSummary> getExternalProjects(int pageSize, int pageNumber,
ProjectSummarySort sort, boolean descending, Collection<ProjectSummaryFilter> filters) {
DimsumPrincipal principal = securityManager.getPrincipal();
List<ProjectSummary> baseProjectSummaries = caseData.getProjectSummaries().stream()
.filter(summary -> principal.getProjects().contains(summary.getName()))
.toList();
Stream<ProjectSummary> stream = filterProjectSummaries(baseProjectSummaries, filters);

if (sort == null) {
sort = ProjectSummarySort.NAME;
descending = true;
}
stream = stream.sorted(descending ? sort.comparator().reversed() : sort.comparator());

List<ExternalProjectSummary> filteredProjectSummaries =
stream.skip(pageSize * (pageNumber - 1))
.limit(pageSize)
.map(ExternalProjectSummary::new)
.collect(Collectors.toList());

TableData<ExternalProjectSummary> data = new TableData<>();
data.setTotalCount(baseProjectSummaries.size());
data.setFilteredCount(filterProjectSummaries(baseProjectSummaries, filters).count());
data.setItems(filteredProjectSummaries);
return data;
}

public TableData<ProjectSummaryRow> getProjectSummaryRows(String projectName,
Collection<CaseFilter> filters, LocalDate afterDate, LocalDate beforeDate) {
DimsumPrincipal principal = securityManager.getPrincipal();
Expand Down
18 changes: 11 additions & 7 deletions ts/util/urls.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { internalUser, siteConfig } from "./site-config";
import { Pair } from "./pair";

function getRestBaseUrl() {
if (internalUser) {
function getRestBaseUrl(common?: boolean) {
if (common) {
return "/rest/common";
} else if (internalUser) {
return "/rest/internal";
} else {
return "/rest/external";
Expand Down Expand Up @@ -40,12 +42,14 @@ export const urls = {
list: `${getRestBaseUrl()}/runs`,
},
autocomplete: {
assayNames: `${getRestBaseUrl()}/autocomplete/assay-names`,
requisitionNames: `${getRestBaseUrl()}/autocomplete/requisition-names`,
projectNames: `${getRestBaseUrl()}/autocomplete/project-names`,
donorNames: `${getRestBaseUrl()}/autocomplete/donor-names`,
assayNames: `${getRestBaseUrl(true)}/autocomplete/assay-names`,
requisitionNames: `${getRestBaseUrl(
true
)}/autocomplete/requisition-names`,
projectNames: `${getRestBaseUrl(true)}/autocomplete/project-names`,
donorNames: `${getRestBaseUrl(true)}/autocomplete/donor-names`,
runNames: `${getRestBaseUrl()}/autocomplete/run-names`,
testNames: `${getRestBaseUrl()}/autocomplete/test-names`,
testNames: `${getRestBaseUrl(true)}/autocomplete/test-names`,
},
notifications: `${getRestBaseUrl()}/notifications`,
omissions: `${getRestBaseUrl()}/omissions`,
Expand Down