• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

DataBiosphere / consent / #5697

18 Apr 2025 04:23PM UTC coverage: 78.956% (-0.02%) from 78.975%
#5697

push

web-flow
[DT-1487]Req. 10 - Enable Int. Collab. Approvals via DAR when LCA = Yes (#2484)

Co-authored-by: rjohanek <rjohanek@broadinstitute.org>

49 of 50 new or added lines in 5 files covered. (98.0%)

14 existing lines in 4 files now uncovered.

10209 of 12930 relevant lines covered (78.96%)

0.79 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.05
/src/main/java/org/broadinstitute/consent/http/service/TDRService.java
1
package org.broadinstitute.consent.http.service;
2

3
import com.google.inject.Inject;
4
import jakarta.ws.rs.NotAuthorizedException;
5
import jakarta.ws.rs.NotFoundException;
6
import java.sql.Timestamp;
7
import java.util.Arrays;
8
import java.util.Collection;
9
import java.util.Comparator;
10
import java.util.Date;
11
import java.util.List;
12
import java.util.Objects;
13
import java.util.UUID;
14
import java.util.stream.Stream;
15
import org.broadinstitute.consent.http.db.DatasetDAO;
16
import org.broadinstitute.consent.http.db.SamDAO;
17
import org.broadinstitute.consent.http.db.UserDAO;
18
import org.broadinstitute.consent.http.models.AuthUser;
19
import org.broadinstitute.consent.http.models.Collaborator;
20
import org.broadinstitute.consent.http.models.DataAccessRequest;
21
import org.broadinstitute.consent.http.models.DataAccessRequestData;
22
import org.broadinstitute.consent.http.models.Dataset;
23
import org.broadinstitute.consent.http.models.User;
24
import org.broadinstitute.consent.http.models.tdr.ApprovedUser;
25
import org.broadinstitute.consent.http.models.tdr.ApprovedUsers;
26
import org.broadinstitute.consent.http.util.ConsentLogger;
27

28
public class TDRService implements ConsentLogger {
29

30
  private final DataAccessRequestService dataAccessRequestService;
31
  private final DatasetDAO datasetDAO;
32
  private final SamDAO samDAO;
33
  private final UserDAO userDAO;
34

35
  @Inject
36
  public TDRService(DataAccessRequestService dataAccessRequestService, DatasetDAO datasetDAO,
37
      SamDAO samDAO, UserDAO userDAO) {
1✔
38
    this.dataAccessRequestService = dataAccessRequestService;
1✔
39
    this.datasetDAO = datasetDAO;
1✔
40
    this.samDAO = samDAO;
1✔
41
    this.userDAO = userDAO;
1✔
42
  }
1✔
43

44
  public ApprovedUsers getApprovedUsersForDataset(AuthUser authUser, Dataset dataset) {
45
    Collection<DataAccessRequest> dars = dataAccessRequestService.getApprovedDARsForDataset(
1✔
46
        dataset);
47
    List<String> labCollaborators = dars.stream()
1✔
48
        .map(DataAccessRequest::getData)
1✔
49
        .filter(Objects::nonNull)
1✔
50
        .map(DataAccessRequestData::getLabAndInternalCollaborators)
1✔
51
        .flatMap(List::stream)
1✔
52
        .filter(Objects::nonNull)
1✔
53
        .map(Collaborator::getEmail)
1✔
54
        .filter(email -> !email.isBlank())
1✔
55
        // Sam has an endpoint for validating a single email at a time
56
        .map(email -> {
1✔
57
          try {
58
            samDAO.getV1UserByEmail(authUser, email);
1✔
59
            return email;
1✔
60
          } catch (NotAuthorizedException e) {
×
61
            logWarn("User " + authUser.getEmail() + " is not authorized to look for users in Sam");
×
62
            return null;
×
63
          } catch (Exception e) {
×
NEW
64
            logWarn("Collaborator: " + email + " does not exist in Sam");
×
65
            return null;
×
66
          }
67
        })
68
        .filter(Objects::nonNull)
1✔
69
        .toList();
1✔
70
    List<Integer> userIds = dars.stream().map(DataAccessRequest::getUserId).toList();
1✔
71
    Collection<User> users = userIds.isEmpty() ? List.of() : userDAO.findUsers(userIds);
1✔
72
    List<String> userEmails = users.stream()
1✔
73
        .map(User::getEmail)
1✔
74
        .filter(email -> !email.isBlank())
1✔
75
        .toList();
1✔
76

77
    List<ApprovedUser> approvedUsers = Stream.of(labCollaborators, userEmails)
1✔
78
        .flatMap(List::stream)
1✔
79
        .distinct()
1✔
80
        .map(ApprovedUser::new)
1✔
81
        .sorted(Comparator.comparing(ApprovedUser::email))
1✔
82
        .toList();
1✔
83

84
    return new ApprovedUsers(approvedUsers);
1✔
85
  }
86

87
  public List<Dataset> getDatasetsByIdentifier(List<Integer> aliases) {
88
    return datasetDAO.findDatasetsByAlias(aliases)
1✔
89
        .stream()
1✔
90
        // technically, it is possible to have two dataset identifiers which
91
        // have the same alias but are not the same: e.g., DUOS-5 and DUOS-00005
92
        .filter(d -> aliases.contains(d.getAlias()))
1✔
93
        .toList();
1✔
94
  }
95
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc