155 lines
7.7 KiB
Java
155 lines
7.7 KiB
Java
package eu.dnetlib.dnetrolemanagement.controllers;
|
|
|
|
import com.google.gson.Gson;
|
|
import com.google.gson.JsonArray;
|
|
import eu.dnetlib.dnetrolemanagement.dto.Response;
|
|
import eu.dnetlib.dnetrolemanagement.dto.User;
|
|
import eu.dnetlib.dnetrolemanagement.exception.UnprocessableException;
|
|
import eu.dnetlib.dnetrolemanagement.exception.ConflictException;
|
|
import eu.dnetlib.dnetrolemanagement.exception.ResourceNotFoundException;
|
|
import eu.dnetlib.dnetrolemanagement.services.RegistryService;
|
|
import eu.dnetlib.dnetrolemanagement.utils.AuthoritiesUpdater;
|
|
import eu.dnetlib.dnetrolemanagement.utils.AuthoritiesUtils;
|
|
import eu.dnetlib.dnetrolemanagement.utils.JsonUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.security.access.prepost.PreAuthorize;
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
|
|
@RestController
|
|
@RequestMapping("/admin")
|
|
public class AdminController {
|
|
|
|
private final RegistryService registryService;
|
|
private final AuthoritiesUpdater authoritiesUpdater;
|
|
private final Gson gson;
|
|
|
|
@Autowired
|
|
public AdminController(RegistryService registryService, AuthoritiesUpdater authoritiesUpdater) {
|
|
this.registryService = registryService;
|
|
this.authoritiesUpdater = authoritiesUpdater;
|
|
this.gson = new Gson();
|
|
}
|
|
|
|
/**
|
|
* Get the user info of the managers of a type(Community, etc.) with id(ee, egi, etc.)
|
|
*/
|
|
@RequestMapping(value = "/{type}/{id}", method = RequestMethod.GET)
|
|
public ResponseEntity<User[]> getInfos(@PathVariable("type") String type, @PathVariable("id") String id) {
|
|
Integer couId = registryService.getCouId(type, id);
|
|
if (couId != null) {
|
|
JsonArray users = registryService.getUserIdByCouId(couId, true);
|
|
JsonArray emails = registryService.getUserEmailByCouId(couId, true);
|
|
JsonArray names = registryService.getUserNamesByCouId(couId, true);
|
|
return ResponseEntity.ok(JsonUtils.mergeUserInfo(users, emails, names, gson));
|
|
}
|
|
throw new ResourceNotFoundException("Role has not been found");
|
|
}
|
|
|
|
/**
|
|
* Assign admin role to logged in user or user with @email
|
|
*/
|
|
@RequestMapping(value = "/{type}/{id}", method = RequestMethod.POST)
|
|
@PreAuthorize("hasAuthority('REGISTERED_USER') || @registryService.getCoPersonIdsByEmail(#email).size() > 0")
|
|
public ResponseEntity<Response> assignRole(@PathVariable("type") String type, @PathVariable("id") String id, @RequestParam(required = false) String email) {
|
|
Integer coPersonId = (email != null) ? registryService.getCoPersonIdsByEmail(email).get(0) : registryService.getCoPersonIdByIdentifier();
|
|
if (coPersonId != null) {
|
|
String identifier = registryService.getIdentifierByCoPersonId(coPersonId);
|
|
Integer couId = registryService.getCouId(type, id);
|
|
if (couId != null) {
|
|
Integer role = registryService.getRoleId(coPersonId, couId);
|
|
if (role != null) {
|
|
if (registryService.getUserAdminGroup(coPersonId, couId) == null) {
|
|
registryService.assignAdminRole(coPersonId, couId);
|
|
authoritiesUpdater.update(identifier, old -> {
|
|
HashSet<SimpleGrantedAuthority> authorities = new HashSet<>((Collection<? extends SimpleGrantedAuthority>) old);
|
|
authorities.add(new SimpleGrantedAuthority(AuthoritiesUtils.manager(type, id)));
|
|
return authorities;
|
|
});
|
|
return ResponseEntity.ok(new Response("Role has been assigned successfully"));
|
|
}
|
|
throw new ConflictException("User is already an admin of this group");
|
|
}
|
|
throw new UnprocessableException("User must be member of this group in order to become an admin.");
|
|
}
|
|
throw new ResourceNotFoundException("Role has not been found");
|
|
}
|
|
throw new ResourceNotFoundException("User has not been found");
|
|
}
|
|
|
|
/**
|
|
* Remove admin role from logged in user or user with @email
|
|
*/
|
|
@RequestMapping(value = "/{type}/{id}", method = RequestMethod.DELETE)
|
|
@PreAuthorize("hasAuthority('REGISTERED_USER') || @registryService.getCoPersonIdsByEmail(#email).size() > 0")
|
|
public ResponseEntity<Response> removeRole(@PathVariable("type") String type, @PathVariable("id") String id, @RequestParam(required = false) String email) {
|
|
List<Integer> coPersonIds = (email != null) ? registryService.getCoPersonIdsByEmail(email) : Collections.singletonList(registryService.getCoPersonIdByIdentifier());
|
|
if (coPersonIds.size() > 0) {
|
|
Integer couId = registryService.getCouId(type, id);
|
|
if (couId != null) {
|
|
coPersonIds.forEach(coPersonId -> {
|
|
registryService.removeAdminRole(coPersonId, couId);
|
|
String identifier = registryService.getIdentifierByCoPersonId(coPersonId);
|
|
authoritiesUpdater.update(identifier, old -> {
|
|
HashSet<SimpleGrantedAuthority> authorities = new HashSet<>((Collection<? extends SimpleGrantedAuthority>) old);
|
|
authorities.remove(new SimpleGrantedAuthority(AuthoritiesUtils.manager(type, id)));
|
|
return authorities;
|
|
});
|
|
});
|
|
return ResponseEntity.ok(new Response("Role has been revoked successfully"));
|
|
}
|
|
throw new ResourceNotFoundException("Role has not been found");
|
|
}
|
|
throw new ResourceNotFoundException("User has not been found");
|
|
}
|
|
|
|
|
|
/**
|
|
* Get the names of the managers of a type(Community, etc.) with id(ee, egi, etc.)
|
|
*/
|
|
@RequestMapping(value = "/{type}/{id}/name", method = RequestMethod.GET)
|
|
public ResponseEntity<User[]> getNames(@PathVariable("type") String type, @PathVariable("id") String id) {
|
|
Integer couId = registryService.getCouId(type, id);
|
|
if (couId != null) {
|
|
JsonArray users = registryService.getUserNamesByCouId(couId, true);
|
|
return ResponseEntity.ok(gson.fromJson(users, User[].class));
|
|
}
|
|
throw new ResourceNotFoundException("Role has not been found");
|
|
}
|
|
|
|
|
|
/**
|
|
* Get the Identifiers of the managers of a type(Community, etc.) with id(ee, egi, etc.)
|
|
*/
|
|
@RequestMapping(value = "/{type}/{id}/id", method = RequestMethod.GET)
|
|
public ResponseEntity<User[]> getIds(@PathVariable("type") String type, @PathVariable("id") String id) {
|
|
Integer couId = registryService.getCouId(type, id);
|
|
if (couId != null) {
|
|
JsonArray users = registryService.getUserIdByCouId(couId, true);
|
|
return ResponseEntity.ok(gson.fromJson(users, User[].class));
|
|
}
|
|
throw new ResourceNotFoundException("Role has not been found");
|
|
}
|
|
|
|
/**
|
|
* Get the emails of the managers of a type(Community, etc.) with id(ee, egi, etc.)
|
|
*/
|
|
@RequestMapping(value = "/{type}/{id}/email", method = RequestMethod.GET)
|
|
public ResponseEntity<User[]> getEmails(@PathVariable("type") String type, @PathVariable("id") String id) {
|
|
Integer couId = registryService.getCouId(type, id);
|
|
if (couId != null) {
|
|
JsonArray users = registryService.getUserEmailByCouId(couId, true);
|
|
return ResponseEntity.ok(gson.fromJson(users, User[].class));
|
|
}
|
|
throw new ResourceNotFoundException("Role has not been found");
|
|
}
|
|
|
|
|
|
}
|