package com.constellio.app.api.admin.services; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import org.joda.time.LocalDateTime; import com.constellio.app.client.entities.GlobalGroupResource; import com.constellio.app.client.entities.GroupResource; import com.constellio.app.client.entities.UserResource; import com.constellio.model.entities.records.wrappers.Group; import com.constellio.model.entities.security.global.GlobalGroup; import com.constellio.model.entities.security.global.GlobalGroupStatus; import com.constellio.model.entities.security.global.UserCredential; import com.constellio.model.services.users.UserServices; @Path("users") @Consumes("application/xml") @Produces("application/xml") public class UserServicesAPI { @POST @Path("addUpdateUserCredential") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String addUpdateUserCredential(@Context HttpHeaders httpHeaders, UserResource userResource) { UserCredential userCredential = toCredential(userResource); userServices().addUpdateUserCredential(userCredential); return "OK"; } @POST @Path("addUpdateGlobalGroup") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String addUpdateGlobalGroup(GlobalGroupResource globalGroupResource) { GlobalGroup group = userServices().createGlobalGroup(globalGroupResource.getCode(), globalGroupResource.getName(), globalGroupResource.getUsersAutomaticallyAddedToCollections(), globalGroupResource.getParent(), globalGroupResource.getStatus(), globalGroupResource.isLocallyCreated()); userServices().addUpdateGlobalGroup(group); return "OK"; } @POST @Path("addUserToCollection") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String addUserToCollection(UserResource resource) { UserCredential userCredential = userServices().getUser(resource.getUsername()); userServices().addUserToCollection(userCredential, resource.getCollections().get(0)); return "OK"; } @POST @Path("generateServiceKeyForUser") @Consumes(MediaType.TEXT_PLAIN) @Produces(MediaType.TEXT_PLAIN) public String generateServiceKeyForUser(String username) { UserCredential userCredential = userServices().getUser(username); return userServices().giveNewServiceToken(userCredential); } @POST @Path("setGlobalGroupUsers") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String setGlobalGroupUsers(GlobalGroupResource resource) { List<UserCredential> userCredentials = new ArrayList<>(); for (String username : resource.getUsersAutomaticallyAddedToCollections()) { userCredentials.add(userServices().getUser(username)); } userServices().setGlobalGroupUsers(resource.getCode(), userCredentials); return "OK"; } @GET @Path("getGlobalGroupUsers") @Produces(MediaType.APPLICATION_JSON) public List<String> getGlobalGroupUsers(@QueryParam("groupCode") String groupCode) { List<String> globalGroupUsernames = new ArrayList<>(); for (UserCredential userCredential : userServices().getGlobalGroupActifUsers(groupCode)) { globalGroupUsernames.add(userCredential.getUsername()); } return globalGroupUsernames; } @GET @Path("getUser") @Produces(MediaType.APPLICATION_JSON) public UserResource getUser(@QueryParam("username") String username) { UserCredential userCredential = userServices().getUser(username); return toData(userCredential); } @GET @Path("getGlobalGroup") @Produces(MediaType.APPLICATION_JSON) public GlobalGroupResource getGlobalGroup(@QueryParam("groupCode") String groupCode) { GlobalGroup globalGroup = userServices().getGroup(groupCode); if (globalGroup.getStatus() == GlobalGroupStatus.INACTIVE) { throw new RuntimeException("Group is inactive"); } return toGlobalGroupResource(globalGroup); } @POST @Path("removeUserFromCollection") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String removeUserFromCollection(UserResource resource) { UserCredential userCredential = userServices().getUser(resource.getUsername()); userServices().removeUserFromCollection(userCredential, resource.getCollections().get(0)); return "OK"; } @POST @Path("removeGlobalGroup") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String removeGlobalGroup(@Context HttpHeaders httpHeaders, GlobalGroupResource resource) { GlobalGroup globalGroup = userServices().getGroup(resource.getCode()); String user = AdminServiceAuthenticator.getAuthenticatedUser(httpHeaders); UserCredential userCredential = AdminServicesUtils.modelServicesFactory().newUserServices().getUser(user); userServices().logicallyRemoveGroupHierarchy(userCredential, globalGroup); return "OK"; } @POST @Path("removeCollectionGroup") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String removeCollectionGroup(@Context HttpHeaders httpHeaders, GroupResource resource) { String user = AdminServiceAuthenticator.getAuthenticatedUser(httpHeaders); UserCredential userCredential = AdminServicesUtils.modelServicesFactory().newUserServices().getUser(user); userServices().removeGroupFromCollections(userCredential, resource.getCode(), Arrays.asList(resource.getCollection())); return "OK"; } @POST @Path("createCustomGroupInCollectionWithCodeAndName") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String createCustomGroupInCollectionWithCodeAndName(GroupResource resource) { userServices().createCustomGroupInCollectionWithCodeAndName(resource.getCollection(), resource.getCode(), resource.getName()); return "OK"; } @GET @Path("getCustomGroupsInCollections") @Produces(MediaType.APPLICATION_JSON) public List<String> getCustomGroupsInCollections(@QueryParam("collection") String collection) { List<String> groupCodes = new ArrayList<>(); for (Group group : userServices().getCollectionGroups(collection)) { groupCodes.add(group.getCode()); } return groupCodes; } @POST @Path("removeUserFromGlobalGroup") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String removeUserFromGlobalGroup(@Context HttpHeaders httpHeaders, UserResource resource) { String groupCode = resource.getGlobalGroups().get(0); String username = resource.getUsername(); userServices().removeUserFromGlobalGroup(username, groupCode); return "OK"; } private UserServices userServices() { return AdminServicesUtils.modelServicesFactory().newUserServices(); } private UserCredential toCredential(UserResource userResource) { Map<String, LocalDateTime> tokens = new HashMap<>(); for (Entry<String, String> token : userResource.getTokens().entrySet()) { tokens.put(token.getKey(), LocalDateTime.parse(token.getValue())); } return userServices().createUserCredential( userResource.getUsername(), userResource.getFirstName(), userResource.getLastName(), userResource.getEmail(), userResource.getServiceKey(), userResource.isSystemAdmin(), userResource.getGlobalGroups(), userResource.getCollections(), tokens, userResource.getStatus(), userResource.getDomain(), Arrays.asList(""), null); } private UserResource toData(UserCredential userCredential) { UserResource userResource = new UserResource(); userResource.setUsername(userCredential.getUsername()); userResource.setFirstName(userCredential.getFirstName()); userResource.setLastName(userCredential.getLastName()); userResource.setEmail(userCredential.getEmail()); userResource.setGlobalGroups(userCredential.getGlobalGroups()); userResource.setCollections(userCredential.getCollections()); userResource.setServiceKey(userCredential.getServiceKey()); userResource.setSystemAdmin(userCredential.isSystemAdmin()); Map<String, String> tokens = new HashMap<String, String>(); for (Entry<String, LocalDateTime> token : userCredential.getAccessTokens().entrySet()) { tokens.put(token.getKey(), token.getValue().toString()); } userResource.setTokens(tokens); return userResource; } private GlobalGroupResource toGlobalGroupResource(GlobalGroup group) { GlobalGroupResource resource = new GlobalGroupResource(); resource.setCode(group.getCode()); resource.setName(group.getName()); resource.setUsersAutomaticallyAddedToCollections(group.getUsersAutomaticallyAddedToCollections()); return resource; } }