From 9040190d3359245cea4413062f28dd1b936358f9 Mon Sep 17 00:00:00 2001
From: Felipe D'Abrantes <felidabrantes@gmail>
Date: Sat, 8 Apr 2023 00:02:43 +0100
Subject: [PATCH] Stop a user from liking a post numerous times

---
 .../feed-service/app/controllers/DailyController.scala        | 2 ++
 backend-services/feed-service/app/models/Daily.scala          | 4 ++++
 .../app/models/exceptions/ConflictException.scala             | 3 +++
 3 files changed, 9 insertions(+)
 create mode 100644 backend-services/feed-service/app/models/exceptions/ConflictException.scala

diff --git a/backend-services/feed-service/app/controllers/DailyController.scala b/backend-services/feed-service/app/controllers/DailyController.scala
index 9b2dc147..0217dc2e 100644
--- a/backend-services/feed-service/app/controllers/DailyController.scala
+++ b/backend-services/feed-service/app/controllers/DailyController.scala
@@ -5,6 +5,7 @@ import play.api.mvc._
 import play.api.libs.json.JsValue
 
 import models.{Daily}
+import models.exceptions.ConflictException
 
 import scala.concurrent.TimeoutException
 import org.bson.types.ObjectId
@@ -92,6 +93,7 @@ class DailyController @Inject()(val controllerComponents: ControllerComponents)
         Ok("Updated")
     } catch {
         case _: TimeoutException => BadRequest("Request timed out")
+        case ex: ConflictException => BadRequest(ex.getMessage())
         case _: Throwable => BadRequest("Exception raised")
     }
   }
diff --git a/backend-services/feed-service/app/models/Daily.scala b/backend-services/feed-service/app/models/Daily.scala
index e4fa685f..db1c1098 100644
--- a/backend-services/feed-service/app/models/Daily.scala
+++ b/backend-services/feed-service/app/models/Daily.scala
@@ -1,6 +1,7 @@
 package models
 
 import repositories.{DailyRepository}
+import models.exceptions.{ConflictException}
 
 import scala.concurrent.ExecutionContext.Implicits.global
 import scala.concurrent.{Future, Await}
@@ -67,6 +68,9 @@ object Daily {
         val result: Future[Unit] = for {
             daily: Daily  <- dailyRepo.getById(dailyId)
             like: Unit <- {
+                // Check user has not already liked Daily
+                if (daily.usersLiked.contains(likerId)) throw new ConflictException("User has already liked this Daily.")
+
                 val updatedUsersLiked: Seq[ObjectId] = daily.usersLiked :+ likerId
                 val update: Bson = Updates.set("usersLiked", updatedUsersLiked)
 
diff --git a/backend-services/feed-service/app/models/exceptions/ConflictException.scala b/backend-services/feed-service/app/models/exceptions/ConflictException.scala
new file mode 100644
index 00000000..bf99cc11
--- /dev/null
+++ b/backend-services/feed-service/app/models/exceptions/ConflictException.scala
@@ -0,0 +1,3 @@
+package models.exceptions
+
+case class ConflictException(message: String) extends Exception(message)
-- 
GitLab