All Downloads are FREE. Search and download functionalities are using the official Maven repository.

models.daos.UserDAOImpl.scala Maven / Gradle / Ivy

The newest version!
package models.daos

import java.util.UUID

import com.mohiva.play.silhouette.api.LoginInfo
import com.mongodb.casbah.Imports._
import models.daos.UserDAOImpl._
import models.{DefaultRole, AdminRole, Database, User}
import play.api.libs.concurrent.Execution.Implicits.defaultContext

import scala.concurrent.Future

/**
 * Give access to the user object.
 */
class UserDAOImpl extends UserDAO {

  /**
   * Finds a user by its login info.
   *
   * @param loginInfo The login info of the user to find.
   * @return The found user or None if no user for the given login info could be found.
   */
  override def find(loginInfo: LoginInfo) = Future {
//    users.find { case (id, user) => user.loginInfo == loginInfo }.map(_._2)
    val request = MongoDBObject(
      "providerID" -> loginInfo.providerID,
      "providerKey" -> loginInfo.providerKey
    )
    val dbUser = users.findOne(request)
    if (dbUser.isDefined) {
      Some(loadFromDB(dbUser.get))
    } else {
      None
    }
  }


  /**
   * Finds a user by its user ID.
   *
   * @param userID The ID of the user to find.
   * @return The found user or None if no user for the given ID could be found.
   */
  override def find(userID: UUID) = Future {
    val request = MongoDBObject("userID" -> userID.toString)
    val dbUser = users.findOne(request)
    if (dbUser.isDefined) {
      Some(loadFromDB(dbUser.get))
    } else {
      None
    }
  }

  /**
   * Saves a user.
   *
   * @param user The user to save.
   * @return The saved user.
   */
  override def save(user: User) = Future {
      users.insert(convertToDB(user))
      user
  }


  private def convertToDB(user : User) : DBObject = {
    MongoDBObject(
      "userID" -> user.userID.toString,
      "providerID" -> user.loginInfo.providerID,
      "providerKey" -> user.loginInfo.providerKey,
      "role" -> user.role.name,
      "firstName" -> user.firstName,
      "lastName" -> user.lastName,
      "fullName" -> user.fullName,
      "email" -> user.email,
      "avatarURL" -> user.avatarURL
    )
  }

  private def loadFromDB(dBObject: DBObject) : User = {
    val userID = UUID.fromString(dBObject.get("userID").asInstanceOf[String])
    val role = Database.loadString(dBObject, "role") match {
      case "admin" => AdminRole()
      case "default" => DefaultRole()
    }
    val loginInfo = LoginInfo(dBObject.get("providerID").asInstanceOf[String], dBObject("providerKey").asInstanceOf[String])
    val firstName = Option(dBObject.get("firstName").asInstanceOf[String])
    val lastName = Option(dBObject.get("lastName").asInstanceOf[String])
    val fullName = Option(dBObject.get("fullName").asInstanceOf[String])
    val email = Option(dBObject.get("email").asInstanceOf[String])
    val avatarURL = Database.loadOptionalString(dBObject, "avatarURL")

    User(userID, loginInfo, role, firstName, lastName, fullName, email, avatarURL)
  }
}

object UserDAOImpl {

  val users = Database.db("users")
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy