LoginSignup
0

More than 5 years have passed since last update.

楽天トラベル空室検索APIで作成した宿泊履歴を検索して1週間の宿泊数を調べる

Posted at

前の記事「MAに向けてTwilioと楽天トラベル空室検索APIを使ってアプリを作りたい」の4回目(http://qiita.com/fumishitan/items/6b9944ed9d4daec6a3a8)
一週間の宿泊数を調べて回数が多ければ、「叱る」という動作を開発する

予約ボタン押下時にデータベースの検索を行う

データベースはニフティクラウドmobile backend(mBaaS)を使用する
ニフティクラウド mobile backend
http://mb.cloud.nifty.com/about.htm

検索のロジックは下記に、コードにコメントを付随した形で記載する

    var today = new Date();
    var beforeOneWeek = new Date();
    beforeOneWeek.setDate(beforeOneWeek.getDate() - 7);
    //ReserveHotelクラスを指定する
    var HotelClass = NCMB.Object.extend("ReserveHotel");
    //オブジェクトをもとにクエリを作成
    var query = new NCMB.Query(HotelClass);
    //Dateのカラムのデータで一週間前よりも直近なデータを絞り込む
    query.greaterThan("Date", beforeOneWeek.toISOString());
    //絞り込んだデータの数を数える 
    query.count({
        success: function(number) {
            //データが2個以上つまり2日以上止まっていたら
            if(number > 1){
            //monacaのメソッドを使いアラートを上げる
                navigator.notification.alert("しっかり休み",alertDismissed , "今週もう3日目やで" , "気をつけます");
            }
        },

        error: function(error) {
        //データの検索に失敗した際もエラーを上げるようにする
            navigator.notification.alert("失敗",alertDismissed , "失敗" , "了解");
        }
    });

クエリを作るところで昇順降順や、指定値以上、以下などデータを選択して検索などが行えます
クエリのメソッドは下記のドキュメントにも書かれています
http://mb.cloud.nifty.com/assets/sdk_doc/javascript/jsdoc/symbols/NCMB.Query.html

ここまで前回記事のコードapp.jsに加えると以下のようになる(前回記事:http://qiita.com/fumishitan/items/747582a3120a0be2da39)

app.js
var xhr = new XMLHttpRequest();
var current;
var YOUR_APP_KEY = "YOUR_APP_KEY";
var YOUR_CLIENT_KEY = "YOUR_CLIENT_KEY";

$(function(){
    //起動時にmobile backend APIキーを設定
    NCMB.initialize(YOUR_APP_KEY,YOUR_CLIENT_KEY);
});

function rakutenTravelApi(){

    navigator.geolocation.getCurrentPosition(onSuccess, onError, option);
    var lat = current.geopoint.latitude;
    var lng = current.geopoint.longitude;

    var rakutentravelApi = "https://app.rakuten.co.jp/services/api/Travel/VacantHotelSearch/20131024";
    var rakutentravelKey ="***************";
    var RANGE = 3;
    var datumType = 1;
    var checkInDate = new Date();
    var checkOutDate = checkInDate;

    checkOutDate.setDate(checkOutDate.getDate() + 1);
    var queri = rakutentravelApi + "?applicationId=" + rakutentravelKey + "&checkinDate=" + checkInDate.toISOString().substring(0,10) + "&checkoutDate=" + checkOutDate.toISOString().substring(0,10) + "&latitude=" + lat + "&longitude=" + lng + "&searchRadius=" + RANGE + "&datumType=" + datumType;
    console.log(queri);
    // XMLHttpRequest オブジェクトを作成
   xhr.open("GET",queri,false);
   xhr.onreadystatechange = processResponse;
   xhr.send();
}

//位置情報取得に成功した場合のコールバック
var onSuccess = function(position){
    current = new CurrentPoint();
    current.distance = CurrentPoint.distance;   //検索範囲の半径を保持する    
    current.geopoint = position.coords;         //位置情報を保存する
    //search(current);
};

//位置情報取得に失敗した場合のコールバック
var onError = function(error){
    console.log("現在位置を取得できませんでした");
};

//位置情報取得時に設定するオプション
var option = {
    timeout: 6000   //タイムアウト値(ミリ秒)
};

//現在地を保持するクラスを作成
function CurrentPoint(){
    geopoint=null;  //端末の位置情報を保持する
    distance=0;     //位置情報検索に利用するための検索距離を指定する
}

function processResponse() {
    if(xhr.readyState == 4) {
        if(xhr.status == 200 || xhr.status == 201) {
            // リクエストの処理
            var rakutentravel = JSON.parse(xhr.responseText);
             for(var i in rakutentravel.hotels){
                var hotelName = JSON.stringify(rakutentravel.hotels[i].hotel[0].hotelBasicInfo["hotelName"]);
                var hotelInfoUrl = JSON.stringify(rakutentravel.hotels[i].hotel[0].hotelBasicInfo["hotelInformationUrl"]);
                var clickInput = "search-button" + i;
                $("#hotel-list").append("<li>" + "<p><h3>" + hotelName + "</h3><h4>" + hotelInfoUrl + "</h4>"); 

                //$("#hotel-list").append("<p>" );
                $("#hotel-list").append("<h4>"+ "<input id=" + clickInput + " " + "type=" + "'button'" + "value=" + "'reserve'" +"></h4>");

                clickInput = "#" + clickInput ;
                $(clickInput).click({name : hotelName,url : hotelInfoUrl},reserve);

                $("#hotel-list").append("</p>" );
                $("#hotel-list").append("</li>" );
                $("#hotel-list").listview('refresh');

            }

        } else {
            // エラー処理

        }
    }
}

function reserve(event){
    var today = new Date();
    var beforeOneWeek = new Date();
    beforeOneWeek.setDate(beforeOneWeek.getDate() - 7);
    var HotelClass = NCMB.Object.extend("ReserveHotel");
    var query = new NCMB.Query(HotelClass);

    query.greaterThan("Date", beforeOneWeek.toISOString());
    query.count({
        success: function(number) {
            if(number > 1){
                navigator.notification.alert("しっかり休み",alertDismissed , "今週もう3日目やで" , "気をつけます");
            }
        },

        error: function(error) {
            navigator.notification.alert("失敗",alertDismissed , "失敗" , "了解");
        }
    });

    var ReserveHotelClass = NCMB.Object.extend("ReserveHotel");
    var reserveHotelClass = new ReserveHotelClass();
    reserveHotelClass.set("HotelName", event.data.name);
    reserveHotelClass.set("HotelUrl", event.data.url);
    reserveHotelClass.set("Date", today.toISOString());
    reserveHotelClass.save(null, {
        success: function(object) {
            // 保存完了後に実行される

        },
        error: function(object, error) {
            // エラー時に実行される
        }
    });
}

function alertDismissed() {
        // 任意のコード
}

これで履歴を一週間以内に2回以上いれていたときにアラートが上がれば今回のものは正常動いている状態になります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0