From ded7aa83c9ecd11c8c6fc2202a77138a56353029 Mon Sep 17 00:00:00 2001
From: Christoph Thelen <christoph.thelen@mni.thm.de>
Date: Thu, 25 Oct 2012 13:53:55 +0200
Subject: [PATCH] Issue #4046: Respond with the feedback value (if any) of the
 current user

---
 .../controller/FeedbackController.java        | 11 +++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 75 ++++++++++++-------
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  1 +
 .../thm/arsnova/services/FeedbackService.java |  5 ++
 .../arsnova/services/IFeedbackService.java    |  1 +
 5 files changed, 66 insertions(+), 27 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/FeedbackController.java b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
index b91cec485..a976fb668 100644
--- a/src/main/java/de/thm/arsnova/controller/FeedbackController.java
+++ b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
@@ -57,6 +57,17 @@ public class FeedbackController extends AbstractController {
 		return feedbackService.getFeedback(sessionkey);
 	}
 	
+	@RequestMapping(value="/session/{sessionkey}/myfeedback", method=RequestMethod.GET)
+	@ResponseBody
+	public Integer getMyFeedback(@PathVariable String sessionkey, HttpServletResponse response) {
+		Integer value = feedbackService.getMyFeedback(sessionkey, userService.getCurrentUser());
+		if (value != null && value >= 0 && value <= 3) {
+			return value;
+		}
+		response.setStatus(HttpStatus.NOT_FOUND.value());
+		return null;
+	}
+	
 	@RequestMapping(value="/session/{sessionkey}/feedbackcount", method=RequestMethod.GET)
 	@ResponseBody
 	public int getFeedbackCount(@PathVariable String sessionkey) {
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index d44832092..000034829 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -286,51 +286,38 @@ public class CouchDBDao implements IDatabaseDao {
 	public Feedback getFeedback(String keyword) {
 		String sessionId = this.getSessionId(keyword);
 		if (sessionId == null) throw new NotFoundException();
-
-		logger.info("Time: {}", this.currentTimestamp());
-
+		
 		View view = new View("understanding/by_session");
 		view.setGroup(true);
 		view.setStartKey(URLEncoder.encode("[\"" + sessionId + "\"]"));
 		view.setEndKey(URLEncoder.encode("[\"" + sessionId + "\",{}]"));
 		ViewResults results = this.getDatabase().view(view);
 		
-		logger.info("Feedback: {}", results.getJSONArray("rows"));
+		return this.createFeedbackObject(results);
+	}
 
+	private Feedback createFeedbackObject(ViewResults results) {
 		int values[] = { 0, 0, 0, 0 };
+		JSONArray rows = results.getJSONArray("rows");
 		
 		try {
 			for (int i = 0; i <= 3; i++) {
-				String key = results.getJSONArray("rows").optJSONObject(i)
-						.optJSONArray("key").getString(1);
+				String key = rows.optJSONObject(i).optJSONArray("key").getString(1);
+				JSONObject feedback = rows.optJSONObject(i);
+				
 				if (key.equals("Bitte schneller"))
-					values[0] = results.getJSONArray("rows").optJSONObject(i)
-							.getInt("value");
+					values[0] = feedback.getInt("value");
 				if (key.equals("Kann folgen"))
-					values[1] = results.getJSONArray("rows").optJSONObject(i)
-							.getInt("value");
+					values[1] = feedback.getInt("value");
 				if (key.equals("Zu schnell"))
-					values[2] = results.getJSONArray("rows").optJSONObject(i)
-							.getInt("value");
+					values[2] = feedback.getInt("value");
 				if (key.equals("Nicht mehr dabei"))
-					values[3] = results.getJSONArray("rows").optJSONObject(i)
-							.getInt("value");
+					values[3] = feedback.getInt("value");
 			}
 		} catch (Exception e) {
-			return new Feedback(
-					values[0],
-					values[1],
-					values[2],
-					values[3]
-			);
+			return new Feedback(values[0], values[1], values[2], values[3]);
 		}
-
-		return new Feedback(
-				values[0],
-				values[1],
-				values[2],
-				values[3]
-		);
+		return new Feedback(values[0], values[1], values[2], values[3]);
 	}
 
 	@Override
@@ -397,6 +384,18 @@ public class CouchDBDao implements IDatabaseDao {
 				return null;
 		}
 	}
+	
+	private int feedbackValueFromString(String value) {
+		if (value.equals("Bitte schneller"))
+			return 0;
+		if (value.equals("Kann folgen"))
+			return 1;
+		if (value.equals("Zu schnell"))
+			return 2;
+		if (value.equals("Nicht mehr dabei"))
+			return 3;
+		return Integer.MIN_VALUE;
+	}
 
 	@Override
 	@Transactional(isolation=Isolation.READ_COMMITTED)
@@ -566,4 +565,26 @@ public class CouchDBDao implements IDatabaseDao {
 			return;
 		}
 	}
+
+	@Override
+	public Integer getMyFeedback(String keyword, User user) {
+		try {
+			String sessionId = this.getSessionId(keyword);
+			if (sessionId == null) throw new NotFoundException();
+			
+			View view = new View("understanding/by_user");
+			view.setKey(URLEncoder.encode("[\"" + sessionId + "\", \"" + user.getUsername() + "\"]", "UTF-8"));
+			ViewResults results = this.getDatabase().view(view);
+			JSONArray rows = results.getJSONArray("rows");
+			
+			if (rows.size() == 0) {
+				return null;
+			}
+			
+			JSONObject json = rows.optJSONObject(0).optJSONObject("value");
+			return this.feedbackValueFromString(json.getString("value"));
+		} catch (UnsupportedEncodingException e) {
+			return null;
+		}
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index ff42a9a69..7a2aafd2d 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -44,4 +44,5 @@ public interface IDatabaseDao {
 	
 	public LoggedIn registerAsOnlineUser(User u, Session s);
 	public void updateSessionOwnerActivity(Session session);
+	public Integer getMyFeedback(String keyword, User user);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/FeedbackService.java b/src/main/java/de/thm/arsnova/services/FeedbackService.java
index 2b4e7f728..c7b798744 100644
--- a/src/main/java/de/thm/arsnova/services/FeedbackService.java
+++ b/src/main/java/de/thm/arsnova/services/FeedbackService.java
@@ -109,4 +109,9 @@ public class FeedbackService implements IFeedbackService {
 		}
 		this.server.reportUpdatedFeedbackForSessions(allAffectedSessions);
 	}
+
+	@Override
+	public Integer getMyFeedback(String keyword, User user) {
+		return this.databaseDao.getMyFeedback(keyword, user);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/services/IFeedbackService.java b/src/main/java/de/thm/arsnova/services/IFeedbackService.java
index bacfb70f7..f81997258 100644
--- a/src/main/java/de/thm/arsnova/services/IFeedbackService.java
+++ b/src/main/java/de/thm/arsnova/services/IFeedbackService.java
@@ -33,4 +33,5 @@ public interface IFeedbackService {
 	public long getAverageFeedback(String sessionkey);
 	public boolean saveFeedback(String keyword, int value, User user);
 	public void broadcastFeedbackChanges(Map<String, Set<String>> affectedUsers, Set<String> allAffectedSessions);
+	public Integer getMyFeedback(String keyword, User user);
 }
\ No newline at end of file
-- 
GitLab