画面仕様

ユーザ情報入力画面

ユーザー情報入力画面は、Googleカレンダーとtoodledoのユーザー情報入力と同期実行ボタンを持つ画面。


利用方法

Googleカレンダーのユーザ名とパスワードには、Googleにログインするときのユーザ名とパスワードを入力します。
Googleカレンダーのマイカレンダーには、Googleカレンダーで作ったマイカレンダーの名前を入力します。
ToododoのUnique ID には、Toodledoの設定画面で表示される Unique IDを入力します。
 初めて同期ボタンを押すと、同期システムの初期化を行います。このときはまだ、イベントの同期は行われていません。
Googleカレンダーのマイカレンダーにイベントを登録したり、すでにあるイベントを変更してから、再び同期ボタンを押すと、Toodledoでそのイベントを見ることができます。逆にToodledoでイベントを登録したり変更してから同期ボタンを押すと、Googleカレンダーのマイカレンダーにイベントが登録されます。
ToodledoからGoogleカレンダーの終日イベントを登録する場合は、イベントのStart Date / Timeの時刻を空欄で登録します。

同期項目


画面イベント機能仕様

ユーザ情報入力画面のイベント機能を説明する。

ユーザ情報入力画面

「同期」ボタンクリックイベント

  1. Googleカレンダーとtoodledoの入力済みユーザ名とパスワードを、Googleカレンダーについては加えてマイカレンダー名をAPIに送る。
  2. いずれか、または両者の認証に問題がある場合は、そのむねメッセージを画面に表示する。
  3. マイカレンダー名がGoogleカレンダーに見つからない場合は、その旨メッセージを画面に表示する。
  4. それぞれのAPIからイベント情報を入手し相互に同期させる。
  5. 相互の同期に問題がなければ、「popupwndow」アンカーを画面に表示する。
  6. いずれか、または両者の認証に問題がある場合は、そのむねメッセージを画面に表示する。

「popupwindow」アンカークリックイベント


Googleカレンダーに対する初期動作

以下の操作はユーザプログラムからの操作方法が不明であるため機能しように含めないことにする。

当該サービスから初めて同期オペレーションを行ったさい、Googleカレンダーに対し以下のカレンダー名のカレンダー追加をGoogleログインアカウントに実行する。

toodledoカレンダーは、toodledoイベントとの同期カレンダーとして利用される。
完了toodledoは、toodledoの完了イベントを登録する。


イベント新規登録

イベント削除

当該サービスはイベントの削除を行わない。
イベントを削除したい場合、ユーザーはGoogledoカレンダーとtoodledoそれぞれのサービスアプリケーションでイベントを削除すること。

Googleカレンダーないしtoodledoの片方のみからイベントを削除した場合、当該サービスの同期オペレーションによって新規イベントに同期してしまうので注意すること。

変更の競合

Googleカレンダーイベントの変更と、toodledoイベントの変更に競合が発生した場合、いずれか過去の変更を破棄する。


保存情報

当該サービスアプリケーションが保存する情報を記載する。(全てtoodledoアカウント毎に保存する)

マッピング情報の削除は、toodledoイベント側で完了となったイベントを対象とする。


イベント操作内容

更新イベントの取得

  1. Googleカレンダーサービスより、最終同期日時以降に更新されたGoogleカレンダーイベント一覧「Googleカレンダー更新イベント一覧」を取得する。
  2. Googleカレンダー更新イベント一覧」の各イベントについて「Googleカレンダー更新イベント操作」を実施する。
  3. toodledoサービスより、最終同期日時以降に更新されたtoodledoイベント一覧「toodledo更新イベント一覧」を取得する。
  4. Toodledoイベント更新イベント一覧」の各イベントについて「Toodledo更新イベント操作」を実施する。

Googleカレンダー更新イベント操作

  1. GoogleカレンダーイベントUIDがマッピング情報に未登録の場合、
    当該イベントUIDをマッピング情報に記載する(toodledoイベントUIDは空)。さらにカレンダーイベントの同期項目をToodledoイベントに設定してToodledoイベントを追加する。いじょうで、当該操作を終了する。
  2. GoogleカレンダーイベントUIDにマッピングされているToodledoイベントUIDをマッピング情報から取得し、当該ToodledoイベントUIDをキーにToodledoイベントをToodledoのAPIから取得する。
  3. 取得したToodledoイベントの更新日がGoogleカレンダーイベントの更新日より未来である場合、そのまま現状を維持し当該操作を終了する。
  4. Googleカレンダーイベントの同期項目をToodledoイベントに設定しToodledoイベントを更新。当該捜査を終了する。

Toodledo更新イベント操作

  1. Toodledoイベントの「状態」が「完了」である場合、そのまま現状を維持し当該操作を終了する。
  2. ToodledoイベントUIDがマッピング情報に未登録の場合、
    当該イベントUIDをマッピング情報に記載し(GoogleカレンダーイベントUIDは空)当該操作を終了する。
  3. GToodledoイベントUIDにマッピングされているGoogleカレンダーイベントUIDをマッピング情報から取得し、当該GoogleカレンダーイベントUIDをキーにGoogleカレンダーイベントをGoogleカレンダーのAPIから取得する。
  4. 取得したGoogleカレンダーイベントの更新日がToodledoイベントの更新日より未来である場合、そのまま現状を維持し当該操作を終了する。
  5. Toodledoイベントの同期項目をGoogleカレンダーイベントに設定しGoogleカレンダーイベントを更新。当該捜査を終了する。

APIエラー時の挙動

Googleカレンダーないしtoodledoがエラーを返却した場合の挙動を纏める。

最終同期日時を更新しないことで、次回の同期ですでに同期済みのイベントも同期の対象となるが、同期済みを同期しても特にデータが変わることはないので問題ない。


イベントを手動削除後同期を行った場合の挙動

機能仕様が曖昧なので、以下の通りの検証を行うこととする。

状態 結果 確認日
カレンダーのイベントを手動で削除した直後、同期を行う。 カレンダー及びタスク画面に変化はない。  
カレンダーのイベントを手動で削除し、
これに紐尽くタスクイベントに変更を加えた後、同期を行う。
削除したカレンダーイベントが復活する。  
タスクのイベントを手動で削除した直後、同期を行う カレンダー及びタスク画面に変化はない。  
タスクのイベントを手動で削除し、
これに紐尽くカレンダーイベントに変更を加えた後、同期を行う。
削除したタスクイベントが復活する。  
カレンダーのイベントと、これに紐尽くタスクのイベントを
手動で削除した後、同期を行う。
カレンダーおよびタスク画面に
削除されたタスクは表示されない。
 

意外な注意事項

toodledoイベントの追加編集にて開始日(startdate)にUNIXタイムスタンプを指定しても、時刻部分は破棄されてしまう。

 


実装調査

Googleカレンダー:マイカレンダー一覧を取得する

ソースコード

指定日以降に更新されたイベントをセレクトする。

詳細

イベントを追加する

実装

イベントを変更する

詳細

同期処理方式

Googleカレンダー/toodledo同期サービスの処理方法を記載する。

  1. 最終同期日時保存ファイルを読み込む
  2. 最終同期保存ファイルが存在しない場合、システム日時を最終同期日時とする。
  3. 最終同期日時保存ファイルにシステム日時を保存する。
  4. 前述の「イベント操作内容」にしたがい、Googleカレンダー更新イベント操作およびToodledo更新イベント操作を行う。

以上


情報記録方式

Googleカレンダー/toodledo同期サービスが独自に保存する情報の記録方式を記載する。

最終同期日時

{YYYY-MM-DD}T{HH:mm:ss}

Googleカレンダー用フォーマット:2013-11-23T04:09:14

toodle用フォーマット:2011-08-28 05:43:22

イベントマップ

{GoogleカレンダーイベントID},{toodledoイベントID}

ToodledoアプリケーションID隠蔽方式

ソースコードを公開するので、ToodledoのアプリケーションIDの設定アルゴリズムも白日となる。
アプリケーションIDをファイルに埋め込んだ場合、そのファイルの所在がプログラムを解説することで容易に知ることができる。
サーバーのデフォルトの設定では、場所がわかれば "http://../場所" でブラウザでそこに記載された内容を表示することができる。
もちろん、アクセスコントロールファイルを変更すれば表示できなくなる。しかし、変更が初期化されるリスクは高い。
そこで、サーバの設定を変えることなくアプリケーションIDを隠蔽するため以下の方式をとる。

登録ファイル名
appid.php
フォーマット <?php
//start-data
//toodlede-appid,{アプリケーションID}
読み込み方法
テキストファイルとして読み込む
「//start-data」の次の行から、CSV解析を行う。
解析アルゴリズム
$appConf = flie('appid.php');
$index = array_search('//start-data', $appConf);
$elements = explode(",", $appConf[$index]);
$appId = $elements[1];

この方式により、ブラウザで「http://../appid.php」にアクセスしても、白紙が表示されるだけとなる。


test evidence

表示

Exceptionが苦手なのでエラーリターンに変更

ToodledoAPIのオープンソースでは、APIから期待しないレスポンスがあるとExceptionを発行している。
これらを全て、エラーメッセージテキストを設定してのエラーリターンに変更する。

表示

ソースコードリスト

http://pear.php.net/manual/ja/package.xml.xml-serializer.php
https://hariushi-lib.googlecode.com/svn/trunk/DateMath.php
https://hariushi-lib.googlecode.com/svn/trunk/Google/Calendar.php
https://hariushi-lib.googlecode.com/svn/trunk/Math.php
https://hariushi-lib.googlecode.com/svn/trunk/Request/Request.php
https://hariushi-lib.googlecode.com/svn/trunk/Session.php
https://hariushi-lib.googlecode.com/svn/trunk/Toodledo/api/Toodledo.php
https://task-shoot-calendar.googlecode.com/svn/trunk/application/configs/application.ini
https://task-shoot-calendar.googlecode.com/svn/trunk/application/controllers/ErrorController.php
https://task-shoot-calendar.googlecode.com/svn/trunk/application/controllers/IndexController.php
https://task-shoot-calendar.googlecode.com/svn/trunk/application/models/AuthController.php
https://task-shoot-calendar.googlecode.com/svn/trunk/application/models/EventmapController.php
https://task-shoot-calendar.googlecode.com/svn/trunk/application/views/scripts/index/index.phtml
https://task-shoot-calendar.googlecode.com/svn/trunk/application/views/scripts/index/index2.phtml
https://task-shoot-calendar.googlecode.com/svn/trunk/application/views/scripts/index/mini.phtml
https://task-shoot-calendar.googlecode.com/svn/trunk/application/views/scripts/index/wait.phtml
https://task-shoot-calendar.googlecode.com/svn/trunk/public/include_path_env.php
https://task-shoot-calendar.googlecode.com/svn/trunk/public/index.php

マジックワードメソッドの改修

ソースコード公開に当たり、toodledoのアプリケーションIDを隠蔽するために設置されたマジックワードメソッドについての説明です。

IndexController::syncAction() の
$appid = Models_EventmappController::getAppIdToodledo();
はマジックワードメソッドの呼び出しです。これを
$appid = あなたが取得したアプリケーションコード;
としてください。

[TOP]|[編集]|[新規]  [TASK(PRIVATE)]


Last-modified: ※作成中