[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  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  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  wrote:
>
> > > Naftoli Gugenheim  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
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  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  wrote:
>
> > Naftoli Gugenheim  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  wrote:
> Naftoli Gugenheim  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.