trait Customerize[A <: MetaMapper[A] with CustomerFields[A]] { self: A with KeyedMetaMapper[Long, A] with CustomerFields[A] =>
def findForCustomer(params: QueryParam[A]*): Box[A] = { var seq = Seq() if (!User.isAdmin_?) seq += By(self.customer, User.customerId) self.find((seq ++ params): _*) } def findAllForCustomer(params: QueryParam[A]*): List[A] = { var seq = Seq() if (!User.isAdmin_?) seq += By(self.customer, User.customerId) self.findAll((seq ++ params): _*) } } Now find() works too. Used MetaMapper instead of KeyedMetaMapper. The self.customer problematic still exists ;) On 22 Jan., 21:54, Franz Bettag <fr...@bett.ag> wrote: > I've got this so far. The CustomerFields trait just appends the > customer's object to the class. > The Customerize trait is for extending the singleton. > > Firs thing, Jeppe wrote to use the find method, which doesn't seem to > be available there. At least it doesn't find it. > So i switched to findAll (which works), but the problem is, that the > By-Clause i am trying to create, does not work. > > How can i get A's customer Property? self and A don't work. Even if i > extend self: A with CustomerFields[A]. > > trait Customerize[A <: MetaMapper[A] with CustomerFields[A]] { > > self: A => > > def findForCustomer(params: QueryParam[A]*): A = { > var seq = Seq(MaxRows(1)) > if (!User.isAdmin_?) seq += By(self.customer, User.customerId) > self.findAll((seq ++ params): _*) > } > > def findAllForCustomer(params: QueryParam[A]*): A = { > var seq = Seq() > if (!User.isAdmin_?) seq += By(self.customer, User.customerId) > self.findAll((seq ++ params): _*) > } > > } > > trait CustomerFields[A <: Mapper[A]] { > > this: A with Mapper[A] => > > private val thisTyped = this.asInstanceOf[A] > > object customer extends MappedLongForeignKey(thisTyped, Customer) > with LifecycleCallbacks { > > override def dbNotNull_? = true > > override def beforeCreate = { > User.currentUser match { > case Full(u: User) => > Customer.find(By(Customer.id, > u.customer.get)) match { > case Full(c: Customer) => this(c) > case _ => Log.error("Customer *not* > found! This shouldn't > happen!"); false > } > case _ => Log.error("User *not* found! This > shouldn't happen!"); > false > } > } > > } > > } > > On 21 Jan., 18:47, Franz Bettag <fr...@bett.ag> wrote: > > > I will implement it into my own MetaMapper-sub-trait so all of my > > models can share the code. > > > Thank you all for your input! > > > On Jan 21, 9:44 am, Jeppe Nejsum Madsen <je...@ingolfs.dk> wrote: > > > > Naftoli Gugenheim <naftoli...@gmail.com> writes: > > > > Why not define a new method? > > > > def findByCurUser(params: QueryParam*) = > > > > User.currentUser.flatMap(user=> find((Seq(By(User.username, > > > > user.username.is)) ++ params): _*)) > > > > find returns a Box and currentUser does too, so flatMap flattens them > > > > into one. Basically find takes a varargs and you're passing a Seq > > > > instead using : _*, and that Seq contains the user and other params. > > > > You could probably write params + By(User.username, user.username.is) > > > > instead of the reverse order, as it's shorter than the previous version. > > > > The problem with this solution is that you cannot use any of Lift's > > > builtin stuff such as CRUDify. > > > > If you wan't to create a multitenant service with only a single set of > > > tables, you wan't do make damn > > > sure that each customer only sees his/her own data :-) > > > > /Jeppe -- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.