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

DataBiosphere / consent / #6202

15 Jul 2025 11:16AM UTC coverage: 80.698% (+0.06%) from 80.634%
#6202

push

web-flow
DT-1941: Migrate user email domain lookups to database (#2603)

36 of 40 new or added lines in 6 files covered. (90.0%)

1 existing line in 1 file now uncovered.

10398 of 12885 relevant lines covered (80.7%)

0.81 hits per line

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

80.49
/src/main/java/org/broadinstitute/consent/http/service/InstitutionService.java
1
package org.broadinstitute.consent.http.service;
2

3
import com.google.api.client.http.HttpStatusCodes;
4
import com.google.inject.Inject;
5
import jakarta.ws.rs.NotFoundException;
6
import jakarta.ws.rs.ServerErrorException;
7
import java.sql.SQLException;
8
import java.util.List;
9
import java.util.Objects;
10
import org.broadinstitute.consent.http.db.InstitutionDAO;
11
import org.broadinstitute.consent.http.db.UserDAO;
12
import org.broadinstitute.consent.http.models.Institution;
13
import org.broadinstitute.consent.http.service.UserService.SimplifiedUser;
14

15
public class InstitutionService {
16

17
  private final InstitutionDAO institutionDAO;
18
  private final UserDAO userDAO;
19

20
  @Inject
21
  public InstitutionService(InstitutionDAO institutionDAO, UserDAO userDAO) {
1✔
22
    this.institutionDAO = institutionDAO;
1✔
23
    this.userDAO = userDAO;
1✔
24
  }
1✔
25

26
  public Institution createInstitution(Institution institution, Integer userId) {
27
    checkForEmptyName(institution);
1✔
28
    checkUserId(userId);
1✔
29
    try {
30
      return institutionDAO.insertFullInstitution(institution, userId);
1✔
31
    } catch (SQLException e) {
×
32
      throw new ServerErrorException("Could not create institution", HttpStatusCodes.STATUS_CODE_SERVER_ERROR, e);
×
33
    }
34
  }
35

36
  public Institution updateInstitutionById(Institution institutionPayload, Integer id,
37
      Integer userId) throws SQLException {
38
    Institution targetInstitution = institutionDAO.findInstitutionById(id);
1✔
39
    isInstitutionNull(targetInstitution);
1✔
40
    checkUserId(userId);
1✔
41
    checkForEmptyName(institutionPayload);
1✔
42
    return institutionDAO.updateFullInstitution(institutionPayload, userId);
1✔
43
  }
44

45
  public void deleteInstitutionById(Integer id) {
46
    Institution institution = institutionDAO.findInstitutionById(id);
1✔
47
    isInstitutionNull(institution);
1✔
48
    institutionDAO.deleteInstitutionById(id);
1✔
49
  }
1✔
50

51
  public Institution findInstitutionById(Integer id) throws NotFoundException {
52
    Institution institution = institutionDAO.findInstitutionById(id);
1✔
53
    isInstitutionNull(institution);
1✔
54

55
    List<SimplifiedUser> signingOfficials = userDAO.getSOsByInstitution(id).stream()
1✔
56
        .map(SimplifiedUser::new)
1✔
57
        .toList();
1✔
58
    institution.setSigningOfficials(signingOfficials);
1✔
59

60
    return institution;
1✔
61
  }
62

63
  /**
64
   * Finds the institution for a given email address. This method returns a fully populated
65
   * institution with signing officials, users, and domains.
66
   *
67
   * @param email the email address to search for
68
   * @return The Institution associated with the email's domain, or null if not found
69
   */
70
  public Institution findInstitutionForEmail(String email) {
NEW
71
    return institutionDAO.findInstitutionByDomain(trimmedEmailDomain(email));
×
72
  }
73

74
  /**
75
   * Finds the institution ID for a given email address. This is a simplified version of the more
76
   * expansive findInstitutionForEmail method that will only return just the ID for verification and
77
   * validation of a user's institutional affiliation and library card assignments.
78
   *
79
   * @param email the email address to search for
80
   * @return The Institution ID associated with the email's domain, or null if not found
81
   */
82
  public Integer findInstitutionIdForEmail(String email) {
NEW
83
    return institutionDAO.findInstitutionIdByDomain(trimmedEmailDomain(email));
×
84
  }
85

86
  private String trimmedEmailDomain(String email) {
NEW
87
    String trimmedEmail = email.trim();
×
NEW
88
    return trimmedEmail.substring(trimmedEmail.indexOf('@') + 1);
×
89
  }
90

91
  public List<Institution> findAllInstitutions() {
92
    return institutionDAO.findAllInstitutions();
1✔
93
  }
94

95
  public List<Institution> findAllInstitutionsByName(String name) {
96
    return institutionDAO.findInstitutionsByName(name);
×
97
  }
98

99
  private void checkForEmptyName(Institution institution) {
100
    String name = institution.getName();
1✔
101
    if (Objects.isNull(name) || name.isBlank()) {
1✔
102
      throw new IllegalArgumentException("Institution name cannot be null or empty");
1✔
103
    }
104
  }
1✔
105

106
  private void checkUserId(Integer userId) {
107
    if (Objects.isNull(userId)) {
1✔
108
      throw new IllegalArgumentException("User ID is a required parameter");
×
109
    }
110
  }
1✔
111

112
  private void isInstitutionNull(Institution institution) {
113
    if (Objects.isNull(institution)) {
1✔
114
      throw new NotFoundException("Institution not found");
1✔
115
    }
116
  }
1✔
117
}
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