Googleアカウントで参加登録する機能を追加する
では、認証されたGoogleアカウントの情報をもとに、イベントへの参加登録/キャンセルを行う機能を追加します。
Modelの修正
まず、Modelの修正から行います。
データストアに登録するプロパティを追加する
前回作成したEventというkindのデータに、プロパティとして開催者と参加者の情報を追加します。
"src/main/scala/demo/model/Event.scala"の先頭にあるEventケースクラスの定義に、以下のリスト5で太字になっている箇所を追加します。
// イベントの情報を持つクラスです。 case class Event( id:Option[Long], name:String, description:String, fromDate:Date, toDate:Date, place:String, join:Long, count:Long, user:User, members:List[User] )
userプロパティは、イベントの開催者です。このUserクラスはGoogleアカウント認証で認証済みユーザーの情報として取得できるクラスで、このUserクラスのままデータストアに保存できます。
membersプロパティは、イベントの参加者です。membersプロパティは、ListPropertyというデータ型を使用します。ListPropertyは、ひとつのプロパティに複数の値をList形式で保存できる型なので、参加者のUserオブジェクトをList形式で格納できます。
プロパティが追加されたので、前回用意したユーティリティ関数も修正しておきます。以下のリスト6の太字になっている箇所が、プロパティの追加によって追加された処理です。
// GAEのEntityオブジェクトからEventオブジェクトを作成します。
def entity2Event( e:Entity ) = {
Event(
...中略...
entityValue[User]( e, "user" ),
entityValue[JList[User]]( e, "members" ).toList
)
}
// EventオブジェクトからGAEのEntityオブジェクトを返します。
def event2Entity( event:Event ) = {
...中略...
e.setProperty( "user", event.user)
e.setProperty( "members", asJList(event.members))
e
}
// ScalaのList型からJava.util.List型に変換するための関数
def asJList[T]( l:List[T] ) = {
val jl = new JList[T]
l.foreach{ jl.add( _ )}
jl
}
参加登録/キャンセルする処理を追加する
実際に参加登録/キャンセルする際に、Snippet側から呼び出されてデータの登録を行う関数を用意しましょう。
"src/main/scala/demo/model/Event.scala"に、リスト7で示すregister関数とcancel関数を追加します。
// 指定したEventに参加登録します。
def register( event:Event, user:User ) ={
if( event.members.contains( user ) == false ){
val e = event2Entity( event )
e.setProperty( "join", event.join + 1)
e.setProperty( "members", asJList(event.members ::: user :: Nil ))
dsService.put( e )
}
}
// 指定したEventに参加キャンセルします。
def cancel( event:Event, user:User ) ={
if( event.members.contains( user ) ){
val e = event2Entity( event )
e.setProperty( "join", event.join - 1)
e.setProperty( "members", asJList(event.members - user ))
dsService.put( e )
}
}
register関数とcancel関数では、引数に対象となるEventオブジェクトと、参加/キャンセルするユーザーのGoogleアカウント情報をもつUserオブジェクトを受け取ります。
register関数の処理の内容は、ユーザーがそのイベントに既に参加登録されているかチェックし、登録されていない場合のみ、イベント情報の参加者数を+1して、さきほどListPropertyとして追加したmembersプロパティにユーザーを追加して、データストアのイベント情報を更新しています。
cancel関数は、逆に参加登録されている場合のみ、参加者数を-1してmembersプロパティからユーザーを削除しています。
