2020-08-04 18:18:08 +02:00
package eu.dnetlib.openaire.usermanagement.api ;
2021-09-09 13:31:21 +02:00
import com.google.gson.* ;
2020-11-14 11:17:54 +01:00
import eu.dnetlib.openaire.user.login.utils.AuthoritiesUpdater ;
2020-10-05 15:09:34 +02:00
import eu.dnetlib.openaire.user.pojos.RoleVerification ;
2020-09-03 21:45:38 +02:00
import eu.dnetlib.openaire.user.utils.EmailSender ;
2020-08-04 18:18:08 +02:00
import eu.dnetlib.openaire.usermanagement.dto.Role ;
2021-09-09 13:31:21 +02:00
import eu.dnetlib.openaire.usermanagement.dto.User ;
2020-11-14 11:17:54 +01:00
import eu.dnetlib.openaire.usermanagement.utils.AuthorizationService ;
2020-08-04 18:18:08 +02:00
import eu.dnetlib.openaire.usermanagement.utils.JsonUtils ;
import eu.dnetlib.openaire.usermanagement.utils.RegistryCalls ;
import eu.dnetlib.openaire.usermanagement.utils.VerificationUtils ;
import org.apache.log4j.Logger ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.http.HttpStatus ;
import org.springframework.security.access.prepost.PreAuthorize ;
2020-11-14 11:17:54 +01:00
import org.springframework.security.core.authority.SimpleGrantedAuthority ;
2020-08-04 18:18:08 +02:00
import org.springframework.stereotype.Component ;
import org.springframework.web.bind.annotation.RequestBody ;
2020-09-03 21:45:38 +02:00
import javax.mail.MessagingException ;
2020-08-04 18:18:08 +02:00
import javax.ws.rs.* ;
import javax.ws.rs.core.MediaType ;
import javax.ws.rs.core.Response ;
2021-09-09 14:13:23 +02:00
import java.util.* ;
2020-08-04 18:18:08 +02:00
@Component ( value = " RegistryService " )
@Path ( " /registry " )
public class RegistryService {
private static final Logger logger = Logger . getLogger ( RegistryService . class ) ;
@Autowired
private RegistryCalls calls ;
@Autowired
private JsonUtils jsonUtils ;
2020-09-03 21:45:38 +02:00
@Autowired
private EmailSender emailSender ;
2020-08-04 18:18:08 +02:00
@Autowired
private VerificationUtils verificationUtils ;
2020-11-14 11:17:54 +01:00
@Autowired
private AuthoritiesUpdater authoritiesUpdater ;
@Autowired
private AuthorizationService authorizationService ;
2021-09-09 13:31:21 +02:00
private final Gson gson = new Gson ( ) ;
2020-08-04 18:18:08 +02:00
/ * *
2020-08-14 12:38:59 +02:00
* Subscribe to a type ( Community , etc . ) with id ( ee , egi , etc . )
2020-09-03 21:45:38 +02:00
* /
2020-08-04 18:18:08 +02:00
@Path ( " /subscribe/{type}/{id} " )
@POST
@Produces ( MediaType . APPLICATION_JSON )
2020-10-05 15:09:34 +02:00
@PreAuthorize ( " isAuthenticated() and @AuthorizationService.isCommunity(#type) " )
2020-08-04 18:18:08 +02:00
public Response subscribe ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
Integer coPersonId = calls . getCoPersonIdByIdentifier ( ) ;
Integer couId = calls . getCouId ( type , id ) ;
if ( couId ! = null ) {
Integer role = calls . getRoleId ( coPersonId , couId ) ;
calls . assignMemberRole ( coPersonId , couId , role ) ;
2021-03-24 11:08:19 +01:00
authoritiesUpdater . update ( authorizationService . getEmail ( ) , old - > {
2020-11-14 11:17:54 +01:00
HashSet < SimpleGrantedAuthority > authorities = new HashSet < > ( ( Collection < ? extends SimpleGrantedAuthority > ) old ) ;
authorities . add ( new SimpleGrantedAuthority ( authorizationService . member ( type , id ) ) ) ;
return authorities ;
} ) ;
2020-08-04 18:18:08 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has been assigned " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
/ * *
2020-10-05 15:09:34 +02:00
* Unsubscribe from type ( Community , etc . ) with id ( ee , egi , etc . ) .
2020-08-04 18:18:08 +02:00
* If user has manager role for this entity , it will be removed too .
2020-09-03 21:45:38 +02:00
* /
2020-08-04 18:18:08 +02:00
@Path ( " /unsubscribe/{type}/{id} " )
@POST
@Produces ( MediaType . APPLICATION_JSON )
2020-10-05 15:09:34 +02:00
@PreAuthorize ( " isAuthenticated() and @AuthorizationService.isCommunity(#type) " )
2020-08-04 18:18:08 +02:00
public Response unsubscribe ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
Integer coPersonId = calls . getCoPersonIdByIdentifier ( ) ;
Integer couId = calls . getCouId ( type , id ) ;
if ( couId ! = null ) {
Integer role = calls . getRoleId ( coPersonId , couId ) ;
if ( role ! = null ) {
calls . removeAdminRole ( coPersonId , couId ) ;
calls . removeMemberRole ( coPersonId , couId , role ) ;
2021-03-24 11:08:19 +01:00
authoritiesUpdater . update ( authorizationService . getEmail ( ) , old - > {
2020-11-14 11:17:54 +01:00
HashSet < SimpleGrantedAuthority > authorities = new HashSet < > ( ( Collection < ? extends SimpleGrantedAuthority > ) old ) ;
authorities . remove ( new SimpleGrantedAuthority ( authorizationService . manager ( type , id ) ) ) ;
authorities . remove ( new SimpleGrantedAuthority ( authorizationService . member ( type , id ) ) ) ;
return authorities ;
} ) ;
2020-08-04 18:18:08 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has been removed " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " User does not have this role " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2021-09-08 18:33:33 +02:00
/ * *
* Create a new role with the given type ( Community , etc . ) with id ( ee , egi , etc . ) .
* * /
@Path ( " /create/{type}/{id} " )
@POST
@Produces ( MediaType . APPLICATION_JSON )
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN) " )
public Response createMemberRole ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
if ( calls . getCouId ( type , id ) ! = null ) {
if ( calls . createRole ( new Role ( type + " . " + id , calls . mapType ( type , false ) + " " + id ) ) ! = null ) {
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has been created " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . BAD_REQUEST . value ( ) ) . entity ( jsonUtils . createResponse ( " An error has occurred. Please try again later " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . CONFLICT . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has already existed " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-04 18:18:08 +02:00
/ * *
* Create a new role with the given name and description .
2020-08-14 12:38:59 +02:00
* * /
2020-08-04 18:18:08 +02:00
@Path ( " /createRole " )
@POST
@Produces ( MediaType . APPLICATION_JSON )
@Consumes ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN) " )
2020-08-04 18:18:08 +02:00
public Response createRole ( @RequestBody Role role ) {
2021-03-24 11:08:19 +01:00
if ( calls . getCouId ( role . getName ( ) ) = = null ) {
2021-06-02 15:40:45 +02:00
if ( calls . createRole ( role ) ! = null ) {
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has been created " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . BAD_REQUEST . value ( ) ) . entity ( jsonUtils . createResponse ( " An error has occurred. Please try again later " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
2021-01-28 15:40:31 +01:00
} else {
return Response . status ( HttpStatus . CONFLICT . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has already existed " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
2020-08-04 18:18:08 +02:00
}
/ * *
* Invite user with email to manage a type ( Community , etc . ) with id ( ee , egi , etc . )
* Auto generated link and code will be sent as response .
2020-09-03 21:45:38 +02:00
* /
2020-11-19 18:15:08 +01:00
@Path ( " /invite/{type}/{id}/manager " )
2020-08-04 18:18:08 +02:00
@POST
@Produces ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
2020-09-08 15:00:33 +02:00
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
2020-11-19 18:15:08 +01:00
public Response inviteManager ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id , @RequestBody String body ) {
2020-08-04 18:18:08 +02:00
Integer couId = calls . getCouId ( type , id ) ;
if ( couId ! = null ) {
2020-11-19 18:15:08 +01:00
JsonObject details = new JsonParser ( ) . parse ( body ) . getAsJsonObject ( ) ;
JsonObject email = details . get ( " email " ) . getAsJsonObject ( ) ;
String recipient = email . get ( " recipient " ) . getAsString ( ) ;
Integer coPersonId = calls . getCoPersonIdByEmail ( recipient ) ;
2020-10-05 15:09:34 +02:00
if ( coPersonId = = null | | calls . getUserAdminGroup ( coPersonId , couId ) = = null ) {
2020-11-19 18:15:08 +01:00
JsonObject invitation = verificationUtils . createManagerInvitation ( recipient , type , id ) ;
return sendEmail ( details , email , coPersonId , invitation ) ;
2020-08-14 12:38:59 +02:00
} else {
2020-08-14 16:51:39 +02:00
return Response . status ( HttpStatus . CONFLICT . value ( ) ) . entity ( jsonUtils . createResponse ( " User has been already manager of this " + type ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
2020-08-14 12:38:59 +02:00
}
2020-08-04 18:18:08 +02:00
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-10-05 15:09:34 +02:00
/ * *
* Invite user with email to be a member of a type ( Community , etc . ) with id ( ee , egi , etc . )
* Auto generated link and code will be sent as response .
* /
2020-11-19 18:15:08 +01:00
@Path ( " /invite/{type}/{id}/member " )
2020-10-05 15:09:34 +02:00
@POST
@Produces ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
2020-10-05 15:09:34 +02:00
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
2020-11-19 18:15:08 +01:00
public Response inviteMember ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id , @RequestBody String body ) {
2021-01-28 15:40:31 +01:00
Integer couId = calls . getCouId ( type , id , false ) ;
2020-10-05 15:09:34 +02:00
if ( couId ! = null ) {
2020-11-19 18:15:08 +01:00
JsonObject details = new JsonParser ( ) . parse ( body ) . getAsJsonObject ( ) ;
JsonObject email = details . get ( " email " ) . getAsJsonObject ( ) ;
String recipient = email . get ( " recipient " ) . getAsString ( ) ;
Integer coPersonId = calls . getCoPersonIdByEmail ( recipient ) ;
2020-10-05 15:09:34 +02:00
if ( coPersonId = = null | | calls . getRoleId ( coPersonId , couId ) = = null ) {
2020-11-19 18:15:08 +01:00
JsonObject invitation = verificationUtils . createMemberInvitation ( recipient , type , id ) ;
return sendEmail ( details , email , coPersonId , invitation ) ;
2020-10-05 15:09:34 +02:00
} else {
return Response . status ( HttpStatus . CONFLICT . value ( ) ) . entity ( jsonUtils . createResponse ( " User has been already member of this " + type ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-11-19 18:15:08 +01:00
private Response sendEmail ( JsonObject details , JsonObject email , Integer coPersonId , JsonObject invitation ) {
2021-03-24 11:08:19 +01:00
String name = ( coPersonId ! = null ) ? calls . getUserNames ( coPersonId ) : " User " ;
2020-11-19 18:15:08 +01:00
String link = details . get ( " link " ) . getAsString ( ) + invitation . get ( " link " ) . getAsString ( ) ;
String subject = email . get ( " subject " ) . getAsString ( ) ;
String message = email . get ( " body " ) . getAsString ( ) .
replace ( " ((__user__)) " , name ) .
replace ( " ((__link__)) " , link ) .
replace ( " ((__code__)) " , invitation . get ( " code " ) . getAsString ( ) ) ;
try {
emailSender . sendEmail ( email . get ( " recipient " ) . getAsString ( ) , subject , message ) ;
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( invitation ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} catch ( MessagingException e ) {
logger . error ( e . getMessage ( ) ) ;
verificationUtils . deleteVerification ( invitation . get ( " link " ) . getAsString ( ) ) ;
return Response . status ( HttpStatus . BAD_REQUEST . value ( ) ) . entity ( jsonUtils . createResponse ( " Email sent failed " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-10 13:30:25 +02:00
/ * *
* Cancel invitation to user with email for managing a type ( Community , etc . ) with id ( ee , egi , etc . )
2020-09-03 21:45:38 +02:00
* /
2020-08-10 13:30:25 +02:00
@Path ( " /invite/{type}/{id}/manager/{email} " )
@DELETE
@Produces ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
2020-09-08 15:00:33 +02:00
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
2020-10-05 15:09:34 +02:00
public Response cancelManagerInvitations ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id , @PathParam ( " email " ) String email ) {
Integer couId = calls . getCouId ( type , id ) ;
if ( couId ! = null ) {
verificationUtils . deleteManagerVerifications ( email , type , id ) ;
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Invitations have been deleted " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
/ * *
* Cancel invitation to user with email for being member of a type ( Community , etc . ) with id ( ee , egi , etc . )
* /
@Path ( " /invite/{type}/{id}/member/{email} " )
@DELETE
@Produces ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
2020-10-05 15:09:34 +02:00
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
public Response cancelMemberInvitations ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id , @PathParam ( " email " ) String email ) {
2021-01-28 15:40:31 +01:00
Integer couId = calls . getCouId ( type , id , false ) ;
2020-08-10 13:30:25 +02:00
if ( couId ! = null ) {
2020-10-05 15:09:34 +02:00
verificationUtils . deleteMemberVerifications ( email , type , id ) ;
2020-08-10 13:30:25 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Invitations have been deleted " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
/ * *
* Get the invited managers for a type ( Community , etc . ) with id ( ee , egi , etc . )
2020-09-03 21:45:38 +02:00
* /
2020-08-14 12:38:59 +02:00
@Path ( " /invite/{type}/{id}/managers/ " )
2020-08-10 13:30:25 +02:00
@GET
@Produces ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
2020-09-08 15:00:33 +02:00
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
2020-08-10 13:30:25 +02:00
public Response getInvitedManagers ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
2020-10-05 15:09:34 +02:00
JsonArray invited = verificationUtils . getInvitedManagers ( type , id ) ;
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( invited ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
/ * *
* Get the invited members for a type ( Community , etc . ) with id ( ee , egi , etc . )
* /
@Path ( " /invite/{type}/{id}/members/ " )
@GET
@Produces ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
2020-10-05 15:09:34 +02:00
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
public Response getInviteMembers ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
JsonArray invited = verificationUtils . getInvitedMembers ( type , id ) ;
2020-08-10 13:30:25 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( invited ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
2020-08-04 18:18:08 +02:00
/ * *
* Get the verification with a specific id only if it refers to the logged in user
2020-09-03 21:45:38 +02:00
* /
2020-08-04 18:18:08 +02:00
@Path ( " verification/{id} " )
@GET
@Produces ( MediaType . APPLICATION_JSON )
@PreAuthorize ( " isAuthenticated() " )
public Response getVerification ( @PathParam ( " id " ) String id ) {
2020-10-05 15:09:34 +02:00
RoleVerification verification = verificationUtils . getVerification ( id ) ;
if ( verification ! = null ) {
2021-03-24 11:08:19 +01:00
if ( verification . getEmail ( ) . equalsIgnoreCase ( authorizationService . getEmail ( ) ) ) {
2020-10-05 15:09:34 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( jsonUtils . createVerification ( verification ) ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
2020-08-04 18:18:08 +02:00
} else {
return Response . status ( HttpStatus . FORBIDDEN . value ( ) ) . entity ( jsonUtils . createResponse ( " Forbidden verification " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Verification has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-10 13:30:25 +02:00
/ * *
* Delete the verification with a specific id .
2020-09-03 21:45:38 +02:00
* /
2020-08-10 13:30:25 +02:00
@Path ( " verification/{id} " )
@DELETE
@Produces ( MediaType . APPLICATION_JSON )
2020-08-14 12:38:59 +02:00
@PreAuthorize ( " isAuthenticated() && @VerificationUtils.ownedVerification(#id) " )
2020-08-10 13:30:25 +02:00
public Response deleteVerification ( @PathParam ( " id " ) String id ) {
if ( verificationUtils . getVerification ( id ) ! = null ) {
verificationUtils . deleteVerification ( id ) ;
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( jsonUtils . createResponse ( " Verification deleted " ) ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( jsonUtils . createResponse ( " Verification has not been found " ) ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-04 18:18:08 +02:00
/ * *
* Verify the verification with the specific id , if the code is correct and it refers to the logged in user .
* Manager role is assigned to this user , along with the member role .
2020-09-03 21:45:38 +02:00
* /
2020-10-05 15:09:34 +02:00
@Path ( " verification/manager/{id} " )
2020-08-04 18:18:08 +02:00
@POST
@Produces ( MediaType . APPLICATION_JSON )
@PreAuthorize ( " isAuthenticated() " )
2020-10-05 15:09:34 +02:00
public Response verifyManager ( @PathParam ( " id " ) String id , @RequestBody String code ) {
RoleVerification verification = verificationUtils . getVerification ( id ) ;
if ( verification ! = null & & verification . getVerificationType ( ) . equals ( " manager " ) ) {
2021-03-24 11:08:19 +01:00
Integer coPersonId = calls . getCoPersonIdByIdentifier ( ) ;
2020-08-04 18:18:08 +02:00
if ( coPersonId ! = null ) {
2021-03-16 08:52:52 +01:00
if ( verification . getEmail ( ) . equalsIgnoreCase ( authorizationService . getEmail ( ) ) ) {
2020-10-05 15:09:34 +02:00
if ( verification . getVerificationCode ( ) . equals ( code ) ) {
Integer couId = calls . getCouId ( verification . getType ( ) , verification . getEntity ( ) ) ;
2020-08-04 18:18:08 +02:00
if ( couId ! = null ) {
Integer role = calls . getRoleId ( coPersonId , couId ) ;
calls . assignMemberRole ( coPersonId , couId , role ) ;
2021-03-24 11:08:19 +01:00
if ( verification . getType ( ) . equals ( " community " ) | | verification . getType ( ) . equals ( " ri " ) ) {
2021-03-11 12:34:24 +01:00
Integer riCouId = calls . getCouId ( " ri " , verification . getEntity ( ) , false ) ;
2021-03-24 11:08:19 +01:00
if ( riCouId ! = null ) {
2021-03-11 12:34:24 +01:00
calls . assignMemberRole ( coPersonId , riCouId , calls . getRoleId ( coPersonId , riCouId ) ) ;
verificationUtils . deleteMemberVerifications ( verification . getEmail ( ) , " community " , verification . getEntity ( ) ) ;
verificationUtils . deleteMemberVerifications ( verification . getEmail ( ) , " ri " , verification . getEntity ( ) ) ;
} else {
verificationUtils . deleteMemberVerifications ( verification . getEmail ( ) , " community " , verification . getEntity ( ) ) ;
}
} else {
verificationUtils . deleteMemberVerifications ( verification . getEmail ( ) , verification . getType ( ) , verification . getEntity ( ) ) ;
}
2020-08-04 18:18:08 +02:00
if ( calls . getUserAdminGroup ( coPersonId , couId ) = = null ) {
2021-03-24 11:08:19 +01:00
if ( verification . getType ( ) . equals ( " community " ) | | verification . getType ( ) . equals ( " ri " ) ) {
2021-03-11 12:34:24 +01:00
verificationUtils . deleteManagerVerifications ( verification . getEmail ( ) , " community " , verification . getEntity ( ) ) ;
verificationUtils . deleteManagerVerifications ( verification . getEmail ( ) , " ri " , verification . getEntity ( ) ) ;
} else {
verificationUtils . deleteManagerVerifications ( verification . getEmail ( ) , verification . getType ( ) , verification . getEntity ( ) ) ;
}
2020-08-04 18:18:08 +02:00
calls . assignAdminRole ( coPersonId , couId ) ;
2020-11-14 11:17:54 +01:00
authoritiesUpdater . update ( verification . getEmail ( ) , old - > {
HashSet < SimpleGrantedAuthority > authorities = new HashSet < > ( ( Collection < ? extends SimpleGrantedAuthority > ) old ) ;
authorities . add ( new SimpleGrantedAuthority ( authorizationService . member ( verification . getType ( ) , verification . getEntity ( ) ) ) ) ;
authorities . add ( new SimpleGrantedAuthority ( authorizationService . manager ( verification . getType ( ) , verification . getEntity ( ) ) ) ) ;
return authorities ;
} ) ;
2020-08-04 18:18:08 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Admin role has been assigned " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . CONFLICT . value ( ) ) . entity ( jsonUtils . createResponse ( " User is already admin of this cou " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
2021-03-11 12:34:24 +01:00
return Response . status ( HttpStatus . BAD_REQUEST . value ( ) ) . entity ( jsonUtils . createResponse ( " Verification code is wrong " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
2020-08-04 18:18:08 +02:00
}
} else {
return Response . status ( HttpStatus . FORBIDDEN . value ( ) ) . entity ( jsonUtils . createResponse ( " Forbidden verification " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " User has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Verification has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-10-05 15:09:34 +02:00
/ * *
* Verify the verification with the specific id , if the code is correct and it refers to the logged in user .
* Member role is assigned to this user , along with the member role .
* /
@Path ( " verification/member/{id} " )
@POST
@Produces ( MediaType . APPLICATION_JSON )
@PreAuthorize ( " isAuthenticated() " )
public Response verifyMember ( @PathParam ( " id " ) String id , @RequestBody String code ) {
RoleVerification verification = verificationUtils . getVerification ( id ) ;
if ( verification ! = null & & verification . getVerificationType ( ) . equals ( " member " ) ) {
2021-03-24 11:08:19 +01:00
Integer coPersonId = calls . getCoPersonIdByIdentifier ( ) ;
2020-10-05 15:09:34 +02:00
if ( coPersonId ! = null ) {
2021-03-16 08:52:52 +01:00
if ( verification . getEmail ( ) . equalsIgnoreCase ( authorizationService . getEmail ( ) ) ) {
2020-10-05 15:09:34 +02:00
if ( verification . getVerificationCode ( ) . equals ( code ) ) {
2021-01-28 15:40:31 +01:00
Integer couId = calls . getCouId ( verification . getType ( ) , verification . getEntity ( ) , false ) ;
2020-10-05 15:09:34 +02:00
if ( couId ! = null ) {
Integer role = calls . getRoleId ( coPersonId , couId ) ;
calls . assignMemberRole ( coPersonId , couId , role ) ;
2020-11-14 11:17:54 +01:00
authoritiesUpdater . update ( verification . getEmail ( ) , old - > {
HashSet < SimpleGrantedAuthority > authorities = new HashSet < > ( ( Collection < ? extends SimpleGrantedAuthority > ) old ) ;
authorities . add ( new SimpleGrantedAuthority ( authorizationService . member ( verification . getType ( ) , verification . getEntity ( ) ) ) ) ;
return authorities ;
} ) ;
2020-10-05 15:09:34 +02:00
verificationUtils . deleteMemberVerifications ( verification . getEmail ( ) , verification . getType ( ) , verification . getEntity ( ) ) ;
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Member role has been assigned " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . FORBIDDEN . value ( ) ) . entity ( jsonUtils . createResponse ( " Verification code is wrong " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . FORBIDDEN . value ( ) ) . entity ( jsonUtils . createResponse ( " Forbidden verification " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " User has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Verification has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-04 18:18:08 +02:00
/ * *
* Remove the manager role from user with email for a type ( Community , etc . ) with id ( ee , egi , etc . )
2020-09-03 21:45:38 +02:00
* /
2020-08-04 18:18:08 +02:00
@Path ( " /{type}/{id}/manager/{email} " )
@DELETE
@Produces ( MediaType . APPLICATION_JSON )
@Consumes ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
2020-08-04 18:18:08 +02:00
public Response removeManagerRole ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String
id , @PathParam ( " email " ) String email ) {
2021-03-24 11:08:19 +01:00
List < Integer > coPersonIds = calls . getCoPersonIdsByEmail ( email ) ;
if ( coPersonIds . size ( ) > 0 ) {
2020-08-04 18:18:08 +02:00
Integer couId = calls . getCouId ( type , id ) ;
if ( couId ! = null ) {
2021-03-24 11:08:19 +01:00
coPersonIds . forEach ( coPersonId - > {
calls . removeAdminRole ( coPersonId , couId ) ;
} ) ;
2020-11-14 11:17:54 +01:00
authoritiesUpdater . update ( email , old - > {
HashSet < SimpleGrantedAuthority > authorities = new HashSet < > ( ( Collection < ? extends SimpleGrantedAuthority > ) old ) ;
authorities . remove ( new SimpleGrantedAuthority ( authorizationService . manager ( type , id ) ) ) ;
return authorities ;
} ) ;
2020-08-04 18:18:08 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has been removed " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " User has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
/ * *
2020-10-05 15:09:34 +02:00
* Remove the member role from user with email for a type ( Community , etc . ) with id ( ee , egi , etc . )
* /
@Path ( " /{type}/{id}/member/{email} " )
@DELETE
@Produces ( MediaType . APPLICATION_JSON )
@Consumes ( MediaType . APPLICATION_JSON )
2020-11-19 18:15:08 +01:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
2020-10-05 15:09:34 +02:00
public Response removeMemberRole ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String
id , @PathParam ( " email " ) String email ) {
2021-03-24 11:08:19 +01:00
List < Integer > coPersonIds = calls . getCoPersonIdsByEmail ( email ) ;
if ( coPersonIds . size ( ) > 0 ) {
2021-01-28 15:40:31 +01:00
Integer couId = calls . getCouId ( type , id , false ) ;
2021-03-24 11:08:19 +01:00
if ( couId ! = null ) {
coPersonIds . forEach ( coPersonId - > {
Integer role = calls . getRoleId ( coPersonId , couId ) ;
calls . removeAdminRole ( coPersonId , couId ) ;
calls . removeMemberRole ( coPersonId , couId , role ) ;
} ) ;
2020-11-14 11:17:54 +01:00
authoritiesUpdater . update ( email , old - > {
HashSet < SimpleGrantedAuthority > authorities = new HashSet < > ( ( Collection < ? extends SimpleGrantedAuthority > ) old ) ;
authorities . remove ( new SimpleGrantedAuthority ( authorizationService . manager ( type , id ) ) ) ;
authorities . remove ( new SimpleGrantedAuthority ( authorizationService . member ( type , id ) ) ) ;
return authorities ;
} ) ;
2020-10-05 15:09:34 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has been removed " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " User has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-04 18:18:08 +02:00
/ * *
2020-10-05 15:09:34 +02:00
* Get the number of the members of a type ( Community , etc . ) with id ( ee , egi , etc . )
2020-09-03 21:45:38 +02:00
* /
2020-10-05 15:09:34 +02:00
@Path ( " /{type}/{id}/members/count " )
2020-08-04 18:18:08 +02:00
@GET
@Produces ( MediaType . APPLICATION_JSON )
2020-10-05 15:09:34 +02:00
public Response getMembersCount ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
2021-01-28 15:40:31 +01:00
Integer couId = calls . getCouId ( type , id , false ) ;
2020-11-04 11:59:49 +01:00
int count = 0 ;
2021-03-24 11:08:19 +01:00
if ( couId ! = null ) {
2021-09-08 18:33:33 +02:00
count = calls . getUserIdByCouId ( couId , false ) . size ( ) ;
2020-11-04 11:59:49 +01:00
}
2020-08-04 18:18:08 +02:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( count ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
/ * *
2021-09-08 18:33:33 +02:00
* Get the names of the members of a type ( Community , etc . ) with id ( ee , egi , etc . )
2020-09-03 21:45:38 +02:00
* /
2021-09-08 18:33:33 +02:00
@Path ( " /{type}/{id}/members{var:.*} " )
2020-08-04 18:18:08 +02:00
@GET
@Produces ( MediaType . APPLICATION_JSON )
2021-09-08 18:33:33 +02:00
@PreAuthorize ( " hasAnyAuthority(@AuthorizationService.PORTAL_ADMIN, " +
" @AuthorizationService.curator(#type), @AuthorizationService.manager(#type, #id)) " )
public Response getMembers ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
Integer couId = calls . getCouId ( type , id , false ) ;
2021-03-24 11:08:19 +01:00
if ( couId ! = null ) {
2021-09-08 18:33:33 +02:00
JsonArray members = calls . getUserIdByCouId ( couId , false ) ;
JsonArray emails = calls . getUserEmailByCouId ( couId , false ) ;
JsonArray names = calls . getUserNamesByCouId ( couId , false ) ;
2021-09-09 13:31:21 +02:00
JsonArray managers = calls . getUserIdByCouId ( couId , true ) ;
members . getAsJsonArray ( ) . forEach ( element - > {
element . getAsJsonObject ( ) . addProperty ( " isManager " , managers . contains ( element ) ) ;
} ) ;
JsonUtils . mergeUserInfo ( members , emails , names , gson ) ;
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( members ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
2020-11-04 11:59:49 +01:00
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
2020-08-04 18:18:08 +02:00
}
2021-03-04 15:45:06 +01:00
/ * *
2021-09-08 18:33:33 +02:00
* Get infos of the managers of a type ( Community , etc . ) with id ( ee , egi , etc . )
2021-03-04 15:45:06 +01:00
* /
2021-09-08 18:33:33 +02:00
@Path ( " /{type}/{id}/managers{var:.*} " )
2021-03-04 15:45:06 +01:00
@GET
@Produces ( MediaType . APPLICATION_JSON )
2021-09-08 18:33:33 +02:00
public Response getManagers ( @PathParam ( " type " ) String type , @PathParam ( " id " ) String id ) {
2021-03-04 15:45:06 +01:00
Integer couId = calls . getCouId ( type , id ) ;
2021-03-24 11:08:19 +01:00
if ( couId ! = null ) {
2021-03-04 15:45:06 +01:00
JsonArray managers = calls . getUserIdByCouId ( couId , true ) ;
2021-09-08 18:33:33 +02:00
if ( authorizationService . isManager ( type , id ) | | authorizationService . isPortalAdmin ( ) | | authorizationService . isCurator ( type ) ) {
JsonArray emails = calls . getUserEmailByCouId ( couId , true ) ;
JsonArray names = calls . getUserNamesByCouId ( couId , true ) ;
2021-09-09 13:31:21 +02:00
JsonUtils . mergeUserInfo ( managers , emails , names , gson ) ;
2021-09-09 14:13:23 +02:00
} else {
managers . forEach ( user - > {
user . getAsJsonObject ( ) . remove ( " coPersonId " ) ;
} ) ;
2021-09-08 18:33:33 +02:00
}
2021-03-04 15:45:06 +01:00
return Response . status ( HttpStatus . OK . value ( ) ) . entity ( jsonUtils . createResponse ( managers ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
} else {
return Response . status ( HttpStatus . NOT_FOUND . value ( ) ) . entity ( jsonUtils . createResponse ( " Role has not been found " ) . toString ( ) ) . type ( MediaType . APPLICATION_JSON ) . build ( ) ;
}
}
2020-08-04 18:18:08 +02:00
}