diff --git a/.gitignore b/.gitignore index d66d90c0bfd70f829b3fc63b5e9055659c86d7ab..2c0bec3c9dca32efe6064b2203aeefe09c340116 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,5 @@ **/.classpath /.idea/vcs.xml /.idea/workspace.xml -/.idea/workspace.xml -/.idea/workspace.xml + +**/.idea \ No newline at end of file diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml index 206f64bd250928d980c302291829b24d7d4f70a0..5fa0d0f8e5b50917e71d3cd24259770441115c28 100644 --- a/gemeinsamforschen/pom.xml +++ b/gemeinsamforschen/pom.xml @@ -146,6 +146,17 @@ <version>3.0.1</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.glassfish.jersey.test-framework.providers</groupId> + <artifactId>jersey-test-framework-provider-inmemory</artifactId> + <version>${jersey.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.test-framework</groupId> + <artifactId>jersey-test-framework-util</artifactId> + <version>2.27</version> + <scope>test</scope> + </dependency> <!-- dropwizard - Need this for '@PATCH' annotation --> <dependency> diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..125862780cbc50f02a1a8978b49f87eaacdeef3c --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/Constants.java @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000000000000000000000000000000000000..554cf0504b8783acc9589f00deaa64eb8356a581 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java @@ -0,0 +1,15 @@ +package unipotsdam.gf.config; + +import org.glassfish.hk2.utilities.binding.AbstractBinder; +import unipotsdam.gf.core.management.Management; +import unipotsdam.gf.core.management.ManagementImpl; +import unipotsdam.gf.interfaces.ICommunication; +import unipotsdam.gf.modules.communication.service.CommunicationDummyService; + +public class GFApplicationBinder extends AbstractBinder { + @Override + protected void configure() { + bind(CommunicationDummyService.class).to(ICommunication.class); + bind(ManagementImpl.class).to(Management.class); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/GFDatabaseConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java similarity index 92% rename from gemeinsamforschen/src/main/java/unipotsdam/gf/GFDatabaseConfig.java rename to gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java index 60776e4510da20091cb98c522dcc2661dcd115e0..252905102d2472eaa125f06499bbdfe1663ea254 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/GFDatabaseConfig.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFDatabaseConfig.java @@ -1,4 +1,4 @@ -package unipotsdam.gf; +package unipotsdam.gf.config; /** * Created by dehne on 31.05.2018. diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFResourceConfig.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFResourceConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..4cef8bbc5dce4f8fdb74373b18d949ea7d093ba1 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFResourceConfig.java @@ -0,0 +1,11 @@ +package unipotsdam.gf.config; + +import org.glassfish.jersey.server.ResourceConfig; + +public class GFResourceConfig extends ResourceConfig { + + public GFResourceConfig() { + register(new GFApplicationBinder()); + packages("unipotsdam.gf"); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java index 002c4bbd3b1eaf5fed52afd74769d11ee74b6746..80ed128cf20fc34528390e98806b166a9495fde7 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/MysqlConnect.java @@ -1,6 +1,6 @@ package unipotsdam.gf.core.database.mysql; -import unipotsdam.gf.GFDatabaseConfig; +import unipotsdam.gf.config.GFDatabaseConfig; import java.sql.*; import java.util.Date; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java index e997c2bd1e1eb277171c7257530476f943817818..ff270f7b46d23457b3742b15596a296d9a99179e 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/database/mysql/VereinfachtesResultSet.java @@ -1,6 +1,10 @@ package unipotsdam.gf.core.database.mysql; -import java.sql.*; +import java.sql.Date; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Timestamp; public class VereinfachtesResultSet { @@ -71,6 +75,15 @@ public class VereinfachtesResultSet { throw new Error("error in VereinfachtesResultSet"); } + public Timestamp getTimestamp(String columnLabel) { + try { + return resultSet.getTimestamp(columnLabel); + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + throw new Error("error in VereinfachtesResultSet"); + } + public String getString(String columnLabel) { try { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java index 1b00ee2a5441dd19c674ca7f851a8ec84c67938b..73c0b1e608c2ea6dc3821ad703904162908d9577 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/Management.java @@ -1,11 +1,14 @@ package unipotsdam.gf.core.management; +import unipotsdam.gf.core.management.group.Group; import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.core.management.user.UserInterests; import unipotsdam.gf.core.management.user.UserProfile; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; +import java.util.List; + /** * Created by dehne on 31.05.2018. * TODO in DAOs refaktorisieren, sobald es mehr wird @@ -13,12 +16,14 @@ import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; public interface Management { /** * delete a User in the database + * * @param identifier */ void delete(StudentIdentifier identifier); /** * create a User in the database + * * @param user * @param profile */ @@ -26,18 +31,28 @@ public interface Management { /** * create a Project in the database + * * @param project */ void create(Project project); /** * Delete a Project in the database + * * @param project */ void delete(Project project); + /** + * Update a User in the database + * + * @param user + */ + void update(User user); + /** * Add an entry in the M:N table linking users and projects + * * @param user * @param project * @param interests @@ -46,20 +61,29 @@ public interface Management { /** * Check if a user exists in the DB + * * @param user * @return */ Boolean exists(User user); + /** + * Check if a project exists in the DB + */ + + Boolean exists(Project project); + /** * Get all the users linked to a project + * * @param project * @return */ - java.util.List<User> getUsers(Project project); + List<User> getUsers(Project project); /** * get the token for the user + * * @param user * @return */ @@ -67,9 +91,34 @@ public interface Management { /** * get the user given his http token + * * @param token * @return */ - User getUser(String token); + User getUserByToken(String token); + + /** + * get user by its email address + * + * @param email + * @return + */ + User getUserByEmail(String email); + + /** + * get project by its id + * + * @param id + * @return + */ + Project getProjectById(String id); + + void createGroup(Group group, String projectId); + + void addGroupMember(User groupMember, int groupId); + + void deleteGroupMember(User groupMember, int groupId); + + List<Group> getGroupsByProjectId(String projectId); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java index edb82a05fa7f3ba6ea6665712efc2d70d45f910d..1cecac2de82d93e049cbc159843b7f91334fb6ec 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java @@ -2,12 +2,17 @@ package unipotsdam.gf.core.management; import unipotsdam.gf.core.database.mysql.MysqlConnect; import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet; +import unipotsdam.gf.core.management.group.Group; import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.core.management.user.UserInterests; import unipotsdam.gf.core.management.user.UserProfile; import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; +import javax.annotation.ManagedBean; +import javax.annotation.Resource; +import javax.inject.Singleton; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -15,6 +20,9 @@ import java.util.UUID; /** * Created by dehne on 31.05.2018. */ +@ManagedBean +@Resource +@Singleton public class ManagementImpl implements Management { @Override public void delete(StudentIdentifier identifier) { @@ -32,14 +40,16 @@ public class ManagementImpl implements Management { MysqlConnect connect = new MysqlConnect(); connect.connect(); - String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `token`,`isStudent`) values (?,?,?,?,?)"; + String mysqlRequest = "INSERT INTO users (`name`, `password`, `email`, `token`,`isStudent`," + + "`rocketChatId`,`rocketChatAuthToken`) values (?,?,?,?,?,?,?)"; connect.issueInsertOrDeleteStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(), - token, user.getStudent()); + token, user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken()); connect.close(); // TODO implmement UserProfile @Mar } + // TODO: naming convention discussion? all is named create, but group is named createGroup @Override public void create(Project project) { UUID uuid = UUID.randomUUID(); @@ -48,9 +58,10 @@ public class ManagementImpl implements Management { MysqlConnect connect = new MysqlConnect(); connect.connect(); String mysqlRequest = - "INSERT INTO projects (`id`, `password`, `activ`, `timecreated`, `author`, " + "`adminpassword`, `token`) values (?,?,?,?,?,?,?)"; - connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), project.getPassword(), project.getActiv(), - project.getTimecreated(), project.getAuthor(), project.getAdminpassword(), token); + "INSERT INTO projects (`id`, `password`, `active`, `timecreated`, `author`, " + + "`adminPassword`, `token`) values (?,?,?,?,?,?,?)"; + connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), project.getPassword(), project.isActive(), + project.getTimecreated(), project.getAuthor(), project.getAdminPassword(), token); connect.close(); } @@ -72,9 +83,20 @@ public class ManagementImpl implements Management { connect.close(); } + @Override + public void update(User user) { + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + String mysqlRequest = "UPDATE `users` SET `name`=?,`password`=?,`email`=?,`token`=?,`isStudent`=?, `rocketChatId`=?,`rocketChatAuthToken`=? WHERE email=? LIMIT 1"; + //TODO: maybe add handling if a line is actually updated + connect.issueUpdateStatement(mysqlRequest, user.getName(), user.getPassword(), user.getEmail(), + user.getToken(), user.getStudent(), user.getRocketChatId(), user.getRocketChatAuthToken(), user.getEmail()); + connect.close(); + } + @Override public Boolean exists(User user) { - Boolean result = false; + Boolean result; MysqlConnect connect = new MysqlConnect(); connect.connect(); String mysqlRequest = "SELECT * FROM users where email = ? and password = ?"; @@ -82,18 +104,31 @@ public class ManagementImpl implements Management { connect.issueSelectStatement(mysqlRequest, user.getEmail(), user.getPassword()); result = vereinfachtesResultSet.next(); connect.close(); - if (result == null) { - return false; - } + return result; + } + + @Override + public Boolean exists(Project project) { + Boolean result; + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + String mysqlRequest = "SELECT * FROM projects where id = ? and adminPassword = ?"; + VereinfachtesResultSet vereinfachtesResultSet = + connect.issueSelectStatement(mysqlRequest, project.getId(), project.getAdminPassword()); + result = vereinfachtesResultSet.next(); + connect.close(); return result; } @Override public List<User> getUsers(Project project) { String query = - "SELECT * FROM users u " + " JOIN projectuser pu ON u.email=pu.userId" + " JOIN projects p ON pu.projectId = p.id" + " WHERE pu.projectId = ?"; + "SELECT * FROM users u " + + " JOIN projectuser pu ON u.email=pu.userId" + + " JOIN projects p ON pu.projectId = p.id" + + " WHERE pu.projectId = ?"; - ArrayList<User> result = new ArrayList<User>(); + ArrayList<User> result = new ArrayList<>(); MysqlConnect connect = new MysqlConnect(); connect.connect(); VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(query, project.getId()); @@ -112,12 +147,31 @@ public class ManagementImpl implements Management { String name = vereinfachtesResultSet.getString("name"); String password = vereinfachtesResultSet.getString("password"); String email = vereinfachtesResultSet.getString("email"); - String rocketChatId = vereinfachtesResultSet.getString("rocketchatid"); + String rocketChatId = vereinfachtesResultSet.getString("rocketChatId"); + String rocketChatAuthToken = vereinfachtesResultSet.getString("rocketChatAuthToken"); Boolean isStudent = vereinfachtesResultSet.getBoolean("isStudent"); + return new User(name, password, email, rocketChatId, rocketChatAuthToken, isStudent); + } - return new User(name, password, email, rocketChatId, isStudent); + private Project getProjectFromResultSet(VereinfachtesResultSet vereinfachtesResultSet) { + String id = vereinfachtesResultSet.getString("id"); + String password = vereinfachtesResultSet.getString("password"); + boolean active = vereinfachtesResultSet.getBoolean("active"); + Timestamp timestamp = vereinfachtesResultSet.getTimestamp("timecreated"); + String author = vereinfachtesResultSet.getString("author"); + String adminPassword = vereinfachtesResultSet.getString("adminpassword"); + String token = vereinfachtesResultSet.getString("token"); + + return new Project(id, password, active, timestamp, author, adminPassword, token); } + private Group getGroupFromResultSet(VereinfachtesResultSet vereinfachtesResultSet) { + int id = vereinfachtesResultSet.getInt("id"); + String projectId = vereinfachtesResultSet.getString("projectId"); + String chatRoomId = vereinfachtesResultSet.getString("chatRoomId"); + // TODO: determine how to get all User + return new Group(id, new ArrayList<>(), projectId, chatRoomId); + } @Override public String getUserToken(User user) { MysqlConnect connect = new MysqlConnect(); @@ -136,12 +190,21 @@ public class ManagementImpl implements Management { } @Override - public User getUser(String token) { + public User getUserByToken(String token) { + return getUserByField("token", token); + } + + @Override + public User getUserByEmail(String email) { + return getUserByField("email", email); + } + + private User getUserByField(String field, String value) { MysqlConnect connect = new MysqlConnect(); connect.connect(); - String mysqlRequest = "SELECT * FROM users where token = ?"; + String mysqlRequest = "SELECT * FROM users where " + field + " = ?"; VereinfachtesResultSet vereinfachtesResultSet = - connect.issueSelectStatement(mysqlRequest, token); + connect.issueSelectStatement(mysqlRequest, value); boolean next = vereinfachtesResultSet.next(); if (next) { User user = getUserFromResultSet(vereinfachtesResultSet); @@ -152,4 +215,68 @@ public class ManagementImpl implements Management { return null; } } + + @Override + public Project getProjectById(String id) { + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + String mysqlRequest = "SELECT * FROM projects where id = ?"; + VereinfachtesResultSet vereinfachtesResultSet = + connect.issueSelectStatement(mysqlRequest, id); + boolean next = vereinfachtesResultSet.next(); + if (next) { + Project project = getProjectFromResultSet(vereinfachtesResultSet); + connect.close(); + return project; + } else { + connect.close(); + return null; + } + } + + + @Override + public void createGroup(Group group, String projectId) { + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + + Project project = getProjectById(projectId); + + for (User groupMember : group.getMembers()) { + String mysqlRequest2 = "INSERT INTO groupuser (`userEmail`, `groupId`) values (?,?)"; + connect.issueInsertOrDeleteStatement(mysqlRequest2, groupMember.getEmail(), project.getId()); + } + connect.close(); + } + + @Override + public void addGroupMember(User groupMember, int groupId) { + + } + + @Override + public void deleteGroupMember(User groupMember, int groupId) { + + } + + @Override + public List<Group> getGroupsByProjectId(String projectId) { + MysqlConnect connect = new MysqlConnect(); + connect.connect(); + // TODO: implement correct join and finish implementation + String mysqlRequest = "SELECT * FROM groups g " + + "JOIN groupuser gu u ON g.id=gu.groupId " + "JOIN users u ON gu.userEmail=u.email" + + "where g.projectId = ?"; + VereinfachtesResultSet vereinfachtesResultSet = + connect.issueSelectStatement(mysqlRequest, projectId); + ArrayList<Group> groups = new ArrayList<>(); + while (vereinfachtesResultSet.next()) { + //groups.add() + } + if (groups.isEmpty()) { + return null; + } else { + return groups; + } + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/Group.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/Group.java new file mode 100644 index 0000000000000000000000000000000000000000..ea56b43196cd93b3c87518dfa55ab58e2840c8b9 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/group/Group.java @@ -0,0 +1,67 @@ +package unipotsdam.gf.core.management.group; + +import unipotsdam.gf.core.management.user.User; + +import java.util.List; + +public class Group { + + private int id; // do not set yourself, autoincrement + private List<User> members; + private String projectId; + private String chatRoomId; + + public Group() { + } + + public Group(List<User> members, String projectId) { + this.members = members; + this.projectId = projectId; + this.chatRoomId = ""; + } + + public Group(List<User> members, String projectId, String chatRoomId) { + this.members = members; + this.projectId = projectId; + this.chatRoomId = chatRoomId; + } + + public Group(int id, List<User> members, String projectId, String chatRoomId) { + this.id = id; + this.members = members; + this.projectId = projectId; + this.chatRoomId = chatRoomId; + } + + public List<User> getMembers() { + return members; + } + + public void setMembers(List<User> members) { + this.members = members; + } + + public String getChatRoomId() { + return chatRoomId; + } + + public void setChatRoomId(String chatRoomId) { + this.chatRoomId = chatRoomId; + } + + public void addMember(User user) { + members.add(user); + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public int getId() { + return id; + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java index de780722652eb40ea1f6f6e2f1518fa0e752bcb3..682b5c40b13472a4bc3369eb7970ddb9bce428fd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java @@ -1,7 +1,5 @@ package unipotsdam.gf.core.management.project; -import org.glassfish.grizzly.http.util.TimeStamp; - import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.ZoneId; @@ -13,25 +11,45 @@ public class Project { private String id; private String password; - private String activ; + private Boolean active; private Timestamp timecreated; private String author; - private String adminpassword; + private String adminPassword; private String token; public Project() { } - public Project( - String id, String password, String activ, String author, String adminpassword) { + public Project(String id, String password, Boolean active, String author, String adminPassword) { + this.id = id; + this.password = password; + this.active = active; + this.author = author; + this.adminPassword = adminPassword; + + this.timecreated = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC"))); + } + + public Project(String id, String password, Boolean active, String author, String adminPassword, String token) { this.id = id; this.password = password; - this.activ = activ; + this.active = active; this.author = author; - this.adminpassword = adminpassword; + this.adminPassword = adminPassword; + this.token = token; + + this.timecreated = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC"))); + } - Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC"))); - this.timecreated = ts; + public Project(String id, String password, Boolean active, Timestamp timecreated, String author, + String adminPassword, String token) { + this.id = id; + this.password = password; + this.active = active; + this.timecreated = timecreated; + this.author = author; + this.adminPassword = adminPassword; + this.token = token; } public String getId() { @@ -50,12 +68,12 @@ public class Project { this.password = password; } - public String getActiv() { - return activ; + public Boolean isActive() { + return active; } - public void setActiv(String activ) { - this.activ = activ; + public void setActive(Boolean active) { + this.active = active; } public String getAuthor() { @@ -66,12 +84,12 @@ public class Project { this.author = author; } - public String getAdminpassword() { - return adminpassword; + public String getAdminPassword() { + return adminPassword; } - public void setAdminpassword(String adminpassword) { - this.adminpassword = adminpassword; + public void setAdminPassword(String adminPassword) { + this.adminPassword = adminPassword; } public String getToken() { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java index 57b6326cc78caca6e9673a9dab8ce31f0118113e..3b3800696c9a44662e03285220d62fe5e8a6822f 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/HiddenUserTag.java @@ -1,24 +1,24 @@ package unipotsdam.gf.core.management.user; import unipotsdam.gf.core.management.ManagementImpl; -import unipotsdam.gf.core.management.user.User; import javax.servlet.http.HttpServletRequest; -import javax.servlet.jsp.tagext.*; -import javax.servlet.jsp.*; -import java.io.*; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.PageContext; +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 * manipulate the user data with jquery */ public class HiddenUserTag extends SimpleTagSupport { - public void doTag() throws JspException, IOException { + public void doTag() throws IOException { PageContext pageContext = (PageContext) getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); String token = request.getParameter("token"); ManagementImpl management = new ManagementImpl(); - User user = management.getUser(token); + User user = management.getUserByToken(token); JspWriter out = getJspContext().getOut(); out.println("<p id=\"user\" hidden>"+user.getName()+"</p>"); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java index 8fd6c0f6d2ae28b8f457ad12922d3698990ece10..3a3a695d7e870ddca681c05918a9a5c4acafddfd 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/SessionValidator.java @@ -4,7 +4,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import unipotsdam.gf.core.management.ManagementImpl; -import javax.servlet.*; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -14,18 +19,18 @@ import java.io.IOException; */ public class SessionValidator implements Filter { - Logger log = LoggerFactory.getLogger(SessionValidator.class); + private final static Logger log = LoggerFactory.getLogger(SessionValidator.class); private void redirectToLogin(ServletRequest request, ServletResponse response) { log.debug("redirecting user to login because token does not exist"); String loginJSP = "../../index.jsp"; ((HttpServletResponse) response).setHeader("Location", loginJSP); - ((HttpServletResponse) response).setContentType("text/html"); + response.setContentType("text/html"); ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_FOUND); // SC_FOUND = 302 } @Override - public void init(FilterConfig filterConfig) throws ServletException { + public void init(FilterConfig filterConfig) { } @@ -37,7 +42,7 @@ public class SessionValidator implements Filter { redirectToLogin(request, response); } ManagementImpl management = new ManagementImpl(); - User user = management.getUser(token); + User user = management.getUserByToken(token); if (user == null) { redirectToLogin(request, response); } 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 22f6157174ee5a3d8dbbb81e44e5fb1e8adaf068..ef9531d231c70944f627ee6afbaeb26ee1eb5ac5 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 @@ -1,14 +1,13 @@ package unipotsdam.gf.core.management.user; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + /** * Created by dehne on 31.05.2018. */ +@JsonIgnoreProperties(ignoreUnknown = true) public class User { - // the email is the id! - public String getId() { - return this.email; - } private String name; private String password; private String email; @@ -25,16 +24,24 @@ public class User { this.password = password; this.email = email; this.isStudent = isStudent; + this.rocketChatAuthToken = ""; + this.rocketChatId = ""; } - public User(String name, String password, String email, String rocketChatId, Boolean isStudent) { + public User(String name, String password, String email, String rocketChatId, String rocketChatAuthToken, Boolean isStudent) { this.name = name; this.password = password; this.email = email; this.rocketChatId = rocketChatId; + this.rocketChatAuthToken = rocketChatAuthToken; this.isStudent = isStudent; } + // the email is the id! + public String getId() { + return this.email; + } + public String getName() { return name; } @@ -68,7 +75,6 @@ public class User { } - public Boolean getStudent() { return isStudent; } @@ -92,4 +98,17 @@ public class User { public void setRocketChatAuthToken(String rocketChatAuthToken) { this.rocketChatAuthToken = rocketChatAuthToken; } + + @Override + public String toString() { + return "User{" + + "name='" + name + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", token='" + token + '\'' + + ", rocketChatAuthToken='" + rocketChatAuthToken + '\'' + + ", rocketChatId='" + rocketChatId + '\'' + + ", isStudent=" + isStudent + + '}'; + } } 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 9de798e4f59741e4818c1c056efe69bd487a728d..d5c0515c1ea29368e7a6322484994eb767e2d2c4 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 @@ -4,6 +4,8 @@ import unipotsdam.gf.core.management.ManagementImpl; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.communication.service.CommunicationDummyService; +import javax.annotation.ManagedBean; +import javax.inject.Inject; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -14,8 +16,12 @@ import java.net.URI; import java.net.URISyntaxException; @Path("/user") +@ManagedBean public class UserService { + @Inject + private ICommunication communicationService; + /** * creates a user with given credentials * @@ -36,13 +42,8 @@ public class UserService { ManagementImpl management = new ManagementImpl(); User user = new User(name, password, email, isStudent == null); - ICommunication iCommunication = new CommunicationDummyService(); - boolean chatUserCreated = iCommunication.registerUser(user); - if (chatUserCreated) { - return login(true, user); - } else { - return registrationError(); - } + return login(true, user); + } /** @@ -90,12 +91,18 @@ public class UserService { ManagementImpl m = new ManagementImpl(); String token = m.getUserToken(user); user = m.getUser(token); + return loginError(); + } return redirectToProjectPage(user, management); } 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); } else { String existsUrl = "../index.jsp?userExists=false"; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig new file mode 100644 index 0000000000000000000000000000000000000000..73d84e8fa40445fffec6c0a31a5523f9fb5e318f --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/user/UserService.java.orig @@ -0,0 +1,163 @@ +package unipotsdam.gf.core.management.user; + +import unipotsdam.gf.core.management.ManagementImpl; +import unipotsdam.gf.interfaces.ICommunication; +import unipotsdam.gf.modules.communication.service.CommunicationDummyService; + +import javax.annotation.ManagedBean; +import javax.inject.Inject; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.net.URI; +import java.net.URISyntaxException; + +@Path("/user") +@ManagedBean +public class UserService { + + @Inject + private ICommunication communicationService; + + /** + * creates a user with given credentials + * + * @param name + * @param password + * @param email + * @param isStudent + * @return + * @throws URISyntaxException + */ + // This method is called if HTML is request + @POST + @Produces(MediaType.TEXT_HTML) + @Path("/create") + public Response createUser(@FormParam("name") String name, @FormParam("password") String password, + @FormParam("email") String email, @FormParam("isStudent") String isStudent) + throws URISyntaxException { + + ManagementImpl management = new ManagementImpl(); + User user = new User(name, password, email, isStudent == null); + return login(true, user); + + } + + /** + * checks if a user exists in order to log him in + * + * @param name + * @param password + * @param email + * @return + * @throws URISyntaxException + */ + // This method is called if HTML is request + @POST + @Produces(MediaType.TEXT_HTML) + @Path("/exists") + public Response existsUser(@FormParam("name") String name, @FormParam("password") String password, + @FormParam("email") String email) + throws URISyntaxException { + + ManagementImpl management = new ManagementImpl(); + User user = new User(name, password, email, null); + ICommunication iCommunication = new CommunicationDummyService(); + boolean isLoggedIn = iCommunication.loginUser(user); + if (isLoggedIn) { + return login(false, user); + } else { + return loginError(); + } + + + } + + /** + * 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(boolean createUser, User user) throws URISyntaxException { + ManagementImpl management = new ManagementImpl(); + if (management.exists(user)) { + if (!createUser) { +<<<<<<< HEAD + ManagementImpl m = new ManagementImpl(); + String token = m.getUserToken(user); + user = m.getUser(token); +======= + boolean successfulLogin = communicationService.loginUser(user); + management.update(user); + if (!successfulLogin) { + return loginError(); + } +>>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd + return redirectToProjectPage(user, management); + } + 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); + } else { + String existsUrl = "../index.jsp?userExists=false"; + return forwardToLocation(existsUrl); + } + ManagementImpl m = new ManagementImpl(); + String token = m.getUserToken(user); + user = m.getUser(token); //todo: write query to get user isStudent + return redirectToProjectPage(user, management); + } + } + + private Response registrationError() throws URISyntaxException { + String existsUrl = "../register.jsp?registrationError=true"; + return forwardToLocation(existsUrl); + } + + private Response loginError() throws URISyntaxException { + String existsUrl = "../index.jsp?loginError=true"; + return forwardToLocation(existsUrl); + } + + /** + * helper function for redirecting to the right project page + * + * @param user + * @param management + * @return + * @throws URISyntaxException + */ + private Response redirectToProjectPage(User user, ManagementImpl management) throws URISyntaxException { + String successUrl; + if (user.getStudent() != null && user.getStudent()) { + successUrl = "../pages/overview-student.html?token="; + } else { + successUrl = "../pages/overview-docent.html?token="; + } + successUrl += management.getUserToken(user); + return forwardToLocation(successUrl); + } + + /** + * * helper function for redirecting to a new page + * + * @param existsUrl + * @return + * @throws URISyntaxException + */ + private Response forwardToLocation(String existsUrl) throws URISyntaxException { + return Response.seeOther(new URI(existsUrl)).build(); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java index 8a07add14391adf6779942e0225e1c38e30e9b2f..12d3d71183ae34966d1e88a04596095c22eadd42 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java @@ -22,7 +22,7 @@ public interface ICommunication { List<ChatMessage> getChatHistory(String roomId); - boolean sendMessageToChat(Message message); + boolean sendMessageToChat(Message message, String roomId); /** * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/create/ @@ -44,6 +44,8 @@ public interface ICommunication { */ boolean addUserToChatRoom(String roomId, User user); + boolean removeUserFromChatRoom(User user, String roomId); + /** * endpoint: https://rocket.chat/docs/developer-guides/rest-api/groups/settopic/ * @@ -79,4 +81,8 @@ public interface ICommunication { */ boolean registerUser(User user); + boolean registerAndLoginUser(User user); + + String getChatRoomLink(String userToken, String projectToken, String groupToken); + } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java new file mode 100644 index 0000000000000000000000000000000000000000..9fa51312f3f086cdacfd1dd25bc21612dccffbc8 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/ChatWindow.java @@ -0,0 +1,40 @@ +package unipotsdam.gf.modules.communication; + +import unipotsdam.gf.core.management.ManagementImpl; +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"); + ManagementImpl management = new ManagementImpl(); + //User user = management.getUserByToken(token); + String groupToken = request.getParameter("groupToken"); + String projectToken = request.getParameter("projectToken"); + //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/service/CommunicationDummyService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java index f659a3620b974c75bbf237c2453b4b30c92d1356..3d989429228f1c213263794b0df7c741f87507cb 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,46 +1,68 @@ package unipotsdam.gf.modules.communication.service; +import unipotsdam.gf.config.Constants; +import unipotsdam.gf.core.management.Management; import unipotsdam.gf.core.management.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 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.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+1), "Dies ist ein Test" + i + " .", - Instant.now().minusSeconds(maxValue * 10 - i * 10),"testUser" + i)); + 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) { - throw new RuntimeException("Do not call this method without implementation"); + public boolean sendMessageToChat(Message message, String roomId) { + return true; } @Override public String createChatRoom(String name, List<User> users) { + if (Objects.isNull(users)) { + return "2"; + } + return "1"; } @Override public boolean addUserToChatRoom(String roomId, User user) { - throw new RuntimeException("Do not call this method without implementation"); + return true; + } + + @Override + public boolean removeUserFromChatRoom(User user, String roomId) { + return true; } @Override public boolean setChatRoomTopic(String roomId, String topic) { - throw new RuntimeException("Do not call this method without implementation"); + return true; } @Override @@ -50,7 +72,6 @@ public class CommunicationDummyService implements ICommunication { @Override public boolean loginUser(User user) { - user.setRocketChatId("1"); user.setRocketChatAuthToken("abc"); return true; } @@ -60,4 +81,28 @@ public class CommunicationDummyService implements ICommunication { 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 userToken, String projectToken, String groupToken) { + //User user = managementService.getUserByToken(userToken); + // TODO: Implement getProjectbyToken and getGroupByToken + //Project project = managementService.getProject(projectToken + String channelName = "general"; + return Constants.ROCKET_CHAT_URL + "/channel/" + channelName + "?layout=embedded"; + } + + // 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/view/CommunicationView.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java new file mode 100644 index 0000000000000000000000000000000000000000..bc2c6ff9fa0638e8a8feb9c12b902f545c19dfe4 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/view/CommunicationView.java @@ -0,0 +1,186 @@ +package unipotsdam.gf.modules.communication.view; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import unipotsdam.gf.core.management.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 javax.annotation.ManagedBean; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +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.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +import static java.util.Objects.isNull; + +@Path("/chat") +@ManagedBean +public class CommunicationView { + + private static final Logger log = LoggerFactory.getLogger(CommunicationView.class); + + @Inject + private ICommunication communicationService; + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/info/{roomId}") + public Response getChatRoomInformation(@PathParam("roomId") String roomId) { + ChatRoom chatRoom = communicationService.getChatRoomInfo(roomId); + if (isNull(chatRoom)) { + 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; + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/addUser/{roomId}") + public Response addUserToChatRoom(@PathParam("roomId") String roomId, User user) { + 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); + if (isNull(wasAdded)) { + log.error("addUserToChatRoom: chatRoom not found for roomId: {}, user: {}", roomId, user); + return Response.status(Response.Status.NOT_FOUND).build(); + } + Response response; + if (wasAdded) { + log.trace("response for addUser: {}", wasAdded); + 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(); + } + return response; + } + + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/removeUser/{roomId}") + public Response removeUserFromChatRoom(User user, @PathParam("roomId") String roomId) { + if (isNull(user)) { + log.trace("removeUser user object was null"); + return Response.status(Response.Status.BAD_REQUEST).entity("must provide user").build(); + } + boolean wasRemoved = communicationService.removeUserFromChatRoom(user, roomId); + if (isNull(wasRemoved)) { + log.error("removeUserToChatRoom: chatRoom not found for roomId: {}, user: {}", roomId, user); + return Response.status(Response.Status.NOT_FOUND).build(); + } + Response response; + if (wasRemoved) { + log.trace("response for removeUser: {}", wasRemoved); + 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(); + } + return response; + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/create") + public Response createChatRoom(@QueryParam("name") String name, List<User> users) { + 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)) { + log.error("error while creating chatRoom for: name: {}, users: {}", name, users); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + log.trace("response for createChatRoom: {}", chatId); + return Response.status(Response.Status.CREATED).entity(chatId).build(); + } + + // Temp: just get user as json + // TODO: remove after done implementing + @GET + @Path("/user") + @Produces(MediaType.APPLICATION_JSON) + public Response getUser() { + User user = ((CommunicationDummyService) communicationService).getUser(); + return Response.ok(user).build(); + } + + +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupCreation/service/GroupCreationService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupCreation/service/GroupCreationService.java new file mode 100644 index 0000000000000000000000000000000000000000..23127b12dc29e93f9d76e299c81619229fab16e4 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/groupCreation/service/GroupCreationService.java @@ -0,0 +1,97 @@ +package unipotsdam.gf.modules.groupCreation.service; + +import unipotsdam.gf.core.management.Management; +import unipotsdam.gf.core.management.group.Group; +import unipotsdam.gf.core.management.project.Project; +import unipotsdam.gf.core.management.user.User; +import unipotsdam.gf.core.management.user.UserProfile; +import unipotsdam.gf.interfaces.ICommunication; + +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 GroupCreationService { + + @Inject + private ICommunication communicationService; + + @Inject + private Management management; + + public boolean createExampleProject() { + + User docentUser = getDocentUser(); + Project project = new Project("1", "", true, docentUser.getEmail(), "admin"); + + List<Group> groups = createDummyGroups(project.getId()); + + if (!management.exists(project)) { + management.create(project); + } + + groups.forEach(group -> management.createGroup(group, project.getId())); + + // TODO: read List<Group> of database to get Id for chatRoomName (Should be ProjectName - GroupId) + // TODO: add projectName as DatabaseEntry + // TODO: implement sql service injection for, so connection is only done once in app + + + List<Group> nonEmptyGroups = groups.stream().filter(group -> group.getMembers().isEmpty()) + .collect(Collectors.toList()); + if (nonEmptyGroups.isEmpty()) { + return false; + } + + + return true; + } + + private List<Group> createDummyGroups(String projectId) { + Group group1 = new Group(new ArrayList<>(), projectId); + Group group2 = new Group(new ArrayList<>(), projectId); + Group group3 = new Group(new ArrayList<>(), projectId); + Group group4 = new Group(new ArrayList<>(), projectId); + 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; + } + + private User getDocentUser() { + User docent = new User("Julian", "docent", "docent@docent.com", false); + if (!management.exists(docent)) { + saveUserToDatabase(docent); + } else { + docent = management.getUserByEmail(docent.getEmail()); + } + return docent; + } + + private void saveUserToDatabase(User user) { + communicationService.registerAndLoginUser(user); + management.create(user, new UserProfile()); + } +} diff --git a/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml b/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml index 3511089f59e16b12495bd35e537aab326cf9edb2..929b4ad51850624802f6c16eed5d88b77f59b274 100644 --- a/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml +++ b/gemeinsamforschen/src/main/webapp/WEB-INF/web.xml @@ -26,6 +26,10 @@ <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> + <init-param> + <param-name>javax.ws.rs.Application</param-name> + <param-value>unipotsdam.gf.config.GFResourceConfig</param-value> + </init-param> <!-- <init-param> <param-name>com.sun.jersey.config.feature.DisableWADL</param-name> <param-value>true</param-value> diff --git a/gemeinsamforschen/src/main/webapp/communication/chatWindow.tld b/gemeinsamforschen/src/main/webapp/communication/chatWindow.tld new file mode 100644 index 0000000000000000000000000000000000000000..e98a7ae49e0b8eba380ac79f2efd35b0840c63cc --- /dev/null +++ b/gemeinsamforschen/src/main/webapp/communication/chatWindow.tld @@ -0,0 +1,16 @@ +<taglib> + <tlib-version>1.0</tlib-version> + <jsp-version>2.0</jsp-version> + <short-name>chatWindow</short-name> + + <tag> + <name>chatWindow</name> + <tag-class>unipotsdam.gf.modules.communication.ChatWindow</tag-class> + <body-content>empty</body-content> + <attribute> + <name>orientation</name> + <required>yes</required> + <rtexprvalue>no</rtexprvalue> + </attribute> + </tag> +</taglib> \ No newline at end of file diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-docent.html b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html index 10bf48506b71a4cd652ae743fc3c04399c1df6e8..cc9f504b65cee81c9b30aefdae2a72555178b49f 100644 --- a/gemeinsamforschen/src/main/webapp/pages/overview-docent.html +++ b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html @@ -51,7 +51,7 @@ </tr> <tr style="cursor:pointer" role="button"> <td> - <a href="project-docent.html"> + <a href="project-docent.jsp"> <h1>dummy Projekt2</h1> </a> </td> diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-docent.html.orig b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html.orig new file mode 100644 index 0000000000000000000000000000000000000000..621176b5de895049ff300d1782269135a296493e --- /dev/null +++ b/gemeinsamforschen/src/main/webapp/pages/overview-docent.html.orig @@ -0,0 +1,91 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>fltrail</title> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> + <link rel="stylesheet" href="../assets/css/styles.css"> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> + <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> +</head> + +<body> +<h1>Übersicht für Dozent1</h1> +<a href="#"><span class="glyphicon glyphicon-envelope" + style="font-size:27px;margin-top:-17px;margin-left:600px;"></span></a> +<a href="#"><span class="glyphicon glyphicon-cog" style="font-size:29px;margin-left:5px;margin-top:-25px;"></span></a> +<div> + <table id="projects"> <!-- getElementById('projects').append um neue Projekte anzufügen --> + <tr style="cursor:pointer" role="button"> + <td> +<<<<<<< HEAD + <a id="project1Link"> +======= + <a href="project-docent.jsp"> +>>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd + <h1>dummy Projekt1</h1> + </a> + </td> + </tr> + <tr> + <td> + <div style="width:100px;"></div> + <div style="width:741px;"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">Newsfeed </h3> + </div> + <div class="panel-body"> + <ul class="list-group"> + <li class="list-group-item"> + <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span> + </li> + <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li> + <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li> + </ul> + </div> + </div> + </div> + </td> + </tr> + <tr> + <td></td> + </tr> + <tr style="cursor:pointer" role="button"> + <td> + <a href="project-docent.jsp"> + <h1>dummy Projekt2</h1> + </a> + </td> + </tr> + <tr> + <td> + <div style="width:100px;"></div> + <div style="width:741px;"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">Newsfeed </h3> + </div> + <div class="panel-body"> + <ul class="list-group"> + <li class="list-group-item"> + <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span> + </li> + <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li> + <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li> + </ul> + </div> + </div> + </div> + </td> + </tr> + </table> +</div> +<button class="btn btn-default" type="button" style="margin-left:250px;">Projekt erstellen</button> +<script src="../assets/js/jquery.min.js"></script> +<script src="../assets/bootstrap/js/bootstrap.min.js"></script> +</body> + +</html> \ No newline at end of file diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-student.html b/gemeinsamforschen/src/main/webapp/pages/overview-student.html index f739bfaf6c6f9d9ab53e9b7de53662a90535d684..feb1ce71f4f1eefaae7b6ec8bd35341670fafa1c 100644 --- a/gemeinsamforschen/src/main/webapp/pages/overview-student.html +++ b/gemeinsamforschen/src/main/webapp/pages/overview-student.html @@ -54,7 +54,7 @@ </tr> <tr style="cursor:pointer" role="button"> <td> - <a href="project-docent.html"> + <a href="project-docent.jsp"> <h1>dummy Projekt2</h1> </a> </td> diff --git a/gemeinsamforschen/src/main/webapp/pages/overview-student.html.orig b/gemeinsamforschen/src/main/webapp/pages/overview-student.html.orig new file mode 100644 index 0000000000000000000000000000000000000000..db7445c800029d1c311a2a61f6528428a110ae85 --- /dev/null +++ b/gemeinsamforschen/src/main/webapp/pages/overview-student.html.orig @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>fltrail</title> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> + <link rel="stylesheet" href="../assets/css/styles.css"> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> + <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> + <script src="../assets/js/utility.js"></script> + <script src="../assets/js/overview-student.js"></script> + +</head> + +<body> +<h1>Übersicht für Student1</h1> +<a href="#"><span class="glyphicon glyphicon-envelope" + style="font-size:27px;margin-top:-17px;margin-left:600px;"></span></a> +<a href="#"><span class="glyphicon glyphicon-cog" style="font-size:29px;margin-left:5px;margin-top:-25px;"></span></a> +<div> + <table id="projects"> <!-- getElementById('projects').append um neue Projekte anzufügen --> + <tr style="cursor:pointer" role="button"> + <td> +<<<<<<< HEAD + <a id="project1Link"> +======= + <a href="project-docent.jsp"> +>>>>>>> 9bbae0ff75b2597ab35479a24d47c12e7a4cc0fd + <h1>dummy Projekt1</h1> + </a> + </td> + </tr> + <tr> + <td> + <div style="width:100px;"></div> + <div style="width:741px;"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">Newsfeed </h3> + </div> + <div class="panel-body"> + <ul class="list-group"> + <li class="list-group-item"> + <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span> + </li> + <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li> + <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li> + </ul> + </div> + </div> + </div> + </td> + </tr> + <tr> + <td></td> + </tr> + <tr style="cursor:pointer" role="button"> + <td> + <a href="project-docent.jsp"> + <h1>dummy Projekt2</h1> + </a> + </td> + </tr> + <tr> + <td> + <div style="width:100px;"></div> + <div style="width:741px;"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">Newsfeed </h3> + </div> + <div class="panel-body"> + <ul class="list-group"> + <li class="list-group-item"> + <span>erste Abgabe vom Dozenten zu dd.mm.yyyy gefordert</span> + </li> + <li class="list-group-item"><span>Beitrag von Student1 wurde hochgeladen</span></li> + <li class="list-group-item"><span>Gruppe "gemeinsam forschen" rockt das Haus</span></li> + </ul> + </div> + </div> + </div> + </td> + </tr> + </table> +</div> + </div><button class="btn btn-default" type="button" style="margin-left:250px;">Projekt beitreten</button> + <script src="../assets/js/jquery.min.js"></script> + <script src="../assets/bootstrap/js/bootstrap.min.js"></script> +</body> + +</html> \ No newline at end of file diff --git a/gemeinsamforschen/src/main/webapp/pages/project-docent.html b/gemeinsamforschen/src/main/webapp/pages/project-docent.jsp similarity index 98% rename from gemeinsamforschen/src/main/webapp/pages/project-docent.html rename to gemeinsamforschen/src/main/webapp/pages/project-docent.jsp index 5e8890a70d8c22019b3f9ec72b687ec2f8b2608e..a67e761165a9ddf5b5d6879c41d2896b9581a771 100644 --- a/gemeinsamforschen/src/main/webapp/pages/project-docent.html +++ b/gemeinsamforschen/src/main/webapp/pages/project-docent.jsp @@ -1,4 +1,5 @@ <!DOCTYPE html> +<%@ taglib prefix = "communication" uri = "/communication/chatWindow.tld"%> <html> <head> @@ -128,6 +129,7 @@ </div> </div> </div> + <communication:chatWindow orientation="right"></communication:chatWindow> <script src="../assets/js/jquery.min.js"></script> <script src="../assets/bootstrap/js/bootstrap.min.js"></script> </body> diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql index 7e6e05efc455f0cb85a040550d3271a1d4a64d06..c92c03da44cc2448ac7b5e9d09cb274997e2459d 100644 --- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql +++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql @@ -1,59 +1,67 @@ -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -SET time_zone = "+00:00"; +CREATE DATABASE IF NOT EXISTS `fltrail` + DEFAULT CHARACTER SET utf8 + COLLATE utf8_general_ci; +USE `fltrail`; -/*!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 if not exists `projects` ( + `id` varchar(400) NOT NULL, + `password` varchar(400) NOT NULL, + `active` tinyint(1) NOT NULL, + `timecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP + ON UPDATE CURRENT_TIMESTAMP, + `author` varchar(400) NOT NULL, + `adminPassword` varchar(400) NOT NULL, + `token` varchar(400) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; -CREATE DATABASE IF NOT EXISTS `fltrail` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; -USE `fltrail`; -CREATE TABLE `projects` ( - `id` varchar(400) NOT NULL, - `password` varchar(400) NOT NULL, - `activ` tinyint(1) NOT NULL, - `timecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `author` varchar(400) NOT NULL, - `adminpassword` varchar(400) NOT NULL, - `token` varchar(400) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `tags` ( +CREATE TABLE if not exists `groups` ( + `id` int NOT NULL AUTO_INCREMENT, + `projectId` varchar(400) NOT NULL, + `chatRoomId` varchar(400) NOT NULL, + PRIMARY KEY (id) +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +CREATE TABLE if not exists groupuser +( + userEmail varchar(400) NOT NULL, + groupId int NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; + +CREATE TABLE if not exists `tags` ( `projectId` varchar(400) NOT NULL, - `tag` varchar(400) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `users` ( - `name` varchar(400) NOT NULL, - `password` varchar(200) NOT NULL, - `email` varchar(400) NOT NULL, - `token` varchar(800) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE projectuser - ( - projectId varchar(400) NOT NULL, - userId varchar(400) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `annotations` ( - `id` varchar(120) NOT NULL, - `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `userId` int(11) DEFAULT NULL, - `targetId` int(11) DEFAULT NULL, - `body` varchar(280) DEFAULT NULL, - `startCharacter` int(11) DEFAULT NULL, - `endCharacter` int(11) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `tag` varchar(400) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; -alter table users - add isStudent tinyint(1) default '1' null; +CREATE TABLE if not exists `users` ( + `name` varchar(400) NOT NULL, + `password` varchar(200) NOT NULL, + `email` varchar(255) NOT NULL, + `token` varchar(800) NOT NULL, + `rocketChatId` varchar(400) NOT NULL, + `rocketChatAuthToken` varchar(800) NOT NULL, + UNIQUE (email) +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; +CREATE TABLE if not exists projectuser +( + projectId varchar(400) NOT NULL, + userId varchar(400) NOT NULL +) + ENGINE = InnoDB + DEFAULT CHARSET = utf8; +alter table users + add isStudent tinyint(1) default '1' null; -/*!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 */; diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java index 9463acbdaa8eb72ef80b9bd13b4fe856c033eed8..8e71c0dcba017d321a6af5540fb843ea8ff7352c 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ManagementTest.java @@ -6,12 +6,10 @@ import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; import unipotsdam.gf.core.management.user.UserProfile; -import java.sql.Timestamp; -import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.List; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * Created by dehne on 01.06.2018. @@ -19,16 +17,15 @@ import static org.junit.Assert.*; public class ManagementTest { @Test - public void testDelete() throws Exception { + public void testDelete() { } /** * CREATE a user in the DB using the - * @throws Exception */ @Test - public void testExists() throws Exception { + public void testExists() { ManagementImpl management = new ManagementImpl(); User user = new User("julian", "1234", "from1123123123@stuff.com", true); assert !management.exists(user); @@ -36,10 +33,9 @@ public class ManagementTest { /** * CREATE a user in the DB using the - * @throws Exception */ @Test - public void testCreate() throws Exception { + public void testCreate() { ManagementImpl management = new ManagementImpl(); User user = new User("julian", "1234", "from@stuff.com", false); management.create(user, new UserProfile()); @@ -48,35 +44,49 @@ public class ManagementTest { /** * Test creating a user in the DB - * @throws Exception */ @Test - public void testCreate1() throws Exception { + public void testCreate1() { ManagementImpl management = new ManagementImpl(); - management.create(new Project("Gemainsam Forschen", "1235", "1", "me", "keins")); + management.create(new Project("Gemainsam Forschen", "1235", true, "me", "keins")); } @Test - public void testRegister() throws Exception { + public void testRegister() { ManagementImpl management = new ManagementImpl(); User user = new User("julian", "1234", "from@stuff.com", true); management.create(user, new UserProfile()); assert management.exists(user); - Project project = new Project("Gemainsam Forschen", "1235", "1", "me", "keins"); + Project project = new Project("Gemainsam Forschen", "1235", true, "me", "keins"); management.create(project); management.register(user, project, null); } @Test - public void testGetUsers() throws Exception { + public void testUpdateUser() { + ManagementImpl management = new ManagementImpl(); + User user = new User("julian", "1234", "testUpdateUser@stuff.com", true); + user.setToken("abc"); + management.create(user, new UserProfile()); + assertTrue(management.exists(user)); + + user.setStudent(false); + management.update(user); + assertTrue(management.exists(user)); + User managementUser = management.getUserByToken(user.getToken()); + assertEquals(user.getStudent(), managementUser.getStudent()); + } + + @Test + public void testGetUsers() { ManagementImpl management = new ManagementImpl(); User user = new User("julian", "1234", "from@stuff.com", false); management.create(user, new UserProfile()); assert management.exists(user); - Project project = new Project("Gemainsam Forschen", "1235", "1", "me", "keins"); + Project project = new Project("Gemainsam Forschen", "1235", true, "me", "keins"); management.create(project); management.register(user, project, null); diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/view/CommunicationViewTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/view/CommunicationViewTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d9bbfc17d3e19b4b5d5a737134c5b90c445a13a8 --- /dev/null +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/communication/view/CommunicationViewTest.java @@ -0,0 +1,128 @@ +package unipotsdam.gf.modules.communication.view; + +import org.glassfish.jersey.test.JerseyTest; +import org.glassfish.jersey.test.util.runner.ConcurrentRunner; +import org.junit.Test; +import org.junit.runner.RunWith; +import unipotsdam.gf.config.GFResourceConfig; +import unipotsdam.gf.core.management.user.User; +import unipotsdam.gf.modules.communication.model.Message; +import unipotsdam.gf.modules.communication.model.chat.ChatRoom; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.Response; +import java.util.ArrayList; +import java.util.List; + +import static javax.ws.rs.core.Response.Status.BAD_REQUEST; +import static javax.ws.rs.core.Response.Status.CREATED; +import static javax.ws.rs.core.Response.Status.NOT_FOUND; +import static javax.ws.rs.core.Response.Status.OK; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +@RunWith(ConcurrentRunner.class) +public class CommunicationViewTest extends JerseyTest { + + private final static String ENDPOINT = "chat/"; + + @Override + protected Application configure() { + CommunicationView communicationView = new CommunicationView(); + GFResourceConfig gfResourceConfig = new GFResourceConfig(); + gfResourceConfig.register(communicationView); + return gfResourceConfig; + } + + @Test + public void getChatRoomInformation() { + String path = ENDPOINT + "info/"; + Response responseOk = target().path(path + "1").request().get(); + assertThat(responseOk.getStatus(), is(OK.getStatusCode())); + assertNotNull(responseOk.readEntity(ChatRoom.class)); + + Response responseNotFound = target().path(path).request().get(); + assertThat(responseNotFound.getStatus(), is(NOT_FOUND.getStatusCode())); + } + + @Test + public void getChatHistory() { + String path = ENDPOINT + "history/"; + Response responseOk = target().path(path + "1").request().get(); + assertThat(responseOk.getStatus(), is(OK.getStatusCode())); + assertNotNull(responseOk.readEntity(List.class)); + + Response responseNotFound = target().path(path).request().get(); + assertThat(responseNotFound.getStatus(), is(NOT_FOUND.getStatusCode())); + } + + @Test + public void createChatRoom() { + String path = ENDPOINT + "create"; + Response responseOk = target().path(path).queryParam("name", "test").request().post(null); + assertThat(responseOk.getStatus(), is(CREATED.getStatusCode())); + assertNotNull(responseOk.readEntity(String.class)); + + ArrayList<User> users = new ArrayList<>(); + users.add(new User("test", "test", "test", true)); + Response responseOk2 = target().path(path).queryParam("name", "test").request().post(Entity.json(users)); + assertThat(responseOk2.getStatus(), is(CREATED.getStatusCode())); + assertNotNull(responseOk2.readEntity(String.class)); + + Response responseBadRequest = target().path(path).request().post(Entity.json(users)); + assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode())); + } + + @Test + public void sendMessage() { + String path = ENDPOINT + "send"; + Message message = new Message(); + message.setMessage("test"); + message.setRoomIdOrChannel("1"); + Response responseOk = target().path(path + "/1").request().post(Entity.json(message)); + assertThat(responseOk.getStatus(), is(OK.getStatusCode())); + assertNotNull(responseOk.readEntity(String.class)); + + Response responseBadRequest = target().path(path + "/1").request().post(Entity.json(null)); + assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode())); + } + + @Test + public void addUserToChatRoom() { + String fullPath = ENDPOINT + "addUser" + "/1"; + + User user = new User("test", "test", "test", true); + Response responseOk = target().path(fullPath).request().post(Entity.json(user)); + assertThat(responseOk.getStatus(), is(OK.getStatusCode())); + assertNotNull(responseOk.readEntity(String.class)); + + Response responseBadRequest = target().path(fullPath).request().post(Entity.json(null)); + assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode())); + } + + @Test + public void removeUserFromChatRoom() { + String fullPath = ENDPOINT + "removeUser" + "/1"; + + User user = new User("test2", "test2", "test", true); + Response responseOk = target().path(fullPath).request().post(Entity.json(user)); + assertThat(responseOk.getStatus(), is(OK.getStatusCode())); + assertNotNull(responseOk.readEntity(String.class)); + + Response responseBadRequest = target().path(fullPath).request().post(Entity.json(null)); + assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode())); + } + + @Test + public void setChatRoomTopic() { + String fullPath = ENDPOINT + "setTopic" + "/1"; + Response responseOk = target().path(fullPath).queryParam("topic", "test").request().post(null); + assertThat(responseOk.getStatus(), is(OK.getStatusCode())); + assertNotNull(responseOk.readEntity(String.class)); + + Response responseBadRequest = target().path(fullPath).request().post(Entity.json(null)); + assertThat(responseBadRequest.getStatus(), is(BAD_REQUEST.getStatusCode())); + } +}