Search code examples
scalalift

When using CRUDify, how do I make sure that when a record is saved, the 'owner' field of the record is automatically set to be the logged-in user?


When using CRUDify, how do I make sure that when a record is saved, the 'owner' field of the record is automatically set to be the logged-in user?

Given the model below, I would like the CRUDify methods to set the 'owner' field to be equal to the id (primary key) of the logged-in user. I am using Lift's MegaProtoUser.

What would I have to override, and how would I do so?

class Mytable extends LongKeyedMapper[Mytable] with IdPK {

  def getSingleton = Myclass

  object owner extends MappedLongForeignKey(this, User) 
  object description extends MappedString(this, 140)
  object name extends MappedString(this, 140)
  object status extends MappedInt(this) 
  object entry_number extends MappedInt(this) 
  object quantity extends MappedDecimal(this, MathContext.DECIMAL64, 2) 
}

object Mytable extends Mytable with LongKeyedMetaMapper[Mytable] with CRUDify[Long, Mytable] {

  override def editMenuLoc:Box[Menu] = Empty
  override def deleteMenuLoc:Box[Menu] = Empty
  override def viewMenuLoc:Box[Menu] = Empty
  override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in"))
  override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in"))

  override def findForList(start: Long, cnt: Int): List[Mytable] =
    findAll(StartAt(start), MaxRows(cnt), By(owner, User.currentUser))

  override def findForParam(in: String): Box[Mytable] =
    for {
      user <- User.currentUser
      id <- Helpers.asLong(in)
      mytable <- find(By(this.id, id), By(owner, user))
    } yield mytable
}

Solution

  • I managed to find a solution here. I just needed to override the defaultValue for the owner field as follows:

    object owner extends MappedLongForeignKey(this, User) {
        override def defaultValue = User.currentUser match {case Full(x) => x.id.get; case _ => 0}
      }