Skip to content
Snippets Groups Projects
Commit a5784fce authored by Felipe D'Abrantes's avatar Felipe D'Abrantes
Browse files

Disable a question instead of deleting it

parent 7ff27329
No related branches found
No related tags found
1 merge request!25Add a question management page
...@@ -64,17 +64,17 @@ class QuestionController @Inject()(val controllerComponents: ControllerComponent ...@@ -64,17 +64,17 @@ class QuestionController @Inject()(val controllerComponents: ControllerComponent
} }
/** /**
* Create an Action to delete a Question in the DB. * Create an Action to disable a Question in the DB.
*/ */
def deleteQuestion(questionId: String) = authenticatedUserAction { implicit request: AuthenticationRequest[AnyContent] => def disableQuestion(questionId: String) = authenticatedUserAction { implicit request: AuthenticationRequest[AnyContent] =>
println("QuestionController:deleteQuestion") println("QuestionController:disableQuestion")
try { try {
if (!ObjectId.isValid(questionId)) throw new InvalidQueryParameterException("Invalid query parameter ID format: questionId") if (!ObjectId.isValid(questionId)) throw new InvalidQueryParameterException("Invalid query parameter ID format: questionId")
if (!request.isAdmin) throw new ForbiddenException("You must be an admin to delete a question.") if (!request.isAdmin) throw new ForbiddenException("You must be an admin to disable a question.")
Question.deleteQuestionAsync(new ObjectId(questionId)) Question.disableQuestionAsync(new ObjectId(questionId))
Ok("Deleted question") Ok("Disabled question")
} catch { } catch {
case _: TimeoutException => BadRequest("Request timed out") case _: TimeoutException => BadRequest("Request timed out")
case ex: InvalidQueryParameterException => BadRequest(ex.getMessage()) case ex: InvalidQueryParameterException => BadRequest(ex.getMessage())
......
...@@ -17,7 +17,7 @@ import org.bson.conversions.Bson ...@@ -17,7 +17,7 @@ import org.bson.conversions.Bson
import org.mongodb.scala.model.{Filters, Updates, Sorts} import org.mongodb.scala.model.{Filters, Updates, Sorts}
import play.api.libs.json.{Json, JsValue, JsString, JsObject, JsNumber, JsArray} import play.api.libs.json.{Json, JsValue, JsString, JsObject, JsNumber, JsBoolean, JsArray}
import scala.math.BigDecimal import scala.math.BigDecimal
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
...@@ -26,6 +26,7 @@ case class Question ( ...@@ -26,6 +26,7 @@ case class Question (
id: Option[ObjectId], id: Option[ObjectId],
content: String, content: String,
used: Integer, used: Integer,
disabled: Boolean,
createdAt: Date, createdAt: Date,
updatedAt: Date updatedAt: Date
) )
...@@ -34,13 +35,13 @@ object Question { ...@@ -34,13 +35,13 @@ object Question {
val questionRepo = new QuestionRepository() val questionRepo = new QuestionRepository()
def getQuestionsAsync(timeout: Int = 4): Seq[Question] = { def getQuestionsAsync(timeout: Int = 4): Seq[Question] = {
val result: Future[Seq[Question]] = questionRepo.getAll(None, Some(Sorts.descending("createdAt")), None, None) val result: Future[Seq[Question]] = questionRepo.getAll(Some(Filters.eq("disabled", false)), Some(Sorts.descending("createdAt")), None, None)
Await.result[Seq[Question]](result, timeout.seconds) Await.result[Seq[Question]](result, timeout.seconds)
} }
def createQuestionAsync(content: String, timeout: Int = 4): Question = { def createQuestionAsync(content: String, timeout: Int = 4): Question = {
val now: Date = Date.from(Instant.now()) val now: Date = Date.from(Instant.now())
val question: Question = Question(None, content, 0, now, now) val question: Question = Question(None, content, 0, false, now, now)
val newQuestion = for { val newQuestion = for {
questionExists <- questionRepo.getAll(Some(Filters.eq("content", question.content)), None, None, None).map(_.isEmpty) questionExists <- questionRepo.getAll(Some(Filters.eq("content", question.content)), None, None, None).map(_.isEmpty)
...@@ -51,10 +52,12 @@ object Question { ...@@ -51,10 +52,12 @@ object Question {
Await.result[Question](newQuestion, timeout.seconds) Await.result[Question](newQuestion, timeout.seconds)
} }
def deleteQuestionAsync(questionId: ObjectId, timeout: Int = 4): Unit = { def disableQuestionAsync(questionId: ObjectId, timeout: Int = 4): Unit = {
val delete: Future[Unit] = questionRepo.deleteOne(questionId) val update: Bson = Updates.set("disabled", true)
Await.result[Unit](delete, timeout.seconds) val disable: Future[Unit] = questionRepo.updateOne(questionId, Seq(update))
}
Await.result[Unit](disable, timeout.seconds)
}
def getLeastUsed(): Future[Question] = { def getLeastUsed(): Future[Question] = {
questionRepo.getFirst(None, Some(Sorts.ascending("used")), None).map((question: Option[Question]) => { questionRepo.getFirst(None, Some(Sorts.ascending("used")), None).map((question: Option[Question]) => {
...@@ -80,6 +83,7 @@ object Question { ...@@ -80,6 +83,7 @@ object Question {
"id" -> JsString(question.id.getOrElse("").toString()), "id" -> JsString(question.id.getOrElse("").toString()),
"content" -> JsString(question.content), "content" -> JsString(question.content),
"used" -> JsNumber(BigDecimal(question.used)), "used" -> JsNumber(BigDecimal(question.used)),
"disabled" -> JsBoolean(question.disabled),
"createdAt" -> JsString(formattedCreatedAt), "createdAt" -> JsString(formattedCreatedAt),
"updatedAt" -> JsString(formattedUpdatedAt) "updatedAt" -> JsString(formattedUpdatedAt)
) )
...@@ -101,6 +105,7 @@ object Question { ...@@ -101,6 +105,7 @@ object Question {
writer.writeStartDocument() writer.writeStartDocument()
writer.writeString("content", value.content) writer.writeString("content", value.content)
writer.writeInt32("used", value.used) writer.writeInt32("used", value.used)
writer.writeBoolean("disabled", value.disabled)
writer.writeDateTime("createdAt", value.createdAt.getTime()) writer.writeDateTime("createdAt", value.createdAt.getTime())
writer.writeDateTime("updatedAt", value.updatedAt.getTime()) writer.writeDateTime("updatedAt", value.updatedAt.getTime())
writer.writeEndDocument() writer.writeEndDocument()
...@@ -111,6 +116,7 @@ object Question { ...@@ -111,6 +116,7 @@ object Question {
val id = reader.readObjectId("_id") val id = reader.readObjectId("_id")
val content = reader.readString("content") val content = reader.readString("content")
val used = reader.readInt32("used") val used = reader.readInt32("used")
val disabled = reader.readBoolean("disabled")
val createdAt = reader.readDateTime("createdAt") val createdAt = reader.readDateTime("createdAt")
val updatedAt = reader.readDateTime("updatedAt") val updatedAt = reader.readDateTime("updatedAt")
reader.readEndDocument() reader.readEndDocument()
...@@ -118,7 +124,7 @@ object Question { ...@@ -118,7 +124,7 @@ object Question {
val createdAtDate: Date = Date.from(Instant.ofEpochMilli(createdAt)) val createdAtDate: Date = Date.from(Instant.ofEpochMilli(createdAt))
val updatedAtDate: Date = Date.from(Instant.ofEpochMilli(updatedAt)) val updatedAtDate: Date = Date.from(Instant.ofEpochMilli(updatedAt))
Question(Some(id), content, used, createdAtDate, updatedAtDate) Question(Some(id), content, used, disabled, createdAtDate, updatedAtDate)
} }
override def getEncoderClass: Class[Question] = classOf[Question] override def getEncoderClass: Class[Question] = classOf[Question]
......
...@@ -31,6 +31,6 @@ GET /question controllers.DailyQuestionController.getDailyQues ...@@ -31,6 +31,6 @@ GET /question controllers.DailyQuestionController.getDailyQues
GET /questions controllers.QuestionController.getQuestions() GET /questions controllers.QuestionController.getQuestions()
POST /question controllers.QuestionController.insertQuestion() POST /insertQuestion controllers.QuestionController.insertQuestion()
DELETE /question controllers.QuestionController.deleteQuestion(questionId: String) POST /disableQuestion controllers.QuestionController.disableQuestion(questionId: String)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment