From e1643e49b71cb9184ad7147392325a5d79d147e2 Mon Sep 17 00:00:00 2001
From: Martin Staehr <software@mstaehr.net>
Date: Mon, 24 Sep 2018 23:04:32 +0200
Subject: [PATCH] #63 feat: implement login for rocketChat api; add new fields
 for rocketChat information to user database

---
 gemeinsamforschen/pom.xml                     | 19 ++++-
 .../java/unipotsdam/gf/config/Constants.java  |  6 --
 .../gf/config/GFApplicationBinder.java        |  2 +
 .../gf/core/management/user/User.java         | 49 ++++++++----
 .../gf/core/management/user/UserDAO.java      |  9 ++-
 .../gf/core/management/user/UserService.java  |  5 +-
 .../core/management/util/ResultSetUtil.java   |  7 +-
 .../unipotsdam/gf/core/states/PhasesImpl.java |  6 +-
 .../gf/interfaces/ICommunication.java         | 11 +--
 .../gf/modules/communication/ChatWindow.java  |  3 +-
 .../model/rocketChat/RocketChatResponse.java  | 75 +++++++++++++++++++
 .../service/CommunicationDummyService.java    | 57 ++++++++++----
 .../communication/service/UnirestService.java | 38 ++++++++++
 .../src/scripts/dbschema/createDummyUser.sql  | 10 +--
 .../createDummyUsersGroupsProject.sql         | 16 ++--
 .../core/management/group/GroupDAOTest.java   |  8 +-
 .../CommunicationDummyServiceTest.java        | 16 ++--
 .../DummyProjectCreationServiceTest.java      |  3 +-
 .../src/test/resources/database/fltrail.sql   |  4 +-
 19 files changed, 263 insertions(+), 81 deletions(-)
 delete mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatResponse.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/UnirestService.java

diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml
index b62bf5b5..0f1368f6 100644
--- a/gemeinsamforschen/pom.xml
+++ b/gemeinsamforschen/pom.xml
@@ -24,6 +24,7 @@
     <properties>
         <org.springframework.version>3.2.4.RELEASE</org.springframework.version>
         <jersey.version>2.6</jersey.version>
+        <jackson.version>2.9.4</jackson.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
@@ -106,25 +107,25 @@
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-core</artifactId>
-            <version>2.4.5</version>
+            <version>${jackson.version}</version>
         </dependency>
 
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
-            <version>2.4.5</version>
+            <version>${jackson.version}</version>
         </dependency>
 
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
-            <version>2.4.5</version>
+            <version>${jackson.version}</version>
         </dependency>
 
         <dependency>
             <groupId>com.fasterxml.jackson.jaxrs</groupId>
             <artifactId>jackson-jaxrs-json-provider</artifactId>
-            <version>2.4.5</version>
+            <version>${jackson.version}</version>
         </dependency>
 
         <dependency>
@@ -226,6 +227,16 @@
             <artifactId>commons-dbutils</artifactId>
             <version>1.7</version>
         </dependency>
+        <dependency>
+            <groupId>io.github.openunirest</groupId>
+            <artifactId>unirest-java</artifactId>
+            <version>2.4.02</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openunirest</groupId>
+            <artifactId>object-mappers-jackson</artifactId>
+            <version>1.0.01</version>
+        </dependency>
 
 
     </dependencies>
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 12586278..00000000
--- 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 a3c34133..9ec68034 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java
@@ -16,6 +16,7 @@ import unipotsdam.gf.interfaces.IPeerAssessment;
 import unipotsdam.gf.interfaces.IPhases;
 import unipotsdam.gf.modules.assessment.controller.service.PeerAssessmentDummy;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+import unipotsdam.gf.modules.communication.service.UnirestService;
 import unipotsdam.gf.modules.groupfinding.DummyGroupfinding;
 import unipotsdam.gf.modules.groupfinding.GroupfindingImpl;
 import unipotsdam.gf.modules.groupfinding.dummy.service.DummyProjectCreationService;
@@ -46,5 +47,6 @@ public class GFApplicationBinder extends AbstractBinder {
         bind(GroupDAO.class).to(GroupDAO.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/core/management/user/User.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java
index 39606a39..db40d181 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/User.java
@@ -14,28 +14,31 @@ public class User {
     private String password;
     private String email;
     private String token;
+    private String rocketChatUsername;
     private String rocketChatAuthToken;
-    private String rocketChatId;
+    private String rocketChatPersonalAccessToken;
+    private String rocketChatUserId;
     private Boolean isStudent;
 
     public User() {
     }
 
     public User(String name, String password, String email, Boolean isStudent) {
-        this(name, password, email, "", "", isStudent);
+        this(name, password, email, "", "", "",
+                "", "", isStudent);
     }
 
-    public User(String name, String password, String email, String rocketChatId, String rocketChatAuthToken, Boolean isStudent) {
-        this(name, password, email, "", rocketChatAuthToken, rocketChatId, isStudent);
-    }
-
-    public User(String name, String password, String email, String token, String rocketChatAuthToken, String rocketChatId, Boolean isStudent) {
+    public User(String name, String password, String email, String token, String rocketChatUsername,
+                String rocketChatAuthToken, String rocketChatPersonalAccessToken, String rocketChatUserId,
+                Boolean isStudent) {
         this.name = name;
         this.password = password;
         this.email = email;
         this.token = token;
+        this.rocketChatUsername = rocketChatUsername;
         this.rocketChatAuthToken = rocketChatAuthToken;
-        this.rocketChatId = rocketChatId;
+        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
+        this.rocketChatUserId = rocketChatUserId;
         this.isStudent = isStudent;
     }
 
@@ -85,12 +88,12 @@ public class User {
         isStudent = student;
     }
 
-    public String getRocketChatId() {
-        return rocketChatId;
+    public String getRocketChatUserId() {
+        return rocketChatUserId;
     }
 
-    public void setRocketChatId(String rocketChatId) {
-        this.rocketChatId = rocketChatId;
+    public void setRocketChatUserId(String rocketChatUserId) {
+        this.rocketChatUserId = rocketChatUserId;
     }
 
     public String getRocketChatAuthToken() {
@@ -101,6 +104,22 @@ public class User {
         this.rocketChatAuthToken = rocketChatAuthToken;
     }
 
+    public String getRocketChatUsername() {
+        return rocketChatUsername;
+    }
+
+    public void setRocketChatUsername(String rocketChatUsername) {
+        this.rocketChatUsername = rocketChatUsername;
+    }
+
+    public String getRocketChatPersonalAccessToken() {
+        return rocketChatPersonalAccessToken;
+    }
+
+    public void setRocketChatPersonalAccessToken(String rocketChatPersonalAccessToken) {
+        this.rocketChatPersonalAccessToken = rocketChatPersonalAccessToken;
+    }
+
     @Override
     public String toString() {
         return "User{" +
@@ -108,8 +127,10 @@ public class User {
                 ", password='" + password + '\'' +
                 ", email='" + email + '\'' +
                 ", token='" + token + '\'' +
+                ", rocketChatUsername='" + rocketChatUsername + '\'' +
                 ", rocketChatAuthToken='" + rocketChatAuthToken + '\'' +
-                ", rocketChatId='" + rocketChatId + '\'' +
+                ", rocketChatPersonalAccessToken='" + rocketChatPersonalAccessToken + '\'' +
+                ", rocketChatUserId='" + rocketChatUserId + '\'' +
                 ", isStudent=" + isStudent +
                 '}';
     }
@@ -123,7 +144,7 @@ public class User {
                 Objects.equals(password, user.password) &&
                 Objects.equals(email, user.email) &&
                 Objects.equals(rocketChatAuthToken, user.rocketChatAuthToken) &&
-                Objects.equals(rocketChatId, user.rocketChatId) &&
+                Objects.equals(rocketChatUserId, user.rocketChatUserId) &&
                 Objects.equals(isStudent, user.isStudent);
     }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java
index 01ed0681..461b5ff7 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserDAO.java
@@ -30,10 +30,13 @@ public class UserDAO {
         String token = uuid.toString();
         connect.connect();
         String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `token`,`isStudent`," +
-                "`rocketChatId`,`rocketChatAuthToken`) values (?,?,?,?,?,?,?)";
+                "`rocketChatUserId`,`rocketChatUsername`,`rocketChatAuthToken`,`rocketChatPersonalAccessToken`) " +
+                "values (?,?,?,?,?,?,?,?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
-                token, user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken());
+                token, user.getStudent(), user.getRocketChatUserId(), user.getRocketChatUsername(), user.getRocketChatAuthToken(),
+                user.getRocketChatPersonalAccessToken());
         connect.close();
+        user.setToken(token);
         // TODO implmement UserProfile @Mar
     }
 
@@ -51,7 +54,7 @@ public class UserDAO {
         //TODO: if user is updated, it also must update all other tables which includes some information about the user, for example project user
         connect.connect();
         connect.issueUpdateStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(),
-                user.getToken(), user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken(), user.getEmail());
+                user.getToken(), user.getStudent(), user.getRocketChatUserId(), user.getRocketChatAuthToken(), user.getEmail());
         connect.close();
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
index c38d65b9..0ead888b 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java
@@ -2,7 +2,6 @@ package unipotsdam.gf.core.management.user;
 
 import unipotsdam.gf.core.management.Management;
 import unipotsdam.gf.interfaces.ICommunication;
-import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
 
 import javax.annotation.ManagedBean;
 import javax.inject.Inject;
@@ -26,7 +25,6 @@ public class UserService {
 
     private UserDAO userDAO;
 
-    @Inject
     private Management management;
 
     @Inject
@@ -77,8 +75,7 @@ public class UserService {
             throws URISyntaxException {
 
         User user = new User(name, password, email, null);
-        ICommunication iCommunication = new CommunicationDummyService();
-        boolean isLoggedIn = iCommunication.loginUser(user);
+        boolean isLoggedIn = communicationService.loginUser(user);
         if (isLoggedIn) {
             return login(false, user);
         } else {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/util/ResultSetUtil.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/util/ResultSetUtil.java
index 7a79f816..f67213c1 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/util/ResultSetUtil.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/util/ResultSetUtil.java
@@ -10,9 +10,12 @@ public class ResultSetUtil {
         String password = vereinfachtesResultSet.getString("password");
         String email = vereinfachtesResultSet.getString("email");
         String token = vereinfachtesResultSet.getString("token");
-        String rocketChatId = vereinfachtesResultSet.getString("rocketChatId");
+        String rocketChatUsername = vereinfachtesResultSet.getString("rocketChatUsername");
         String rocketChatAuthToken = vereinfachtesResultSet.getString("rocketChatAuthToken");
+        String rocketChatPersonalAccessToken = vereinfachtesResultSet.getString("rocketChatPersonalAccessToken");
+        String rocketChatUserId = vereinfachtesResultSet.getString("rocketChatUserId");
         Boolean isStudent = vereinfachtesResultSet.getBoolean("isStudent");
-        return new User(name, password, email, token, rocketChatId, rocketChatAuthToken, isStudent);
+        return new User(name, password, email, token, rocketChatUsername, rocketChatAuthToken,
+                rocketChatPersonalAccessToken, rocketChatUserId, isStudent);
     }
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java
index 0c06f3ee..fcf78ce7 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java
@@ -2,7 +2,6 @@ package unipotsdam.gf.core.states;
 
 import unipotsdam.gf.core.database.mysql.MysqlConnect;
 import unipotsdam.gf.core.management.project.Project;
-import unipotsdam.gf.core.states.model.Constraints;
 import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.core.states.model.ProjectPhase;
 import unipotsdam.gf.interfaces.Feedback;
@@ -12,15 +11,14 @@ import unipotsdam.gf.interfaces.IPeerAssessment;
 import unipotsdam.gf.interfaces.IPhases;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.assessment.controller.service.PeerAssessment;
-import unipotsdam.gf.modules.assessment.controller.service.PeerAssessmentDummy;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+import unipotsdam.gf.modules.communication.service.UnirestService;
 import unipotsdam.gf.modules.journal.service.IJournalImpl;
 import unipotsdam.gf.modules.peer2peerfeedback.DummyFeedback;
 import unipotsdam.gf.view.Messages;
 
 import javax.annotation.ManagedBean;
 import javax.inject.Inject;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -36,7 +34,7 @@ public class PhasesImpl implements IPhases {
 
     private Feedback feedback = new DummyFeedback();
 
-    private ICommunication iCommunication = new CommunicationDummyService();
+    private ICommunication iCommunication = new CommunicationDummyService(new UnirestService());
 
     private IJournal iJournal = new IJournalImpl();
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
index 71a78118..0b90a016 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
@@ -2,8 +2,6 @@ package unipotsdam.gf.interfaces;
 
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
-import unipotsdam.gf.assignments.NotImplementedLogger;
-import unipotsdam.gf.core.states.model.Constraints;
 import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.communication.model.Message;
@@ -28,13 +26,13 @@ public interface ICommunication {
     List<ChatMessage> getChatHistory(String roomId);
 
 
-    boolean sendMessageToChat(Message message, String roomId) ;
+    boolean sendMessageToChat(Message message, String roomId);
 
     /**
      * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/create/
      * creates chatroom
      *
-     * @param name                  chat room name
+     * @param name     chat room name
      * @param userList member of chat by id
      * @return chat room id
      */
@@ -50,7 +48,7 @@ public interface ICommunication {
      */
     boolean addUserToChatRoom(String roomId, User user);
 
-    boolean removeUserFromChatRoom(User user, String roomId) ;
+    boolean removeUserFromChatRoom(User user, String roomId);
 
     /**
      * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/settopic/
@@ -80,6 +78,9 @@ public interface ICommunication {
     boolean loginUser(User user);
 
     /**
+     * api 1: https://rocket.chat/docs/developer-guides/rest-api/users/generatepersonalaccesstoken/
+     * api 2: https://rocket.chat/docs/developer-guides/rest-api/users/getpersonalaccesstokens/
+     *
      * registers new user to rocket chat
      *
      * @param user registers user to rocket.chat
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
index 366395ce..5cb62355 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java
@@ -2,6 +2,7 @@ package unipotsdam.gf.modules.communication;
 
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+import unipotsdam.gf.modules.communication.service.UnirestService;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.jsp.JspWriter;
@@ -21,7 +22,7 @@ public class ChatWindow extends SimpleTagSupport {
         String groupToken = request.getParameter("groupToken");
         String projectToken = request.getParameter("projectToken");
         //get ProjetbyToken
-        ICommunication communicationService = new CommunicationDummyService();
+        ICommunication communicationService = new CommunicationDummyService(new UnirestService());
         String chatRoomLink = communicationService.getChatRoomLink(token, projectToken, groupToken);
 
         JspWriter out = getJspContext().getOut();
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatResponse.java
new file mode 100644
index 00000000..dee14a38
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/model/rocketChat/RocketChatResponse.java
@@ -0,0 +1,75 @@
+package unipotsdam.gf.modules.communication.model.rocketChat;
+
+import java.util.Map;
+
+public class RocketChatResponse {
+
+    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 "RocketChatResponse{" +
+                "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/service/CommunicationDummyService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
index 9fa18319..8081ca76 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
@@ -1,27 +1,27 @@
 package unipotsdam.gf.modules.communication.service;
 
+import io.github.openunirest.http.HttpResponse;
 import unipotsdam.gf.assignments.Assignee;
 import unipotsdam.gf.assignments.NotImplementedLogger;
-import unipotsdam.gf.config.Constants;
-import unipotsdam.gf.core.management.Management;
+import unipotsdam.gf.config.GFRocketChatConfig;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
-import unipotsdam.gf.assignments.Assignee;
-import unipotsdam.gf.assignments.NotImplementedLogger;
-import unipotsdam.gf.core.states.model.Constraints;
 import unipotsdam.gf.core.states.model.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 unipotsdam.gf.modules.communication.model.rocketChat.RocketChatResponse;
 
 import javax.annotation.ManagedBean;
 import javax.annotation.Resource;
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import javax.ws.rs.core.Response;
 import java.time.Instant;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -31,8 +31,12 @@ import java.util.Objects;
 @Singleton
 public class CommunicationDummyService implements ICommunication {
 
+    private UnirestService unirestService;
+
     @Inject
-    Management managementService;
+    public CommunicationDummyService(UnirestService unirestService) {
+        this.unirestService = unirestService;
+    }
 
     @Override
     public List<ChatMessage> getChatHistory(String roomId) {
@@ -61,13 +65,13 @@ public class CommunicationDummyService implements ICommunication {
     }
 
     @Override
-    public boolean addUserToChatRoom(String roomId, User user)  {
+    public boolean addUserToChatRoom(String roomId, User user) {
         NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, "addUserToChatRoom");
         return false;
     }
 
     @Override
-    public boolean removeUserFromChatRoom(User user, String roomId)  {
+    public boolean removeUserFromChatRoom(User user, String roomId) {
         NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, "removing user from chat " +
                 "room");
         return false;
@@ -86,13 +90,38 @@ public class CommunicationDummyService implements ICommunication {
 
     @Override
     public boolean loginUser(User user) {
-        user.setRocketChatAuthToken("abc");
+        if (user.getEmail().isEmpty() || user.getPassword().isEmpty()) {
+            return false;
+        }
+
+        HashMap<String, String> rocketChatAuth = new HashMap<>();
+        rocketChatAuth.put("user", user.getEmail());
+        rocketChatAuth.put("password", user.getPassword());
+
+        HttpResponse<RocketChatResponse> response =
+                unirestService
+                        .post(GFRocketChatConfig.ROCKET_CHAT_API_LINK + "login")
+                        .body(rocketChatAuth)
+                        .asObject(RocketChatResponse.class);
+        // TODO: add Error class which holds Errors and posts them
+        int status = response.getStatus();
+        if (status == Response.Status.UNAUTHORIZED.getStatusCode() || status == Response.Status.BAD_REQUEST.getStatusCode()) {
+            return false;
+        }
+        RocketChatResponse rocketChatResponse = response.getBody();
+        user.setRocketChatUserId(rocketChatResponse.getUserId());
+        user.setRocketChatAuthToken(rocketChatResponse.getAuthToken());
         return true;
     }
 
     @Override
     public boolean registerUser(User user) {
-        user.setRocketChatId("1");
+        // register User
+
+        // login User and fill information
+
+        // create custom access token with authToken
+        user.setRocketChatUserId("1");
         return true;
     }
 
@@ -111,13 +140,13 @@ public class CommunicationDummyService implements ICommunication {
         // TODO: Implement getProjectbyToken and getGroupByToken
         //Project project = managementService.getProject(projectToken
         String channelName = "general";
-        return Constants.ROCKET_CHAT_URL + "/channel/" + channelName + "?layout=embedded";
+        return GFRocketChatConfig.ROCKET_CHAT_API_LINK + "/channel/" + channelName + "?layout=embedded";
     }
 
     @Override
-    public void sendSingleMessage(Message message, User user)  {
+    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();
+        String message2 = "sending email with message: " + message.getMessage() + " to: " + user.getEmail();
         NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, message2);
     }
 
@@ -129,7 +158,7 @@ public class CommunicationDummyService implements ICommunication {
     @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.getId();
+        String message2 = "sending email with message: " + message + " to: " + project.getId();
         NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, message2);
     }
 
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 00000000..354c6d52
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/UnirestService.java
@@ -0,0 +1,38 @@
+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 {
+
+    public UnirestService() {
+        // has to be set for application
+        Unirest.setObjectMapper(new JacksonObjectMapper());
+        Unirest.setDefaultHeader("Content-Type", "application/json");
+    }
+
+    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/scripts/dbschema/createDummyUser.sql b/gemeinsamforschen/src/scripts/dbschema/createDummyUser.sql
index c68466c5..5c240fee 100644
--- a/gemeinsamforschen/src/scripts/dbschema/createDummyUser.sql
+++ b/gemeinsamforschen/src/scripts/dbschema/createDummyUser.sql
@@ -6,21 +6,21 @@ CREATE TABLE if not exists `users` (
   `password`            varchar(200) NOT NULL,
   `email`               varchar(255) NOT NULL,
   `token`               varchar(800) NOT NULL,
-  `rocketChatId`        varchar(400) NOT NULL,
+  `rocketChatUserId`        varchar(400) NOT NULL,
   `rocketChatAuthToken` varchar(800) NOT NULL,
   UNIQUE (email)
 
 )ENGINE = InnoDB DEFAULT CHARSET = utf8;
 
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent1', 'egal', 'test1@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent1', 'egal', 'test2@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent1', 'egal', 'test3@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent1', 'egal', 'test4@uni.de', 'test1','1','abc');
\ No newline at end of file
diff --git a/gemeinsamforschen/src/scripts/dbschema/createDummyUsersGroupsProject.sql b/gemeinsamforschen/src/scripts/dbschema/createDummyUsersGroupsProject.sql
index 3e5d9846..66d1d970 100644
--- a/gemeinsamforschen/src/scripts/dbschema/createDummyUsersGroupsProject.sql
+++ b/gemeinsamforschen/src/scripts/dbschema/createDummyUsersGroupsProject.sql
@@ -3,28 +3,28 @@
   Functions with empty grouptable only (because of autoincrement id of group)
  */
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent1', 'egal', 'test1@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent2', 'egal', 'test2@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent3', 'egal', 'test3@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent4', 'egal', 'test4@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent5', 'egal', 'test5@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent6', 'egal', 'test6@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent7', 'egal', 'test7@uni.de', 'test1','1','abc');
 
-INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatId`, `rocketChatAuthToken`) VALUES
+INSERT INTO `users` (`name`, `password`, `email`, `token`, `rocketChatUserId`, `rocketChatAuthToken`) VALUES
   ('teststudent8', 'egal', 'test8@uni.de', 'test1','1','abc');
 
 INSERT INTO  `projects` (`id`, `password`,`active`,`timecreated`,`author`,`adminpassword`,`token`,`phase`) VALUES
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/group/GroupDAOTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/group/GroupDAOTest.java
index 6eacdade..0e7eaed4 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/group/GroupDAOTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/core/management/group/GroupDAOTest.java
@@ -33,9 +33,11 @@ public class GroupDAOTest {
         userDAO = new UserDAO(inMemoryMySqlConnect);
 
         User userStudent = new User("Student", "password", "testStudent@mail.com", "1",
-                "1", "1", true);
-        User userDocent = new User("Docent", "password", "testDocent@mail.com",
-                "1", "1", "1", false);
+                "1", "1", "1", "1",
+                true);
+        User userDocent = new User("Docent", "password", "testDocent@mail.com", "1",
+                "1", "1", "1", "1",
+                false);
         userDAO.persist(userStudent, null);
         userDAO.persist(userDocent, null);
 
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
index 76eb6fcd..db2809ed 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationDummyServiceTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/service/CommunicationDummyServiceTest.java
@@ -5,9 +5,11 @@ import org.junit.Test;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.interfaces.ICommunication;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static unipotsdam.gf.config.GFRocketChatConfig.TEST_USER;
 
 public class CommunicationDummyServiceTest {
 
@@ -16,22 +18,24 @@ public class CommunicationDummyServiceTest {
 
     @Before
     public void setUp() {
-        iCommunication = new CommunicationDummyService();
+        iCommunication = new CommunicationDummyService(new UnirestService());
         user = new User("name", "password", "email", true);
     }
 
     @Test
     public void loginUser() {
-        boolean isLoggedIn = iCommunication.loginUser(user);
-        assertNotNull(user.getRocketChatId());
-        assertNotNull(user.getRocketChatAuthToken());
-        assertTrue(isLoggedIn);
+        assertTrue(iCommunication.loginUser(TEST_USER));
+        assertTrue(!TEST_USER.getRocketChatAuthToken().isEmpty());
+        assertTrue(TEST_USER.getRocketChatUserId().isEmpty());
+
+        User falseLoginUser = new User("name", "password", "email", true);
+        assertFalse(iCommunication.loginUser(falseLoginUser));
     }
 
     @Test
     public void registerUser() {
         boolean userCreated = iCommunication.registerUser(user);
-        assertNotNull(user.getRocketChatId());
+        assertNotNull(user.getRocketChatUserId());
         assertNull(user.getRocketChatAuthToken());
         assertTrue(userCreated);
     }
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
index 07b517ef..24ccc2d4 100644
--- 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
@@ -10,6 +10,7 @@ import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserDAO;
 import unipotsdam.gf.interfaces.ICommunication;
 import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
+import unipotsdam.gf.modules.communication.service.UnirestService;
 import unipotsdam.gf.modules.groupfinding.service.GroupDAO;
 import unipotsdam.gf.util.TestHelper;
 
@@ -21,7 +22,7 @@ public class DummyProjectCreationServiceTest {
 
     @Test
     public void testCreateExampleProject() {
-        ICommunication communication = new CommunicationDummyService();
+        ICommunication communication = new CommunicationDummyService(new UnirestService());
         InMemoryMySqlConnect inMemoryMySqlConnect = new InMemoryMySqlConnect();
         Management management = TestHelper.getManagementImpl(inMemoryMySqlConnect);
         GroupDAO groupDAO = new GroupDAO(inMemoryMySqlConnect);
diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql
index 0aa37e4e..c5e1c666 100644
--- a/gemeinsamforschen/src/test/resources/database/fltrail.sql
+++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql
@@ -117,7 +117,9 @@ CREATE TABLE `users` (
   `password` varchar(200) NOT NULL,
   `email` varchar(255) NOT NULL,
   `token` varchar(800) NOT NULL,
-  `rocketChatId` varchar(400) NOT NULL,
+  `rocketChatUserId` varchar(400) NOT NULL,
+  `rocketChatUsername` VARCHAR(400) NOT NULL,
+  `rocketChatPersonalAccessToken` VARCHAR(400) NOT NULL,
   `rocketChatAuthToken` varchar(800) NOT NULL,
   `isStudent` tinyint(1) DEFAULT '1'
 )
-- 
GitLab