<NME> UserService.scala
<BEF> /**
 * Copyright 2012-2014 Jorge Aliss (jaliss at gmail dot com) - twitter: @jaliss
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package securesocial.core.services

import scala.concurrent.Future
import securesocial.core.{ PasswordInfo, BasicProfile }
import securesocial.core.providers.MailToken

trait UserService[U] {

  /**
   * Finds a SocialUser that maches the specified id
   *
   * @param providerId the provider id
   * @param userId the user id
   * @return an optional profile
   */
  def find(providerId: String, userId: String): Future[Option[BasicProfile]]

  /**
   * Finds a profile by email and provider
   *
   * @param email - the user email
   * @param providerId - the provider id
   * @return an optional profile
   */
  def findByEmailAndProvider(email: String, providerId: String): Future[Option[BasicProfile]]

  /**
   * Saves a profile.  This method gets called when a user logs in, registers or changes his password.
   * This is your chance to save the user information in your backing store.
   *
   * @param profile the user profile
   * @param mode a mode that tells you why the save method was called
   */
  def save(profile: BasicProfile, mode: SaveMode): Future[U]

  /**
   * Links the current user to another profile
   *
   * @param current The current user instance
   * @param to the profile that needs to be linked to
   */
  def link(current: U, to: BasicProfile): Future[U]

  /**
   * Returns an optional PasswordInfo instance for a given user
   *
   * @param user a user instance
   * @return returns an optional PasswordInfo
   */
  def passwordInfoFor(user: U): Future[Option[PasswordInfo]]

  /**
   * Updates the PasswordInfo for a given user
   *
   * @param user a user instance
   * @param info the password info
   * @return
   */
  def updatePasswordInfo(user: U, info: PasswordInfo): Future[Option[BasicProfile]]

  /**
   * Saves a mail token.  This is needed for users that
   * are creating an account in the system or trying to reset a password
   *
   * Note: If you do not plan to use the UsernamePassword provider just provide en empty
   * implementation
   *
   * @param token The token to save
   */
  def saveToken(token: MailToken): Future[MailToken]

  /**
   * Finds a token
   *
   * Note: If you do not plan to use the UsernamePassword provider just provide en empty
   * implementation
   *
   * @param token the token id
   * @return
   */
  def findToken(token: String): Future[Option[MailToken]]

  /**
   * Deletes a token
   *
   * Note: If you do not plan to use the UsernamePassword provider just provide en empty
   * implementation
   *
   * @param uuid the token id
   */
  def deleteToken(uuid: String): Future[Option[MailToken]]

  /**
   * Deletes all expired tokens
   *
   * Note: If you do not plan to use the UsernamePassword provider just provide en empty
   * implementation
   *
   */
  def deleteExpiredTokens()
}

/**
/**
 * Save modes
 */
case class SaveMode() {
  def is(m: SaveMode): Boolean = this == m
}

object SaveMode {
  val LoggedIn = SaveMode()
  val SignUp = SaveMode()
  val PasswordChange = SaveMode()
}

<MSG> Add a string so SaveMode compares will work.

<DFF> @@ -120,12 +120,12 @@ trait UserService[U] {
 /**
  * Save modes
  */
-case class SaveMode() {
+case class SaveMode(name: String) {
   def is(m: SaveMode): Boolean = this == m
 }
 
 object SaveMode {
-  val LoggedIn = SaveMode()
-  val SignUp = SaveMode()
-  val PasswordChange = SaveMode()
+  val LoggedIn = SaveMode("loggedIn")
+  val SignUp = SaveMode("signUp")
+  val PasswordChange = SaveMode("passwordChange")
 }

{'addition_count': 4, 'commit_subject': 'Add a string so SaveMode compares will work.', 'deletion_count': 4, 'file_extension': '.scala', 'lang': 'scala', 'license': 'apache-2.0', 'repo_name': 'jaliss/securesocial'}