Skip to content

Commit 00bad76

Browse files
committed
getConections and clean duplicates
Signed-off-by: Etienne Homer <[email protected]>
1 parent 279c46f commit 00bad76

File tree

3 files changed

+82
-34
lines changed

3 files changed

+82
-34
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* Copyright (c) 2022, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.useradmin.server.service;
8+
9+
import org.gridsuite.useradmin.server.repository.ConnectionEntity;
10+
import org.gridsuite.useradmin.server.repository.ConnectionRepository;
11+
import org.springframework.stereotype.Service;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
import java.time.LocalDateTime;
15+
import java.util.List;
16+
import java.util.Map;
17+
import java.util.Objects;
18+
import java.util.stream.Collectors;
19+
20+
/**
21+
* @author Etienne Homer <etienne.homer at rte-france.com>
22+
*/
23+
@Service
24+
public class ConnectionsService {
25+
26+
private ConnectionRepository connectionRepository;
27+
28+
public ConnectionsService(ConnectionRepository connectionRepository) {
29+
this.connectionRepository = Objects.requireNonNull(connectionRepository);
30+
}
31+
32+
@Transactional
33+
public void recordConnectionAttempt(String sub, Boolean isAllowed) {
34+
ConnectionEntity connectionEntity = connectionRepository.findBySub(sub).stream().findFirst().orElse(null);
35+
if (connectionEntity == null) {
36+
connectionEntity = new ConnectionEntity(sub, LocalDateTime.now(), LocalDateTime.now(), isAllowed);
37+
connectionRepository.save(connectionEntity);
38+
} else {
39+
connectionEntity.setLastConnexionDate(LocalDateTime.now());
40+
connectionEntity.setConnectionAccepted(isAllowed);
41+
}
42+
}
43+
44+
@Transactional
45+
public List<ConnectionEntity> removeDuplicates() {
46+
Map<String, List<ConnectionEntity>> connectionsBySub = connectionRepository.findAll().stream().collect(Collectors.groupingBy(ConnectionEntity::getSub));
47+
48+
connectionsBySub.keySet().forEach(sub -> {
49+
connectionsBySub.get(sub).stream().skip(1).forEach(connectionEntity -> {
50+
ConnectionEntity groupedEntity = connectionsBySub.get(sub).get(0);
51+
if (connectionEntity.getLastConnexionDate().isAfter(groupedEntity.getLastConnexionDate())) {
52+
groupedEntity.setLastConnexionDate(connectionEntity.getLastConnexionDate());
53+
}
54+
if (connectionEntity.getFirstConnexionDate().isBefore(groupedEntity.getFirstConnexionDate())) {
55+
groupedEntity.setFirstConnexionDate(connectionEntity.getFirstConnexionDate());
56+
}
57+
connectionRepository.delete(connectionEntity);
58+
});
59+
});
60+
return connectionsBySub.values().stream().map(list -> list.get(0)).collect(Collectors.toList());
61+
}
62+
}

src/main/java/org/gridsuite/useradmin/server/service/UserAdminService.java

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,17 @@
99
import org.gridsuite.useradmin.server.UserAdminApplicationProps;
1010
import org.gridsuite.useradmin.server.UserAdminException;
1111
import org.gridsuite.useradmin.server.repository.ConnectionEntity;
12-
import org.gridsuite.useradmin.server.repository.ConnectionRepository;
1312
import org.gridsuite.useradmin.server.repository.UserAdminRepository;
1413
import org.gridsuite.useradmin.server.repository.UserInfosEntity;
1514
import org.slf4j.Logger;
1615
import org.slf4j.LoggerFactory;
1716
import org.springframework.beans.factory.annotation.Autowired;
18-
import org.springframework.dao.DataIntegrityViolationException;
1917
import org.springframework.stereotype.Service;
2018

21-
import java.time.LocalDateTime;
2219
import java.util.*;
2320
import java.util.concurrent.ConcurrentHashMap;
2421
import java.util.function.Function;
2522
import java.util.function.Predicate;
26-
import java.util.stream.Collectors;
2723

2824
import static org.gridsuite.useradmin.server.UserAdminException.Type.FORBIDDEN;
2925

@@ -35,14 +31,14 @@ public class UserAdminService {
3531
private static final Logger LOGGER = LoggerFactory.getLogger(UserAdminService.class);
3632
private UserAdminRepository userAdminRepository;
3733

38-
private ConnectionRepository connectionRepository;
34+
private ConnectionsService connectionsService;
3935

4036
@Autowired
4137
private UserAdminApplicationProps applicationProps;
4238

43-
public UserAdminService(UserAdminRepository userAdminRepository, ConnectionRepository connectionRepository) {
39+
public UserAdminService(UserAdminRepository userAdminRepository, ConnectionsService connectionsService) {
4440
this.userAdminRepository = Objects.requireNonNull(userAdminRepository);
45-
this.connectionRepository = Objects.requireNonNull(connectionRepository);
41+
this.connectionsService = Objects.requireNonNull(connectionsService);
4642
}
4743

4844
public List<UserInfosEntity> getUsers(String userId) {
@@ -56,23 +52,14 @@ public List<ConnectionEntity> getConnections(String userId) {
5652
if (!isAdmin(userId)) {
5753
throw new UserAdminException(FORBIDDEN);
5854
}
59-
return removeDuplicates(connectionRepository.findAll());
55+
return connectionsService.removeDuplicates();
6056
}
6157

6258
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
6359
Set<Object> seen = ConcurrentHashMap.newKeySet();
6460
return t -> seen.add(keyExtractor.apply(t));
6561
}
6662

67-
68-
private List<ConnectionEntity> removeDuplicates(List<ConnectionEntity> connections) {
69-
List<ConnectionEntity> connectionsWithoutDuplicates = connections.stream().filter(distinctByKey(ConnectionEntity::getSub)).collect(Collectors.toList());
70-
connectionsWithoutDuplicates.stream().forEach(c -> c.setLastConnexionDate(connectionRepository.findBySub(c.getSub()).stream().max(Comparator.comparing(ConnectionEntity::getLastConnexionDate)).get().getLastConnexionDate()));
71-
connectionRepository.deleteAll();
72-
connectionRepository.saveAll(connectionsWithoutDuplicates);
73-
return connectionsWithoutDuplicates;
74-
}
75-
7663
public void createUser(String sub, String userId) {
7764
if (!isAdmin(userId)) {
7865
throw new UserAdminException(FORBIDDEN);
@@ -90,26 +77,10 @@ public void delete(UUID id, String userId) {
9077

9178
public boolean subExists(String sub) {
9279
Boolean isAllowed = (applicationProps.getAdmins().isEmpty() && userAdminRepository.count() == 0) || !userAdminRepository.findAllBySub(sub).isEmpty();
93-
recordConnectionAttempt(sub, isAllowed);
80+
connectionsService.recordConnectionAttempt(sub, isAllowed);
9481
return isAllowed.booleanValue();
9582
}
9683

97-
public void recordConnectionAttempt(String sub, Boolean isAllowed) {
98-
ConnectionEntity connectionEntity = connectionRepository.findBySub(sub).stream().max(Comparator.comparing(ConnectionEntity::getLastConnexionDate)).orElse(null);
99-
if (connectionEntity == null) {
100-
connectionEntity = new ConnectionEntity(sub, LocalDateTime.now(), LocalDateTime.now(), isAllowed);
101-
try {
102-
connectionRepository.save(connectionEntity);
103-
} catch (DataIntegrityViolationException e) {
104-
LOGGER.info("User connection already recorded.");
105-
}
106-
} else {
107-
connectionEntity.setLastConnexionDate(LocalDateTime.now());
108-
connectionEntity.setConnectionAccepted(isAllowed);
109-
connectionRepository.save(connectionEntity);
110-
}
111-
}
112-
11384
private boolean isAdmin(String sub) {
11485
return applicationProps.getAdmins().contains(sub);
11586
}

src/test/java/org/gridsuite/useradmin/server/UserAdminTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,5 +202,20 @@ public void testGetConnections() throws Exception {
202202

203203
assertEquals(2, connectionEntities.size());
204204

205+
connectionRepository.save(new ConnectionEntity(USER_SUB, LocalDateTime.now(), LocalDateTime.now(), true));
206+
207+
connectionRepository.save(new ConnectionEntity(USER_SUB, LocalDateTime.now(), LocalDateTime.now(), true));
208+
209+
connectionRepository.save(new ConnectionEntity(USER_SUB, LocalDateTime.now(), LocalDateTime.now(), true));
210+
211+
connectionEntities = objectMapper.readValue(
212+
mockMvc.perform(get("/" + UserAdminApi.API_VERSION + "/connections")
213+
.header("userId", ADMIN_USER)
214+
.contentType(APPLICATION_JSON))
215+
.andExpect(status().isOk())
216+
.andReturn().getResponse().getContentAsString(),
217+
new TypeReference<>() {
218+
});
219+
assertEquals(2, connectionEntities.size());
205220
}
206221
}

0 commit comments

Comments
 (0)