Skip to content
Snippets Groups Projects
Commit d4cb9838 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Included FE dist files inside Spring application; Groups model logic

parent 032148ba
No related branches found
No related tags found
No related merge requests found
Showing
with 315 additions and 20 deletions
.DS_Store .DS_Store
node_modules node_modules
gms-ui/dist gms-ui/dist
gms-ui/node/
# local env files # local env files
.env.local .env.local
...@@ -53,3 +54,4 @@ nbactions.xml ...@@ -53,3 +54,4 @@ nbactions.xml
### VS Code ### ### VS Code ###
.vscode/ .vscode/
/gms-ui/target/
VUE_APP_API_CLIENT = 'server' VUE_APP_API_CLIENT = 'server'
BASE_API_URL = 'http://localhost:8081/'
//import axios from 'axios' const BASE_API_URL = "http://localhost:8081/"
export default { export default {
fetchPosts () { fetchMainModel () {
return null;//axios return fetch(BASE_API_URL + 'groups?groupId=ROOT&tab=groups&paginatorPageSize=20&paginatorPage=1', {
//.get('https://jsonplaceholder.typicode.com/posts') method: 'GET',
//.then(response => response.data) mode: 'cors',
cache: 'no-cache',
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
});
} }
} };
...@@ -67,6 +67,27 @@ ...@@ -67,6 +67,27 @@
<build> <build>
<plugins> <plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes/static</outputDirectory>
<resources>
<resource>
<directory>../gms-ui/dist</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
......
...@@ -15,6 +15,7 @@ import org.springframework.security.oauth2.provider.ClientDetailsService; ...@@ -15,6 +15,7 @@ import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.client.InMemoryClientDetailsService; import org.springframework.security.oauth2.provider.client.InMemoryClientDetailsService;
import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter; import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.RemoteTokenServices; import org.springframework.security.oauth2.provider.token.RemoteTokenServices;
import org.springframework.web.client.RestTemplate;
/** /**
* Extending the AuthorizationServerEndpointsConfiguration disables the Spring * Extending the AuthorizationServerEndpointsConfiguration disables the Spring
...@@ -63,4 +64,9 @@ public class OAuth2Config extends AuthorizationServerEndpointsConfiguration { ...@@ -63,4 +64,9 @@ public class OAuth2Config extends AuthorizationServerEndpointsConfiguration {
return new DefaultUserInfoRestTemplateFactory(customizers, details, return new DefaultUserInfoRestTemplateFactory(customizers, details,
oauth2ClientContext); oauth2ClientContext);
} }
@Bean
public RestTemplate rapRestTemplate() {
return new RestTemplate();
}
} }
...@@ -20,13 +20,13 @@ public class SessionData { ...@@ -20,13 +20,13 @@ public class SessionData {
private UsersRepository usersRepository; private UsersRepository usersRepository;
private String userId; private String userId;
private String accessToken;
@PostConstruct @PostConstruct
public void init() { public void init() {
CustomAuthenticationData authn = (CustomAuthenticationData) ((OAuth2Authentication) request.getUserPrincipal()).getUserAuthentication(); CustomAuthenticationData authn = (CustomAuthenticationData) ((OAuth2Authentication) request.getUserPrincipal()).getUserAuthentication();
userId = (String) authn.getPrincipal(); userId = (String) authn.getPrincipal();
//accessToken = (String) ((CustomAuthenticationData) request.getUserPrincipal()).getAttributes().get("access_token"); accessToken = (String) authn.getAttributes().get("access_token");
//System.out.println("SessionData initialized: " + accessToken);
if (!usersRepository.findById(userId).isPresent()) { if (!usersRepository.findById(userId).isPresent()) {
User user = new User(); User user = new User();
...@@ -38,4 +38,8 @@ public class SessionData { ...@@ -38,4 +38,8 @@ public class SessionData {
public String getUserId() { public String getUserId() {
return userId; return userId;
} }
public String getAccessToken() {
return accessToken;
}
} }
...@@ -35,7 +35,7 @@ public class GroupsController { ...@@ -35,7 +35,7 @@ public class GroupsController {
private GroupsService groupsService; private GroupsService groupsService;
@GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public GroupsModelResponse getGroupsModelResponse(@Valid @RequestBody GroupsModelRequest groupsModelRequest) { public GroupsModelResponse getGroupsModelResponse(@Valid GroupsModelRequest groupsModelRequest) {
return groupsModelService.getGroupsModel(groupsModelRequest, session.getUserId()); return groupsModelService.getGroupsModel(groupsModelRequest, session.getUserId());
} }
......
package it.inaf.ia2.gms.model; package it.inaf.ia2.gms.model;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
public class GroupsModelRequest extends BaseModelRequest { public class GroupsModelRequest extends BaseModelRequest {
@NotNull
private String groupId; private String groupId;
@NotNull
private String tab;
@Min(1)
private int paginatorPage; private int paginatorPage;
private int paginatorPageSize; private int paginatorPageSize;
...@@ -14,6 +23,14 @@ public class GroupsModelRequest extends BaseModelRequest { ...@@ -14,6 +23,14 @@ public class GroupsModelRequest extends BaseModelRequest {
this.groupId = groupId; this.groupId = groupId;
} }
public String getTab() {
return tab;
}
public void setTab(String tab) {
this.tab = tab;
}
public int getPaginatorPage() { public int getPaginatorPage() {
return paginatorPage; return paginatorPage;
} }
......
...@@ -2,11 +2,21 @@ package it.inaf.ia2.gms.model; ...@@ -2,11 +2,21 @@ package it.inaf.ia2.gms.model;
public enum IdentityType { public enum IdentityType {
EDU_GAIN, EDU_GAIN("EduGAIN"),
X509, X509("X.509"),
ORCID, ORCID("OrcID"),
GOOGLE, GOOGLE("Google"),
LINKEDIN, LINKEDIN("LinkedIn"),
FACEBOOK, FACEBOOK("Facebook"),
LOCAL_IDP LOCAL_IDP("LocalIdP");
private final String value;
IdentityType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
} }
package it.inaf.ia2.gms.persistence; package it.inaf.ia2.gms.persistence;
import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.Membership; import it.inaf.ia2.gms.persistence.model.Membership;
import it.inaf.ia2.gms.persistence.model.MembershipId; import it.inaf.ia2.gms.persistence.model.MembershipId;
import it.inaf.ia2.gms.persistence.model.User; import it.inaf.ia2.gms.persistence.model.User;
...@@ -13,4 +14,6 @@ import org.springframework.stereotype.Repository; ...@@ -13,4 +14,6 @@ import org.springframework.stereotype.Repository;
public interface MembershipRepository extends JpaRepository<Membership, MembershipId> { public interface MembershipRepository extends JpaRepository<Membership, MembershipId> {
List<Membership> findBy_user(User user); List<Membership> findBy_user(User user);
List<Membership> findBy_group(Group group);
} }
package it.inaf.ia2.gms.persistence; package it.inaf.ia2.gms.persistence;
import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.User; import it.inaf.ia2.gms.persistence.model.User;
import it.inaf.ia2.gms.persistence.model.UserGroupPermission; import it.inaf.ia2.gms.persistence.model.UserGroupPermission;
import it.inaf.ia2.gms.persistence.model.UserGroupPermissionId; import it.inaf.ia2.gms.persistence.model.UserGroupPermissionId;
...@@ -13,4 +14,6 @@ import org.springframework.stereotype.Repository; ...@@ -13,4 +14,6 @@ import org.springframework.stereotype.Repository;
public interface PermissionsRepository extends JpaRepository<UserGroupPermission, UserGroupPermissionId> { public interface PermissionsRepository extends JpaRepository<UserGroupPermission, UserGroupPermissionId> {
List<UserGroupPermission> findBy_user(User user); List<UserGroupPermission> findBy_user(User user);
List<UserGroupPermission> findBy_group(Group group);
} }
package it.inaf.ia2.gms.rap; package it.inaf.ia2.gms.rap;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.model.RapUser;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component @Component
public class RapClient { public class RapClient {
@Value("${rap.ws-url}")
private String rapBaseUrl;
@Autowired
private SessionData sessionData;
@Autowired
private RestTemplate rapRestTemplate;
public List<RapUser> getUsers(Set<String> identifiers) {
String url = rapBaseUrl + "/user?identifiers=" + String.join(",", identifiers);
return rapRestTemplate.exchange(url, HttpMethod.GET, getEntity(), new ParameterizedTypeReference<List<RapUser>>() {
}).getBody();
}
private HttpEntity<?> getEntity() {
return getEntity(null);
}
private <T> HttpEntity<T> getEntity(T body) {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.add("Authorization", "Bearer " + sessionData.getAccessToken());
return new HttpEntity<>(body, headers);
}
} }
...@@ -5,9 +5,13 @@ import it.inaf.ia2.gms.model.GroupNode; ...@@ -5,9 +5,13 @@ import it.inaf.ia2.gms.model.GroupNode;
import it.inaf.ia2.gms.model.GroupsModelRequest; import it.inaf.ia2.gms.model.GroupsModelRequest;
import it.inaf.ia2.gms.model.GroupsModelResponse; import it.inaf.ia2.gms.model.GroupsModelResponse;
import it.inaf.ia2.gms.model.PaginatedData; import it.inaf.ia2.gms.model.PaginatedData;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.model.UserPermission;
import it.inaf.ia2.gms.persistence.model.Group; import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.User; import it.inaf.ia2.gms.persistence.model.User;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -21,6 +25,12 @@ public class GroupsModelService { ...@@ -21,6 +25,12 @@ public class GroupsModelService {
@Autowired @Autowired
private GroupsService groupsService; private GroupsService groupsService;
@Autowired
private MembersService membersService;
@Autowired
private PermissionsService permissionsService;
public GroupsModelResponse getGroupsModel(GroupsModelRequest request, String userId) { public GroupsModelResponse getGroupsModel(GroupsModelRequest request, String userId) {
User user = usersService.getUserById(userId); User user = usersService.getUserById(userId);
...@@ -30,12 +40,31 @@ public class GroupsModelService { ...@@ -30,12 +40,31 @@ public class GroupsModelService {
response.setPage("groups"); response.setPage("groups");
List<GroupNode> groupNodes = groupsService.getSubgroups(group, user); response.setBreadcrumbs(buildBreadcrumbs(new ArrayList<>(), group));
response.setGroupsPanel(new PaginatedData<>(groupNodes, request.getPaginatorPage(), request.getPaginatorPageSize())); List<Permission> currentNodePermissions = groupsService.getPermissions(group, user);
response.setPermissions(currentNodePermissions);
response.setPermissions(groupsService.getPermissions(group, user)); switch (request.getTab()) {
response.setBreadcrumbs(buildBreadcrumbs(new ArrayList<>(), group)); case "groups":
List<GroupNode> groupNodes = groupsService.getSubgroups(group, user);
response.setGroupsPanel(new PaginatedData<>(groupNodes, request.getPaginatorPage(), request.getPaginatorPageSize()));
break;
case "members":
if (currentNodePermissions.contains(Permission.ADMIN)
|| currentNodePermissions.contains(Permission.MANAGE_MEMBERS)
|| currentNodePermissions.contains(Permission.VIEW_MEMBERS)) {
List<RapUser> members = membersService.getMembers(group);
response.setMembersPanel(new PaginatedData<>(members, request.getPaginatorPage(), request.getPaginatorPageSize()));
}
break;
case "permissions":
if (currentNodePermissions.contains(Permission.ADMIN)) {
List<UserPermission> permissions = permissionsService.getUserPermissions(group);
response.setPermissionsPanel(new PaginatedData<>(permissions, request.getPaginatorPage(), request.getPaginatorPageSize()));
}
break;
}
return response; return response;
} }
...@@ -48,6 +77,7 @@ public class GroupsModelService { ...@@ -48,6 +77,7 @@ public class GroupsModelService {
breadcrumbs.add(bc); breadcrumbs.add(bc);
if (group.getParentGroup() == null) { if (group.getParentGroup() == null) {
Collections.reverse(breadcrumbs);
return breadcrumbs; return breadcrumbs;
} else { } else {
return buildBreadcrumbs(breadcrumbs, group.getParentGroup()); return buildBreadcrumbs(breadcrumbs, group.getParentGroup());
......
package it.inaf.ia2.gms.service;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.persistence.MembershipRepository;
import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.Membership;
import it.inaf.ia2.gms.rap.RapClient;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MembersService {
@Autowired
private MembershipRepository membershipRepository;
@Autowired
private RapClient rapClient;
public List<RapUser> getMembers(Group group) {
List<Membership> memberships = membershipRepository.findBy_group(group);
Set<String> userIdentifiers = memberships.stream()
.map(m -> m.getUser().getId())
.collect(Collectors.toSet());
return rapClient.getUsers(userIdentifiers);
}
}
package it.inaf.ia2.gms.service;
import it.inaf.ia2.gms.model.RapUser;
import it.inaf.ia2.gms.model.UserPermission;
import it.inaf.ia2.gms.persistence.PermissionsRepository;
import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.UserGroupPermission;
import it.inaf.ia2.gms.rap.RapClient;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PermissionsService {
@Autowired
private PermissionsRepository permissionsRepository;
@Autowired
private RapClient rapClient;
public List<UserPermission> getUserPermissions(Group group) {
List<UserGroupPermission> permissions = permissionsRepository.findBy_group(group);
Set<String> userIdentifiers = permissions.stream()
.map(p -> p.getUser().getId())
.collect(Collectors.toSet());
Map<String, RapUser> users = rapClient.getUsers(userIdentifiers).stream()
.collect(Collectors.toMap(RapUser::getId, Function.identity()));
List<UserPermission> result = new ArrayList<>();
for (UserGroupPermission p : permissions) {
RapUser rapUser = users.get(p.getUser().getId());
if (rapUser != null) {
UserPermission permission = new UserPermission();
permission.setPermission(p.getPermission());
permission.setUser(rapUser);
result.add(permission);
}
}
return result;
}
}
...@@ -16,3 +16,5 @@ spring.datasource.url=jdbc:mysql://localhost:3306/gms?useJDBCCompliantTimezoneSh ...@@ -16,3 +16,5 @@ spring.datasource.url=jdbc:mysql://localhost:3306/gms?useJDBCCompliantTimezoneSh
spring.datasource.username=gms spring.datasource.username=gms
spring.datasource.password=gms spring.datasource.password=gms
#spring.jpa.open-in-view=false #spring.jpa.open-in-view=false
rap.ws-url=http://localhost/rap-ia2/ws
\ No newline at end of file
package it.inaf.ia2.gms.controller;
import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.model.GroupsModelRequest;
import it.inaf.ia2.gms.model.GroupsModelResponse;
import it.inaf.ia2.gms.service.GroupsModelService;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import static org.mockito.ArgumentMatchers.any;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
@RunWith(MockitoJUnitRunner.class)
public class GroupsControllerTest {
@Mock
private SessionData session;
@Mock
private GroupsModelService groupsModelService;
@InjectMocks
private GroupsController controller;
@Autowired
private MockMvc mockMvc;
@Before
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void testGetGroups() throws Exception {
GroupsModelResponse response = new GroupsModelResponse();
when(groupsModelService.getGroupsModel(any(), any()))
.thenReturn(response);
mockMvc.perform(get("/groups?groupId=ROOT&tab=groups&paginatorPageSize=20&paginatorPage=1"))
.andExpect(status().isOk());
ArgumentCaptor<GroupsModelRequest> requestCaptor = ArgumentCaptor.forClass(GroupsModelRequest.class);
verify(groupsModelService).getGroupsModel(requestCaptor.capture(), any());
GroupsModelRequest request = requestCaptor.getValue();
assertEquals("ROOT", request.getGroupId());
assertEquals("groups", request.getTab());
assertEquals(1, request.getPaginatorPage());
assertEquals(20, request.getPaginatorPageSize());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment