diff --git a/gemeinsamforschen/README.md b/gemeinsamforschen/README.md index 284556cdb9189584d471f938099cc7a57e3cbf28..8489d771e9d9a268d13930323750b5571cd75118 100644 --- a/gemeinsamforschen/README.md +++ b/gemeinsamforschen/README.md @@ -11,4 +11,18 @@ Go to `Administration -> Allgemeines -> REST API -> Enable Personal Access Token ### Manual Personal Access Token 1. Click on your profile picture -> `Mein Konto` -> `Personal Access Token` 1. add a new personal access token -1. add it to configuration class `GFRocketChatConfig` \ No newline at end of file +1. add it to configuration class `GFRocketChatConfig` + +### Enable iframe integration +Dont mix up with General/Allegemeines->IFRAME INTEGRATION + +Accounts/Konten->IFRAME: + +1. click on enable + +1. FOR API URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/sso +localhost:8080/gemeinsamforschen/rest/chat/sso + +1. FOR IFRAME URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/login +localhost:8080/gemeinsamforschen/rest/chat/login + diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml index 5b2bd52a6a6a796f086ffb07f3dfdb57a86ebab2..16571efab215f165250dd42fc56e9d39530b4517 100644 --- a/gemeinsamforschen/pom.xml +++ b/gemeinsamforschen/pom.xml @@ -69,6 +69,13 @@ <version>5.1.6</version> </dependency> + <!-- converting html to java pojo --> + <!-- <dependency> + <groupId>fr.whimtrip</groupId> + <artifactId>whimtrip-ext-htmltopojo</artifactId> + <version>1.0.2</version> + </dependency>--> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java index c0093db06fbecd872a7933ec2be34e3af03fd7aa..8fd0ea098cf755ec609feaa4f76069bf4f8bcddd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java @@ -1,17 +1,26 @@ package unipotsdam.gf.config; +import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.user.User; +/** + * ROCKET CHAT NEEDS TO KNOW THE ENDPOINT FOR THE SSO CONFIGURE LIKE IN README + * + * 1. FOR API URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/sso + * localhost:8080/gemeinsamforschen/rest/chat/sso + * + * 1. FOR IFRAME URL: http://141.89.53.195:8080/gemeinsamforschen/rest/chat/login + * localhost:8080/gemeinsamforschen/rest/chat/login + */ public class GFRocketChatConfig { //private static final String ROCKET_CHAT_LINK = "http://rocketchat.westeurope.cloudapp.azure.com/"; + // public static final String ROCKET_CHAT_LINK_0 = "https://rocket.farm-test.rz.uni-potsdam.de"; + // public static final String ROCKET_CHAT_LINK = "https://rocket.farm-test.rz.uni-potsdam.de/"; - public static final String ROCKET_CHAT_LINK_0 = "https://rocket.farm-test.rz.uni-potsdam.de"; - public static final String ROCKET_CHAT_LINK = "https://rocket.farm-test.rz.uni-potsdam.de/"; - - // or https://rocket.farm.uni-potsdam.de/ - // https://rocket.farm-test.rz.uni-potsdam.de/home + public static final String ROCKET_CHAT_LINK_0 = "http://fleckenroller.cs.uni-potsdam.de:3000"; + public static final String ROCKET_CHAT_LINK = "http://fleckenroller.cs.uni-potsdam.de:3000/"; /** * username: fltrailadmin pw: GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F @@ -21,14 +30,14 @@ public class GFRocketChatConfig { public static final String ROCKET_CHAT_API_LINK = ROCKET_CHAT_LINK + "api/v1/"; - public static final User TEST_USER = new User("student1", "egal", + public static final RocketChatUser TEST_USER = new RocketChatUser("student1", "egal", "student1@yolo.com", "student1", "", "", "6ofqfp8J9ynfvspBJ", false); /* public static final User ADMIN_USER = new User("admin nachname", "passwort", "email", "rocketChatUsername", "rocketChatAuthToken", "rocketChatPersonalAccessToken", "rocketChatUserId", false);*/ - public static final User ADMIN_USER = new User("fltrailadmin", "GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F", + public static final RocketChatUser ADMIN_USER = new RocketChatUser("fltrailadmin", "GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F", "julian.dehne@uni-potsdam.de", "rocketChatUsername", "rocketChatAuthToken", "rocketChatPersonalAccessToken", "SuFbpF3P9aYEo634W", false); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/MysqlDownException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/MysqlDownException.java new file mode 100644 index 0000000000000000000000000000000000000000..647f39f6954cdad03233c8af372089ad7816d65a --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/MysqlDownException.java @@ -0,0 +1,4 @@ +package unipotsdam.gf.exceptions; + +public class MysqlDownException { +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/RocketChatDownException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/RocketChatDownException.java new file mode 100644 index 0000000000000000000000000000000000000000..6b9bdb421f2ff7fa7ba214ebe78c6b7aff1c7398 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/RocketChatDownException.java @@ -0,0 +1,4 @@ +package unipotsdam.gf.exceptions; + +public class RocketChatDownException extends Exception { +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInMysqlException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInMysqlException.java new file mode 100644 index 0000000000000000000000000000000000000000..5231c47a4ce7f4b3764a223a3730964dabc75e5e --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInMysqlException.java @@ -0,0 +1,4 @@ +package unipotsdam.gf.exceptions; + +public class UserDoesNotExistInMysqlException extends Exception { +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInRocketChatException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInRocketChatException.java new file mode 100644 index 0000000000000000000000000000000000000000..a877a7f2ec4b0c6fed06392bcc6c40a53cab4372 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserDoesNotExistInRocketChatException.java @@ -0,0 +1,4 @@ +package unipotsdam.gf.exceptions; + +public class UserDoesNotExistInRocketChatException extends Exception { +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInMysqlException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInMysqlException.java new file mode 100644 index 0000000000000000000000000000000000000000..f9982f918896a8397294fdbf7bc18ad8b8fb0f1d --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInMysqlException.java @@ -0,0 +1,9 @@ +package unipotsdam.gf.exceptions; + +public class UserExistsInMysqlException extends Exception { + + @Override + public String getMessage() { + return "Tried to create User but exists in mysql"; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInRocketChatException.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInRocketChatException.java new file mode 100644 index 0000000000000000000000000000000000000000..8160dadf6cc03059fe1bb5d20ff447902a613b65 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/exceptions/UserExistsInRocketChatException.java @@ -0,0 +1,8 @@ +package unipotsdam.gf.exceptions; + +public class UserExistsInRocketChatException extends Exception { + @Override + public String getMessage() { + return "Tried to create User but exists in RocketChat"; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java index b5c9b6e75fd1b6d22eeef3c389101979c8402dba..2215e62abcbda96922e33b0ff9cab8cd3c962690 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java @@ -1,8 +1,12 @@ package unipotsdam.gf.interfaces; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.exceptions.UserExistsInRocketChatException; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; import unipotsdam.gf.modules.communication.model.EMailMessage; +import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.communication.model.chat.ChatMessage; import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.project.Project; @@ -37,7 +41,8 @@ public interface ICommunication { * @param name chat room name * @return chat room id */ - String createChatRoom(String name, boolean readOnly, List<User> users); + String createChatRoom(String name, boolean readOnly, List<User> users) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** * creates chatRoom with name "group.projectId - group.id" and set chatRoomId for group @@ -45,11 +50,17 @@ public interface ICommunication { * @param group Object for information * @return true if chatRoom was created, otherwise false */ - boolean createChatRoom(Group group, boolean readOnly); + boolean createChatRoom(Group group, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; - String createEmptyChatRoom(String name, boolean readOnly); + String createEmptyChatRoom(String name, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; - boolean deleteChatRoom(String roomId); + void deleteChatRoom(Group group) throws RocketChatDownException, UserDoesNotExistInRocketChatException; + + void deleteChatRoom(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException; + + boolean deleteChatRoom(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/invite/ @@ -58,9 +69,11 @@ public interface ICommunication { * @param user information about user * @return if user was added successfully */ - boolean addUserToChatRoom(User user, String roomId); + boolean addUserToChatRoom(User user, String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; - boolean removeUserFromChatRoom(User user, String roomId); + boolean removeUserFromChatRoom(User user, String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/settopic/ @@ -80,9 +93,9 @@ public interface ICommunication { * @param roomId chat room id * @return chat room information */ - String getChatRoomName(String roomId); + String getChatRoomName(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException; - boolean exists(String roomId); + boolean exists(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** * api: https://rocket.chat/docs/developer-guides/rest-api/authentication/login/ @@ -90,7 +103,8 @@ public interface ICommunication { * @param user username and password * @return information about user, especially authtoken for later use of endpoints */ - User loginUser(User user); + RocketChatUser loginUser(User user) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** * api 1: https://rocket.chat/docs/developer-guides/rest-api/users/register/ @@ -102,9 +116,11 @@ public interface ICommunication { * @param user registers user to rocket.chat * @return user id */ - boolean registerUser(User user); + boolean registerUser(User user) + throws RocketChatDownException, UserExistsInRocketChatException; - String getChatRoomLink(String userToken, String projectId); + String getChatRoomLink(String userToken, String projectId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; String getProjectChatRoomLink(String projectName); @@ -115,4 +131,6 @@ public interface ICommunication { boolean informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project); boolean sendMessageToUsers(Project project, EMailMessage eMailMessage); + + public void delete(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java index 2b1ee6f6aa1590c5d597afafcd4b1b258fdf8474..4708281160f29938c3ff4c1ee19052d21b0f0dcf 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java @@ -7,6 +7,7 @@ import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.group.GroupfindingCriteria; import java.util.ArrayList; +import java.util.List; public interface IGroupFinding { @@ -45,4 +46,6 @@ public interface IGroupFinding { ArrayList<String> getStudentsInSameGroup(StudentIdentifier student); int getMinNumberOfStudentsNeeded(Project project); + + List<Group> createRandomGroups(Project project); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/LoginToken.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/LoginToken.java new file mode 100644 index 0000000000000000000000000000000000000000..67b37b22728e42f4cce4fdb67a3c412e1f2f6933 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/LoginToken.java @@ -0,0 +1,21 @@ +package unipotsdam.gf.modules.communication.model; + +public class LoginToken { + private String loginToken; + + + public LoginToken(String loginToken) { + this.loginToken = loginToken; + } + + public LoginToken( ) { + } + + public String getLoginToken() { + return loginToken; + } + + public void setLoginToken(String loginToken) { + this.loginToken = loginToken; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/RocketChatUser.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/RocketChatUser.java new file mode 100644 index 0000000000000000000000000000000000000000..131f285cc8ceb00e2338eaca9207499f78cf1991 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/RocketChatUser.java @@ -0,0 +1,50 @@ +package unipotsdam.gf.modules.communication.model; + +import unipotsdam.gf.modules.user.User; + +public class RocketChatUser extends User { + private String rocketChatAuthToken; + // not in this version + private String rocketChatPersonalAccessToken; + // the actual id that oculd be used instead of the email with the queries + private String rocketChatUserId; + + public RocketChatUser(String name, String password, String email, String rocketChatUsername, + String rocketChatAuthToken, String rocketChatPersonalAccessToken, String rocketChatUserId, + Boolean isStudent) { + super(name, password,email,rocketChatUsername, isStudent); + this.rocketChatAuthToken = rocketChatAuthToken; + this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken; + this.rocketChatUserId = rocketChatUserId; + + } + + public RocketChatUser() { + + } + + + public String getRocketChatUserId() { + return rocketChatUserId; + } + + public void setRocketChatUserId(String rocketChatUserId) { + this.rocketChatUserId = rocketChatUserId; + } + + public String getRocketChatAuthToken() { + return rocketChatAuthToken; + } + + public void setRocketChatAuthToken(String rocketChatAuthToken) { + this.rocketChatAuthToken = rocketChatAuthToken; + } + + public String getRocketChatPersonalAccessToken() { + return rocketChatPersonalAccessToken; + } + + public void setRocketChatPersonalAccessToken(String rocketChatPersonalAccessToken) { + this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatSuccessResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatSuccessResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..8fa718f0eb8cbc88b8d18141618dd217a43e763c --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatSuccessResponse.java @@ -0,0 +1,19 @@ +package unipotsdam.gf.modules.communication.model.rocketChat; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class RocketChatSuccessResponse { + private String success; + + public RocketChatSuccessResponse() { + } + + public String getSuccess() { + return success; + } + + public void setSuccess(String success) { + this.success = success; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java index d9f6579d7bcb1db66785e629520beac0d21fd71b..2b8f949a142ecae91c0d0a03a05f39a9cea2e52a 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java @@ -7,12 +7,17 @@ import org.apache.logging.log4j.util.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import unipotsdam.gf.config.GFRocketChatConfig; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.exceptions.UserExistsInRocketChatException; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; import unipotsdam.gf.modules.communication.model.EMailMessage; +import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.communication.model.chat.ChatMessage; import unipotsdam.gf.modules.communication.model.rocketChat.RocketChatLoginResponse; import unipotsdam.gf.modules.communication.model.rocketChat.RocketChatRegisterResponse; +import unipotsdam.gf.modules.communication.model.rocketChat.RocketChatSuccessResponse; import unipotsdam.gf.modules.communication.util.RocketChatHeaderMapBuilder; import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.group.GroupDAO; @@ -69,7 +74,7 @@ public class CommunicationService implements ICommunication { } - private static Boolean isUpdated; +/* private static Boolean isUpdated; private static synchronized Boolean setAdminToken() { if (isUpdated == null) { @@ -87,7 +92,7 @@ public class CommunicationService implements ICommunication { isUpdated = false; } return null; - } + }*/ @Override public List<ChatMessage> getChatHistory(String roomId) { @@ -102,15 +107,17 @@ public class CommunicationService implements ICommunication { } @Override - public String createEmptyChatRoom(String name, boolean readOnly) { + public String createEmptyChatRoom(String name, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { return createChatRoom(name, readOnly, new ArrayList<>()); } @Override - public String createChatRoom(String name, boolean readOnly, List<User> member) { - loginUser(ADMIN_USER); + public String createChatRoom(String name, boolean readOnly, List<User> member) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); - Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build(); + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); List<String> usernameList = member.stream().map(User::getRocketChatUsername).collect(Collectors.toList()); HashMap<String, Object> bodyMap = new HashMap<>(); @@ -141,11 +148,12 @@ public class CommunicationService implements ICommunication { } @Override - public boolean createChatRoom(Group group, boolean readOnly) { - loginUser(ADMIN_USER); + public boolean createChatRoom(Group group, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); // chatRoom name: projectId - GroupId - String chatRoomName = String.join("-", group.getProjectName(), String.valueOf(group.getId())); + String chatRoomName = getChatRoomName(group); if (exists(chatRoomName)) { return true; } @@ -159,11 +167,25 @@ public class CommunicationService implements ICommunication { } @Override - public boolean deleteChatRoom(String roomId) { + public void deleteChatRoom(Group group) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + deleteChatRoom(getChatRoomName(group)); + } + + @Override + public void deleteChatRoom(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + deleteChatRoom(project.getName()); + } + + private String getChatRoomName(Group group) { + return String.join("-", group.getProjectName(), String.valueOf(group.getId())); + } + + @Override + public boolean deleteChatRoom(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException { // TODO: maybe add lock for getChatRoomName, so synchronized access doesn't create errors while deleting - loginUser(ADMIN_USER); + //loginUser(ADMIN_USER); - Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build(); + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); HashMap<String, String> bodyMap = new HashMap<>(); bodyMap.put("roomId", roomId); @@ -184,25 +206,29 @@ public class CommunicationService implements ICommunication { } @Override - public boolean addUserToChatRoom(User user, String roomId) { + public boolean addUserToChatRoom(User user, String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { return modifyChatRoom(user, roomId, true); } @Override - public boolean removeUserFromChatRoom(User user, String roomId) { + public boolean removeUserFromChatRoom(User user, String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { return modifyChatRoom(user, roomId, false); } - private boolean modifyChatRoom(User user, String roomId, boolean addUser) { - loginUser(ADMIN_USER); + private boolean modifyChatRoom(User user, String roomId, boolean addUser) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); + RocketChatUser student = loginUser(user); - if (hasEmptyParameter(user.getRocketChatUserId(), roomId)) { + if (hasEmptyParameter(user.getRocketChatUsername(), roomId)) { return false; } - Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build(); + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); Map<String, String> bodyMap = new HashMap<>(); bodyMap.put("roomId", roomId); - bodyMap.put("userId", user.getRocketChatUserId()); + bodyMap.put("userId", student.getRocketChatUserId()); String groupUrl = addUser ? "groups.invite" : "groups.kick"; @@ -225,11 +251,11 @@ public class CommunicationService implements ICommunication { } @Override - public String getChatRoomName(String roomId) { + public String getChatRoomName(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException { - loginUser(ADMIN_USER); + //loginUser(ADMIN_USER); - Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth().build(); + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); HttpResponse<Map> response = unirestService.get(ROCKET_CHAT_API_LINK + "groups.info").headers(headerMap) .queryString("roomId", roomId).asObject(Map.class); @@ -248,7 +274,7 @@ public class CommunicationService implements ICommunication { } @Override - public User loginUser(User user) { + public RocketChatUser loginUser(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException { if (hasEmptyParameter(user.getEmail(), user.getPassword())) { return null; @@ -258,36 +284,43 @@ public class CommunicationService implements ICommunication { HashMap<String, String> rocketChatAuth = new HashMap<>(); rocketChatAuth.put("user", user.getEmail()); rocketChatAuth.put("password", user.getPassword()); -/* + HttpResponse<RocketChatLoginResponse> response = unirestService.post(ROCKET_CHAT_API_LINK + "login").body(rocketChatAuth) .asObject(RocketChatLoginResponse.class); if (isBadRequest(response)) { - return null; + throw new UserDoesNotExistInRocketChatException(); } else { - if (ADMIN_USER.equals(user)) { + /*if (ADMIN_USER.equals(user)) { setAdminToken(); - } + }*/ } RocketChatLoginResponse rocketChatLoginResponse = response.getBody(); - user.setRocketChatUserId(rocketChatLoginResponse.getUserId()); - user.setRocketChatAuthToken(rocketChatLoginResponse.getAuthToken()); -*/ - return user; + + RocketChatUser rocketChatUser = new RocketChatUser(); + rocketChatUser.setEmail(user.getEmail()); + rocketChatUser.setPassword(user.getPassword()); + rocketChatUser.setRocketChatUserId(rocketChatLoginResponse.getUserId()); + rocketChatUser.setRocketChatAuthToken(rocketChatLoginResponse.getAuthToken()); + + return rocketChatUser; } @Override - public boolean registerUser(User user) { + public boolean registerUser(User user) throws RocketChatDownException, UserExistsInRocketChatException { if (hasEmptyParameter(user.getEmail(), user.getName(), user.getPassword())) { return false; } HashMap<String, String> rocketChatRegister = new HashMap<>(); - String rocketChatUsername = createRocketChatUsername(user); - rocketChatRegister.put("username", rocketChatUsername); + if (user.getRocketChatUsername() == null) { + String rocketChatUsername = createRocketChatUsername(user); + user.setRocketChatUsername(rocketChatUsername); + } + rocketChatRegister.put("username", user.getRocketChatUsername()); rocketChatRegister.put("email", user.getEmail()); rocketChatRegister.put("pass", user.getPassword()); rocketChatRegister.put("name", user.getName()); @@ -296,19 +329,20 @@ public class CommunicationService implements ICommunication { unirestService.post(ROCKET_CHAT_API_LINK + "users.register").body(rocketChatRegister) .asObject(RocketChatRegisterResponse.class); - if (isBadRequest(response)) { - return false; + Boolean badRequest = isBadRequest(response); + if (badRequest) { + throw new UserExistsInRocketChatException(); } RocketChatRegisterResponse registerResponse = response.getBody(); + + // not sure we need this test if (!registerResponse.isSuccessful()) { return false; } - user.setRocketChatUsername(rocketChatUsername); - user.setRocketChatUserId(registerResponse.getUserId()); - - + // updateRocketChatUserName user with rocket chat data + userDAO.updateRocketChatUserName(user); /** * TODO with higher rocket chat version a personal access tokens exist and this function can be used */ @@ -316,9 +350,10 @@ public class CommunicationService implements ICommunication { return true; } - public String getChatRoomLink(String userEmail, String projectName) { + public String getChatRoomLink(String userEmail, String projectName) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { - loginUser(ADMIN_USER); + //loginUser(ADMIN_USER); String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), new Project(projectName)); if (chatRoomId.isEmpty()) { @@ -338,6 +373,7 @@ public class CommunicationService implements ICommunication { return ROCKET_CHAT_ROOM_LINK + projectName + "?layout=embedded"; } + // TODO: Think about splitting email and chat communication into different @Override public boolean sendSingleMessage(EMailMessage eMailMessage, User user) { @@ -445,18 +481,57 @@ public class CommunicationService implements ICommunication { user.setRocketChatPersonalAccessToken(responseBody.get("token").toString()); return true; }*/ - private boolean isBadRequest(HttpResponse response) { + private Boolean isBadRequest(HttpResponse response) throws RocketChatDownException { int status = response.getStatus(); + if (Response.Status.OK.getStatusCode() == status) { + return false; + } if (Response.Status.UNAUTHORIZED.getStatusCode() == status) { - unsetAdminToken(); + //unsetAdminToken(); + return true; + } + if (Response.Status.NOT_FOUND.getStatusCode() == status) { + //unsetAdminToken(); + throw new RocketChatDownException(); + } else { + return true; } - return status == Response.Status.BAD_REQUEST.getStatusCode() || status == Response.Status.UNAUTHORIZED - .getStatusCode(); } @Override - public boolean exists(String roomId) { + public boolean exists(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException { return !getChatRoomName(roomId).isEmpty(); } + + public void delete(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); + // we need the rocketchatid + if (!(user instanceof RocketChatUser)) { + // we need the password to delete the user + if (user.getPassword() == null) { + user = userDAO.getUserByEmail(user.getEmail()); + } + // fetchign the rocketchat id + try { + RocketChatUser rocketLeagueUser = loginUser(user); + // the actual delete + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); + Map<String, String> bodyMap = new HashMap<>(); + bodyMap.put("userId", rocketLeagueUser.getRocketChatUserId()); + + HttpResponse<RocketChatSuccessResponse> response = + unirestService.post(ROCKET_CHAT_API_LINK + "users.delete").headers(headerMap).body(bodyMap).asObject(RocketChatSuccessResponse.class); + + Boolean badRequest = isBadRequest(response); + if (badRequest) { + //throw new UserDoesNotExistInRocketChatException(); + } + } catch (UserDoesNotExistInRocketChatException e) { + // wenn der Nutzer nicht existiert, brauchen wir ihn auch nicht löschen + } + } + + + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java index 449c533b39bcddf45737e8a164d247fc79377eab..8def9d716f836665c67762a09823c73d137b9044 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java @@ -1,5 +1,10 @@ package unipotsdam.gf.modules.communication.util; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.modules.communication.model.RocketChatUser; +import unipotsdam.gf.modules.communication.service.CommunicationService; + import java.util.HashMap; import java.util.Map; @@ -23,10 +28,14 @@ public class RocketChatHeaderMapBuilder { return this; } - public RocketChatHeaderMapBuilder withRocketChatAdminAuth() { + public RocketChatHeaderMapBuilder withRocketChatAdminAuth(CommunicationService communicationService) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { // with new version of rocketChat: RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(ADMIN_USER.getRocketChatPersonalAccessToken()); - RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(ADMIN_USER.getRocketChatAuthToken()); - return rocketChatHeaderMapBuilder.withRocketChatUserId(ADMIN_USER.getRocketChatUserId()); + + RocketChatUser admin = communicationService.loginUser(ADMIN_USER); + + RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(admin.getRocketChatAuthToken()); + return rocketChatHeaderMapBuilder.withRocketChatUserId(admin.getRocketChatUserId()); } public Map<String, String> build() { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java index d1178369f086dab8ef56177949db28aad8dc9c62..d1e34cb5a31875c9770d44247aa88bcaeadee665 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java @@ -2,11 +2,18 @@ package unipotsdam.gf.modules.communication.view; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import unipotsdam.gf.config.GFRocketChatConfig; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.modules.communication.model.LoginToken; +import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.interfaces.ICommunication; +import unipotsdam.gf.session.GFContexts; import javax.annotation.ManagedBean; import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -14,6 +21,7 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; @@ -32,7 +40,8 @@ public class CommunicationView { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/info/{roomId}") - public Response getChatRoomInformation(@PathParam("roomId") String roomId) { + public Response getChatRoomInformation(@PathParam("roomId") String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { String chatRoomName = communicationService.getChatRoomName(roomId); if (chatRoomName.isEmpty()) { log.error("chatRoom not found for roomId: {}", roomId); @@ -46,7 +55,8 @@ public class CommunicationView { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("/addUser/{roomId}") - public Response addUserToChatRoom(@PathParam("roomId") String roomId, User user) { + public Response addUserToChatRoom(@PathParam("roomId") String roomId, User user) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { if (isNull(user)) { log.trace("addUser user object was null"); return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build(); @@ -62,7 +72,9 @@ public class CommunicationView { response = Response.ok(wasAdded).build(); } else { log.error("error while adding user to chat room"); - response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom").build(); + response = + Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom") + .build(); } return response; } @@ -72,7 +84,8 @@ public class CommunicationView { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("/removeUser/{roomId}") - public Response removeUserFromChatRoom(User user, @PathParam("roomId") String roomId) { + public Response removeUserFromChatRoom(User user, @PathParam("roomId") String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { if (isNull(user)) { log.trace("removeUser user object was null"); return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build(); @@ -88,7 +101,9 @@ public class CommunicationView { response = Response.ok(wasRemoved).build(); } else { log.error("error while adding user to chat room"); - response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom").build(); + response = + Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom") + .build(); } return response; } @@ -97,7 +112,9 @@ public class CommunicationView { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("/room/create/{name}") - public Response createChatRoom(@PathParam("name") String name, List<User> users, @QueryParam("readOnly") boolean readOnly) { + public Response createChatRoom( + @PathParam("name") String name, List<User> users, @QueryParam("readOnly") boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { if (isNull(name)) { return Response.status(Response.Status.BAD_REQUEST).entity("must provide name as queryParam").build(); } @@ -109,4 +126,31 @@ public class CommunicationView { log.trace("response for createChatRoom: {}", chatId); return Response.status(Response.Status.CREATED).entity(chatId).build(); } + + @POST + @Produces(MediaType.APPLICATION_JSON) + @Path("/sso") + public LoginToken provideLoginToken(@Context HttpServletRequest req, Object payload) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + if (req.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN) != null) { + String token = getAuthToken(req); + return new LoginToken(token); + } else { + RocketChatUser user = communicationService.loginUser(GFRocketChatConfig.ADMIN_USER); + return new LoginToken(user.getRocketChatAuthToken()); + } + } + + private String getAuthToken(@Context HttpServletRequest req) { + return req.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN).toString(); + } + + @GET + @Produces(MediaType.TEXT_HTML) + @Path("/login") + public String provideLoginHTML(@Context HttpServletRequest req) { + String rocketChatIntegration = "<script> window.parent.postMessage({event: 'login-with-token',loginToken:" + + " '"+getAuthToken(req)+"'}, '"+GFRocketChatConfig.ROCKET_CHAT_LINK_0 +"');</script>"; + return rocketChatIntegration; + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java index 0453ce6b9c817164a797f6b4f1834173a4e0f582..f7b551f5fa017eed2ec82e5036251313d9cdb619 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java @@ -11,6 +11,7 @@ public class Group { private List<User> members; private String projectName; private String chatRoomId; + private String name; public Group() { members = new ArrayList<>(); @@ -68,8 +69,6 @@ public class Group { members.add(user); } - - public int getId() { return id; } @@ -88,4 +87,12 @@ public class Group { public int hashCode() { return getId(); } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java index ebe009fa95ae7578f60b494a3b9815293027ce64..e6ae168f67c0e0bf262b3e39cfaaf57b2d621a44 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java @@ -176,10 +176,17 @@ public class GroupDAO { public void clearChatRoomIdOfGroup(String chatRoomId) { connect.connect(); - String mysqlRequest = "update groups SET chatRoomId = ? where chatRoomId = ?"; + String mysqlRequest = "updateRocketChatUserName groups SET chatRoomId = ? where chatRoomId = ?"; connect.issueUpdateStatement(mysqlRequest, "", chatRoomId); connect.close(); } + + public void deleteGroups(Project project) { + String query = "DELETE from groups where projectName = ?"; + connect.connect(); + connect.issueInsertOrDeleteStatement(query, project.getName()); + connect.close(); + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupData.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupData.java new file mode 100644 index 0000000000000000000000000000000000000000..cc78582ee0ab378776f969384f5179a0c2ed9ba4 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupData.java @@ -0,0 +1,23 @@ +package unipotsdam.gf.modules.group; + +import java.util.ArrayList; +import java.util.List; + +public class GroupData { + List<Group> groups; + + public GroupData() { + } + + public GroupData(List<Group> groups) { + this.groups = groups; + } + + public List<Group> getGroups() { + return groups; + } + + public void setGroups(ArrayList<Group> groups) { + this.groups = groups; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java index 359a4f442263aba16aa86d3f83c4ae2642019aee..e064017dcf01ba82585f1a8f814766f911bfcea0 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java @@ -27,10 +27,20 @@ public class GroupView { private Management iManagement; @Inject - ProjectDAO projectDAO; + private ProjectDAO projectDAO; @Inject - GroupFormationProcess groupFormationProcess; + private GroupFormationProcess groupFormationProcess; + + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/all/projects/{projectName}") + public GroupData getOrInitializeGroups(@PathParam("projectName") String projectName) { + GroupData data = groupFormationProcess.getOrInitializeGroups(new Project(projectName)); + return data; + } + @GET @Produces(MediaType.APPLICATION_JSON) @@ -83,7 +93,6 @@ public class GroupView { throw new WebApplicationException( "the groupfindingmechanism needs to be one of " + GroupFormationMechanism.values().toString()); } - } @@ -97,6 +106,12 @@ public class GroupView { + /** + * find out if this is used by learning goal + * @param projectName + * @param groups + */ + @Deprecated @POST @Consumes(MediaType.APPLICATION_JSON) @Path("/projects/{projectName}") @@ -107,4 +122,21 @@ public class GroupView { groupfinding.persistGroups(Arrays.asList(groups), project); } + @PUT + @Consumes(MediaType.APPLICATION_JSON) + @Path("/projects/{projectName}/groups") + public void persistGroups(@PathParam("projectName") String projectName, GroupData data) { + Project project = new Project(projectName); + + groupfinding.persistGroups(data.getGroups(), project); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/projects/{projectName}/groups/finalize") + public void finalizeGroups(@PathParam("projectName") String projectName) { + Project project = new Project(projectName); + groupFormationProcess.finalize(project); + } + } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java index 24374f5e7c960d49199a6e0369b64294ff3adfd1..04ea415eaa08f0cd170b35d8515acc37d400166f 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java @@ -3,9 +3,12 @@ package unipotsdam.gf.modules.group; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.interfaces.IGroupFinding; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; +import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.modules.user.UserDAO; import javax.inject.Inject; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class GroupfindingImpl implements IGroupFinding { @@ -13,6 +16,9 @@ public class GroupfindingImpl implements IGroupFinding { @Inject private GroupDAO groupDAO; + @Inject + private UserDAO userDAO; + @Inject public GroupfindingImpl(GroupDAO groupDAO) { this.groupDAO = groupDAO; @@ -60,4 +66,57 @@ public class GroupfindingImpl implements IGroupFinding { return participantsNeeded; } + + @Override + public List<Group> createRandomGroups(Project project) { + ArrayList<Group> result = new ArrayList<>(); + groupDAO.deleteGroups(project); + List<User> usersByProjectName = userDAO.getUsersByProjectName(project.getName()); + int numberOfUsers = usersByProjectName.size(); + if (usersByProjectName.size()<6){ + Group group = new Group(); + group.getMembers().addAll(usersByProjectName); + result.add(group); + } else { + int numberOf3Groups = getNumberOf3Groups(numberOfUsers); + //int numberOf4Groups = getNumberOf4Groups(numberOfUsers); + + Group group = new Group(); + int i = 1; + group.setName(i + ""); + for (User user : usersByProjectName) { + if (numberOf3Groups > 0) { + numberOf3Groups--; + // TODO insert formula here for the correct groups + if (group.getMembers().size() == 3) { + result.add(group); + group = new Group(); + i++; + group.setName(i + ""); + } + } else { + if (group.getMembers().size() == 4) { + result.add(group); + group = new Group(); + i++; + group.setName(i + ""); + } + } + group.addMember(user); + // set group name 1 more + } + result.add(group); + } + return result; + } + // (number % 3) + (Math.floor(number/3)-(number%3)) = n für alle Zahlen größer als 5 + public int getNumberOf4Groups(Integer number) { + return (number % 3); + } + + + // every number can be divided in factors 4 and 3 as long it is greater then 5 + public int getNumberOf3Groups(Integer number) { + return (number / 3) - (number % 3); + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupfinding/service/GroupDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupfinding/service/GroupDAO.java deleted file mode 100644 index ad14b1f6d9f4323985b643677521d98c455dc101..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupfinding/service/GroupDAO.java +++ /dev/null @@ -1,150 +0,0 @@ -/* -package unipotsdam.gf.modules.groupfinding.service; - -import org.apache.logging.log4j.util.Strings; -import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; -import unipotsdam.gf.modules.group.Group; -import unipotsdam.gf.mysql.MysqlConnect; -import unipotsdam.gf.mysql.VereinfachtesResultSet; -import unipotsdam.gf.util.ResultSetUtil; - -import javax.annotation.ManagedBean; -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.*; - -@ManagedBean -@Resource -@Singleton -public class GroupDAO { - - private MysqlConnect connect; - - @Inject - public GroupDAO(MysqlConnect connect) { - this.connect = connect; - } - - public ArrayList<String> getStudentsInSameGroupAs(StudentIdentifier student) { - connect.connect(); - ArrayList<String> result = new ArrayList<>(); - Integer groupId; - String mysqlRequest1 = "SELECT groupId FROM `groupuser` WHERE `projectId`=? AND `studentId`=?"; - VereinfachtesResultSet vereinfachtesResultSet1 = - connect.issueSelectStatement(mysqlRequest1, student.getProjectName(), student.getUserEmail()); - vereinfachtesResultSet1.next(); - groupId = vereinfachtesResultSet1.getInt("groupId"); - String mysqlRequest2 = "SELECT * FROM `groupuser` WHERE `groupId`=?"; - VereinfachtesResultSet vereinfachtesResultSet2 = - connect.issueSelectStatement(mysqlRequest2, groupId); - boolean next2 = vereinfachtesResultSet2.next(); - while (next2) { - String peer = vereinfachtesResultSet2.getString("studentId"); - if (!peer.equals(student.getUserEmail())) - result.add(peer); - next2 = vereinfachtesResultSet2.next(); - } - connect.close(); - return result; - } - - public void persist(Group group) { - connect.connect(); - List<Group> existingGroups = getExistingEntriesOfGroups(group.get()); - if (Objects.isNull(group.getChatRoomId())) { - group.setChatRoomId(""); - } - String mysqlRequestGroup = "INSERT INTO groups (`projectId`,`chatRoomId`) values (?,?)"; - connect.issueInsertOrDeleteStatement(mysqlRequestGroup, group.getProjectId(), group.getChatRoomId()); - - List<Group> existingGroupsWithNewEntry = getExistingEntriesOfGroups(group.getProjectId()); - existingGroupsWithNewEntry.removeAll(existingGroups); - group.setId(existingGroupsWithNewEntry.get(0).getId()); - for (User groupMember : group.getMembers()) { - String mysqlRequest2 = "INSERT INTO groupuser (`studentId`, `projectId`, `groupId`) values (?,?,?)"; - connect.issueInsertOrDeleteStatement(mysqlRequest2, groupMember.getEmail(), group.getProjectId(), group.getId()); - } - connect.close(); - - } - - public void update(Group group) { - connect.connect(); - String mysqlRequest = "UPDATE groups SET projectId = ?, chatRoomId = ? where id = ?"; - connect.issueUpdateStatement(mysqlRequest, group.getProjectId(), group.getChatRoomId(), group.getId()); - connect.close(); - // TODO: implement update of groupuser if needed later (if member list need to be updated) - } - - public void clearChatRoomIdOfGroup(String chatRoomId) { - connect.connect(); - String mysqlRequest = "update groups SET chatRoomId = ? where chatRoomId = ?"; - connect.issueUpdateStatement(mysqlRequest, "", chatRoomId); - connect.close(); - } - - public Boolean exists(Group group) { - List<Group> existingGroups = getGroupsByProjectId(group.getProjectId()); - return existingGroups.contains(group); - } - - public void addGroupMember(User groupMember, int groupId) { - // TODO: implement - } - - public void deleteGroupMember(User groupMember, int groupId) { - // TODO: implement - } - - public List<Group> getGroupsByProjectId(String projectId) { - connect.connect(); - String mysqlRequest = "SELECT * FROM groups g " + - "JOIN groupuser gu ON g.id=gu.groupId " + "JOIN users u ON gu.studentId=u.email " + - "where g.projectId = ?"; - VereinfachtesResultSet vereinfachtesResultSet = - connect.issueSelectStatement(mysqlRequest, projectId); - if (Objects.isNull(vereinfachtesResultSet)) { - connect.close(); - return Collections.emptyList(); - } - HashMap<Integer, Group> groupHashMap = new HashMap<>(); - while (vereinfachtesResultSet.next()) { - fillGroupFromResultSet(vereinfachtesResultSet, groupHashMap); - } - ArrayList<Group> groups = new ArrayList<>(); - groupHashMap.forEach((key, group) -> groups.add(group)); - connect.close(); - return groups; - } - - - - private void fillGroupFromResultSet(VereinfachtesResultSet vereinfachtesResultSet, HashMap<Integer, Group> existingGroups) { - int id = vereinfachtesResultSet.getInt("id"); - if (existingGroups.containsKey(id)) { - existingGroups.get(id).addMember(ResultSetUtil.getUserFromResultSet(vereinfachtesResultSet)); - } else { - String projectId = vereinfachtesResultSet.getString("projectId"); - User user = ResultSetUtil.getUserFromResultSet(vereinfachtesResultSet); - String chatRoomId = vereinfachtesResultSet.getString("chatRoomId"); - ArrayList<User> userList = new ArrayList<>(Collections.singletonList(user)); - Group group = new Group(id, userList, projectId, chatRoomId); - existingGroups.put(id, group); - } - } - - private List<Group> getExistingEntriesOfGroups(String projectId) { - String mysqlExistingGroup = "SELECT * FROM groups WHERE projectId = ?"; - VereinfachtesResultSet resultSet = connect.issueSelectStatement(mysqlExistingGroup, projectId); - ArrayList<Group> existingGroups = new ArrayList<>(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - Group existingGroup = new Group(id, projectId); - existingGroups.add(existingGroup); - } - return existingGroups; - } - -} -*/ diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java index 03327bb3d4ce66bf062a21286c823c9af9ccf71d..6a95ea4cf55da3e767efa2d65ecc0f34fe0259d1 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java @@ -73,7 +73,7 @@ public class ManagementImpl implements Management { @Override public void update(User user) { - userDAO.update(user); + userDAO.updateRocketChatUserName(user); } @Override diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java index ab8525d346360372a68f0e3ef601f96bd5327f8a..645934de781333b828f07d1b0934e082e638f94b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java @@ -1,8 +1,9 @@ package unipotsdam.gf.modules.project; -import unipotsdam.gf.process.ProjectCreationProcess; -import unipotsdam.gf.process.tasks.TaskDAO; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.process.ProjectCreationProcess; import unipotsdam.gf.session.GFContexts; import javax.annotation.ManagedBean; @@ -36,7 +37,8 @@ public class ProjectView { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) @Path("/create") - public void createProject(@Context HttpServletRequest req, Project project) throws URISyntaxException, IOException { + public void createProject(@Context HttpServletRequest req, Project project) + throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException { String userEmail = gfContexts.getUserEmail(req); User user = iManagement.getUserByEmail(userEmail); assert user != null; @@ -68,15 +70,16 @@ public class ProjectView { @Consumes(MediaType.TEXT_PLAIN) @Produces(MediaType.TEXT_PLAIN) @Path("/login/{projectName}") - public String register(@Context HttpServletRequest req, @PathParam("projectName") String projectName, - @QueryParam("password") String - password) throws IOException { + public String register( + @Context HttpServletRequest req, @PathParam("projectName") String projectName, + @QueryParam("password") String password) + throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException { User user = gfContexts.getUserFromSession(req); Project project = projectDAO.getProjectByName(projectName); - if (project == null){ + if (project == null) { return "project missing"; } - if (!project.getPassword().equals(password) ) { + if (!project.getPassword().equals(password)) { return "wrong password"; } @@ -97,5 +100,4 @@ public class ProjectView { } - } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java index b5aeb64848d9b4dda47e5c6ba8e3c79b50bfb708..2c80bf36625049933262c265ba0369ea77c7a905 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java @@ -576,7 +576,7 @@ public class SubmissionController implements ISubmission, HasProgress { */ public void markAsFinal(FullSubmission fullSubmission) { connection.connect(); - String query = "update fullsubmissions set finalized = ? where id = ?"; + String query = "updateRocketChatUserName fullsubmissions set finalized = ? where id = ?"; connection.issueUpdateStatement(query, 1, fullSubmission.getId()); connection.close(); } @@ -591,7 +591,7 @@ public class SubmissionController implements ISubmission, HasProgress { */ public void updateFullSubmission(User submissionOwner, User feedbackGiver) { connection.connect(); - String query = "update fullsubmissions set feedbackUser = ? where user = ?"; + String query = "updateRocketChatUserName fullsubmissions set feedbackUser = ? where user = ?"; connection.issueUpdateStatement(query, feedbackGiver.getEmail(), submissionOwner.getEmail()); connection.close(); // TODO implement linking submission with group diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java index 7824b33ceff00e14e9e4ac4b234ca9b63604130c..2a877f7d7e042e7f0465c1d0acde24daa7c80e9f 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java @@ -14,11 +14,9 @@ public class User { private String name; private String password; private String email; + // the speaking name must unique in rocket chat private String rocketChatUsername; - private String rocketChatAuthToken; - // not in this version - private String rocketChatPersonalAccessToken; - private String rocketChatUserId; + private Boolean isStudent; public User() { @@ -26,28 +24,15 @@ public class User { - public User(String name, String password, String email, String rocketChatUsername, String rocketChatPersonalAccessToken, String rocketChatUserId) { + public User(String name, String password, String email, String rocketChatUsername, Boolean isStudent) { this.name = name; this.password = password; this.email = email; this.rocketChatUsername = rocketChatUsername; - this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken; - this.rocketChatUserId = rocketChatUserId; - + this.setStudent(isStudent); } - public User(String name, String password, String email, String rocketChatUsername, - String rocketChatAuthToken, String rocketChatPersonalAccessToken, String rocketChatUserId, - Boolean isStudent) { - this.name = name; - this.password = password; - this.email = email; - this.rocketChatUsername = rocketChatUsername; - this.rocketChatAuthToken = rocketChatAuthToken; - this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken; - this.rocketChatUserId = rocketChatUserId; - this.isStudent = isStudent; - } + public User(String authorEmail) { this.email = authorEmail; @@ -94,22 +79,7 @@ public class User { isStudent = student; } - public String getRocketChatUserId() { - return rocketChatUserId; - } - - public void setRocketChatUserId(String rocketChatUserId) { - this.rocketChatUserId = rocketChatUserId; - } - @JsonIgnore - public String getRocketChatAuthToken() { - return rocketChatAuthToken; - } - - public void setRocketChatAuthToken(String rocketChatAuthToken) { - this.rocketChatAuthToken = rocketChatAuthToken; - } public String getRocketChatUsername() { return rocketChatUsername; @@ -119,13 +89,7 @@ public class User { this.rocketChatUsername = rocketChatUsername; } - public String getRocketChatPersonalAccessToken() { - return rocketChatPersonalAccessToken; - } - public void setRocketChatPersonalAccessToken(String rocketChatPersonalAccessToken) { - this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken; - } @Override public String toString() { @@ -134,9 +98,6 @@ public class User { ", password='" + password + '\'' + ", email='" + email + '\'' + ", rocketChatUsername='" + rocketChatUsername + '\'' + - ", rocketChatAuthToken='" + rocketChatAuthToken + '\'' + - ", rocketChatPersonalAccessToken='" + rocketChatPersonalAccessToken + '\'' + - ", rocketChatUserId='" + rocketChatUserId + '\'' + ", isStudent=" + isStudent + '}'; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java index 5412add8f2a3764501b3f556be0d9a2c1fa215b5..5deba403998a2624d07f08ebdd349f52779cdec3 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserDAO.java @@ -29,11 +29,10 @@ public class UserDAO { public void persist(User user, UserProfile profile) { connect.connect(); String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `isStudent`," + - "`rocketChatUserId`,`rocketChatUsername`,`rocketChatAuthToken`,`rocketChatPersonalAccessToken`) " + - "values (?,?,?,?,?,?,?,?)"; + "`rocketChatUsername`) " + + "values (?,?,?,?,?)"; connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(), - user.getStudent(), user.getRocketChatUserId(), user.getRocketChatUsername(), user.getRocketChatAuthToken(), - user.getRocketChatPersonalAccessToken()); + user.getStudent(),user.getRocketChatUsername()); connect.close(); // TODO implmement UserProfile @Mar } @@ -45,14 +44,11 @@ public class UserDAO { connect.close(); } - public void update(User user) { - String mysqlRequest = "UPDATE `users` SET `name`=?,`password`=?,`email`=?,`isStudent`=?," + - "`rocketChatId`=?,`rocketChatAuthToken`=? WHERE email=? LIMIT 1"; - //TODO: maybe add handling if a line is actually updated - //TODO: if user is updated, it also must update all other tables which includes some information about the user, for example project user + public void updateRocketChatUserName(User user) { + String mysqlRequest = "UPDATE `users` SET" + + "`rocketChatUsername`=? WHERE email=? LIMIT 1"; connect.connect(); - connect.issueUpdateStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(), - user.getStudent(), user.getRocketChatUserId(), user.getRocketChatAuthToken(), user.getEmail()); + connect.issueUpdateStatement(mysqlRequest, user.getRocketChatUsername(), user.getEmail()); connect.close(); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java index bb7a1f504edfa7e1232547c93b477eb3d36f3348..4faadc71b8cc3e6a5169dcf4f27aa582a6ab6388 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java @@ -1,6 +1,8 @@ package unipotsdam.gf.modules.user; +import unipotsdam.gf.exceptions.*; import unipotsdam.gf.modules.project.Management; +import unipotsdam.gf.process.ProjectCreationProcess; import unipotsdam.gf.session.GFContexts; import unipotsdam.gf.interfaces.ICommunication; @@ -33,6 +35,9 @@ public class UserView { @Inject private Management management; + @Inject + private ProjectCreationProcess projectCreationProcess; + @Inject public UserView(ICommunication communicationService, UserDAO userDAO, Management management) { this.communicationService = communicationService; @@ -59,10 +64,35 @@ public class UserView { @FormParam("email") String email, @FormParam("isStudent") String isStudent) throws URISyntaxException { User user = new User(name, password, email, isStudent == null); - return register(req, true, user); + try { + projectCreationProcess.createUser(user); + } catch (UserExistsInRocketChatException e) { + return registrationError(); + } catch (UserExistsInMysqlException e) { + String existsUrl = "../register.jsp?userExists=true"; + return forwardToLocation(existsUrl); + } catch (RocketChatDownException e) { + e.printStackTrace(); + return registrationError(); + } + + try { + projectCreationProcess.authenticateUser(user, req); + } catch (UserDoesNotExistInRocketChatException e) { + loginError(); + } catch (RocketChatDownException e) { + e.printStackTrace(); + return registrationError(); + } + return redirectToProjectPage(user); } + private Response redirectToUserExists() throws URISyntaxException { + String existsUrl = "../index.jsp?userExists=false"; + return forwardToLocation(existsUrl); + } + /** * checks if a user exists in order to log him in * @@ -76,20 +106,25 @@ public class UserView { @POST @Produces(MediaType.TEXT_HTML) @Path("/exists") - public Response loginUser( + public Response authenticate( @Context HttpServletRequest req, @FormParam("name") String name, @FormParam("password") String password, @FormParam("email") String email) throws URISyntaxException { User user = new User(name, password, email, null); - // TODO fix this - User isLoggedIn = communicationService.loginUser(user); - if (isLoggedIn != null) { - req.getSession().setAttribute(GFContexts.ROCKETCHATAUTHTOKEN, isLoggedIn.getRocketChatAuthToken()); - req.getSession().setAttribute(GFContexts.ROCKETCHATID, isLoggedIn.getRocketChatUserId()); - return register(req, false, user); - } else { + try { + Boolean exists = projectCreationProcess.authenticateUser(user, req); + if (exists) { + user = fillUserFields(user); + return redirectToProjectPage(user); + } else { + return loginError(); + } + } catch (UserDoesNotExistInRocketChatException e) { + return loginError(); + } catch (RocketChatDownException e) { return loginError(); } + } @POST @@ -106,40 +141,6 @@ public class UserView { } - /** - * if create User is true, the user is created and logged in if he does not exist - * - * @param createUser - * @param user - * @return - * @throws URISyntaxException - */ - public Response register(HttpServletRequest req, boolean createUser, User user) throws URISyntaxException { - - if (management.exists(user)) { - if (!createUser) { - user = fillUserFields(user); - return redirectToProjectPage(req, user); - } - String existsUrl = "../register.jsp?userExists=true"; - return forwardToLocation(existsUrl); - } else { - if (createUser) { - boolean isRegisteredAndLoggedIn = communicationService.registerUser(user); - if (!isRegisteredAndLoggedIn) { - return registrationError(); - } - management.create(user, null); - user = fillUserFields(user); - return redirectToProjectPage(req, user); - } else { - String existsUrl = "../index.jsp?userExists=false"; - return forwardToLocation(existsUrl); - } - - } - } - private User fillUserFields(User user) { user = userDAO.getUserByEmail(user.getEmail()); return user; @@ -162,7 +163,7 @@ public class UserView { * @return * @throws URISyntaxException */ - private Response redirectToProjectPage(HttpServletRequest req, User user) throws URISyntaxException { + private Response redirectToProjectPage(User user) throws URISyntaxException { String successUrl; if (user.getStudent() != null && user.getStudent()) { @@ -170,7 +171,6 @@ public class UserView { } else { successUrl = "../project/overview-docent.jsp"; } - req.getSession().setAttribute(GFContexts.USEREMAIL, user.getEmail()); Response result = forwardToLocation(successUrl); return result; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java index d0aecb4b7b4d8026a6b18327406833dc17a1cb8a..789cdb9a2f3766c625c3e9a5a7f2ed15129a4919 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/mysql/MysqlConnectImpl.java @@ -137,6 +137,7 @@ public class MysqlConnectImpl implements MysqlConnect { } private void printErrorMessage(String statement, SQLException ex) { + ex.printStackTrace(); String message = ex.toString() + " for statement \n" + statement; log.error(message); System.out.println(message); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java index b2cbfb34fc03a378c231746fdd9726c05c9899c8..2cd418eaaded38648d2ed7086339a1bf27f7c9e4 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java @@ -3,6 +3,7 @@ package unipotsdam.gf.process; import unipotsdam.gf.interfaces.IGroupFinding; import unipotsdam.gf.interfaces.IPhases; import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.group.GroupData; import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.project.ProjectDAO; @@ -16,6 +17,7 @@ import unipotsdam.gf.process.tasks.TaskName; import javax.inject.Inject; import javax.inject.Singleton; import java.util.Arrays; +import java.util.List; @Singleton public class GroupFormationProcess { @@ -26,8 +28,6 @@ public class GroupFormationProcess { @Inject TaskDAO taskDAO; - - @Inject private DossierCreationProcess dossierCreationProcess; @@ -38,9 +38,7 @@ public class GroupFormationProcess { projectDAO.setGroupFormationMechanism(groupFormationMechanism, project); } - // taskDAO.persistTeacherTask(project, TaskName.FORM_GROUPS_MANUALLY, Phase.GroupFormation); - /** * this method can only be called to change the group formation to manual groups or single * @param groupFormationMechanism @@ -55,9 +53,8 @@ public class GroupFormationProcess { * and if there groups are not handled manually * this method finalizes the groups * @param project - * @param groups */ - public void finish(Project project, Group ... groups) { + public void finalize(Project project) { taskDAO.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation); /** * Gruppenphase wird beendet @@ -74,4 +71,12 @@ public class GroupFormationProcess { } + public GroupData getOrInitializeGroups(Project project) { + List<Group> groups = groupfinding.getGroups(project); + if (groups.isEmpty()) { + groups = groupfinding.createRandomGroups(project); + } + return new GroupData(groups); + + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java index addead6777066cbb4ff38f6fa3b801e0a6d3f4e5..c6bd697ebf74ea8c11b611d7e0ad9f2f9ca6ae58 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java @@ -1,7 +1,9 @@ package unipotsdam.gf.process; +import unipotsdam.gf.exceptions.*; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.interfaces.IPhases; +import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.project.Management; @@ -13,9 +15,11 @@ import unipotsdam.gf.process.tasks.Progress; import unipotsdam.gf.process.tasks.Task; import unipotsdam.gf.process.tasks.TaskDAO; import unipotsdam.gf.process.tasks.TaskName; +import unipotsdam.gf.session.GFContexts; import javax.inject.Inject; import javax.inject.Singleton; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.WebApplicationException; import java.io.IOException; @@ -39,6 +43,9 @@ public class ProjectCreationProcess { @Inject private ICommunication iCommunication; + @Inject + private GFContexts gfContexts; + /** * STEP 1 * @@ -46,7 +53,8 @@ public class ProjectCreationProcess { * @param author * @throws IOException */ - public void createProject(Project project, User author) throws IOException { + public void createProject(Project project, User author) + throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException { project.setAuthorEmail(author.getEmail()); try { iManagement.create(project); @@ -66,7 +74,8 @@ public class ProjectCreationProcess { * @param project * @param user */ - public void studentEntersProject(Project project, User user) { + public void studentEntersProject(Project project, User user) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { // student enters project iManagement.register(user, project, null); @@ -90,4 +99,37 @@ public class ProjectCreationProcess { } iCommunication.addUserToChatRoom(user, project.getName()); } + + public void createUser(User user) + throws UserExistsInMysqlException, RocketChatDownException, UserExistsInRocketChatException { + if(iManagement.exists(user)) { + throw new UserExistsInMysqlException(); + } + // create user in rocket chat + iCommunication.registerUser(user); + // create user in mysql + iManagement.create(user, null); + + } + + public Boolean authenticateUser(User user, HttpServletRequest req) + throws UserDoesNotExistInRocketChatException, RocketChatDownException { + // todo implement + + RocketChatUser isLoggedIn = iCommunication.loginUser(user); + gfContexts.updateUserSessionWithRocketChat(req, isLoggedIn); + gfContexts.updateUserWithEmail(req, isLoggedIn); + return iManagement.exists(user); + } + + public void deleteUser(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + iManagement.delete(user); + iCommunication.delete(user); + } + + public void deleteProject(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + // TODO implement + iManagement.delete(project); + iCommunication.deleteChatRoom(project); + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java index 973fbee8f0fda35105cbe99c6604b6379248e6fd..506694558376f6a314e89fd0fc3bf502f0371f85 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/phases/PhasesImpl.java @@ -79,7 +79,7 @@ public class PhasesImpl implements IPhases { // inform users about the formed groups, optionally giving them a hint on what happens next iCommunication.sendMessageToUsers(project, Messages.GroupFormation(project)); saveState(project, changeToPhase); - groupFormationProcess.finish(project); + groupFormationProcess.finalize(project); dossierCreationProcess.start(project); break; case DossierFeedback: diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java index f2a2232824f9c0620d136794e11fee138dc2e6b3..ed4bd984dcbaa7a211fb869306f5057a4fdbae0d 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java @@ -275,7 +275,7 @@ public class TaskDAO { } /* - * if this takes long rewrite it as batch update + * if this takes long rewrite it as batch updateRocketChatUserName */ public void finishMemberTask(Project project, TaskName taskName) { java.util.List<User> members = userDAO.getUsersByProjectName(project.getName()); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java index aba9535de20cd3e022882d4eef83fdf68070fb96..7ec5417a9279235333ccc1b9cf98815e29ba111b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/session/GFContexts.java @@ -1,5 +1,6 @@ package unipotsdam.gf.session; +import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.modules.user.UserDAO; @@ -31,4 +32,13 @@ public class GFContexts { String userEmail = getUserEmail(req); return userDAO.getUserByEmail(userEmail); } + + public void updateUserSessionWithRocketChat(HttpServletRequest req, RocketChatUser user) { + req.getSession().setAttribute(GFContexts.ROCKETCHATAUTHTOKEN, user.getRocketChatAuthToken()); + req.getSession().setAttribute(GFContexts.ROCKETCHATID, user.getRocketChatUserId()); + } + + public void updateUserWithEmail(HttpServletRequest req, User user) { + req.getSession().setAttribute(GFContexts.USEREMAIL, user.getEmail()); + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java index b39db08204876758ece73d4b7155853a9c71713c..3abb7d26db347ba827ff37a384b2bed9dfad37c8 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java @@ -6,6 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import unipotsdam.gf.config.GFApplicationBinder; import unipotsdam.gf.config.GFRocketChatConfig; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.communication.service.CommunicationService; import unipotsdam.gf.session.GFContext; @@ -44,8 +46,15 @@ public class ChatWindow extends SimpleTagSupport { writeIframe(request, chatRoomLink); } else { // scope is group - String chatRoomLink = communicationService - .getChatRoomLink(request.getSession().getAttribute(GFContexts.USEREMAIL).toString(), projectName); + String chatRoomLink = null; + try { + chatRoomLink = communicationService + .getChatRoomLink(request.getSession().getAttribute(GFContexts.USEREMAIL).toString(), projectName); + } catch (RocketChatDownException e) { + e.printStackTrace(); + } catch (UserDoesNotExistInRocketChatException e) { + e.printStackTrace(); + } writeIframe(request, chatRoomLink); } @@ -58,10 +67,6 @@ public class ChatWindow extends SimpleTagSupport { log.debug("ChatRoomLink for ChatWindow: {}", chatRoomLink); JspWriter out = getJspContext().getOut(); out.println("<iframe height=\"400px\" src=\"" + chatRoomLink + "\">"); - String rocketChatIntegration = "<script> window.parent.postMessage({event: 'login-with-token',loginToken:" + - " '"+getAuthToken+"'}, '"+GFRocketChatConfig.ROCKET_CHAT_LINK_0 +"');</script>"; - out.println(rocketChatIntegration); - out.println("</iframe>"); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java index aeee3a2a09e2e9ba748cd12a3022e9bb6dac400d..ec7d9e929cae335f0f00040014a2897f7bd27ed2 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java @@ -9,12 +9,8 @@ public class ResultSetUtil { String name = vereinfachtesResultSet.getString("name"); String password = vereinfachtesResultSet.getString("password"); String email = vereinfachtesResultSet.getString("email"); - String rocketChatId = vereinfachtesResultSet.getString("rocketChatUserId"); - String rocketChatAuthToken = vereinfachtesResultSet.getString("rocketChatAuthToken"); - String rocketChatPersonalAccessToken = vereinfachtesResultSet.getString("rocketChatPersonalAccessToken"); - String rocketChatUserId = vereinfachtesResultSet.getString("rocketChatUserId"); + String rocketChatUserName = vereinfachtesResultSet.getString("rocketChatUserName"); Boolean isStudent = vereinfachtesResultSet.getBoolean("isStudent"); - return new User(name, password, email, rocketChatId, rocketChatAuthToken, - rocketChatPersonalAccessToken, rocketChatUserId, isStudent); + return new User(name, password, email, rocketChatUserName, isStudent); } } diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp b/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp index 674145cd5ce3d0f22f728673b41e59f798885837..84dc20c81818387c51243ebba2f26afc900e1a27 100644 --- a/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp +++ b/gemeinsamforschen/src/main/webapp/groupfinding/create-groups-preferences.jsp @@ -10,8 +10,6 @@ <head> <title>Gruppenfindung basierend auf psychometrischen Merkmalen wurde noch nicht implementiert. Klicken sie auf zurück im browser</title> - <span>@Mirjam: Hier kämen deine Einstellungen für den Dozierenden bezüglich der Gruppenfindung basierend auf - Merkmalen</span> </head> <body> diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/css/edit-groups.css b/gemeinsamforschen/src/main/webapp/groupfinding/css/edit-groups.css new file mode 100644 index 0000000000000000000000000000000000000000..6729fb50b96d4f3be747404896995f7d0c80f867 --- /dev/null +++ b/gemeinsamforschen/src/main/webapp/groupfinding/css/edit-groups.css @@ -0,0 +1,23 @@ +.sortableGroup { + list-style-type: none; + margin: 0; + float: left; + margin-right: 10px; + background: #eee; + padding: 5px; + min-width: 143px; + max-width: 243px; + margin-bottom: 20px; +} + +.sortableGroup li { + margin: 5px; + padding: 5px; + font-size: 1.2em; + min-width: 120px; +} + +th, td { + padding: 15px; + text-align: left; +} \ No newline at end of file diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/edit-groups.jsp b/gemeinsamforschen/src/main/webapp/groupfinding/edit-groups.jsp new file mode 100644 index 0000000000000000000000000000000000000000..9cef5fc006c29d1df811668ab74177fa3ef75342 --- /dev/null +++ b/gemeinsamforschen/src/main/webapp/groupfinding/edit-groups.jsp @@ -0,0 +1,54 @@ +<%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="omniDependencies" %> +<%-- + Created by IntelliJ IDEA. + User: dehne + Date: 05.11.2018 + Time: 13:23 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<html> +<head> + <title>Title</title> + <omniDependencies:omniDependencies hierarchy="1"/> + <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> + <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> + <%--<link rel="stylesheet" href="/resources/demos/style.css">--%> + <link rel="stylesheet" href="css/edit-groups.css"> + <script src="js/edit-groups.js"></script> + +</head> +<body> + +<%--TODO das mit %3 oder %4 auf mehrere Zeilen verteilen--%> +<script id="groupTemplate" type="text/x-jQuery-tmpl"> + {{each(prop,group) bla}} + <div class="container-fluid"> + <h3>Gruppe ${group.id}</h3> + <ul id="group_${group.id}" class="droptrue sortableGroup"> + {{each(prop2, val) group.members }} + <li class="ui-state-default"> + <table> + <tr> + <td> ${val.name} </td> + <td> ${val.email} </td> + </tr> + </table> + </li> + {{/each}} + </ul> + </div> + {{/each}} + <div class="container-fluid"> + <h3>Gruppe ${lastGroupId}</h3> + <ul id="group_${lastGroupId}" class="droptrue sortableGroup"></ul> + </div> + + +</script> +<div id="editable_groups"></div> +<button id="persistNewGroups">Gruppen speichern</button> +<button id="finalizeNewGroups">Gruppen finalisieren</button> + +</body> +</html> diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js b/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js index 65bebd7fc61d7672eecef571d7fa1cde9502d754..3cc75aa64ece11f7480d5ba7eb673d38ab89720f 100644 --- a/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js +++ b/gemeinsamforschen/src/main/webapp/groupfinding/js/create-groups-manual.js @@ -23,14 +23,14 @@ $(document).ready(function () { function getAllGroups(callback) { $.ajax({ - url: "../rest/group/get/projects/" + $('#projectName').html().trim(), + url: "../rest/group/all/projects/" + $('#projectName').html().trim(), headers: { "Content-Type": "application/json", "Cache-Control": "no-cache" }, type: 'GET', success: function (response) { - callback(response); + callback(response.groups); }, error: function (a) { } diff --git a/gemeinsamforschen/src/main/webapp/groupfinding/js/edit-groups.js b/gemeinsamforschen/src/main/webapp/groupfinding/js/edit-groups.js new file mode 100644 index 0000000000000000000000000000000000000000..94c7aa757ca1bc1b79cdd642b5b9999b061e3241 --- /dev/null +++ b/gemeinsamforschen/src/main/webapp/groupfinding/js/edit-groups.js @@ -0,0 +1,63 @@ +var projectName = getProjectName(); + +$(function () { + + serverSide({ + hierarchyLevel:1, + modulePath:"/group", + methodPath: "/projects/?/groups", + pathParams: [projectName], + queryParams: [] + },"GET", printGroups); + + $(".sortableGroup").disableSelection(); + + $("#persistNewGroups").click(function () { + + serverSide({ + hierarchyLevel: 1, + modulePath: "/group", + methodPath: "/projects/?/groups", + pathParams: [projectName], + queryParams: [], + entity: getGroupDataFromHtml() + }, "PUT", function (a,b,c) { + console.log(a); + }) + }); + $("#finalizeNewGroups").click(function () { + // TODO get firstgroup + }); + + function getGroupDataFromHtml() { + var i = 1; + //$("#group_1 > li > table > tbody > tr > td:nth-child(2)") + } + + function printGroups(a,b,c) { + var firstgroup = + groups = { + bla: [ + { + id: "1", + members: [{name:"me", email:"egal@stuff.com"}, {name:"him", email:"egal@stuff.com"}, {name:"her", email:"egal@stuff.com"}] + }, + { + id: "2", + members: [{name:"me2", email:"egal@stuff.com"}, {name:"him2", email:"egal@stuff.com"}, {name:"her2", email:"egal@stuff.com"}] + } + ], + lastGroupId: "44" + }; + + // create a group + $("#groupTemplate") + .tmpl(firstgroup) + .appendTo("#editable_groups"); + + $("ul.droptrue").sortable({ + connectWith: "ul" + }); + + } +}); diff --git a/gemeinsamforschen/src/main/webapp/project/overview-student.jsp b/gemeinsamforschen/src/main/webapp/project/overview-student.jsp index b2457201073c9d1d971ac0c7701e42804ebf8c40..814215abd79e49b193726360694548128e536eb9 100644 --- a/gemeinsamforschen/src/main/webapp/project/overview-student.jsp +++ b/gemeinsamforschen/src/main/webapp/project/overview-student.jsp @@ -57,6 +57,8 @@ </div> <button class="btn btn-default" type="button" style="margin-left:250px;" id="enrollProject">Projekt beitreten </button> + <%-- <iframe height="600px" id="rocketChat" src="http://fleckenroller.cs.uni-potsdam.de:3000"> + </iframe>--%> </div> </div> diff --git a/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp b/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp index 8c40df687e33d099529ad25e56337497a7a6484a..817d5e2614fea3c9b869448b6f30159dbe507325 100644 --- a/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp +++ b/gemeinsamforschen/src/main/webapp/project/tasks-docent.jsp @@ -50,6 +50,8 @@ {{/if}} </script> </div> +<%--<chat:chatWindow orientation="right" scope="project"></chat:chatWindow>--%> + <footer:footer/> </body> </html> diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js index 7a174d902942ed373983f14fc0334e2bcb99b97d..c5f382243d4a3e8286ef233a40e531221a78bb7d 100644 --- a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js +++ b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js @@ -101,13 +101,18 @@ function RequestObj(hierachyLevel, modulePath, methodPath, pathParams, queryPara } +function serverSide(requestObj, method, callback) { + serverSideWithType(requestObj, method, callback, 'application/json'); +} + /** * send a request to the server * @param requestObj the data specific to the reqeuest * @param method GET, POST, DELETE or PUT * @param callback + * @param contentType typically 'application/json' */ -function serverSide(requestObj, method, callback) { +function serverSideWithType(requestObj, method, callback, contentType) { let relativPath = calculateHierachy(requestObj.hierarchyLevel) let methodPath = requestObj.methodPath requestObj.pathParams.forEach(function (e) { @@ -120,10 +125,11 @@ function serverSide(requestObj, method, callback) { localurl = localurl + requestObj.queryParams; } + if (method == "PUT") { $.ajax({ url: localurl, - contentType: 'application/json', + contentType: contentType, type: 'PUT', data: JSON.stringify(requestObj.entity), success: function (response) { @@ -139,7 +145,7 @@ function serverSide(requestObj, method, callback) { if (method == "POST" || method == "DELETE") { $.ajax({ url: localurl, - contentType: 'application/json', + contentType: contentType, type: method, data: requestObj.entity == null ? {} : JSON.stringify(requestObj.entity), success: function (response) { diff --git a/gemeinsamforschen/src/main/webapp/test.html b/gemeinsamforschen/src/main/webapp/test.html deleted file mode 100644 index 80fc3415e61e58694edb94895f7a5ef3d2a14b7b..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/webapp/test.html +++ /dev/null @@ -1,14 +0,0 @@ -<html> -<head> - <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> - <script type="application/javascript"> - $(document).on("load", function () { - document.getElementById('rocketChat').Meteor.loginWithToken('kv3mHoraygndPiwH7wrOK1QGA6NAeCwrJqt7LIkKq7z'); - }); - </script> -</head> -<body> -<iframe height="600px" id="rocketChat" src="https://rocket.farm-test.rz.uni-potsdam.de/group/Pokemon?layout=embedded"> -</iframe> -</body> -</html> \ No newline at end of file diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java index 47c98e52f0e5bcfca2f304adaa9b49051b2a3fde..91d41f32e66cd4f53bd24482c5507a99db814547 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/user/UserDAOTest.java @@ -90,7 +90,7 @@ public class UserDAOTest { assertTrue(userDAO.exists(user)); user.setStudent(false); - userDAO.update(user); + userDAO.updateRocketChatUserName(user); assertTrue(userDAO.exists(user)); User managementUser = userDAO.getUserByEmail(user.getEmail()); assertEquals(user.getStudent(), managementUser.getStudent()); diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java index 17c9b042e8badd6122a1f6ac07fb8eeddcad5eeb..2485150f96f9b225170ec9aa4cd2a1074993c9f9 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java @@ -32,7 +32,7 @@ public class UpdateDB { System.out.println(new java.io.File( "." ).getCanonicalPath()); updateDB.runScript(new FileReader("src/test/resources/database/db.sql")); updateDB.runScript(new FileReader("src/test/resources/database/fltrail.sql")); - updateDB.runScript(new FileReader("src/test/resources/database/testuser.sql")); + //updateDB.runScript(new FileReader("src/test/resources/database/testuser.sql")); } public static void updateTestDB() throws SQLException, ManagedProcessException, IOException { diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java index a0e2266200d2f030ec9b22cc149b930c7c6e0652..73e2b7c1db641c471305858d1f7fa18656523148 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java @@ -9,6 +9,9 @@ import uk.co.jemos.podam.api.PodamFactoryImpl; import unipotsdam.gf.config.GFApplicationBinder; import unipotsdam.gf.core.database.TestGFApplicationBinder; import unipotsdam.gf.core.database.UpdateDB; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.exceptions.UserExistsInRocketChatException; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; import unipotsdam.gf.modules.communication.model.EMailMessage; @@ -83,14 +86,22 @@ public class CommunicationServiceTest { @After public void tearDown() { - createdChatRooms.forEach(createdChatRoom -> iCommunication.deleteChatRoom(createdChatRoom)); + createdChatRooms.forEach(createdChatRoom -> { + try { + iCommunication.deleteChatRoom(createdChatRoom); + } catch (RocketChatDownException e) { + e.printStackTrace(); + } catch (UserDoesNotExistInRocketChatException e) { + e.printStackTrace(); + } + }); createdChatRooms.clear(); } @Test - public void loginUser() { + public void loginUser() throws RocketChatDownException, UserDoesNotExistInRocketChatException { assertNotNull(iCommunication.loginUser(TEST_USER)); assertTrue(!TEST_USER.getRocketChatAuthToken().isEmpty()); assertTrue(!TEST_USER.getRocketChatUserId().isEmpty()); @@ -102,19 +113,15 @@ public class CommunicationServiceTest { @Ignore @Test - public void registerUser() { + public void registerUser() throws RocketChatDownException, UserExistsInRocketChatException { // TODO Side effect is not optimal because you need to know that before persisting the user boolean userCreated = iCommunication.registerUser(user); //userDAO.persist(user, null); assertTrue(userCreated); - assertNotNull(user.getRocketChatUserId()); - assertNotNull(user.getRocketChatAuthToken()); - assertNotNull(user.getRocketChatPersonalAccessToken()); - } @Test - public void createEmptyChatRoom() { + public void createEmptyChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String chatRoom = iCommunication.createEmptyChatRoom("Test", false); assertNotNull(chatRoom); assertFalse(chatRoom.isEmpty()); @@ -130,7 +137,7 @@ public class CommunicationServiceTest { } @Test - public void createChatRoomWithUser() { + public void createChatRoomWithUser() throws RocketChatDownException, UserDoesNotExistInRocketChatException { List<User> userList = Arrays.asList(ADMIN_USER, TEST_USER); String chatRoom = iCommunication.createChatRoom("ChatWithUser", false, userList); @@ -142,7 +149,7 @@ public class CommunicationServiceTest { } @Test - public void createChatRoomWithGroup() { + public void createChatRoomWithGroup() throws RocketChatDownException, UserDoesNotExistInRocketChatException { Group group = new Group(); group.setMembers(Collections.singletonList(ADMIN_USER)); group.setProjectName("chatWithGroup"); @@ -152,7 +159,7 @@ public class CommunicationServiceTest { } @Test - public void getChatRoomName() { + public void getChatRoomName() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String expectedChatRoomName = "ChatRoomName"; String chatRoomId = iCommunication.createEmptyChatRoom(expectedChatRoomName, false); assertNotNull(chatRoomId); @@ -168,7 +175,7 @@ public class CommunicationServiceTest { } @Test - public void getChatRoomLink() { + public void getChatRoomLink() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String projectId = "Projekt"; Project project = new Project(projectId, user.getEmail()); projectDAO.persist(project); @@ -192,7 +199,7 @@ public class CommunicationServiceTest { } @Test - public void exists() { + public void exists() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String expectedChatRoomName = "ChatRoomName"; String chatRoomId = iCommunication.createEmptyChatRoom(expectedChatRoomName, false); assertNotNull(chatRoomId); @@ -205,7 +212,7 @@ public class CommunicationServiceTest { } @Test - public void addUserToChatRoom() { + public void addUserToChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String chatRoomId = iCommunication.createEmptyChatRoom("addUser", false); assertNotNull(chatRoomId); assertFalse(chatRoomId.isEmpty()); @@ -216,7 +223,7 @@ public class CommunicationServiceTest { } @Test - public void removeUserFromChatRoom() { + public void removeUserFromChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String chatRoomId = iCommunication.createEmptyChatRoom("removeUser", false); assertNotNull(chatRoomId); assertFalse(chatRoomId.isEmpty()); @@ -229,7 +236,7 @@ public class CommunicationServiceTest { } @Test - public void deleteChatRoom() { + public void deleteChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { String chatRoomId = iCommunication.createEmptyChatRoom("deleteChatRoom", false); assertNotNull(chatRoomId); assertFalse(chatRoomId.isEmpty()); @@ -271,7 +278,7 @@ public class CommunicationServiceTest { @Test @Ignore - public void createTestData() { + public void createTestData() throws RocketChatDownException, UserDoesNotExistInRocketChatException { User user = new User(); user.setName("Martin Nachname"); user.setPassword("test1234"); diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java index 27ee1232b5686784b645b6d07d0017d4058c59ba..af8fbb9c08de24e86c5e5d8da3df1e23d6143abc 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/process/tasks/GroupPhaseTaskTest.java @@ -1,14 +1,24 @@ package unipotsdam.gf.process.tasks; +import ch.vorburger.exec.ManagedProcessException; import org.glassfish.hk2.api.ServiceLocator; import org.glassfish.hk2.utilities.ServiceLocatorUtilities; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; +import unipotsdam.gf.config.GFApplicationBinder; import unipotsdam.gf.core.database.TestGFApplicationBinder; +import unipotsdam.gf.core.database.UpdateDB; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.exceptions.UserExistsInMysqlException; +import unipotsdam.gf.exceptions.UserExistsInRocketChatException; +import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.interfaces.IGroupFinding; import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.group.GroupData; import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.project.Management; import unipotsdam.gf.modules.project.Project; @@ -18,8 +28,11 @@ import unipotsdam.gf.process.ProjectCreationProcess; import javax.inject.Inject; +import java.io.IOException; +import java.sql.SQLException; import java.util.ArrayList; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class GroupPhaseTaskTest { @@ -40,61 +53,82 @@ public class GroupPhaseTaskTest { @Inject private GroupFormationProcess groupFormationProcess; + @Inject + private ICommunication communication; + private PodamFactory factory = new PodamFactoryImpl(); - private User teacher; + @Before - public void setUp() { - /*final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder());*/ - final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder()); + public void setUp() throws IOException, SQLException, ManagedProcessException { + UpdateDB.main(new String[0]); + + final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); + //final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder()); locator.inject(this); } + @Ignore @Test - public void createCourse() { - - this.teacher = factory.manufacturePojo(User.class); + public void createUser() + throws RocketChatDownException, UserExistsInRocketChatException, UserExistsInMysqlException, UserDoesNotExistInRocketChatException { + User teacher = factory.manufacturePojo(User.class); + teacher.setEmail("vodka@yolo.com"); + teacher.setPassword("egal"); teacher.setStudent(false); - management.create(teacher, null); - // add Titel - Project project = factory.manufacturePojo(Project.class); - project.setAuthorEmail(teacher.getEmail()); - management.create(project); - management.register(teacher, project, null); + projectCreationProcess.deleteUser(teacher); + projectCreationProcess.createUser(teacher); + projectCreationProcess.deleteUser(teacher); + } - /*ProjectConfiguration projectConfiguration = factory.manufacturePojo(ProjectConfiguration.class); - management.create(projectConfiguration, project); + @Test + public void createCourse() + throws RocketChatDownException, UserDoesNotExistInRocketChatException, UserExistsInMysqlException, UserExistsInRocketChatException, IOException { - GroupfindingCriteria groupfindingCriteria = factory.manufacturePojo(GroupfindingCriteria.class); - groupFinding.selectGroupfindingCriteria(groupfindingCriteria, project);*/ + // create teacher + User teacher = factory.manufacturePojo(User.class); + teacher.setEmail("vodka@yolo.com"); + teacher.setPassword("egal"); + teacher.setStudent(false); + projectCreationProcess.deleteUser(teacher); + projectCreationProcess.createUser(teacher); - taskDAO.createTaskWaitForParticipants(project, teacher); - ArrayList<Task> tasks = taskDAO.getTasks(teacher, project); - assertTrue(tasks != null && tasks.size() > 0); + Project project = factory.manufacturePojo(Project.class); + project.setName("TEST"); + projectCreationProcess.deleteProject(project); + projectCreationProcess.createProject(project, teacher); + groupFormationProcess.setGroupFormationMechanism(GroupFormationMechanism.Manual, project); ArrayList<User> students = new ArrayList<>(); - for (int i = 0; i<5;i++) { + for (int i = 0; i < 30; i++) { User user = factory.manufacturePojo(User.class); user.setStudent(true); - students.add(user); - - management.create(user, null); + user.setRocketChatUsername("student" + i); + user.setEmail("student" + i + "@stuff.com"); + user.setPassword("egal"); + projectCreationProcess.deleteUser(user); + projectCreationProcess.createUser(user); projectCreationProcess.studentEntersProject(project, user); + students.add(user); } + //groupFormationProcess.changeGroupFormationMechanism(GroupFormationMechanism.Manual, project); + GroupData orInitializeGroups = groupFormationProcess.getOrInitializeGroups(project); + assertFalse(orInitializeGroups.getGroups().isEmpty()); + /* groupFormationProcess.finalize(project);*/ - groupFormationProcess.changeGroupFormationMechanism(GroupFormationMechanism.Manual, project); - Group group = new Group(); - for (User student : students) { - group.addMember(student); - } - groupFormationProcess.finish(project, group); + /*ArrayList<Task> tasks = taskDAO.getTasks(teacher, project); + assertTrue(tasks != null && tasks.size() > 0);*/ + /* for (User student : students) { + projectCreationProcess.deleteUser(student); + projectCreationProcess.deleteProject(project); + }*/ } diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql index a1d352a9667c1e8238f4df80e751d9f626e1cf5b..786426caf61e0f07bff402d909ee7dde5de088a4 100644 --- a/gemeinsamforschen/src/test/resources/database/fltrail.sql +++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql @@ -1,7 +1,7 @@ CREATE TABLE `annotations` ( `id` varchar(120) NOT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `userEmail` varchar(120) DEFAULT NULL, + `userEmail` varchar(255) DEFAULT NULL, `targetId` varchar(120) DEFAULT NULL, `targetCategory` varchar(30) NOT NULL, `title` varchar(120) DEFAULT NULL, @@ -60,7 +60,8 @@ CREATE TABLE `groupfindingmechanismselected` ( CREATE TABLE `groups` ( `id` int(11) NOT NULL, `projectName` varchar(400) NOT NULL, - `chatRoomId` varchar(400) + `chatRoomId` varchar(400), + `name` varchar(255) NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `groupuser` ( @@ -85,7 +86,7 @@ CREATE TABLE `projects` ( CREATE TABLE `projectuser` ( `projectName` varchar(100) NOT NULL, - `userEmail` varchar(100) NOT NULL + `userEmail` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `quiz` ( @@ -106,7 +107,7 @@ CREATE TABLE `submissionpartbodyelements` ( CREATE TABLE `submissionparts` ( `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `userEmail` varchar(120) NOT NULL, + `userEmail` varchar(255) NOT NULL, `fullSubmissionId` varchar(120) NOT NULL, `category` varchar(30) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -117,7 +118,7 @@ CREATE TABLE `tags` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `tasks` ( - `userEmail` varchar(100) NOT NULL, + `userEmail` varchar(255) NOT NULL, `projectName` varchar(200) NOT NULL, `taskName` varchar(100) DEFAULT NULL, `groupTask` tinyint(4) DEFAULT NULL, @@ -135,10 +136,7 @@ CREATE TABLE `users` ( `name` varchar(100) NOT NULL, `password` varchar(200) NOT NULL, `email` varchar(255) NOT NULL, - `rocketChatUserId` varchar(400), - `rocketChatPersonalAccessToken` varchar(400), - `rocketChatUsername` varchar(400), - `rocketChatAuthToken` varchar(800), + `rocketChatUserName` varchar(400), `isStudent` tinyint(1) DEFAULT '1' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -196,15 +194,15 @@ ALTER TABLE `groups` ALTER TABLE `groupuser` - ADD CONSTRAINT `groupuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`), - ADD CONSTRAINT `groupuser_ibfk_2` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`); + ADD CONSTRAINT `groupuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE, + ADD CONSTRAINT `groupuser_ibfk_2` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE; ALTER TABLE `projects` ADD CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`author`) REFERENCES `users` (`email`); ALTER TABLE `projectuser` - ADD CONSTRAINT `projectuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`), - ADD CONSTRAINT `projectuser_ibfk_2` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`); + ADD CONSTRAINT `projectuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE, + ADD CONSTRAINT `projectuser_ibfk_2` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE; COMMIT; CREATE UNIQUE INDEX fullsubmissions_user_projectName_uindex ON fullsubmissions (user, projectName); @@ -212,3 +210,7 @@ CREATE UNIQUE INDEX fullsubmissions_user_projectName_uindex ON fullsubmissions ( CREATE UNIQUE INDEX tasks_userEmail_projectName_taskName_uindex ON tasks (userEmail, projectName, taskName); + + + +