diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java deleted file mode 100644 index 125862780cbc50f02a1a8978b49f87eaacdeef3c..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java +++ /dev/null @@ -1,6 +0,0 @@ -package unipotsdam.gf.config; - -public interface Constants { - - String ROCKET_CHAT_URL = "http://rocketchat.westeurope.cloudapp.azure.com"; -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java index d8690cf1aff2e60c34147eadc637a9a82fb9c490..7f54357ce3fd7e7fda8c8577ba8d92d2562c5e24 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java @@ -6,14 +6,11 @@ import unipotsdam.gf.modules.annotation.controller.AnnotationController; import unipotsdam.gf.modules.annotation.controller.FeedbackImpl; import unipotsdam.gf.modules.assessment.controller.service.AssessmentDBCommunication; import unipotsdam.gf.modules.assessment.controller.service.PeerAssessment; -import unipotsdam.gf.modules.communication.service.CommunicationDummyService; -import unipotsdam.gf.modules.group.DummyProjectCreationService; +import unipotsdam.gf.modules.communication.service.CommunicationService; +import unipotsdam.gf.modules.communication.service.UnirestService; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.group.GroupfindingImpl; import unipotsdam.gf.modules.journal.service.IJournalImpl; -import unipotsdam.gf.modules.journal.service.JournalService; -import unipotsdam.gf.modules.journal.service.JournalServiceImpl; -import unipotsdam.gf.modules.journal.util.JournalUtils; import unipotsdam.gf.modules.project.Management; import unipotsdam.gf.modules.project.ManagementImpl; import unipotsdam.gf.modules.project.ProjectConfigurationDAO; @@ -35,18 +32,17 @@ import unipotsdam.gf.session.GFContexts; public class GFApplicationBinder extends AbstractBinder { - + /** + * TODO replace DummyImplementation + */ @Override protected void configure() { - bind(CommunicationDummyService.class).to(ICommunication.class); + bind(CommunicationService.class).to(ICommunication.class); bind(ManagementImpl.class).to(Management.class); bind(PeerAssessment.class).to(IPeerAssessment.class); bind(PhasesImpl.class).to(IPhases.class); bind(GFContext.class).to(GFContext.class); - bind(JournalUtils.class).to(JournalUtils.class); - bind(JournalServiceImpl.class).to(JournalService.class); bind(ManagementImpl.class).to(Management.class); - bind(FeedbackImpl.class).to(Feedback.class); bind(DummyResearchReportManagement.class).to(ResearchReportManagement.class); bind(IJournalImpl.class).to(IJournal.class); bind(GroupfindingImpl.class).to(IGroupFinding.class); @@ -59,16 +55,20 @@ public class GFApplicationBinder extends AbstractBinder { bind(SubmissionController.class).to(SubmissionController.class); bind(AnnotationController.class).to(AnnotationController.class); bind(ProjectConfigurationDAO.class).to(ProjectConfigurationDAO.class); - bind(DummyProjectCreationService.class).to(DummyProjectCreationService.class); bind(UserDAO.class).to(UserDAO.class); bind(ProjectDAO.class).to(ProjectDAO.class); bind(GroupDAO.class).to(GroupDAO.class); bind(TaskDAO.class).to(TaskDAO.class); + bind(FeedbackImpl.class).to(Feedback.class); + bind(UnirestService.class).to(UnirestService.class); bindMore(); } protected void bindMore() { bind(MysqlConnectImpl.class).to(MysqlConnect.class); + bind(MysqlConnect.class).to(MysqlConnect.class); + bind(GroupfindingImpl.class).to(IGroupFinding.class); + bind(UnirestService.class).to(UnirestService.class); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java index 252905102d2472eaa125f06499bbdfe1663ea254..9d61aea469fb9aebdd44000313224d34bb8c5b1b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java @@ -10,4 +10,5 @@ public class GFDatabaseConfig { public static final String USER = "root"; public static final String PASS = ""; public static final String DB_NAME = "fltrail"; + public static final String TEST_DB_NAME = "fltrail_test"; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFMailConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFMailConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..8b4665ac02639d461684f6369a9546d8ddf7c965 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFMailConfig.java @@ -0,0 +1,9 @@ +package unipotsdam.gf.config; + +public class GFMailConfig { + + public final static String SMTP_HOST = ""; + public final static String SMTP_PORT = ""; + public final static String SMTP_USERNAME = ""; + public final static String SMTP_PASSWORD = ""; +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java index feac0c4e9926ffabdf27fad4ff2c1620d8b0b680..8fd0ea098cf755ec609feaa4f76069bf4f8bcddd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFRocketChatConfig.java @@ -1,8 +1,52 @@ 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 { - public static final String ROCKET_CHAT_LINK = "https://rocket.farm.uni-potsdam.de/"; - public static final String ADMIN_USERNAME = ""; - public static final String ADMIN_PASSWORD = ""; + //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 = "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 + */ + + public static final String ROCKET_CHAT_ROOM_LINK = ROCKET_CHAT_LINK + "group/"; + + public static final String ROCKET_CHAT_API_LINK = ROCKET_CHAT_LINK + "api/v1/"; + + 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 RocketChatUser ADMIN_USER = new RocketChatUser("fltrailadmin", "GEbCM1Rso6TUGGMKtGmg6c5EydMQEu61K9zdD10F", + "julian.dehne@uni-potsdam.de", "rocketChatUsername", "rocketChatAuthToken", + "rocketChatPersonalAccessToken", "SuFbpF3P9aYEo634W", false); + + + + /** + * curl -H "Content-type:application/json" \ + * https://rocket.farm-test.rz.uni-potsdam.de/api/v1/login \ + * -d '{ "user": "test@stuff.com", "password": "passwort" }' + * um + */ } 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 ece710bea944cf6039ef9aa659244b169757e9f1..4d1a3f7781d82e58d91d3ef9fe19c4aba9f7c939 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java @@ -1,12 +1,17 @@ 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; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.process.constraints.ConstraintsMessages; -import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; -import unipotsdam.gf.modules.communication.model.Message; -import unipotsdam.gf.modules.communication.model.chat.ChatMessage; -import unipotsdam.gf.modules.communication.model.chat.ChatRoom; import java.util.List; import java.util.Map; @@ -23,21 +28,39 @@ public interface ICommunication { * @param roomId ID of room of user * @return List of Chat Messages */ + @Deprecated List<ChatMessage> getChatHistory(String roomId); - - boolean sendMessageToChat(Message message, String roomId) ; + @Deprecated + boolean sendMessageToChat(EMailMessage EMailMessage, String roomId); /** * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/create/ * creates chatroom * - * @param name chat room name - * @param userList member of chat by id + * @param name chat room name * @return chat room id */ - String createChatRoom(String name, List<User> userList); + 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 + * + * @param group Object for information + * @return true if chatRoom was created, otherwise false + */ + boolean createChatRoom(Group group, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; + String createEmptyChatRoom(String name, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; + + 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/ @@ -46,9 +69,11 @@ public interface ICommunication { * @param user information about user * @return if user was added successfully */ - boolean addUserToChatRoom(String roomId, User user); + 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/ @@ -57,6 +82,7 @@ public interface ICommunication { * @param topic topic of chat room * @return true, if topic was set correctly */ + @Deprecated boolean setChatRoomTopic(String roomId, String topic); @@ -67,7 +93,9 @@ public interface ICommunication { * @param roomId chat room id * @return chat room information */ - ChatRoom getChatRoomInfo(String roomId); + String getChatRoomName(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException; + + boolean exists(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** * api: https://rocket.chat/docs/developer-guides/rest-api/authentication/login/ @@ -75,26 +103,36 @@ public interface ICommunication { * @param user username and password * @return information about user, especially authtoken for later use of endpoints */ - boolean loginUser(User user); + RocketChatUser loginUser(User user) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; /** + * api 1: https://rocket.chat/docs/developer-guides/rest-api/users/register/ + * api 2: https://rocket.chat/docs/developer-guides/rest-api/users/generatepersonalaccesstoken/ + * api 3: https://rocket.chat/docs/developer-guides/rest-api/users/getpersonalaccesstokens/ + * * registers new user to rocket chat * * @param user registers user to rocket.chat * @return user id */ - boolean registerUser(User user); + boolean registerUser(User user) + throws RocketChatDownException, UserExistsInRocketChatException; - boolean registerAndLoginUser(User user); + String getChatRoomLink(String userEmail, String projectId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException; - String getChatRoomLink(String userEmail, String projectToken, String groupToken); + String getProjectChatRoomLink(String projectName); // TODO implement as Email or whatever - void sendSingleMessage(Message message, User user); + boolean sendSingleMessage(EMailMessage EMailMessage, User user); //added by Axel. - void informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project); + boolean informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project); + + boolean sendMessageToUsers(Project project, EMailMessage eMailMessage); + + public void delete(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException; + - // TODO implement as Email or whatever - void sendMessageToUsers(Project project, String message); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java index 2b1ee6f6aa1590c5d597afafcd4b1b258fdf8474..c76efc824ba40a36109ee20a9b0aa55308de4a2a 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IGroupFinding.java @@ -1,5 +1,7 @@ package unipotsdam.gf.interfaces; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; import unipotsdam.gf.modules.project.Project; @@ -7,6 +9,7 @@ import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.group.GroupfindingCriteria; import java.util.ArrayList; +import java.util.List; public interface IGroupFinding { @@ -18,6 +21,8 @@ public interface IGroupFinding { void selectGroupfindingCriteria( GroupfindingCriteria groupfindingCriteria, Project project); + GroupFormationMechanism getGFM(Project project); + /** * Persist the selected manual groups * @param groupComposition @@ -45,4 +50,13 @@ public interface IGroupFinding { ArrayList<String> getStudentsInSameGroup(StudentIdentifier student); int getMinNumberOfStudentsNeeded(Project project); + + void deleteGroups(Project project); + + List<Group> createRandomGroups(Project project); + + /** + * finish the groups in the db + */ + void finalizeGroups(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java deleted file mode 100644 index 1a0d657baba3b66527714bd71550de846525ce0a..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java +++ /dev/null @@ -1,38 +0,0 @@ -package unipotsdam.gf.modules.communication; - -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.communication.service.CommunicationDummyService; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.tagext.SimpleTagSupport; -import java.io.IOException; - -public class ChatWindow extends SimpleTagSupport { - - private String orientation; - - public void doTag() throws IOException { - PageContext pageContext = (PageContext) getJspContext(); - HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); - String token = request.getParameter("token"); - //User user = management.getUserByEmail(token); - String groupToken = request.getParameter("groupToken"); - String projectToken = request.getParameter("projectName"); - //get ProjetbyToken - ICommunication communicationService = new CommunicationDummyService(); - String chatRoomLink = communicationService.getChatRoomLink(token, projectToken, groupToken); - - JspWriter out = getJspContext().getOut(); - out.println("<iframe width=\"30%\" height=\"100%\" src=\"" + chatRoomLink + "\"/>"); - } - - public void setOrientation(String orientation) { - this.orientation = orientation; - } - - public String getOrientation() { - return orientation; - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/Messages.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/Messages.java index cb24bd6725cf2397565210fb53c8618b2d6b9050..229e4a12795e4d660da2d8fe67212c5993e3dd28 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/Messages.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/Messages.java @@ -1,25 +1,39 @@ package unipotsdam.gf.modules.communication; + +import unipotsdam.gf.modules.communication.model.EMailMessage; import unipotsdam.gf.modules.project.Project; public class Messages { - public static String GroupFormation(Project project){ + public static EMailMessage GroupFormation(Project project) { // TODO add link to site + markup - return "Die Gruppen wurden für den Kurs "+ project.getName() + " erstellt"; + EMailMessage eMailMessage = new EMailMessage(); + eMailMessage.setSubject(project.getName() + ": Gruppenerstellung abgeschlossen"); + eMailMessage.setBody("Die Gruppen wurden für den Kurs " + project.getName() + " erstellt"); + return eMailMessage; } - public static String NewFeedbackTask(Project project) { + public static EMailMessage NewFeedbackTask(Project project) { // TODO add link to site + markup - return "Eine neue Feedbackaufgabe wurde für den Kurs "+ project.getName() + " erstellt"; + EMailMessage eMailMessage = new EMailMessage(); + eMailMessage.setSubject(project.getName() + ": Feedbackaufgabe erstellt"); + eMailMessage.setBody("Eine neue Feedbackaufgabe wurde für den Kurs " + project.getName() + " erstellt"); + return eMailMessage; } - public static String AssessmentPhaseStarted(Project project) { + public static EMailMessage AssessmentPhaseStarted(Project project) { // TODO add link to site + markup - return "Die Bewertungsphase hat begonnen. Bitte geht auf ... und macht ...."; + EMailMessage eMailMessage = new EMailMessage(); + eMailMessage.setSubject(project.getName() + ": Beginn der Bewertungsphase"); + eMailMessage.setBody("Die Bewertungsphase hat begonnen. Bitte geht auf ... und macht ...."); + return eMailMessage; } - public static String CourseEnds(Project project) { + public static EMailMessage CourseEnds(Project project) { // TODO add link to site + markup - return "Die Bewertung ist abgeschlossen. Sie erhalten ihre Bewertung in Kürze."; + EMailMessage eMailMessage = new EMailMessage(); + eMailMessage.setSubject(project.getName() + ": Bewertungsphase abgeschlossen"); + eMailMessage.setBody("Die Bewertung ist abgeschlossen. Sie erhalten ihre Bewertung in Kürze."); + return eMailMessage; } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/EMailMessage.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/EMailMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..6b76df20de6bf2c90a4be77e229936ddba14fe19 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/EMailMessage.java @@ -0,0 +1,34 @@ +package unipotsdam.gf.modules.communication.model; + +public class EMailMessage { + + private String subject; + private String body; + + + public EMailMessage() { + } + + public EMailMessage(String subject, String body) { + this.subject = subject; + this.body = body; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + +} 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/Message.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/Message.java deleted file mode 100644 index d01a32710be40c2ac13b7203ea9dd9f9f6e2cab1..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/Message.java +++ /dev/null @@ -1,38 +0,0 @@ -package unipotsdam.gf.modules.communication.model; - -public class Message { - - private String roomIdOrChannel; - private String message; - - public Message() {} - - public Message(String roomIdOrChannel, String message) { - this.roomIdOrChannel = roomIdOrChannel; - this.message = message; - } - - public String getRoomIdOrChannel() { - return roomIdOrChannel; - } - - public void setRoomIdOrChannel(String roomIdOrChannel) { - this.roomIdOrChannel = roomIdOrChannel; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public String toString() { - return "Message{" + - "roomIdOrChannel='" + roomIdOrChannel + '\'' + - ", message='" + message + '\'' + - '}'; - } -} 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/SampleAnswer.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/SampleAnswer.java deleted file mode 100644 index 6a34b213584abfc5fd149c488184250dfacf0303..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/SampleAnswer.java +++ /dev/null @@ -1,25 +0,0 @@ -package unipotsdam.gf.modules.communication.model; - - -public class SampleAnswer { - - private String answer; - - public SampleAnswer() { - } - - public String getAnswer() { - return answer; - } - - public void setAnswer(String answer) { - this.answer = answer; - } - - @Override - public String toString() { - return "SampleAnswer{" + - "answer='" + answer + '\'' + - '}'; - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/chat/ChatRoom.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/chat/ChatRoom.java index 0a97bfcaa8956ee862866c8cb1df48335a9301ed..1dfa856184657b7aad7c7ff6ca4012adc0dbca03 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/chat/ChatRoom.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/chat/ChatRoom.java @@ -1,5 +1,6 @@ package unipotsdam.gf.modules.communication.model.chat; +// TODO: never used at the moment by ICommunication, just context, maybe remove public class ChatRoom { String id; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatLoginResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatLoginResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..408e236d5b6f3de10281567a5bf010abb4333e51 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatLoginResponse.java @@ -0,0 +1,78 @@ +package unipotsdam.gf.modules.communication.model.rocketChat; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class RocketChatLoginResponse { + + private String status; + + // for success data + private Map data; + + // for error data + private String error; + private String message; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Map getData() { + return data; + } + + public void setData(Map data) { + this.data = data; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return "RocketChatLoginResponse{" + + "status='" + status + '\'' + + ", data=" + data + + ", error='" + error + '\'' + + ", message='" + message + '\'' + + '}'; + } + + public boolean isSuccessful() { + return status.equals("success"); + } + + public boolean hasError() { + return status.equals("error"); + } + + public String getAuthToken() { + // TODO: throw exception for error + return isSuccessful() ? data.get("authToken").toString() : ""; + } + + public String getUserId() { + // TODO: throw exception for error + return isSuccessful() ? data.get("userId").toString() : ""; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatRegisterResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatRegisterResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..cd24a152b4c56f55c880d29cbd99e196b1a1592e --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatRegisterResponse.java @@ -0,0 +1,57 @@ +package unipotsdam.gf.modules.communication.model.rocketChat; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.logging.log4j.util.Strings; + +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class RocketChatRegisterResponse { + + private Map user; + private String error; + + private boolean successful; + + public Map getUser() { + return user; + } + + public void setUser(Map user) { + this.user = user; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + @JsonProperty("success") + public boolean isSuccessful() { + return successful; + } + + public void setSuccessful(boolean successful) { + this.successful = successful; + } + + public String getUserId() { + if (!isSuccessful()) { + // TODO: throw error + return Strings.EMPTY; + } + return user.get("_id").toString(); + } + + public boolean isEmailExistError() { + boolean emailError = false; + if (!isSuccessful()) { + emailError = error.contains("Email already exists."); + } + return emailError; + } +} 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/CommunicationDummyService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java deleted file mode 100644 index a932c327f53f53e8d7b91c7ca8ed5860ac393746..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java +++ /dev/null @@ -1,138 +0,0 @@ -package unipotsdam.gf.modules.communication.service; - -import unipotsdam.gf.assignments.Assignee; -import unipotsdam.gf.assignments.NotImplementedLogger; -import unipotsdam.gf.config.Constants; -import unipotsdam.gf.modules.project.Management; -import unipotsdam.gf.modules.project.Project; -import unipotsdam.gf.modules.user.User; -import unipotsdam.gf.process.constraints.ConstraintsMessages; -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; -import unipotsdam.gf.modules.communication.model.Message; -import unipotsdam.gf.modules.communication.model.chat.ChatMessage; -import unipotsdam.gf.modules.communication.model.chat.ChatRoom; - -import javax.annotation.ManagedBean; -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Singleton; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -@Resource -@ManagedBean -@Singleton -public class CommunicationDummyService implements ICommunication { - - @Inject - Management managementService; - - @Override - public List<ChatMessage> getChatHistory(String roomId) { - ArrayList<ChatMessage> chatMessages = new ArrayList<>(); - int maxValue = 6; - for (int i = 1; i <= maxValue; i++) { - chatMessages.add(new ChatMessage(String.valueOf(i), "Dies ist ein Test " + i + ".", - Instant.now().minusSeconds(maxValue * 10 - i * 10), "testUser" + i)); - } - return chatMessages; - } - - @Override - public boolean sendMessageToChat(Message message, String roomId) { - NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class); - return false; - } - - @Override - public String createChatRoom(String name, List<User> userList) { - if (Objects.isNull(userList)) { - return "2"; - } - - return "1"; - } - - @Override - public boolean addUserToChatRoom(String roomId, User user) { - NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, "addUserToChatRoom"); - return false; - } - - @Override - public boolean removeUserFromChatRoom(User user, String roomId) { - NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, "removing user from chat " + - "room"); - return false; - } - - @Override - public boolean setChatRoomTopic(String roomId, String topic) { - NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, "setting chat room topic"); - return false; - } - - @Override - public ChatRoom getChatRoomInfo(String roomId) { - return new ChatRoom("1", "test"); - } - - @Override - public boolean loginUser(User user) { - user.setRocketChatAuthToken("abc"); - return true; - } - - @Override - public boolean registerUser(User user) { - user.setRocketChatId("1"); - return true; - } - - @Override - public boolean registerAndLoginUser(User user) { - // TODO: try to login user first --> if it fails there is no user, register afterwards or add exists function - if (!registerUser(user)) { - return false; - } - return loginUser(user); - - } - - public String getChatRoomLink(String userEmail, String projectToken, String groupToken) { - //User user = managementService.getUserByEmail(userEmail); - // TODO: Implement getProjectbyToken and getGroupByToken - //Project project = managementService.getProject(projectName - String channelName = "general"; - return Constants.ROCKET_CHAT_URL + "/channel/" + channelName + "?layout=embedded"; - } - - @Override - public void sendSingleMessage(Message message, User user) { - // TODO implement as email or directed message, popup after login or whatever - String message2 = "sending email with message: "+ message.getMessage() + " to: "+ user.getEmail(); - NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, message2); - } - - @Override - public void informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project) { - - } - - @Override - public void sendMessageToUsers(Project project, String message) { - // TODO implement as email or directed message, popup after login or whatever - String message2 = "sending email with message: "+ message + " to: "+ project.getName(); - NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, message2); - } - - // TODO: remove after done implementing - // just for postman testing - public User getUser() { - return new User("Martin Stähr", "test", "test@test.com", true); - } -} 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 new file mode 100644 index 0000000000000000000000000000000000000000..7e2a4734664bae88631544cd9234037e31d997c0 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java @@ -0,0 +1,545 @@ +package unipotsdam.gf.modules.communication.service; + +import io.github.openunirest.http.HttpResponse; +import io.github.openunirest.request.body.RequestBodyEntity; +import org.apache.http.HttpEntity; +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; +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.modules.user.UserDAO; +import unipotsdam.gf.process.constraints.ConstraintsMessages; + +import javax.annotation.ManagedBean; +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.mail.Authenticator; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import javax.ws.rs.core.Response; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +import static unipotsdam.gf.config.GFMailConfig.SMTP_HOST; +import static unipotsdam.gf.config.GFMailConfig.SMTP_PASSWORD; +import static unipotsdam.gf.config.GFMailConfig.SMTP_PORT; +import static unipotsdam.gf.config.GFMailConfig.SMTP_USERNAME; +import static unipotsdam.gf.config.GFRocketChatConfig.ADMIN_USER; +import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_API_LINK; +import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_ROOM_LINK; + +@Resource +@ManagedBean +@Singleton +public class CommunicationService implements ICommunication { + + private final static Logger log = LoggerFactory.getLogger(CommunicationService.class); + + @Inject + private UnirestService unirestService; + @Inject + private UserDAO userDAO; + @Inject + private GroupDAO groupDAO; + + public CommunicationService() { + + } + +/* private static Boolean isUpdated; + + private static synchronized Boolean setAdminToken() { + if (isUpdated == null) { + isUpdated = true; + } else { + return isUpdated; + } + return null; + } + + + private static synchronized Boolean unsetAdminToken() { + if (isUpdated == null) { + } else { + isUpdated = false; + } + return null; + }*/ + + @Override + public List<ChatMessage> getChatHistory(String roomId) { + //TODO : not needed at the moment, possibly remove + return null; + } + + @Override + public boolean sendMessageToChat(EMailMessage EMailMessage, String roomId) { + // TODO: not needed at the moment, possibly remove + return false; + } + + @Override + 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) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); + + 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<>(); + bodyMap.put("name", name); + bodyMap.put("readOnly", readOnly); + bodyMap.put("members", usernameList); + + + RequestBodyEntity body = + unirestService.post(ROCKET_CHAT_API_LINK + "groups.create").headers(headerMap).body(bodyMap); + + HttpEntity entity = body.getEntity(); + + HttpResponse<Map> response = body.asObject(Map.class); + + if (isBadRequest(response)) { + return Strings.EMPTY; + } + + Map responseMap = response.getBody(); + log.debug("responseMap: {}", responseMap); + if (responseMap.containsKey("error")) { + return Strings.EMPTY; + } + + Map groupMap = (Map) responseMap.get("group"); + return groupMap.get("_id").toString(); + } + + @Override + public boolean createChatRoom(Group group, boolean readOnly) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); + + // chatRoom name: projectId - GroupId + String chatRoomName = getChatRoomName(group); + if (exists(chatRoomName)) { + return true; + } + String chatRoomId = createChatRoom(chatRoomName, readOnly, group.getMembers()); + if (chatRoomId.isEmpty()) { + return false; + } + group.setChatRoomId(chatRoomId); + groupDAO.update(group); + return true; + } + + @Override + 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); + + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); + HashMap<String, String> bodyMap = new HashMap<>(); + bodyMap.put("roomId", roomId); + + HttpResponse<Map> response = + unirestService.post(ROCKET_CHAT_API_LINK + "groups.delete").headers(headerMap).body(bodyMap) + .asObject(Map.class); + + if (isBadRequest(response)) { + return false; + } + Map responseMap = response.getBody(); + if (responseMap.get("success").equals("false") || responseMap.containsKey("error")) { + return false; + } + groupDAO.clearChatRoomIdOfGroup(roomId); + + return true; + } + + @Override + public boolean addUserToChatRoom(User user, String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + return modifyChatRoom(user, roomId, true); + } + + @Override + public boolean removeUserFromChatRoom(User user, String roomId) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + return modifyChatRoom(user, roomId, false); + } + + private boolean modifyChatRoom(User user, String roomId, boolean addUser) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + //loginUser(ADMIN_USER); + RocketChatUser student = loginUser(user); + + if (hasEmptyParameter(user.getRocketChatUsername(), roomId)) { + return false; + } + Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); + Map<String, String> bodyMap = new HashMap<>(); + bodyMap.put("roomId", roomId); + bodyMap.put("userId", student.getRocketChatUserId()); + + String groupUrl = addUser ? "groups.invite" : "groups.kick"; + + HttpResponse<Map> response = + unirestService.post(GFRocketChatConfig.ROCKET_CHAT_API_LINK + groupUrl).headers(headerMap).body(bodyMap) + .asObject(Map.class); + + if (isBadRequest(response)) { + return false; + } + + Map responseMap = response.getBody(); + return !responseMap.containsKey("error") && !responseMap.get("success").equals("false"); + } + + @Override + public boolean setChatRoomTopic(String roomId, String topic) { + // TODO: not needed at the moment, possibly remove + return false; + } + + @Override + public String getChatRoomName(String roomId) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + + //loginUser(ADMIN_USER); + + 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); + + if (isBadRequest(response)) { + return Strings.EMPTY; + } + + Map responseMap = response.getBody(); + if (responseMap.containsKey("error")) { + return Strings.EMPTY; + } + + Map groupMap = (Map) responseMap.get("group"); + return groupMap.get("name").toString(); + } + + @Override + public RocketChatUser loginUser(User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + + if (hasEmptyParameter(user.getEmail(), user.getPassword())) { + return null; + } + + // + 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)) { + throw new UserDoesNotExistInRocketChatException(); + } else { + /*if (ADMIN_USER.equals(user)) { + setAdminToken(); + }*/ + } + + RocketChatLoginResponse rocketChatLoginResponse = response.getBody(); + + 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) throws RocketChatDownException, UserExistsInRocketChatException { + + if (hasEmptyParameter(user.getEmail(), user.getName(), user.getPassword())) { + return false; + } + + HashMap<String, String> rocketChatRegister = new HashMap<>(); + 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()); + + HttpResponse<RocketChatRegisterResponse> response = + unirestService.post(ROCKET_CHAT_API_LINK + "users.register").body(rocketChatRegister) + .asObject(RocketChatRegisterResponse.class); + + Boolean badRequest = isBadRequest(response); + if (badRequest) { + throw new UserExistsInRocketChatException(); + } + + RocketChatRegisterResponse registerResponse = response.getBody(); + + // not sure we need this test + if (!registerResponse.isSuccessful()) { + return false; + } + + // 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 + */ + //return createCustomAccessToken(user); + return true; + } + + /** + * + * @param userEmail + * @param projectName + * @return + * @throws RocketChatDownException + * @throws UserDoesNotExistInRocketChatException + */ + public String getChatRoomLink(String userEmail, String projectName) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + + //loginUser(ADMIN_USER); + + String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), new Project(projectName)); + if (chatRoomId.isEmpty()) { + return Strings.EMPTY; + } + + String chatRoomName = getChatRoomName(chatRoomId); + if (chatRoomName.isEmpty()) { + return Strings.EMPTY; + } + + return ROCKET_CHAT_ROOM_LINK + chatRoomName + "?layout=embedded"; + } + + @Override + public String getProjectChatRoomLink(String projectName) { + 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) { + + //loginUser(ADMIN_USER); + + Properties properties = new Properties(); + properties.put("mail.smtp.auth", true); + properties.put("mail.smtp.starttls.enable", "true"); + properties.put("mail.smtp.host", SMTP_HOST); + properties.put("mail.smtp.port", SMTP_PORT); + + Session session = Session.getInstance(properties, new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(SMTP_USERNAME, SMTP_PASSWORD); + } + }); + + try { + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress(SMTP_USERNAME, "FLTrail Messagebot")); + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(user.getEmail())); + message.setSubject(eMailMessage.getSubject()); + message.setText(eMailMessage.getBody()); + + Transport.send(message); + return true; + } catch (MessagingException | UnsupportedEncodingException e) { + log.error("Exception while sending an email: {}", e); + return false; + } + } + + @Override + public boolean informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project) { + HashMap<StudentIdentifier, ConstraintsMessages> notSentEMailMap = new HashMap<>(); + tasks.entrySet().stream().filter(entry -> { + User user = new User(); + user.setEmail(entry.getKey().getUserEmail()); + EMailMessage eMailMessage = new EMailMessage(); + eMailMessage.setSubject("Benachrichtigung über nicht erledigte Aufgaben im Projekt " + project.getName()); + eMailMessage.setBody(entry.getValue().toString()); + return !sendSingleMessage(eMailMessage, user); + }).forEach(entry -> notSentEMailMap.put(entry.getKey(), entry.getValue())); + return notSentEMailMap.isEmpty(); + } + + @Override + public boolean sendMessageToUsers(Project project, EMailMessage eMailMessage) { + List<User> users = userDAO.getUsersByProjectName(project.getName()); + List<User> userEmailProblemList = + users.stream().filter(user -> !sendSingleMessage(eMailMessage, user)).collect(Collectors.toList()); + return userEmailProblemList.isEmpty(); + } + + private boolean hasEmptyParameter(String... parameters) { + return Arrays.stream(parameters).anyMatch(String::isEmpty); + } + + private String createRocketChatUsername(User user) { + // TODO: eventually add username to normal registration + String possibleUsername = user.getName().replaceAll(" ", ""); + int counter = 1; + while (userDAO.existsByRocketChatUsername(possibleUsername)) { + possibleUsername = user.getName().replaceAll(" ", "") + counter; + counter++; + } + return possibleUsername; + } + + /** + * TODO with higher rocket chat version a personal access tokens exist and this function can be used (ab 0.69 + * präferiert 0.70) + */ +/* private boolean createCustomAccessToken(User user) { + if (hasEmptyParameter(user.getRocketChatUserId())) { + return false; + } + + if (!loginUser(user)) { + return false; + } + + HashMap<String, String> bodyMap = new HashMap<>(); + bodyMap.put("tokenName", "fltrailToken"); + Map<String, String> headerMap = new RocketChatHeaderMapBuilder() + .withAuthTokenHeader(user.getRocketChatAuthToken()) + .withRocketChatUserId(user.getRocketChatUserId()).build(); + + HttpResponse<Map> response = unirestService + .post(ROCKET_CHAT_API_LINK + "users.generatePersonalAccessToken") + .headers(headerMap) + .body(bodyMap) + .asObject(Map.class); + + if (isBadRequest(response)) { + return false; + } + + Map responseBody = response.getBody(); + if (responseBody.containsKey("status")) { + return false; + } + user.setRocketChatPersonalAccessToken(responseBody.get("token").toString()); + return true; + }*/ + 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(); + return true; + } + if (Response.Status.NOT_FOUND.getStatusCode() == status) { + //unsetAdminToken(); + throw new RocketChatDownException(); + } else { + return true; + } + } + + + @Override + 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/service/SampleService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/SampleService.java deleted file mode 100644 index 870b49db98d0a0b8434fc627ea23a9022c13d52b..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/SampleService.java +++ /dev/null @@ -1,12 +0,0 @@ -package unipotsdam.gf.modules.communication.service; - -import unipotsdam.gf.modules.communication.model.SampleAnswer; - -public class SampleService { - - public SampleAnswer provideSampleAnswer(String name) { - SampleAnswer sampleAnswer = new SampleAnswer(); - sampleAnswer.setAnswer("Hello " + name); - return sampleAnswer; - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/UnirestService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/UnirestService.java new file mode 100644 index 0000000000000000000000000000000000000000..9930d0297939a1e9770948d8b4da0468aa63001d --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/UnirestService.java @@ -0,0 +1,43 @@ +package unipotsdam.gf.modules.communication.service; + +import io.github.openunirest.http.Unirest; +import io.github.openunirest.mappers.JacksonObjectMapper; +import io.github.openunirest.request.GetRequest; +import io.github.openunirest.request.HttpRequestWithBody; + +import javax.annotation.ManagedBean; +import javax.annotation.Resource; +import javax.inject.Singleton; + +@ManagedBean +@Resource +@Singleton +public class UnirestService { + + private static boolean isInitialized = false; + + public UnirestService() { + // has to be set for application + if (!isInitialized) { + Unirest.setObjectMapper(new JacksonObjectMapper()); + Unirest.setDefaultHeader("Content-Type", "application/json"); + isInitialized = true; + } + } + + public GetRequest get(String url) { + return Unirest.get(url); + } + + public HttpRequestWithBody post(String url) { + return Unirest.post(url); + } + + public HttpRequestWithBody delete(String url) { + return Unirest.delete(url); + } + + public HttpRequestWithBody put(String url) { + return Unirest.put(url); + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..8def9d716f836665c67762a09823c73d137b9044 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/util/RocketChatHeaderMapBuilder.java @@ -0,0 +1,44 @@ +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; + +import static unipotsdam.gf.config.GFRocketChatConfig.ADMIN_USER; + +public class RocketChatHeaderMapBuilder { + + private Map<String, String> headerMap; + + public RocketChatHeaderMapBuilder() { + headerMap = new HashMap<>(); + } + + public RocketChatHeaderMapBuilder withAuthTokenHeader(String authToken) { + headerMap.put("X-Auth-Token", authToken); + return this; + } + + public RocketChatHeaderMapBuilder withRocketChatUserId(String userId) { + headerMap.put("X-User-Id", userId); + return this; + } + + public RocketChatHeaderMapBuilder withRocketChatAdminAuth(CommunicationService communicationService) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + // with new version of rocketChat: RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(ADMIN_USER.getRocketChatPersonalAccessToken()); + + RocketChatUser admin = communicationService.loginUser(ADMIN_USER); + + RocketChatHeaderMapBuilder rocketChatHeaderMapBuilder = withAuthTokenHeader(admin.getRocketChatAuthToken()); + return rocketChatHeaderMapBuilder.withRocketChatUserId(admin.getRocketChatUserId()); + } + + public Map<String, String> build() { + return headerMap; + } +} 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 cfb141f320c5d74d9b7e97dbd12b13213df28de5..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,15 +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.modules.communication.model.Message; -import unipotsdam.gf.modules.communication.model.chat.ChatMessage; -import unipotsdam.gf.modules.communication.model.chat.ChatRoom; -import unipotsdam.gf.modules.communication.service.CommunicationDummyService; +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; @@ -18,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; @@ -36,60 +40,28 @@ public class CommunicationView { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/info/{roomId}") - public Response getChatRoomInformation(@PathParam("roomId") String roomId) { - ChatRoom chatRoom = communicationService.getChatRoomInfo(roomId); - if (isNull(chatRoom)) { + 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); return Response.status(Response.Status.NOT_FOUND).build(); } - log.trace("getChatRoomInformationResponse: {}", chatRoom); - return Response.ok(chatRoom).build(); - } - - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("/history/{roomId}") - public Response getChatHistory(@PathParam("roomId") String roomId) { - List<ChatMessage> chatMessages = communicationService.getChatHistory(roomId); - if (isNull(chatMessages)) { - log.error("getChatHistory: chatRoom not found for roomId: {}", roomId); - return Response.status(Response.Status.NOT_FOUND).build(); - } - log.trace("response for getChatHistory: {}", chatMessages); - return Response.ok(chatMessages).build(); - } - - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/send/{roomId}") - public Response sendMessage(Message message, @PathParam("roomId") String roomId) { - if (isNull(message)) { - log.trace("sendMessage message object was null"); - return Response.status(Response.Status.BAD_REQUEST).entity("must provide message").build(); - } - boolean wasSend = communicationService.sendMessageToChat(message, roomId); - Response response; - if (wasSend) { - log.trace("response for sendMessage: {}", wasSend); - response = Response.ok(wasSend).build(); - } else { - log.error("error while sending message for message: {}", message); - response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while sending message").build(); - } - return response; + log.trace("getChatRoomInformationResponse: {}", chatRoomName); + return Response.ok(chatRoomName).build(); } @POST @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(); } - boolean wasAdded = communicationService.addUserToChatRoom(roomId, user); + boolean wasAdded = communicationService.addUserToChatRoom(user, roomId); if (isNull(wasAdded)) { log.error("addUserToChatRoom: chatRoom not found for roomId: {}, user: {}", roomId, user); return Response.status(Response.Status.NOT_FOUND).build(); @@ -100,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; } @@ -110,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(); @@ -126,31 +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(); - } - return response; - } - - @POST - @Produces(MediaType.APPLICATION_JSON) - @Path("/setTopic/{roomId}") - public Response setChatRoomTopic(@PathParam("roomId") String roomId, @QueryParam("topic") String topic) { - if (isNull(topic)) { - log.trace("setTopic param not given"); - return Response.status(Response.Status.BAD_REQUEST).entity("topic must be not empty").build(); - } - boolean wasSet = communicationService.setChatRoomTopic(roomId, topic); - if (isNull(wasSet)) { - log.error("addChatRoomTopic: chatRoom not found for roomId: {}, topic: {}", roomId, topic); - return Response.status(Response.Status.NOT_FOUND).build(); - } - Response response; - if (wasSet) { - log.trace("response for setTopic: {}", wasSet); - response = Response.ok(wasSet).build(); - } else { - log.error("error while setting topic to chat room"); - response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while setting topic to chat room").build(); + response = + Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("error while adding user to chatRoom") + .build(); } return response; } @@ -158,13 +111,15 @@ public class CommunicationView { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/create") - public Response createChatRoom(@QueryParam("name") String name, List<User> users) { + @Path("/room/create/{name}") + 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(); } - String chatId = communicationService.createChatRoom(name, users); - if (isNull(chatId)) { + String chatId = communicationService.createChatRoom(name, readOnly, users); + if (chatId.isEmpty()) { log.error("error while creating chatRoom for: name: {}, users: {}", name, users); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } @@ -172,15 +127,30 @@ public class CommunicationView { return Response.status(Response.Status.CREATED).entity(chatId).build(); } - // Temp: just get user as json - // TODO: remove after done implementing - @GET - @Path("/user") + @POST @Produces(MediaType.APPLICATION_JSON) - public Response getUser() { - User user = ((CommunicationDummyService) communicationService).getUser(); - return Response.ok(user).build(); + @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/communication/view/SampleView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/SampleView.java deleted file mode 100644 index e54f664db4177cdd62bb3aa58c6853c1a933ed13..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/SampleView.java +++ /dev/null @@ -1,28 +0,0 @@ -package unipotsdam.gf.modules.communication.view; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import unipotsdam.gf.modules.communication.model.SampleAnswer; -import unipotsdam.gf.modules.communication.service.SampleService; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -@Path("/example") -public class SampleView { - - Logger log = LoggerFactory.getLogger(SampleView.class); - - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("{name}") - public SampleAnswer helloWorld(@PathParam("name") String name) { - SampleService sampleService = new SampleService(); - SampleAnswer sampleAnswer = sampleService.provideSampleAnswer(name); - log.info("HelloWorldview helloWorld Method answered: {}",sampleAnswer); - return sampleAnswer; - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/DummyProjectCreationService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/DummyProjectCreationService.java deleted file mode 100644 index 4ed0dd14eeea8d363d9d2ba376489c4b6eec8ff1..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/DummyProjectCreationService.java +++ /dev/null @@ -1,113 +0,0 @@ -package unipotsdam.gf.modules.group; - -import uk.co.jemos.podam.api.PodamFactory; -import uk.co.jemos.podam.api.PodamFactoryImpl; -import unipotsdam.gf.modules.project.Management; -import unipotsdam.gf.modules.group.Group; -import unipotsdam.gf.modules.project.Project; -import unipotsdam.gf.modules.user.User; -import unipotsdam.gf.modules.user.UserDAO; -import unipotsdam.gf.modules.user.UserProfile; -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.group.GroupDAO; - -import javax.annotation.ManagedBean; -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - - -@ManagedBean -@Resource -@Singleton -public class DummyProjectCreationService { - - - private PodamFactory factory = new PodamFactoryImpl(); - - private ICommunication communicationService; - private Management management; - private GroupDAO groupDAO; - private UserDAO userDAO; - - @Inject - public DummyProjectCreationService(ICommunication communicationService, Management management, GroupDAO groupDAO, UserDAO userDAO) { - this.communicationService = communicationService; - this.management = management; - this.groupDAO = groupDAO; - this.userDAO = userDAO; - } - - public boolean createExampleProject() { - - Project project = factory.manufacturePojo(Project.class); - - User docentUser = getDocentUser(); - if (!management.exists(docentUser)) { - management.create(docentUser, null); - } - - if (!management.exists(project)) { - management.create(project); - } - - List<Group> groups = createDummyGroups(project.getName()); - - List<Group> nonCreatedGroups = groups.stream().filter(group -> !management.exists(group)).collect(Collectors.toList()); - - nonCreatedGroups.forEach(group -> management.create(group)); - - List<Group> groupsWithId = groupDAO.getGroupsByProjectName(project.getName()); - groupsWithId.forEach(group -> { - String chatRoomName = String.join(" - ", project.getName(), String.valueOf(group.getId())); - group.setChatRoomId(communicationService.createChatRoom(chatRoomName, group.getMembers())); - management.update(group); - }); - - return true; - } - - public List<Group> createDummyGroups(String projectName) { - Group group1 = new Group(new ArrayList<>(), projectName); - Group group2 = new Group(new ArrayList<>(), projectName); - Group group3 = new Group(new ArrayList<>(), projectName); - Group group4 = new Group(new ArrayList<>(), projectName); - List<Group> groups = Arrays.asList(group1, group2, group3, group4); - - String baseUserName = "Name "; - String password = "test123"; - String baseEMailFront = "test"; - String baseEMailDomain = "@example.com"; - boolean isStudentValue = true; - for (int userNumber = 0; userNumber < groups.size() * 5; userNumber++) { - String userName = baseUserName + (userNumber + 1); - String email = baseEMailFront + (userNumber + 1) + baseEMailDomain; - User user = new User(userName, password, email, isStudentValue); - if (!management.exists(user)) { - saveUserToDatabase(user); - int groupPosition = userNumber % groups.size(); - groups.get(groupPosition).addMember(user); - } - } - return groups; - } - - public User getDocentUser() { - User docent = new User("Julian", "docent", "docent@docent.com", false); - if (!management.exists(docent)) { - saveUserToDatabase(docent); - } else { - docent = userDAO.getUserByEmail(docent.getEmail()); - } - return docent; - } - - private void saveUserToDatabase(User user) { - communicationService.registerAndLoginUser(user); - management.create(user, new UserProfile()); - } -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/DummyProjectCreationView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/DummyProjectCreationView.java deleted file mode 100644 index 4e3950d0cfa532ad23fe92bceef94a321c2016ba..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/DummyProjectCreationView.java +++ /dev/null @@ -1,34 +0,0 @@ -package unipotsdam.gf.modules.group; - -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -@Path("/dummy/project/") -public class DummyProjectCreationView { - - @Inject - DummyProjectCreationService dummyProjectCreationService; - - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("/create") - public Response createDummyProject() { - - boolean success = dummyProjectCreationService.createExampleProject(); - - Response response; - if (success) { - response = Response.ok("Dummy-Project created").build(); - } else { - response = Response.serverError().build(); - } - - return response; - } - - -} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/EnumeratedProfileQuestion.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/EnumeratedProfileQuestion.java new file mode 100644 index 0000000000000000000000000000000000000000..7c48efbced68608c4f678f5f0904e7249ce19da0 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/EnumeratedProfileQuestion.java @@ -0,0 +1,27 @@ +package unipotsdam.gf.modules.group; + +import java.util.ArrayList; +import java.util.List; + +/** + * If the question asks the user to select an option then + * the question neds to provide a list of options as string + * else: the number of checkboxes is stored and the answer is an index + * note: multiple select is not implemented + */ +public class EnumeratedProfileQuestion extends ProfileQuestion { + private java.util.List<String> options; + + public EnumeratedProfileQuestion() { + super(); + this.options = new ArrayList<>(); + } + + public List<String> getOptions() { + return options; + } + + public void setOptions(List<String> options) { + this.options = options; + } +} 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 85bbf3eecb249154dbff5e33dc9a3f94f0ae8f6e..5d8ed5f03db2b26035d37db1c87026338c6d23f2 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java @@ -1,5 +1,6 @@ package unipotsdam.gf.modules.group; +import org.apache.logging.log4j.util.Strings; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.mysql.MysqlConnect; import unipotsdam.gf.mysql.VereinfachtesResultSet; @@ -151,6 +152,43 @@ public class GroupDAO { connect.close(); return groupFormationMechanism; } + + public String getGroupChatRoomId(User user, Project project) { + connect.connect(); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("SELECT g.chatRoomId FROM groups g "); + stringBuilder.append("join groupuser gu on g.id=gu.groupId "); + stringBuilder.append("where g.projectName=? and gu.userEmail=?"); + + VereinfachtesResultSet resultSet = connect.issueSelectStatement(stringBuilder.toString(), project.getName(), + user.getEmail()); + if (Objects.isNull(resultSet)) { + connect.close(); + return Strings.EMPTY; + } + String chatRoomId = Strings.EMPTY; + if (resultSet.next()) { + chatRoomId = resultSet.getString("chatRoomId"); + } + connect.close(); + return chatRoomId; + } + + public void clearChatRoomIdOfGroup(String chatRoomId) { + connect.connect(); + String mysqlRequest = "updateRocketChatUserName groups SET chatRoomId = ? where chatRoomId = ?"; + connect.issueUpdateStatement(mysqlRequest, "", chatRoomId); + connect.close(); + } + + public void deleteGroups(Project project) { + String query ="DELETE gu FROM groupuser gu INNER JOIN groups g ON gu.groupId=g.id WHERE g.projectName = ?;"; + String query2="DELETE FROM groups WHERE projectName=?;"; + connect.connect(); + connect.issueInsertOrDeleteStatement(query, project.getName()); + connect.issueInsertOrDeleteStatement(query2, 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 ec10d90e4ac6f458e853ecf81507cb3f63d271c5..4c065f1f43f64e3c8be0dca1ce74c15205a8d9e0 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupView.java @@ -1,5 +1,8 @@ package unipotsdam.gf.modules.group; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; import unipotsdam.gf.modules.project.Management; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.project.ProjectDAO; @@ -14,6 +17,7 @@ import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; @Path("/group") public class GroupView { @@ -25,10 +29,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) @@ -81,20 +95,48 @@ public class GroupView { throw new WebApplicationException( "the groupfindingmechanism needs to be one of " + GroupFormationMechanism.values().toString()); } - } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/get/projects/{projectName}") + public List<Group> getGroups(@PathParam("projectName") String projectName) { + List<Group> result = groupfinding.getGroups(projectDAO.getProjectByName(projectName)); + return result; + } - + /** + * find out if this is used by learning goal + * @param projectName + * @param groups + */ + @Deprecated @POST @Consumes(MediaType.APPLICATION_JSON) @Path("/projects/{projectName}") public void saveGroups(@PathParam("projectName") String projectName, Group[] groups) { Project project = new Project(projectName); - groupfinding.persistGroups(Arrays.asList(groups), project); + groupFormationProcess.saveGroups(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); + groupFormationProcess.saveGroups(data.getGroups(), project); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/projects/{projectName}/groups/finalize") + public void finalizeGroups(@PathParam("projectName") String projectName) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { + 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..b0df88bbd61d735ac6abf1038b0bcf29bf1421a9 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupfindingImpl.java @@ -1,11 +1,17 @@ package unipotsdam.gf.modules.group; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.interfaces.ICommunication; 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 +19,12 @@ public class GroupfindingImpl implements IGroupFinding { @Inject private GroupDAO groupDAO; + @Inject + private UserDAO userDAO; + + @Inject + private ICommunication iCommunication; + @Inject public GroupfindingImpl(GroupDAO groupDAO) { this.groupDAO = groupDAO; @@ -24,6 +36,11 @@ public class GroupfindingImpl implements IGroupFinding { // } + @Override + public GroupFormationMechanism getGFM(Project project){ + return groupDAO.getGroupFormationMechanism(project); + } + @Override public void persistGroups(List<Group> groupComposition, Project project) { for (Group group : groupComposition) { @@ -60,4 +77,76 @@ public class GroupfindingImpl implements IGroupFinding { return participantsNeeded; } + + @Override + public void deleteGroups(Project project){ + groupDAO.deleteGroups(project); + } + + @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; + } + + /** + * after this groups should not be touched by the system + * @param project + */ + @Override + public void finalizeGroups(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException { + // create group chat rooms + List<Group> groups = getGroups(project); + for (Group group : groups) { + iCommunication.createChatRoom(group, false); + } + } + + // (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/group/ProfileDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileDAO.java new file mode 100644 index 0000000000000000000000000000000000000000..8e468e6f61317a5a81787b63a190da7063ca0a62 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileDAO.java @@ -0,0 +1,146 @@ +package unipotsdam.gf.modules.group; + +import unipotsdam.gf.mysql.MysqlConnect; +import unipotsdam.gf.mysql.VereinfachtesResultSet; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ProfileDAO { + @Inject + private MysqlConnect connect; + + /** + * helper function for persisting questions + * @param profileQuestion + * @return the id of the created question + */ + private int persistHelper(ProfileQuestion profileQuestion) { + + int result = -1; + connect.connect(); + + String query = "INSERT INTO profilequestions (`scaleSize`, `question`) values(?,?)"; + result = connect.issueInsertStatementWithAutoincrement(query, profileQuestion.getScaleSize(), + profileQuestion.getQuestion()); + + connect.close(); + + return result; + } + + /** + * persist questions with enumeration + * @param enumeratedProfileQuestion + */ + public void persist(EnumeratedProfileQuestion enumeratedProfileQuestion) { + int questionId = persistHelper(enumeratedProfileQuestion); + connect.connect(); + String query = "INSERT INTO profilequestionoptions (`profileQuestionId`, `name`) values (?,?)"; + List<String> options = enumeratedProfileQuestion.getOptions(); + for (String option : options) { + connect.issueInsertOrDeleteStatement(query, questionId, option); + } + connect.close(); + } + + /** + * persist questions with scale i.e. 1 to 5 + * @param scaledProfileQuestion + */ + public void persist(ScaledProfileQuestion scaledProfileQuestion) { + persistHelper(scaledProfileQuestion); + } + + /** + * persist an answer + * @param profileQuestionAnswer + */ + public void persist(ProfileQuestionAnswer profileQuestionAnswer) { + connect.connect(); + String query = + "INSERT INTO profilequestionanswer (`profileQuestionId`,`answerIndex`, `selectedAnswer`, " + "`userEmail` values (?,?,?,?)"; + connect.issueInsertOrDeleteStatement(query, profileQuestionAnswer.getQuestion().getId(), + profileQuestionAnswer.getAnswerIndex(), profileQuestionAnswer.getSelectedAnswer(), + profileQuestionAnswer.getUser().getEmail()); + } + + /** + * get all the questions + * @return + */ + public java.util.List<ProfileQuestion> getQuestions() { + ArrayList<ProfileQuestion> profileQuestions = new ArrayList<>(); + connect.connect(); + + String query = + "SELECT (q.id,q.scaleSize, q.question, o.name) from profilequestions q LEFT JOIN " + "profilequestionoptions o where q.id = o" + ".profileQuestionId group by q.id"; + VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query); + HashMap<Integer, ArrayList<String>> optionMap = new HashMap<>(); + List<ProfileQuestion> tmpList = new ArrayList<>(); + while (vereinfachtesResultSet.next()) { + String optionName = vereinfachtesResultSet.getString("name"); + int questionId = vereinfachtesResultSet.getInt("id"); + int scaleSize = vereinfachtesResultSet.getInt("scaleSize"); + String question = vereinfachtesResultSet.getString("question"); + if (optionName != null) { + if (optionMap.containsKey(optionName)) { + ArrayList<String> optionList = optionMap.get(optionName); + optionList.add(optionName); + optionMap.put(questionId, optionList); + } else { + ArrayList<String> optionList = new ArrayList<>(); + optionList.add(optionName); + optionMap.put(questionId, optionList); + } + } + tmpList.add(new ProfileQuestion(questionId, scaleSize, question)); + } + + for (ProfileQuestion question : tmpList) { + if (optionMap.containsKey(question.getId())) { + EnumeratedProfileQuestion enumeratedProfileQuestion = new EnumeratedProfileQuestion(); + enumeratedProfileQuestion.setScaleSize(question.getScaleSize()); + enumeratedProfileQuestion.setOptions(optionMap.get(question.getId())); + enumeratedProfileQuestion.setQuestion(question.getQuestion()); + profileQuestions.add(enumeratedProfileQuestion); + }else { + profileQuestions.add(question); + } + } + + connect.close(); + return profileQuestions; + } + + public List<ProfileQuestionRelation> getProfileRelations() { + ArrayList<ProfileQuestionRelation>questionRelations = new ArrayList<>(); + connect.connect(); + String query = "SELCT * from profilequestionrelations"; + VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query); + while (vereinfachtesResultSet.next()) { + int firstQuestionId = vereinfachtesResultSet.getInt("firstQuestionId"); + int secondQuestionId = vereinfachtesResultSet.getInt("secondQuestionId"); + String relation = vereinfachtesResultSet.getString("relation"); + + ProfileQuestion profileQuestion1 = new ProfileQuestion(firstQuestionId); + ProfileQuestion profileQuestion2 = new ProfileQuestion(secondQuestionId); + ProfileQuestionRelationType profileQuestionRelationType = ProfileQuestionRelationType.valueOf(relation); + questionRelations.add(new ProfileQuestionRelation(profileQuestion1, profileQuestion2, + profileQuestionRelationType)); + } + + connect.close(); + return questionRelations; + } + + public void persistProfileRelation(ProfileQuestion firstQuestion, ProfileQuestion secondQuestion) { + // TODO implement + connect.connect(); + + connect.close(); + } + +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestion.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestion.java new file mode 100644 index 0000000000000000000000000000000000000000..284014f8877032ebbc58facd36ebf6bf3610f8d1 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestion.java @@ -0,0 +1,46 @@ +package unipotsdam.gf.modules.group; + +public class ProfileQuestion { + private int id; + private int scaleSize; + private String question; + + public ProfileQuestion() { + } + + public ProfileQuestion(int id, int scaleSize, String question) { + this.id = id; + this.scaleSize = scaleSize; + this.question = question; + } + + public ProfileQuestion(int firstQuestionId) { + this.id= firstQuestionId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getScaleSize() { + return scaleSize; + } + + public void setScaleSize(int scaleSize) { + this.scaleSize = scaleSize; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + //pr +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionAnswer.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionAnswer.java new file mode 100644 index 0000000000000000000000000000000000000000..cdfe200c938d7d4bdeaba0f2c0ff61e7a7f0f7ba --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionAnswer.java @@ -0,0 +1,54 @@ +package unipotsdam.gf.modules.group; + +import unipotsdam.gf.modules.user.User; + +public class ProfileQuestionAnswer { + private ProfileQuestion question; + private Integer answerIndex; + // multiple is not implemented + private String selectedAnswer; + private User user; + + public ProfileQuestionAnswer( + ProfileQuestion question, Integer answerIndex, String selectedAnswer, User user) { + this.question = question; + this.answerIndex = answerIndex; + this.selectedAnswer = selectedAnswer; + this.user = user; + } + + public ProfileQuestionAnswer() { + } + + public ProfileQuestion getQuestion() { + return question; + } + + public void setQuestion(ProfileQuestion question) { + this.question = question; + } + + public Integer getAnswerIndex() { + return answerIndex; + } + + public void setAnswerIndex(Integer answerIndex) { + this.answerIndex = answerIndex; + } + + public String getSelectedAnswer() { + return selectedAnswer; + } + + public void setSelectedAnswer(String selectedAnswer) { + this.selectedAnswer = selectedAnswer; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionRelation.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionRelation.java new file mode 100644 index 0000000000000000000000000000000000000000..b067cc651a9a7ed8630529119d7611eb5c43ea36 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionRelation.java @@ -0,0 +1,43 @@ +package unipotsdam.gf.modules.group; + +public class ProfileQuestionRelation { + private ProfileQuestion profileQuestion1; + private ProfileQuestion getProfileQuestion2; + private ProfileQuestionRelationType profileQuestionRelationType; + + public ProfileQuestionRelation( + ProfileQuestion profileQuestion1, ProfileQuestion getProfileQuestion2, + ProfileQuestionRelationType profileQuestionRelationType) { + this.profileQuestion1 = profileQuestion1; + this.getProfileQuestion2 = getProfileQuestion2; + this.profileQuestionRelationType = profileQuestionRelationType; + } + + public ProfileQuestionRelation() { + } + + public ProfileQuestion getProfileQuestion1() { + return profileQuestion1; + } + + public void setProfileQuestion1(ProfileQuestion profileQuestion1) { + this.profileQuestion1 = profileQuestion1; + } + + public ProfileQuestion getGetProfileQuestion2() { + return getProfileQuestion2; + } + + public void setGetProfileQuestion2(ProfileQuestion getProfileQuestion2) { + this.getProfileQuestion2 = getProfileQuestion2; + } + + public ProfileQuestionRelationType getProfileQuestionRelationType() { + return profileQuestionRelationType; + } + + public void setProfileQuestionRelationType( + ProfileQuestionRelationType profileQuestionRelationType) { + this.profileQuestionRelationType = profileQuestionRelationType; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionRelationType.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionRelationType.java new file mode 100644 index 0000000000000000000000000000000000000000..7393a34ab11b372e5bc79037045adaa39f525609 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ProfileQuestionRelationType.java @@ -0,0 +1,17 @@ +package unipotsdam.gf.modules.group; + +/** + * This type indicates how groups are affected by the underlying variable of the item + * if it is homogenous, the groups can't have enough of it i.e. motivation + * + * If it is heteogenous, the groups should have contrasting members, i.e. more of a leader type but not too many + * alphas + * + * If it is nivelled, it is an attribute best avoided beause it could be mission critial, such as a depressed person. + * Here the groups should be greated in a way, that the problematic people are distributed in the groups + */ +public enum ProfileQuestionRelationType { + HOMOGENOUS, + HETEROGENOUS, + NIVELLED +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ScaledProfileQuestion.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ScaledProfileQuestion.java new file mode 100644 index 0000000000000000000000000000000000000000..5612a899ddee06c467cd523401e803748e2651a9 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/ScaledProfileQuestion.java @@ -0,0 +1,4 @@ +package unipotsdam.gf.modules.group; + +public class ScaledProfileQuestion extends ProfileQuestion { +} 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 de4ddbb6e7fe744450e98af3392d77d65f92850b..52a0203100f45e3b973f37fbc61233637ed9c728 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ManagementImpl.java @@ -74,7 +74,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/Project.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/Project.java index ecf2a19983f05e2836ee191f8a527254cbaa4f8f..058d9f97d3de00e961c183e78878767b9b2b362d 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/Project.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/Project.java @@ -22,6 +22,7 @@ public class Project { private String description; public Project() { + tags = new String[0]; } public Project(String name, String password, Boolean active, String author, String[] tags) { @@ -49,13 +50,17 @@ public class Project { this.description = description; } - public Project(String projectName, String password) { + public Project(String projectName, String authorEmail) { this.name = projectName; - this.password = password; + this.authorEmail = authorEmail; + this.active = true; + this.timecreated = System.currentTimeMillis(); + tags = new String[0]; } public Project(String projectName) { this.name = projectName; + this.active = true; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectDAO.java index 27d504b281a6c2a9e7e5d96cdcac343e4e7c1cb8..ee89b87810dfb6e36a3563db3f013ade0cc88a6a 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectDAO.java @@ -47,10 +47,11 @@ public class ProjectDAO { java.sql.Timestamp timestamp = new java.sql.Timestamp(project.getTimecreated()); connect.connect(); String mysqlRequest = - "INSERT INTO projects (`name`, `password`, `active`, `timecreated`, `author`, `phase`, `description`) values (?,?,?,?,?,?,?)"; + "INSERT INTO projects (`name`, `password`, `active`, `timecreated`, `author`, " + "`phase`) " + + "values (?,?,?,?,?,?,?)"; connect.issueInsertOrDeleteStatement(mysqlRequest, project.getName(), project.getPassword(), - project.isActive(), timestamp, project.getAuthorEmail(), - project.getPhase() == null ? Phase.CourseCreation : project.getPhase(), project.getDescription()); + project.isActive(), project.getTimecreated(), project.getAuthorEmail(), + project.getPhase() == null ? Phase.GroupFormation : project.getPhase()); connect.close(); @@ -75,6 +76,8 @@ public class ProjectDAO { String mysqlRequest = "DELETE FROM projects where name = (?)"; connect.issueInsertOrDeleteStatement(mysqlRequest, project.getName()); connect.close(); + // TODO: delete all groups of project? + } public Boolean exists(Project project) { 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 6397b96dce48acd70d655668a9be9c18402963e8..a3a4684d33e0cb82ce4db65fabb412d1abc4521b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/project/ProjectView.java @@ -3,8 +3,11 @@ package unipotsdam.gf.modules.project; import com.sun.org.apache.xpath.internal.operations.Bool; 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.session.GFContext; +import unipotsdam.gf.process.ProjectCreationProcess; import unipotsdam.gf.session.GFContexts; import javax.annotation.ManagedBean; @@ -39,7 +42,8 @@ public class ProjectView { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) @Path("/create") - public String createProject(@Context HttpServletRequest req, Project project) throws URISyntaxException, IOException { + public String createProject(@Context HttpServletRequest req, Project project) + throws IOException, RocketChatDownException, UserDoesNotExistInRocketChatException { String userEmail = gfContexts.getUserEmail(req); User user = iManagement.getUserByEmail(userEmail); assert user != null; @@ -52,7 +56,8 @@ public class ProjectView { @POST @Path("/delete/project/{projectName}") - public void deleteProject(@Context HttpServletRequest req, @PathParam("projectName") String projectName) throws URISyntaxException, IOException { + public void deleteProject(@Context HttpServletRequest req, @PathParam("projectName") String projectName) + throws URISyntaxException, IOException, RocketChatDownException, UserDoesNotExistInRocketChatException { String userEmail1 = gfContexts.getUserEmail(req); User user = iManagement.getUserByEmail(userEmail1); Boolean isStudent= user.getStudent(); @@ -79,31 +84,26 @@ public class ProjectView { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/all/student/{studentEmail}") - public List<Project> getProjectsStudent( + public java.util.List<Project> getProjectsStudent( @PathParam("studentEmail") String studentEmail) { return iManagement.getProjectsStudent(studentEmail); } - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("/all") - public List<Project> getAllProjects() { - return iManagement.getAllProjects(); - } @GET @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"; } @@ -124,5 +124,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 51e65716eb57ef4f3107547b5c7d983e5facddeb..4f578ce9e93b59b9c09abc52aca1e5e7eb61a63b 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/HiddenUserTag.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/HiddenUserTag.java index 836fd02959063f9bacc344ad6715286f645983e3..61e1e4afc5cf705bb654654fee6b5308b45caf10 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/HiddenUserTag.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/HiddenUserTag.java @@ -9,7 +9,7 @@ import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; /** - * implemented while porting the login page. It might be useful to have a hidden user field on the page in order to + * implemented while porting the register page. It might be useful to have a hidden user field on the page in order to * manipulate the user data with jquery */ @ManagedBean 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 fbacc36332744862c9a6a117014a34ce36b0375b..2a877f7d7e042e7f0465c1d0acde24daa7c80e9f 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/User.java @@ -1,5 +1,6 @@ package unipotsdam.gf.modules.user; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.Objects; @@ -13,38 +14,47 @@ public class User { private String name; private String password; private String email; - private String rocketChatAuthToken; - private String rocketChatId; + // the speaking name must unique in rocket chat + private String rocketChatUsername; + private Boolean isStudent; public User() { } - public User(String name, String password, String email, Boolean isStudent) { - this(name, password, email, "", "", isStudent); - } - public User(String name, String password, String email, String rocketChatAuthToken, String rocketChatId, Boolean isStudent) { + + public User(String name, String password, String email, String rocketChatUsername, Boolean isStudent) { this.name = name; this.password = password; this.email = email; - this.rocketChatAuthToken = rocketChatAuthToken; - this.rocketChatId = rocketChatId; - this.isStudent = isStudent; + this.rocketChatUsername = rocketChatUsername; + this.setStudent(isStudent); } + + public User(String authorEmail) { this.email = authorEmail; } - public String getName() { - return name; + public User(String name, String password, String email, Boolean isStudent) { + this.name = name; + this.password= password; + this.email = email; + this.isStudent = isStudent; } + public void setName(String name) { this.name = name; } + public String getName() { + return name; + } + + @JsonIgnore public String getPassword() { return password; } @@ -69,30 +79,25 @@ public class User { isStudent = student; } - public String getRocketChatId() { - return rocketChatId; - } - public void setRocketChatId(String rocketChatId) { - this.rocketChatId = rocketChatId; - } - public String getRocketChatAuthToken() { - return rocketChatAuthToken; + public String getRocketChatUsername() { + return rocketChatUsername; } - public void setRocketChatAuthToken(String rocketChatAuthToken) { - this.rocketChatAuthToken = rocketChatAuthToken; + public void setRocketChatUsername(String rocketChatUsername) { + this.rocketChatUsername = rocketChatUsername; } + + @Override public String toString() { return "User{" + "name='" + name + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + - ", rocketChatAuthToken='" + rocketChatAuthToken + '\'' + - ", rocketChatId='" + rocketChatId + '\'' + + ", rocketChatUsername='" + rocketChatUsername + '\'' + ", isStudent=" + isStudent + '}'; } @@ -102,11 +107,11 @@ public class User { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; - return Objects.equals(name, user.name) && - Objects.equals(password, user.password) && - Objects.equals(email, user.email) && - Objects.equals(rocketChatAuthToken, user.rocketChatAuthToken) && - Objects.equals(rocketChatId, user.rocketChatId) && - Objects.equals(isStudent, user.isStudent); + return Objects.equals(email, user.email) ; + } + + @Override + public int hashCode() { + return getEmail().hashCode(); } } 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 24f786511fb094bded2e5415682466d4cdc1f7f0..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,9 +29,10 @@ public class UserDAO { public void persist(User user, UserProfile profile) { connect.connect(); String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `isStudent`," + - "`rocketChatId`,`rocketChatAuthToken`) values (?,?,?,?,?,?)"; + "`rocketChatUsername`) " + + "values (?,?,?,?,?)"; connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(), - user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken()); + user.getStudent(),user.getRocketChatUsername()); connect.close(); // TODO implmement UserProfile @Mar } @@ -43,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 updateForUser 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.getRocketChatId(), user.getRocketChatAuthToken(), user.getEmail()); + connect.issueUpdateStatement(mysqlRequest, user.getRocketChatUsername(), user.getEmail()); connect.close(); } @@ -65,6 +63,18 @@ public class UserDAO { return result; } + public boolean existsByRocketChatUsername(String rocketChatUsername) { + connect.connect(); + String mysqlRequest = "SELECT * FROM users where rocketChatUsername = ?"; + VereinfachtesResultSet resultSet = connect.issueSelectStatement(mysqlRequest, rocketChatUsername); + if (resultSet == null) { + return false; + } + boolean result = resultSet.next(); + connect.close(); + return result; + } + public List<User> getUsersByProjectName(String projectName) { connect.connect(); String query = @@ -107,9 +117,6 @@ public class UserDAO { return getUserByField("email", email); } - public User getUserByToken(String token) { - return getUserByField("token", token); - } private User getUserByField(String field, String value) { connect.connect(); 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 f84848eed1543213c16bc52575fe392957eda8e3..b9b81e674dfb3d0d83d33cdc564008d94d1d2ed5 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/user/UserView.java @@ -1,9 +1,10 @@ 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; -import unipotsdam.gf.modules.communication.service.CommunicationDummyService; import javax.annotation.ManagedBean; import javax.inject.Inject; @@ -25,12 +26,18 @@ import java.net.URISyntaxException; @ManagedBean public class UserView { + @Inject private ICommunication communicationService; + + @Inject private UserDAO userDAO; @Inject private Management management; + @Inject + private ProjectCreationProcess projectCreationProcess; + @Inject public UserView(ICommunication communicationService, UserDAO userDAO, Management management) { this.communicationService = communicationService; @@ -57,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 login(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 * @@ -74,18 +106,25 @@ public class UserView { @POST @Produces(MediaType.TEXT_HTML) @Path("/exists") - public Response existsUser( + 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); - ICommunication iCommunication = new CommunicationDummyService(); - boolean isLoggedIn = iCommunication.loginUser(user); - if (isLoggedIn) { - return login(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 @@ -102,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 - */ - protected Response login(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.registerAndLoginUser(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; @@ -158,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()) { @@ -166,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 c26a91b6fb51d6c5786f91180dc6e81e2b5e8437..a289c669c5c442b0dae8ad0c87fae0a588454d9c 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java @@ -1,5 +1,8 @@ package unipotsdam.gf.process; +import unipotsdam.gf.exceptions.RocketChatDownException; +import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; +import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.interfaces.IGroupFinding; import unipotsdam.gf.interfaces.IPhases; import unipotsdam.gf.modules.group.Group; @@ -34,7 +37,6 @@ public class GroupFormationProcess { @Inject private IGroupFinding groupfinding; - public void setGroupFormationMechanism(GroupFormationMechanism groupFormationMechanism, Project project) { projectDAO.setGroupFormationMechanism(groupFormationMechanism, project); } @@ -55,7 +57,7 @@ public class GroupFormationProcess { * this method finalizes the groups * @param project */ - public void finalize(Project project) { + public void finalize(Project project) throws RocketChatDownException, UserDoesNotExistInRocketChatException { taskDAO.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation); /** * Gruppenphase wird beendet @@ -69,6 +71,9 @@ public class GroupFormationProcess { // Die Studierenden müssen nicht mehr auf die Gruppenfindung warten taskDAO.finishMemberTask(project, TaskName.WAITING_FOR_GROUP); taskDAO.persistMemberTask(project, TaskName.CONTACT_GROUP_MEMBERS, Phase.GroupFormation); + + //if the project is finalized create group chat room + groupfinding.finalizeGroups(project); } @@ -83,6 +88,5 @@ public class GroupFormationProcess { public void saveGroups(List<Group> groups,Project project){ groupfinding.deleteGroups(project); groupfinding.persistGroups(groups, project); - taskDAO.finishMemberTask(project, TaskName.WAIT_FOR_PARTICPANTS); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java index 6a4f30ebf195e6a6973a1aeadee9a6ea7fb324f5..35078a93ff5808b079a10305ca711961c1b67507 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java @@ -1,7 +1,10 @@ package unipotsdam.gf.process; +import unipotsdam.gf.exceptions.*; +import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.annotation.model.Category; import unipotsdam.gf.modules.assessment.AssessmentMechanism; +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 +16,11 @@ import unipotsdam.gf.process.phases.Phase; 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.util.HashMap; @@ -38,6 +43,11 @@ public class ProjectCreationProcess { @Inject private GroupDAO groupDAO; + @Inject + private ICommunication iCommunication; + + @Inject + private GFContexts gfContexts; /** * STEP 1 @@ -45,7 +55,8 @@ public class ProjectCreationProcess { * @param project which project is created * @param author who creates the project */ - public void createProject(Project project, User author) { + public void createProject(Project project, User author) + throws RocketChatDownException, UserDoesNotExistInRocketChatException { project.setAuthorEmail(author.getEmail()); try { iManagement.create(project); @@ -53,16 +64,10 @@ public class ProjectCreationProcess { throw new WebApplicationException("Project already exists"); } taskDao.createTaskWaitForParticipants(project, author); - HashMap<Phase, Boolean> phase = new HashMap<>(); - phase.put(project.getPhase(), true); - HashMap<Category, Boolean> category = new HashMap<>(); - category.put(Category.TITEL, true); - ProjectConfiguration projectConfiguration = new ProjectConfiguration( - phase, - category, - AssessmentMechanism.PEER_ASSESSMENT, //todo: its just a default by now. correct this - GroupFormationMechanism.SingleUser); //todo: its just a default by now. fix it - iManagement.create(projectConfiguration, project); + + // create chatromm + iCommunication.createEmptyChatRoom(project.getName(), false); + } /** @@ -71,7 +76,8 @@ public class ProjectCreationProcess { * @param project which project is entered * @param user who is participates the project */ - 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); @@ -93,13 +99,47 @@ public class ProjectCreationProcess { //phases.endPhase(Phase.GroupFormation, project); } } + 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); + } + + /* *//** * STEP N * * @param project the project to delete - */ + *//* public void deleteProject(Project project) { try { iManagement.delete(project); @@ -107,5 +147,5 @@ public class ProjectCreationProcess { throw new WebApplicationException("Project already exists"); } //taskDao.createTaskWaitForParticipants(project, author); - } + }*/ } 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 3cd85a226e0fedf55d36040627055b037b6d5210..992d97837f02e7f1b7334c699820a4ff88c73233 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java @@ -1,6 +1,7 @@ package unipotsdam.gf.process.tasks; import unipotsdam.gf.interfaces.IGroupFinding; +import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.project.ProjectDAO; import unipotsdam.gf.modules.submission.controller.SubmissionController; @@ -15,6 +16,8 @@ import javax.annotation.ManagedBean; import javax.inject.Inject; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.Comparator; import java.util.List; @@ -95,7 +98,14 @@ public class TaskDAO { project.setName(vereinfachtesResultSet.getString("projectName")); ParticipantsCount participantsCount = projectDAO.getParticipantCount(project); participantsCount.setParticipantsNeeded(groupFinding.getMinNumberOfStudentsNeeded(project)); - task.setTaskData(participantsCount); + Map<String, Object> taskData = new HashMap<>(); + taskData.put("participantCount", participantsCount); + GroupFormationMechanism gfm =groupFinding.getGFM(project); + taskData.put("gfm", gfm); + task.setTaskData(taskData); + if (gfm.equals(GroupFormationMechanism.Manual)){ + task.setTaskType(TaskType.LINKED); + } task.setHasRenderModel(true); return task; } @@ -303,7 +313,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 1c4f46a42c6c2539c67e2779f702c079625acb3f..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; @@ -14,6 +15,10 @@ public class GFContexts { public static final String USEREMAIL = "userEmail"; public static final String PROJECTNAME = "projectName"; + public static final String ROCKETCHATAUTHTOKEN = "rocketchatauthtoken"; + public static final String ROCKETCHATID = "rocketchatid"; + + public String getUserEmail(HttpServletRequest req) throws IOException { Object userEmail = req.getSession().getAttribute(GFContexts.USEREMAIL); if (userEmail == null) { @@ -27,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/session/SessionExistsFilter.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/session/SessionExistsFilter.java index 52afe707398ca028c6dfc9f0b17db023f47fe24f..16c4db2eb668a1e81ce4746410953b340a497df6 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/session/SessionExistsFilter.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/session/SessionExistsFilter.java @@ -52,8 +52,8 @@ public class SessionExistsFilter implements Filter { Object attribute = request1.getSession().getAttribute(GFContexts.USEREMAIL); if (attribute == null) { - //redirectToLogin(request, response); - request1.getSession().setAttribute(GFContexts.USEREMAIL, attribute); + redirectToLogin(request, response); + //request1.getSession().setAttribute(GFContexts.USEREMAIL, "vodkas@yolo.com"); chain.doFilter(request,response); } else { final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java new file mode 100644 index 0000000000000000000000000000000000000000..09f624f0e549884b855ca921748647de9050223b --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java @@ -0,0 +1,99 @@ +package unipotsdam.gf.taglibs; + +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +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; +import unipotsdam.gf.session.GFContexts; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.PageContext; +import javax.servlet.jsp.tagext.SimpleTagSupport; +import java.io.IOException; + +public class ChatWindow extends SimpleTagSupport { + + private static final Logger log = LoggerFactory.getLogger(ChatWindow.class); + + private String orientation; + + private String scope; + + @Inject + private ICommunication communicationService; + + public void doTag() throws IOException { + + final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); + locator.inject(this); + + PageContext pageContext = (PageContext) getJspContext(); + HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); + /*String token = request.getParameter("token"); */ + String projectName = request.getParameter("projectName"); + String userEmail = request.getSession().getAttribute(GFContexts.USEREMAIL).toString(); + + /** + * create project chatroom + */ + if (getScope() == "project") { + String chatRoomLink = communicationService.getProjectChatRoomLink(projectName); + writeIframe(request, chatRoomLink); + /** + * create group chatroom + */ + } else { + // scope is group + String projectChatRoomLink = null; + try { + projectChatRoomLink = communicationService.getChatRoomLink(userEmail, projectName); + } catch (RocketChatDownException e) { + e.printStackTrace(); + } catch (UserDoesNotExistInRocketChatException e) { + e.printStackTrace(); + } + if (projectChatRoomLink != null) { + writeIframe(request, projectChatRoomLink); + } + } + + } + + private void writeIframe(HttpServletRequest request, String chatRoomLink) throws + IOException { + String getAuthToken = request.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN).toString(); + String getId = request.getSession().getAttribute(GFContexts.ROCKETCHATID).toString(); + JspWriter out = getJspContext().getOut(); + + log.debug("chatroom links for ChatWindow: {}", chatRoomLink); + + out.println("<iframe height=\"400px\" src=\"" + chatRoomLink + "\">"); + out.println("</iframe>"); + + } + + public void setOrientation(String orientation) { + this.orientation = orientation; + } + + public String getOrientation() { + return orientation; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getScope() { + return scope; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java index 4d0cf6ba5ff5c16f2b8db19ce57703cfd0cca2c7..ec7d9e929cae335f0f00040014a2897f7bd27ed2 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/util/ResultSetUtil.java @@ -1,7 +1,7 @@ package unipotsdam.gf.util; -import unipotsdam.gf.mysql.VereinfachtesResultSet; import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.mysql.VereinfachtesResultSet; public class ResultSetUtil { @@ -9,9 +9,8 @@ public class ResultSetUtil { String name = vereinfachtesResultSet.getString("name"); String password = vereinfachtesResultSet.getString("password"); String email = vereinfachtesResultSet.getString("email"); - String rocketChatId = "";//vereinfachtesResultSet.getString("rocketChatId"); - String rocketChatAuthToken = "";//vereinfachtesResultSet.getString("rocketChatAuthToken"); + String rocketChatUserName = vereinfachtesResultSet.getString("rocketChatUserName"); Boolean isStudent = vereinfachtesResultSet.getBoolean("isStudent"); - return new User(name, password, email, rocketChatId, rocketChatAuthToken, isStudent); + return new User(name, password, email, rocketChatUserName, isStudent); } } diff --git a/gemeinsamforschen/src/main/webapp/project/js/create-project.js b/gemeinsamforschen/src/main/webapp/project/js/create-project.js index 3560647017df66dd62c03a557a60af6287ca4438..27a0cef1c9ea7776cef2d21fc43d905b97ccce11 100644 --- a/gemeinsamforschen/src/main/webapp/project/js/create-project.js +++ b/gemeinsamforschen/src/main/webapp/project/js/create-project.js @@ -1,5 +1,6 @@ let allTheTags = []; let projectName = ""; +var gfm = ""; /** * Created by fides-WHK on 19.02.2018. @@ -38,12 +39,11 @@ function createNewProject(allTheTags, activ) { if (allTheTags.length !== 5) { $('#exactNumberOfTags').show(); } else { - createProjectinCompbase(); - location.href="tasks-student.jsp?projectName="+projectName; + sendGroupPreferences(); } } }, - error: function (a) { + error: function (a, b, c) { console.log(a); return true; } @@ -68,7 +68,7 @@ function initTagsInput(allTheTags) { onAddTag: function (tag) { allTheTags.push(tag); }, - onRemoveTag: function () { + onRemoveTag: function (tag) { allTheTags.pop(); //todo: löscht noch nicht den gewählten tag sondern den letzten } }); @@ -86,6 +86,10 @@ function initSendButton(allTheTags) { function getProjectValues() { projectName = $("#nameProject").val().trim(); let password = $("#passwordProject").val().trim(); + let adminPassword = $("#adminPassword").val().trim(); + if (adminPassword === "") { + adminPassword = "1234"; + } //allTheTags = $("#tagsProject").tagsInput('items'); //allTheTags = $("#tagsProject").val(); let reguexp = /^[a-zA-Z0-9äüöÄÜÖ]+$/; @@ -114,6 +118,8 @@ function getProjectValues() { "password" : password, "description": description, "active" : true, + "adminPassword": adminPassword, + "phase" : "GroupFormation", "timecreated" : time, "authorEmail": $('#userEmail').text().trim(), "phase" : "CourseCreation", @@ -140,7 +146,7 @@ function createProjectinCompbase() { success: function (response) { console.log(response); // it actually worked, too - sendGroupPreferences(); + document.location.href = "tasks-docent.jsp?projectName="+projectName; }, error: function (a) { console.log(a); @@ -149,3 +155,37 @@ function createProjectinCompbase() { } }); } + + +function sendGroupPreferences() { + gfm = $('input[name=gfm]:checked').val(); + if (gfm == "Basierend auf Präferenzen") { + // TODO implement preference based group selection + gfm = "UserProfilStrategy"; + } else if (gfm == "per Hand") { + gfm = "Manual"; + } else if (gfm == "Basierend auf Lernzielen") { + gfm = "LearningGoalStrategy"; + } else if(gfm == "Keine Gruppen") { + gfm = "SingleUser"; + } + + var localurl = "../../gemeinsamforschen/rest/group/gfm/create/projects/" + projectName; + $.ajax({ + gfm: gfm, + url: localurl, + contentType: 'application/json', + type: 'POST', + data: gfm, + success: function (a, b, c) { + if (gfm == "LearningGoalStrategy") { + createProjectinCompbase(); + } + document.location.href = "tasks-docent.jsp?projectName="+projectName; + return true; + }, + error: function (a, b, c) { + return false; + } + }); +} diff --git a/gemeinsamforschen/src/main/webapp/project/overview-student.jsp b/gemeinsamforschen/src/main/webapp/project/overview-student.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp b/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp index 8817b33e437a0bae90c8f32a72b4e595e3a0d11a..c13ff10484c3a680e2758bc5a33ad05415cd979c 100644 --- a/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp +++ b/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp @@ -10,6 +10,8 @@ <%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="headLine" %> <%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="omniDependencies" %> <%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="footer" %> +<%@ taglib uri="../taglibs/gemeinsamForschen.tld" prefix="chat" %> + <!DOCTYPE html> <html lang="de"> <head> @@ -50,9 +52,8 @@ </div> </div> - - </script> + <script id="finishedTaskTemplate" type="text/x-jQuery-tmpl"> <div class="card ${phase}"> <div class="card-finished"><h4 class="icon closed">${infoText}</h4> @@ -60,6 +61,10 @@ </div> </div> </script> + +<chat:chatWindow orientation="right" scope="project"></chat:chatWindow> +<chat:chatWindow orientation="right" scope="group"></chat:chatWindow> + <footer:footer/> </body> diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/group/ProfileDAOTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/group/ProfileDAOTest.java new file mode 100644 index 0000000000000000000000000000000000000000..57ae0fb2a1b5d18fb4f2886c096d7349e1432888 --- /dev/null +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/context/group/ProfileDAOTest.java @@ -0,0 +1,41 @@ +package unipotsdam.gf.core.context.group; + +import ch.vorburger.exec.ManagedProcessException; +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +import org.junit.Before; +import org.junit.Test; +import unipotsdam.gf.core.database.TestGFApplicationBinder; +import unipotsdam.gf.core.database.UpdateDB; +import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.user.User; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class ProfileDAOTest { + @Before + public void setUp() throws IOException, SQLException, ManagedProcessException { + final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder()); + //final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); + locator.inject(this); + + UpdateDB.updateTestDB(); + } + + @Test + public void testCreate() { + + } + + @Test + public void testDelete() { + + } + + +} 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/InMemoryMySqlConnect.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java index 0919b1232b4221dd880bcf37a2a0d885866b1703..e0b8ce48eb2e4789e645304a99b743efa79e052e 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/InMemoryMySqlConnect.java @@ -41,6 +41,17 @@ public class InMemoryMySqlConnect extends MysqlConnectImpl { } + @Override + public void connect() { + // + if (conn == null) { + try { + conn = getConnection(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } @Override public void close() { diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/MysqlTestConnect.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/MysqlTestConnect.java index 62a10bfa5b174eefa38efa5498305712e8ea1716..50a53a86c32b03ef28abd8c502dad2dc4439cbb0 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/MysqlTestConnect.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/MysqlTestConnect.java @@ -13,7 +13,8 @@ public class MysqlTestConnect extends MysqlConnectImpl { private static String createConnectionString() { String connString = - "jdbc:mysql://" + "localhost" + "/" + GFDatabaseConfig.DB_NAME + "?user=" + GFDatabaseConfig.USER + "&password=" + GFDatabaseConfig.PASS; + "jdbc:mysql://" + "localhost" + "/" + GFDatabaseConfig.TEST_DB_NAME + "?user=" + GFDatabaseConfig.USER + + "&password=" + GFDatabaseConfig.PASS; return String.format(connString, "fltrail_test"); } 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 35189bdbd2c59b80445e895da3c3d4de7c6d1b14..2485150f96f9b225170ec9aa4cd2a1074993c9f9 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/database/UpdateDB.java @@ -16,7 +16,8 @@ public class UpdateDB { private boolean stopOnError; private boolean autoCommit; - private PrintWriter logWriter = new PrintWriter(System.out); + //private PrintWriter logWriter = new PrintWriter(System.out); + private PrintWriter logWriter = null; private PrintWriter errorLogWriter = new PrintWriter(System.err); private String delimiter = DEFAULT_DELIMITER; @@ -29,8 +30,20 @@ public class UpdateDB { UpdateDB updateDB = new UpdateDB(connection, true, false); 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 { + MysqlConnect mysqlConnect = new MysqlTestConnect(); + Connection connection = mysqlConnect.getConnection(); + + UpdateDB updateDB = new UpdateDB(connection, true, false); + System.out.println(new java.io.File( "." ).getCanonicalPath()); + updateDB.runScript(new FileReader("src/test/resources/database/test_db.sql")); + updateDB.runScript(new FileReader("src/test/resources/database/fltrail.sql")); + //updateDB.runScript(new FileReader("src/test/resources/database/testuser.sql")); } public UpdateDB(Connection connection, boolean stopOnError, boolean autoCommit) { diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java index bda296be063d25b06930e3fe95136b7385519e5a..d79b7fdbeead1091a242fa8dc53af73d63c0e59a 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java @@ -111,7 +111,7 @@ public class ActivityFlowTest { formGroups(); // end first phase - phases.endPhase(Phase.CourseCreation, project); + phases.endPhase(Phase.GroupFormation, project); // upload dossiers uploadDossiers(); diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java index 5928380b42700142cedd858b6e7c7c202652cf59..2f3f29b3f834f30f5a92cd20768b451abe9a2bd2 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/PhaseTest.java @@ -48,12 +48,7 @@ public class PhaseTest { management.register(user, project, null); } - @Test - public void phase1() { - Project project = new Project(); - project.setName(projectName); - phases.endPhase(Phase.CourseCreation, project); - } + @Test public void phase2() { diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationDummyServiceTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationDummyServiceTest.java deleted file mode 100644 index 6c6e0577b2c756e3841a38d76f8d5b3d29e14218..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationDummyServiceTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package unipotsdam.gf.modules.communication.service; - -import org.junit.Before; -import org.junit.Test; -import unipotsdam.gf.modules.user.User; -import unipotsdam.gf.interfaces.ICommunication; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -public class CommunicationDummyServiceTest { - - private ICommunication iCommunication; - private User user; - - @Before - public void setUp() { - iCommunication = new CommunicationDummyService(); - user = new User("name", "password", "email", true); - } - - @Test - public void loginUser() { - boolean isLoggedIn = iCommunication.loginUser(user); - assertNotNull(user.getRocketChatId()); - assertNotNull(user.getRocketChatAuthToken()); - assertTrue(isLoggedIn); - } - - @Test - public void registerUser() { - boolean userCreated = iCommunication.registerUser(user); - assertNotNull(user.getRocketChatId()); - assertNull(user.getRocketChatAuthToken()); - assertTrue(userCreated); - } -} 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 new file mode 100644 index 0000000000000000000000000000000000000000..73e2b7c1db641c471305858d1f7fa18656523148 --- /dev/null +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationServiceTest.java @@ -0,0 +1,317 @@ +package unipotsdam.gf.modules.communication.service; + +import ch.vorburger.exec.ManagedProcessException; +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +import org.junit.*; +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.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.group.Group; +import unipotsdam.gf.modules.group.GroupDAO; +import unipotsdam.gf.modules.project.Management; +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.modules.project.ProjectDAO; +import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.modules.user.UserDAO; +import unipotsdam.gf.modules.user.UserProfile; +import unipotsdam.gf.process.constraints.Constraints; +import unipotsdam.gf.process.constraints.ConstraintsMessages; + +import javax.inject.Inject; +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static unipotsdam.gf.config.GFRocketChatConfig.ADMIN_USER; +import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_ROOM_LINK; +import static unipotsdam.gf.config.GFRocketChatConfig.TEST_USER; + +public class CommunicationServiceTest { + + @Inject + private ICommunication iCommunication; + + private User user; + + @Inject + private GroupDAO groupDAO; + + @Inject + private UserDAO userDAO; + + @Inject + private ProjectDAO projectDAO; + + private List<String> createdChatRooms; + + @Inject + Management management; + + + @BeforeClass + public static void init() throws IOException, SQLException, ManagedProcessException { + //UpdateDB.updateTestDB(); + } + + @Before + public void setUp() { + + //final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder()); + final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); + locator.inject(this); + + user = new User("Vorname Nachname", "password", "email@uni.de", true); + userDAO.persist(user, null); + + createdChatRooms = new ArrayList<>(); + + } + + @After + public void tearDown() { + createdChatRooms.forEach(createdChatRoom -> { + try { + iCommunication.deleteChatRoom(createdChatRoom); + } catch (RocketChatDownException e) { + e.printStackTrace(); + } catch (UserDoesNotExistInRocketChatException e) { + e.printStackTrace(); + } + }); + createdChatRooms.clear(); + + + } + + @Test + public void loginUser() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + assertNotNull(iCommunication.loginUser(TEST_USER)); + assertTrue(!TEST_USER.getRocketChatAuthToken().isEmpty()); + assertTrue(!TEST_USER.getRocketChatUserId().isEmpty()); + + User falseLoginUser = new User("name", "password", "email", true); + assertNotNull(iCommunication.loginUser(falseLoginUser)); + } + + + @Ignore + @Test + 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); + } + + @Test + public void createEmptyChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String chatRoom = iCommunication.createEmptyChatRoom("Test", false); + assertNotNull(chatRoom); + assertFalse(chatRoom.isEmpty()); + assertTrue(iCommunication.exists(chatRoom)); + + + String chatRoomReadOnly = iCommunication.createEmptyChatRoom("Test2", true); + assertNotNull(chatRoomReadOnly); + assertFalse(chatRoomReadOnly.isEmpty()); + assertTrue(iCommunication.exists(chatRoomReadOnly)); + + createdChatRooms.addAll(Arrays.asList(chatRoom, chatRoomReadOnly)); + } + + @Test + public void createChatRoomWithUser() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + List<User> userList = Arrays.asList(ADMIN_USER, TEST_USER); + String chatRoom = iCommunication.createChatRoom("ChatWithUser", false, userList); + + assertNotNull(chatRoom); + assertFalse(chatRoom.isEmpty()); + assertTrue(iCommunication.exists(chatRoom)); + + createdChatRooms.add(chatRoom); + } + + @Test + public void createChatRoomWithGroup() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + Group group = new Group(); + group.setMembers(Collections.singletonList(ADMIN_USER)); + group.setProjectName("chatWithGroup"); + boolean successful = iCommunication.createChatRoom(group, false); + assertTrue(successful); + createdChatRooms.add(group.getChatRoomId()); + } + + @Test + public void getChatRoomName() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String expectedChatRoomName = "ChatRoomName"; + String chatRoomId = iCommunication.createEmptyChatRoom(expectedChatRoomName, false); + assertNotNull(chatRoomId); + assertFalse(chatRoomId.isEmpty()); + + String actualChatRoomName = iCommunication.getChatRoomName(chatRoomId); + assertEquals(expectedChatRoomName, actualChatRoomName); + + String nonExistingChatRoomName = iCommunication.getChatRoomName("1"); + assertTrue(nonExistingChatRoomName.isEmpty()); + + createdChatRooms.add(chatRoomId); + } + + @Test + public void getChatRoomLink() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String projectId = "Projekt"; + Project project = new Project(projectId, user.getEmail()); + projectDAO.persist(project); + + Group group = new Group(); + userDAO.persist(ADMIN_USER, new UserProfile()); + group.setProjectName(projectId); + group.setMembers(Collections.singletonList(ADMIN_USER)); + groupDAO.persist(group); + iCommunication.createChatRoom(group, false); + groupDAO.update(group); + + String chatRoomLink = iCommunication.getChatRoomLink(ADMIN_USER.getEmail(), projectId); + assertNotNull(chatRoomLink); + assertFalse(chatRoomLink.isEmpty()); + String expectedUrl = ROCKET_CHAT_ROOM_LINK + projectId + "-" + group.getId() + "?layout=embedded"; + assertEquals(expectedUrl, chatRoomLink); + + createdChatRooms.add(group.getChatRoomId()); + + } + + @Test + public void exists() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String expectedChatRoomName = "ChatRoomName"; + String chatRoomId = iCommunication.createEmptyChatRoom(expectedChatRoomName, false); + assertNotNull(chatRoomId); + assertFalse(chatRoomId.isEmpty()); + + assertTrue(iCommunication.exists(chatRoomId)); + assertFalse(iCommunication.exists("1")); + + createdChatRooms.add(chatRoomId); + } + + @Test + public void addUserToChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String chatRoomId = iCommunication.createEmptyChatRoom("addUser", false); + assertNotNull(chatRoomId); + assertFalse(chatRoomId.isEmpty()); + + assertTrue(iCommunication.addUserToChatRoom(TEST_USER, chatRoomId)); + + createdChatRooms.add(chatRoomId); + } + + @Test + public void removeUserFromChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String chatRoomId = iCommunication.createEmptyChatRoom("removeUser", false); + assertNotNull(chatRoomId); + assertFalse(chatRoomId.isEmpty()); + + assertTrue(iCommunication.addUserToChatRoom(TEST_USER, chatRoomId)); + + assertTrue(iCommunication.removeUserFromChatRoom(TEST_USER, chatRoomId)); + + createdChatRooms.add(chatRoomId); + } + + @Test + public void deleteChatRoom() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + String chatRoomId = iCommunication.createEmptyChatRoom("deleteChatRoom", false); + assertNotNull(chatRoomId); + assertFalse(chatRoomId.isEmpty()); + assertTrue(iCommunication.exists(chatRoomId)); + + assertTrue(iCommunication.deleteChatRoom(chatRoomId)); + assertFalse(iCommunication.exists(chatRoomId)); + } + + @Test + @Ignore + public void sendSingleMessage() { + User user = new User(); + // Permalink for email-address: http://www.trashmail.de/index.php?search=javatest + user.setEmail("javatest@trashmail.de"); + EMailMessage eMailMessage = new EMailMessage(); + eMailMessage.setSubject("Test Email"); + eMailMessage.setBody("Test Body"); + + iCommunication.sendSingleMessage(eMailMessage, user); + } + + @Test + @Ignore + public void informAboutMissingTasks() { + HashMap<StudentIdentifier, ConstraintsMessages> tasks = new HashMap<>(); + Project project = new Project(); + String projectId = "Projekt"; + project.setName(projectId); + StudentIdentifier studentIdentifier = new StudentIdentifier(); + studentIdentifier.setProjectName(projectId); + // Permalink for email-address: http://www.trashmail.de/index.php?search=javatest + studentIdentifier.setUserEmail("javatest@trashmail.de"); + ConstraintsMessages constraintsMessages = new ConstraintsMessages(Constraints.QuizCount, studentIdentifier); + tasks.put(studentIdentifier, constraintsMessages); + boolean successful = iCommunication.informAboutMissingTasks(tasks, project); + assertTrue(successful); + } + + @Test + @Ignore + public void createTestData() throws RocketChatDownException, UserDoesNotExistInRocketChatException { + User user = new User(); + user.setName("Martin Nachname"); + user.setPassword("test1234"); + user.setEmail("martin@test.com"); + user.setStudent(true); + + userDAO.persist(user, null); + + + /* try { + userService.register(true, user); + } catch (URISyntaxException e) { + Assert.fail(); + }*/ + assertTrue(userDAO.exists(user)); + + PodamFactory podamFactory = new PodamFactoryImpl(); + Project project = podamFactory.manufacturePojo(Project.class); + // for the dummy data on website + String projectId = "gemeinsamForschen"; + project.setName(projectId); + projectDAO.persist(project); + assertTrue(projectDAO.exists(project)); + + management.register(user, project, null); + + Group group = new Group(); + group.setProjectName(projectId); + group.setMembers(Collections.singletonList(user)); + groupDAO.persist(group); + assertTrue(groupDAO.exists(group)); + + boolean success = iCommunication.createChatRoom(group, false); + assertTrue(success); + } +} diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/SampleServiceTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/SampleServiceTest.java deleted file mode 100644 index e510a60cc1682b78b89721be660fe320cd093f51..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/SampleServiceTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package unipotsdam.gf.modules.communication.service; - - -import org.junit.Test; -import unipotsdam.gf.modules.communication.model.SampleAnswer; - -import static org.junit.Assert.assertEquals; - - -public class SampleServiceTest { - - @Test - public void returnCorrectMessage() { - SampleService sampleService = new SampleService(); - SampleAnswer sampleAnswer = sampleService.provideSampleAnswer("test"); - - assertEquals(sampleAnswer.getAnswer(), "Hello test"); - } -} diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/groupfinding/dummy/service/DummyProjectCreationServiceTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/groupfinding/dummy/service/DummyProjectCreationServiceTest.java deleted file mode 100644 index 04d3cab09c581f720baed4729fdbd876a0bd8f3e..0000000000000000000000000000000000000000 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/groupfinding/dummy/service/DummyProjectCreationServiceTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package unipotsdam.gf.modules.groupfinding.dummy.service; - -import org.glassfish.hk2.api.ServiceLocator; -import org.glassfish.hk2.utilities.ServiceLocatorUtilities; -import org.junit.Before; -import org.junit.Test; -import uk.co.jemos.podam.api.PodamFactory; -import uk.co.jemos.podam.api.PodamFactoryImpl; -import unipotsdam.gf.core.database.InMemoryMySqlConnect; -import unipotsdam.gf.core.database.TestGFApplicationBinder; -import unipotsdam.gf.modules.group.DummyProjectCreationService; -import unipotsdam.gf.modules.project.Management; -import unipotsdam.gf.modules.group.Group; -import unipotsdam.gf.modules.project.Project; -import unipotsdam.gf.modules.project.ProjectDAO; -import unipotsdam.gf.modules.user.User; -import unipotsdam.gf.modules.user.UserDAO; -import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.communication.service.CommunicationDummyService; -import unipotsdam.gf.modules.group.GroupDAO; - -import javax.inject.Inject; -import java.util.List; - -import static org.junit.Assert.assertTrue; - -public class DummyProjectCreationServiceTest { - - static PodamFactory factory = new PodamFactoryImpl(); - - - @Inject - private UserDAO userDAO; - - @Inject - private Management management; - - @Before - public void setUp() { - final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestGFApplicationBinder()); - //final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); - locator.inject(this); - - } - - - @Test - public void testCreateExampleProject() { - ICommunication communication = new CommunicationDummyService(); - InMemoryMySqlConnect inMemoryMySqlConnect = new InMemoryMySqlConnect(); - GroupDAO groupDAO = new GroupDAO(inMemoryMySqlConnect); - - DummyProjectCreationService - dummyProjectCreationService = new DummyProjectCreationService(communication, management, groupDAO, userDAO); - - dummyProjectCreationService.createExampleProject(); - - User docentUser = dummyProjectCreationService.getDocentUser(); - assertTrue(userDAO.exists(docentUser)); - - ProjectDAO projectDAO = new ProjectDAO(inMemoryMySqlConnect); - Project project = factory.manufacturePojo(Project.class); - assertTrue(projectDAO.exists(project)); - - List<Group> dummyGroups = dummyProjectCreationService.createDummyGroups(project.getName()); - dummyGroups.forEach(group -> group.setChatRoomId("1")); - dummyGroups.forEach(group -> { - assertTrue(groupDAO.exists(group)); - group.getMembers().forEach(user -> assertTrue(userDAO.exists(user))); - }); - } -} 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/db.sql b/gemeinsamforschen/src/test/resources/database/db.sql new file mode 100644 index 0000000000000000000000000000000000000000..5077fdd31903acb5e37a871746300826b8c2abe1 --- /dev/null +++ b/gemeinsamforschen/src/test/resources/database/db.sql @@ -0,0 +1,9 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +SET time_zone = "+00:00"; + +DROP DATABASE `fltrail`; +CREATE DATABASE IF NOT EXISTS `fltrail` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; + +USE `fltrail`; \ No newline at end of file diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql index 87e750a6749fde78f407f1d2895d54d0b2bfaa2d..8a3f7ab978e518860f72109d7b87930d09afe0c6 100644 --- a/gemeinsamforschen/src/test/resources/database/fltrail.sql +++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql @@ -1,18 +1,7 @@ -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -SET AUTOCOMMIT = 0; -START TRANSACTION; -SET time_zone = "+00:00"; - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; - - 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, @@ -72,6 +61,7 @@ CREATE TABLE `groups` ( `id` int(11) NOT NULL, `projectName` varchar(200) NOT NULL, `chatRoomId` varchar(400) NOT NULL + `name` varchar(255) NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `groupuser` ( @@ -96,16 +86,20 @@ CREATE TABLE `phasesselected` ( CREATE TABLE `projects` ( `name` varchar(100) NOT NULL, + `password` varchar(400) DEFAULT '', + `active` tinyint(1) NOT NULL DEFAULT true, + `timecreated` mediumtext, `password` varchar(400) NOT NULL, `active` tinyint(1) NOT NULL, `timecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `author` varchar(100) NOT NULL, - `phase` varchar(400) NOT NULL + `adminPassword` varchar(400), + `phase` varchar(400) NOT NULL DEFAULT 'GroupFormation' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 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` ( @@ -126,7 +120,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; @@ -137,7 +131,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, @@ -152,12 +146,11 @@ CREATE TABLE `tasks` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `users` ( - `name` varchar(100) NOT NULL, - `password` varchar(200) NOT NULL, - `email` varchar(255) NOT NULL, - `rocketChatId` varchar(400) NOT NULL, - `rocketChatAuthToken` varchar(800) NOT NULL, - `isStudent` tinyint(1) DEFAULT '1' + `name` varchar(100) NOT NULL, + `password` varchar(200) NOT NULL, + `email` varchar(255) NOT NULL, + `rocketChatUserName` varchar(400), + `isStudent` tinyint(1) DEFAULT '1' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `workrating` ( @@ -172,6 +165,12 @@ CREATE TABLE `workrating` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE submissionuser +( + submissionId varchar(400), + userEmail varchar(255) +); + ALTER TABLE `annotations` ADD PRIMARY KEY (`id`), ADD KEY `annotations_fullsubmissions_id_fk` (`targetId`); @@ -276,8 +275,8 @@ ALTER TABLE `groups` ADD CONSTRAINT `groups_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; 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 `phasesselected` ADD CONSTRAINT `phasesselected_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; @@ -286,6 +285,8 @@ 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`) ON DELETE CASCADE, + ADD CONSTRAINT `projectuser_ibfk_2` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE; ADD CONSTRAINT `projectuser_ibfk_1` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`), ADD CONSTRAINT `projectuser_ibfk_2` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; @@ -299,6 +300,75 @@ ALTER TABLE `workrating` ADD CONSTRAINT `workrating_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; COMMIT; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +CREATE UNIQUE INDEX fullsubmissions_user_projectName_uindex ON fullsubmissions (user, projectName); + +CREATE UNIQUE INDEX tasks_userEmail_projectName_taskName_uindex ON tasks (userEmail, projectName, taskName); + +CREATE TABLE profilequestions +( + id int PRIMARY KEY AUTO_INCREMENT, + scaleSize int, + question varchar(500) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE profilequestionoptions +( + id int PRIMARY KEY AUTO_INCREMENT, + profileQuestionId int, + name varchar (255) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE profilequestionanswer +( + profileQuestionId int, + answerIndex int, + selectedAnswer varchar(255) not null, + userEmail varchar(255) not null, + CONSTRAINT profilequestionanswer_profilequestions_id_fk FOREIGN KEY (profileQuestionId) + REFERENCES profilequestions(id), + CONSTRAINT profilequestionanswer_user_email_fk FOREIGN KEY (userEmail) + REFERENCES users(email) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE profilequestionrelations +( + firstQuestionId int, + secondQuestionId int, + relation varchar(200), + CONSTRAINT profilequestionrelations_profilequestions_id_fk FOREIGN KEY (firstQuestionId) REFERENCES profilequestions (id), + CONSTRAINT profilequestionrelations_profilequestions2_id_fk FOREIGN KEY (secondQuestionId) REFERENCES profilequestions (id) +); + +ALTER TABLE profilequestionrelations COMMENT = 'This indicates if a profile question leads to homogenity in groups'; +ALTER TABLE annotations COMMENT = 'Stores comments to a part of the dossier for a category such as RESEARCH'; +ALTER TABLE answeredquiz COMMENT = 'The answered quiz table holds the interpreted result of the quiz answer'; +ALTER TABLE assessmentmechanismselected COMMENT = 'Holds the peer assessement mechanism selected'; +ALTER TABLE categoriesselected COMMENT = 'NOT IMPLEMENTED'; +ALTER TABLE contributionrating COMMENT = 'TODO @Axel plz comment'; +ALTER TABLE fullsubmissions COMMENT = 'This holds the aggregated text of the dossier students should upload'; +ALTER TABLE grades COMMENT = 'Shows the grades that are calculated for a given student'; +ALTER TABLE groupfindingmechanismselected COMMENT = 'Groupfinding is done either automatically or manual'; +ALTER TABLE groups COMMENT = 'the groups that are created'; +ALTER TABLE groupuser COMMENT = 'n x m table for group and user'; +ALTER TABLE phasesselected COMMENT = 'the phase that is selected out of Phase enum'; +ALTER TABLE profilequestionanswer COMMENT = 'the answer to a profile question needed for group finding algorithm'; +ALTER TABLE profilequestionoptions COMMENT = 'the options for a profile question for thegroup finding algorithm'; +ALTER TABLE profilequestions COMMENT = 'stores the questions needed for group finding'; +ALTER TABLE projects COMMENT = 'just a list of all the projects'; +ALTER TABLE projectuser COMMENT = 'n x m for projects and user'; +ALTER TABLE quiz COMMENT = 'lists the quizzes for the app'; +ALTER TABLE submissionpartbodyelements COMMENT = 'holds the parts of a dossier that are annoated with category'; +ALTER TABLE submissionparts COMMENT = 'no idea what that it does but it is important'; +ALTER TABLE submissionuser COMMENT = 'no idea if that is needed. seems not be used'; +ALTER TABLE tags COMMENT = 'lists some tags for the project in order to make it more searchable and for groupfinding'; +ALTER TABLE tasks COMMENT = 'The task table is important. It lists the actual state of the system associated to tasks'; +ALTER TABLE users COMMENT = 'Just lists the users'; +ALTER TABLE workrating COMMENT = '@Axel plz comment'; + + + + + + + + diff --git a/gemeinsamforschen/src/test/resources/database/test_db.sql b/gemeinsamforschen/src/test/resources/database/test_db.sql new file mode 100644 index 0000000000000000000000000000000000000000..5d93b29d8cf128ff167ed7a8525ce5b096070652 --- /dev/null +++ b/gemeinsamforschen/src/test/resources/database/test_db.sql @@ -0,0 +1,9 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +SET time_zone = "+00:00"; + +DROP DATABASE `fltrail_test`; +CREATE DATABASE IF NOT EXISTS `fltrail_test` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; + +USE `fltrail_test`; \ No newline at end of file diff --git a/gemeinsamforschen/src/test/resources/database/testuser.sql b/gemeinsamforschen/src/test/resources/database/testuser.sql index fdbb25267ec35fa80e9c7f600c2017f46b0ee316..905e60a6aacad64d91cbabe9ddbc5aedcc9b00d6 100644 --- a/gemeinsamforschen/src/test/resources/database/testuser.sql +++ b/gemeinsamforschen/src/test/resources/database/testuser.sql @@ -1,10 +1,10 @@ -INSERT IGNORE INTO users (name, password, email, rocketChatId, rocketChatAuthToken, isStudent) values ("Julian Dehne", +INSERT IGNORE INTO users (name, password, email, rocketChatUserId, rocketChatAuthToken, isStudent) values ("Julian Dehne", "egal", "vodkas@yolo.com", "egal", "egal", 1); -INSERT IGNORE INTO users (name, password, email, rocketChatId, rocketChatAuthToken, isStudent) values ("Axel Wiepke", +INSERT IGNORE INTO users (name, password, email, rocketChatUserId, rocketChatAuthToken, isStudent) values ("Axel Wiepke", "egal", "vodkass@yolo.com", "egal", "egal", 1); -INSERT IGNORE INTO users (name, password, email, rocketChatId, rocketChatAuthToken, isStudent) values ("Herr Lehrer", +INSERT IGNORE INTO users (name, password, email, rocketChatUserId, rocketChatAuthToken, isStudent) values ("Herr Lehrer", "egal", "vodka@yolo.com", "egal", "egal", 0);