-
Felipe D'Abrantes authored99ad7129
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
DailyRepository.scala 2.52 KiB
package repositories
import com.typesafe.config.ConfigFactory
import models.{Daily, MongoDBClient}
import org.mongodb.scala.{MongoCollection, Document}
import org.bson.types.ObjectId
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Await}
import scala.concurrent.duration._
class DailyRepository extends MongoDBClient {
// Loads the default configuration
private val config = ConfigFactory.load()
private val databaseName = config.getString("mongo.feedService.db")
private val collectionName = config.getString("mongo.dailies.collection")
/**
* Returns a reference to a MongoDB collection within a database.
* Once Future completes, collection reference is returned.
*
* @return a MongoCollection[Document] object representing the dailies collection.
* @throws TimeoutException if the Future doesn't complete within the 3 second timeout.
*/
private def dailiesCollection: MongoCollection[Document] = {
val futureCollection = for {
database <- getDatabase(databaseName)
collection <- getCollection(database, collectionName)
} yield collection
Await.result(futureCollection, 3.seconds)
}
/**
* Gets all the Daily records.
*
* @return A Future containing a sequence of matching Daily objects.
*/
def getAllDailies(): Future[Seq[Daily]] = {
val documents: Future[Seq[Document]] = find(dailiesCollection)
documents.map(document => {
document.map(doc => Daily(
Some(doc.getObjectId("_id")),
doc.getObjectId("user_id"),
doc.getObjectId("question_id"),
doc.getString("content"),
doc.getInteger("likes")
))
})
}
/**
* Inserts a Daily record into the database.
*
* @return A Future containing the inserted Daily object with the generated ID.
*/
def insertDaily(daily: Daily): Future[Daily] = {
// Don't supply an ID as Mongo will generate one for us
val document = Document(
"user_id" -> daily.userId,
"question_id" -> daily.questionId,
"content" -> daily.content,
"likes" -> daily.likes
)
val result = insertOne(dailiesCollection, document)
// Return a Daily entity with the generated ID
result.flatMap(id => {
val updatedDaily = daily.copy(id = Some(new ObjectId(id)))
Future.successful(updatedDaily)
})
}
}