Skip to content

Commit a8dd72c

Browse files
authored
Merge pull request #1196 from oncokb/feat/add-service-account
Revert "Revert "update models to allow creating service user""
2 parents f324e34 + d6ce2de commit a8dd72c

39 files changed

+1287
-89
lines changed

.jhipster/Token.json

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
"fieldName": "renewable",
3737
"fieldType": "Boolean",
3838
"fieldValidateRules": ["required"]
39+
},
40+
{
41+
"fieldName": "name",
42+
"fieldType": "String"
3943
}
4044
],
4145
"changelogDate": "20190823204705",

screenshot-test/App.screenshot.js

+8
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ function getMockResponse(url) {
221221
body: companyDetails,
222222
};
223223
break;
224+
case `${SERVER_URL}api/companies/service-account/token`:
225+
case `${SERVER_URL}api/companies/1/service-account/token`:
226+
res = {
227+
status: 200,
228+
contentType: 'application/json',
229+
body: companyUserToken,
230+
};
231+
break;
224232
case `${SERVER_URL}api/users/non-company-emails`:
225233
res = {
226234
status: 200,
Loading
Loading
Loading
Loading

screenshot-test/data/api-account.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020
"createdDate" : null,
2121
"lastModifiedBy" : "admin",
2222
"lastModifiedDate" : "2019-11-14T11:30:46Z",
23-
"authorities" : [ "ROLE_USER", "ROLE_PREMIUM_USER", "ROLE_ADMIN", "ROLE_API" ]
23+
"authorities" : [ "ROLE_USER", "ROLE_PREMIUM_USER", "ROLE_ADMIN", "ROLE_API", "ROLE_COMPANY_ADMIN" ]
2424
}

screenshot-test/data/api-company-user-tokens.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"usageLimit": null,
88
"currentUsage": 0,
99
"renewable": true,
10+
"name": "Token",
1011
"user": {
1112
"id": 4,
1213
"login": "user",

src/main/java/org/mskcc/cbio/oncokb/config/Constants.java

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public final class Constants {
4545

4646
public static final String ONCOKB_S3_BUCKET = "oncokb-v2";
4747

48+
public static final int MAX_SERVICE_ACCOUNT_TOKENS = 10;
49+
4850
private Constants() {
4951
}
5052

src/main/java/org/mskcc/cbio/oncokb/config/SecurityConfiguration.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void configure(HttpSecurity http) throws Exception {
9696
.antMatchers("/api/v1/v2/api-docs").permitAll()
9797
.antMatchers("/api/private/utils/data/**").hasAnyAuthority(AuthoritiesConstants.DATA_DOWNLOAD)
9898

99-
.antMatchers("/api/v1/annotate/**").hasAnyAuthority(AuthoritiesConstants.API)
99+
.antMatchers("/api/v1/annotate/**").hasAnyAuthority(AuthoritiesConstants.API, AuthoritiesConstants.ROLE_SERVICE_ACCOUNT)
100100

101101
.antMatchers("/api/v1/genes/lookup").hasAnyAuthority(AuthoritiesConstants.PUBLIC_WEBSITE, AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN)
102102
.antMatchers("/api/v1/variants/lookup").hasAnyAuthority(AuthoritiesConstants.PUBLIC_WEBSITE, AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN)
@@ -135,6 +135,7 @@ public void configure(HttpSecurity http) throws Exception {
135135
.antMatchers("/api/tokens/**").hasAnyAuthority(AuthoritiesConstants.ADMIN)
136136
.antMatchers("/api/token-stats/**").hasAnyAuthority(AuthoritiesConstants.ADMIN)
137137

138+
.antMatchers("/api/companies/service-account/token").hasAnyAuthority(AuthoritiesConstants.ROLE_COMPANY_ADMIN)
138139
.antMatchers("/api/companies/**").hasAnyAuthority(AuthoritiesConstants.ADMIN)
139140
.antMatchers("/api/company-domains/**").hasAnyAuthority(AuthoritiesConstants.ADMIN)
140141

src/main/java/org/mskcc/cbio/oncokb/domain/Token.java

+17
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public class Token implements Serializable {
4444
@Column(name = "renewable", nullable = false)
4545
private Boolean renewable = true;
4646

47+
@Column(name = "name")
48+
private String name;
49+
4750
@ManyToOne
4851
@JsonIgnoreProperties(value = "tokens", allowSetters = true)
4952
private User user;
@@ -135,6 +138,19 @@ public void setRenewable(Boolean renewable) {
135138
this.renewable = renewable;
136139
}
137140

141+
public String getName() {
142+
return name;
143+
}
144+
145+
public Token name(String name) {
146+
this.name = name;
147+
return this;
148+
}
149+
150+
public void setName(String name) {
151+
this.name = name;
152+
}
153+
138154
public User getUser() {
139155
return user;
140156
}
@@ -176,6 +192,7 @@ public String toString() {
176192
", usageLimit=" + getUsageLimit() +
177193
", currentUsage=" + getCurrentUsage() +
178194
", renewable='" + isRenewable() + "'" +
195+
", name='" + getName() + "'" +
179196
"}";
180197
}
181198
}

src/main/java/org/mskcc/cbio/oncokb/repository/UserRepository.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.data.jpa.repository.EntityGraph;
99
import org.springframework.data.jpa.repository.JpaRepository;
1010
import org.springframework.data.jpa.repository.Query;
11+
import org.springframework.data.repository.query.Param;
1112
import org.springframework.stereotype.Repository;
1213

1314
import java.util.List;
@@ -42,7 +43,8 @@ public interface UserRepository extends JpaRepository<User, Long> {
4243
@Cacheable(cacheResolver = "userCacheResolver")
4344
Optional<User> findOneWithAuthoritiesByEmailIgnoreCase(String email);
4445

45-
Page<User> findAllByLoginNot(Pageable pageable, String login);
46+
@Query("select user from User user where :authorityName not in (select authority.name FROM user.authorities authority) and user.login != :login")
47+
List<User> findAllUsersWithoutAuthorityAndLoginNot(@Param("authorityName") String authorityName, @Param("login") String login);
4648

4749
@Query("select user, userDetails from User as user left join UserDetails as userDetails on user.id = userDetails.user WHERE user in ?1")
4850
List<Object[]> findAllUsersWithUserDetailsByUsersIn(List<User> users);

src/main/java/org/mskcc/cbio/oncokb/security/AuthoritiesConstants.java

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public final class AuthoritiesConstants {
2121

2222
public static final String API = "ROLE_API";
2323

24+
public static final String ROLE_COMPANY_ADMIN = "ROLE_COMPANY_ADMIN";
25+
26+
public static final String ROLE_SERVICE_ACCOUNT = "ROLE_SERVICE_ACCOUNT";
27+
2428
private AuthoritiesConstants() {
2529
}
2630
}

src/main/java/org/mskcc/cbio/oncokb/security/uuid/TokenProvider.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -80,20 +80,23 @@ private Token getNewToken(Set<Authority> authorities, Optional<Instant> definedE
8080
public Token createTokenForCurrentUserLogin(Optional<Instant> definedExpirationTime, Optional<Boolean> isRenewable) {
8181
Optional<User> userOptional = userRepository.findOneWithAuthoritiesByLogin(SecurityUtils.getCurrentUserLogin().get());
8282
if(userOptional.isPresent()) {
83-
return createToken(userOptional.get(), definedExpirationTime, isRenewable);
83+
return createToken(userOptional.get(), definedExpirationTime, isRenewable, Optional.empty());
8484
}
8585
return null;
8686
}
8787

88-
public Token createToken(User user, Optional<Instant> definedExpirationTime, Optional<Boolean> isRenewable) {
88+
public Token createToken(User user, Optional<Instant> definedExpirationTime, Optional<Boolean> isRenewable, Optional<String> name) {
8989
Token token = getNewToken(user.getAuthorities(), definedExpirationTime, isRenewable);
9090
token.setUser(user);
91+
if (name.isPresent()) {
92+
token.setName(name.get());
93+
}
9194
tokenService.save(token);
9295
return token;
9396
}
9497

95-
public void createToken(Token token){
96-
Token newToken = createToken(token.getUser(), Optional.of(token.getExpiration()), Optional.of(token.isRenewable()));
98+
public void createToken(Token token, Optional<String> name){
99+
Token newToken = createToken(token.getUser(), Optional.of(token.getExpiration()), Optional.of(token.isRenewable()), name);
97100
newToken.setCreation(token.getCreation());
98101
newToken.setCurrentUsage(token.getCurrentUsage());
99102
newToken.setUsageLimit(token.getUsageLimit());

src/main/java/org/mskcc/cbio/oncokb/service/CompanyService.java

+14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package org.mskcc.cbio.oncokb.service;
22

3+
import org.mskcc.cbio.oncokb.domain.Token;
4+
import org.mskcc.cbio.oncokb.domain.User;
35
import org.mskcc.cbio.oncokb.domain.enumeration.LicenseStatus;
46
import org.mskcc.cbio.oncokb.service.dto.CompanyDTO;
7+
import org.mskcc.cbio.oncokb.service.dto.UserDTO;
8+
import org.mskcc.cbio.oncokb.web.rest.errors.TooManyTokensException;
59
import org.mskcc.cbio.oncokb.web.rest.vm.CompanyVM;
610

711
import java.util.List;
@@ -58,4 +62,14 @@ public interface CompanyService {
5862
* @param id the id of the entity.
5963
*/
6064
void delete(Long id);
65+
66+
Optional<User> createServiceAccount(Long id);
67+
68+
void deleteServiceAccount(CompanyDTO companyDTO);
69+
70+
Optional<Token> createServiceAccountToken(Long id, String name) throws TooManyTokensException;
71+
72+
Optional<List<Token>> getServiceAccountTokensForCompany(Long id);
73+
74+
Optional<UserDTO> getServiceUserForCompany(Long companyId);
6175
}

src/main/java/org/mskcc/cbio/oncokb/service/TokenService.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,13 @@ public interface TokenService {
5858

5959
void expireToken(Token token);
6060

61+
void delete(Long id);
62+
6163
/**
6264
* Delete the token and associates its token stats with a new token.
6365
* @param id id of token
6466
*/
65-
void delete(Long id);
67+
void deleteAndAssociateStats(Long id);
6668

6769
/**
6870
* Delete all tokens related to the user

src/main/java/org/mskcc/cbio/oncokb/service/UserService.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ public User registerUser(UserDTO userDTO, String password) {
313313
return newUser;
314314
}
315315

316-
public User createUser(UserDTO userDTO, Optional<Integer> tokenValidDays, Optional<Boolean> tokenIsRenewable) {
316+
public User createUser(UserDTO userDTO, boolean isServiceUser, Optional<Integer> tokenValidDays, Optional<Boolean> tokenIsRenewable) {
317317
User user = new User();
318318
user.setLogin(userDTO.getLogin().toLowerCase());
319319
user.setFirstName(userDTO.getFirstName());
@@ -355,6 +355,10 @@ public User createUser(UserDTO userDTO, Optional<Integer> tokenValidDays, Option
355355
userDetails.setCompany(companyMapper.toEntity(userDTO.getCompany()));
356356
userDetailsRepository.save(userDetails);
357357

358+
if (isServiceUser) {
359+
log.debug("Created Information for Service User: {}", user);
360+
return user;
361+
}
358362

359363
// Check if the user is a part of licensed company and then continue with approval procedure
360364
if(userDetails.getCompany() != null){
@@ -534,7 +538,7 @@ public List<UserDTO> findAllUsersWithUserDetailsByUsersIn(List<User> users) {
534538
@Transactional(readOnly = true)
535539
@Cacheable(cacheResolver = "userCacheResolver", key = "#root.methodName")
536540
public Page<UserDTO> getAllManagedUsers(Pageable pageable) {
537-
List<User> users = userRepository.findAllByLoginNot(pageable, Constants.ANONYMOUS_USER).getContent();
541+
List<User> users = userRepository.findAllUsersWithoutAuthorityAndLoginNot(AuthoritiesConstants.ROLE_SERVICE_ACCOUNT, Constants.ANONYMOUS_USER);
538542
List<UserDTO> userDTOs = findAllUsersWithUserDetailsByUsersIn(users);
539543
return new PageImpl<>(userDTOs, pageable, users.size());
540544
}
@@ -642,7 +646,8 @@ private List<Token> generateTokenForUserIfNotExist(UserDTO userDTO, Optional<Int
642646
Token token = tokenProvider.createToken(
643647
userMapper.userDTOToUser(userDTO),
644648
tokenValidDays.isPresent() ? Optional.of(Instant.now().plusSeconds(DAY_IN_SECONDS * (long) tokenValidDays.get())) : Optional.empty(),
645-
tokenIsRenewable
649+
tokenIsRenewable,
650+
Optional.empty()
646651
);
647652
tokens.add(token);
648653
}

0 commit comments

Comments
 (0)