Skip to content
Snippets Groups Projects
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)
        })
    }
}