SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Google App Engine/JavaによるScala/Liftアプリケーション開発

Google App Engine/JavaでのScala/Liftアプリケーション開発(後編)

GoogleサービスのAPIを利用してアプリケーションを構築

Googleアカウントで参加登録する機能を追加する

 では、認証されたGoogleアカウントの情報をもとに、イベントへの参加登録/キャンセルを行う機能を追加します。

Modelの修正

 まず、Modelの修正から行います。

データストアに登録するプロパティを追加する

 前回作成したEventというkindのデータに、プロパティとして開催者と参加者の情報を追加します。

 "src/main/scala/demo/model/Event.scala"の先頭にあるEventケースクラスの定義に、以下のリスト5で太字になっている箇所を追加します。

[リスト5]Event.scalaでのEventケースクラス修正
// イベントの情報を持つクラスです。
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の太字になっている箇所が、プロパティの追加によって追加された処理です。

[リスト6]Event.scalaでのユーティリティ関数修正
// 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関数を追加します。

[リスト7]Event.scalaでの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プロパティからユーザーを削除しています。

次のページ
動作確認

この記事は参考になりましたか?

Google App Engine/JavaによるScala/Liftアプリケーション開発連載記事一覧
この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 尾崎 智仁(オザキ トモヒト)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5103 2010/05/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー