[Lift] Re: Ideas for how to inject QueryParams into find() and findAll()

2010-01-22 Thread Franz Bettag
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.



[Lift] Re: Ideas for how to inject QueryParams into find() and findAll()

2010-01-22 Thread Franz Bettag
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.



[Lift] Re: Ideas for how to inject QueryParams into find() and findAll()

2010-01-21 Thread Franz Bettag
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.