kintone

kintoneでマッチングアプリを作ってみた

巷ではマッチングアプリとやらが流行っている。
嘘か本当か、女子大生まで当たり前のように使っているとかいないとか。
昔は出会い系なんて使ってるやつ=やばいやつなんていうイメージもあったが、
今じゃ名前もマッチングアプリに変わって…本当にブランディングは大事だなぁと思う。

さて、今回はそんなマッチングアプリをkintoneで作ってみよう!
社内恋愛なんて!…みたいな時代もあったが今や当たり前。
それを促進するアプリを作る!

機能を決めよう

  • マッチング希望者は、氏名・性別・デートしたい日をレコードに登録。
  • 同じデート日を登録している相手がいれば、「マッチングが成立しました」と表示。
  • 相手は当日会うまでまでわからない!
  • 集合時刻は終業時間の15分後、待ち合わせ場所は会社前とし、
    あとは二人で頑張ってね!という投げやりパターン。
  • 当日リマインドをかける
  • 他の人にレコードを見られないようにする

アプリを作ろう

特に多くの情報は必要ないので、構成はこんな感じ。

フィールドコードとフィールド名は例によって揃えておこう。
マッチング先は数値フィールドで。マッチング相手のレコード番号を保存するためにある。

マッチング機能を作ろう

仕様

①レコードが新規追加されたタイミングで
②同アプリ内に同じデート日を設定している異性の未マッチングレコードを検索し
③発見したら①のレコードとマッチング相手のレコードを、レコード番号で結びつける
④そしてお互いに「マッチングが成立しました」という通知を送る。

①レコードが新規追加されたタイミングで

ここからはすべてコーディングになるので気合を入れていこう。
まず、レコードが新規追加されたタイミングで発火するイベントを。
今回使用するのは、app.record.create.submitと
app.record.create.submit.successいうイベント。
レコード追加時のイベントは複数あるが、今回はレコード番号を取得しなければならないので
レコード番号が作成されるタイミングのイベントを使用する。

②同アプリ内に同じデート日を設定している異性の未マッチングレコードを検索し

まずは作成したレコードのデート日、性別を変数に格納し、
検索用に異性の性別を変数に格納。

 var record = event.record;
 var recordId = record.レコード番号.value;
 var dateDay = record.デート日.value;
 var sex = record.性別.value;
var searchSex;
if(sex === "男性") {
    searchSex = "女性";
} else {
    searchSex = "男性";
}

そして同じデート日で、マッチングがされていない相手を検索。
今回も安定のkintoneUtilityを使用しよう。

kintoneUtility.rest.getAllRecordsByQuery({
   app: 688,
  query: 'デート日 = "' + dateDay + '" and マッチング先 = "" and 性別 in ("' + searchSex +'")',
   isGuest: false
 }).then(function(response) {
   console.log(response);
 }).catch(function(error) {
   console.log(error);
 });

③発見したら①のレコードとマッチング相手のレコードを、レコード番号で結びつける

同日をデート日に設定しているレコードがなければ単純に登録して終了、
ある場合、複数ならばランダムに相手を決定して、結びつける。

マッチング相手のレコード番号をマッチング先に追加

こちらは app.record.create.submit イベント内に記述。

    var match;
    if(response.records.length === 0) {
        console.log('登録処理');
        alert('マッチング相手が見つかりませんでした。見つかるのを待ちましょう');
    } else if(response.records.length === 1) {
        console.log('1件見つかりました');
        alert('マッチング成功!当日は終業15分後に会社前集合です');
        match = response.records[0].レコード番号.value;
        record.マッチング先.value = match;    
    } else if(response.records.length >= 2) {
        console.log('複数見つかりました');
        alert('マッチング成功!当日は終業15分後に会社前集合です'); 
        match = response.records[Math.floor(Math.random() * response.records.length)].レコード番号.value;
        record.マッチング先.value = match;
    }
    return event;  

マッチング相手のレコード番号に自分のレコード番号を追加

こちらは app.record.create.submit.success に記述。

kintone.events.on(['app.record.create.submit.success'], function(event) {
    var record = event.record;
    var recordId = record.レコード番号.value;
    var match = record.マッチング先.value;
    if(match !== "") {
        var setRecord = {
          マッチング先: {
            value: recordId
          }
        };
        kintoneUtility.rest.putRecord({
          app: 688,
          id: match,
          record: setRecord,
          isGuest: false
        }).then(function(response) {
          console.log(response);
        }).catch(function(error) {
          console.log(error);
        });
        
    }
    return event;
    
});

④そしてお互いに「マッチングが成立しました」という通知を送る。

作成側には先ほどの作成時にalertを表示することで対応した。

待っている相手に通知を送る

既にレコードを作成し(作成したときにマッチングしなかった)、待っている人に通知を送るには
アプリの条件通知で編集にチェックを入れればよい。

ただし、これではレコードが更新されたことしかわからないので
レコードを開いたタイミングで「マッチングが成立しました」という表示を行う。

kintone.events.on(['app.record.detail.show'], function(event) {
    if(event.record.マッチング先 !== "") {
        alert('マッチングが成立しました');
    }
});

その他の細かい機能

当日リマインドをかける

これは標準のリマインド機能を使えばよい。
気を付けないといけないのは、マッチングしていないのに通知が来たら腹が立つってこと笑
これは条件を追加設定して対応しよう。

他の人にレコードを見られないようにする

こちらも標準機能を使って対応できる。
追加と閲覧のみできればよいので、閲覧にチェックを付けて、他は外す。

以上で作成完了だ!!

完成形

(function() {
"use strict";

kintone.events.on(['app.record.create.submit'], function(event) {

var record = event.record;
var dateDay = record.デート日.value;
var sex = record.性別.value;
var searchSex;
if(sex === "男性") {
    searchSex = "女性";
} else {
    searchSex = "男性";
}

 return kintoneUtility.rest.getAllRecordsByQuery({
  app: 688,
  query: 'デート日 = "' + dateDay + '" and マッチング先 = "" and 性別 in ("' + searchSex +'")',
  isGuest: false
}).then(function(response) {
    var match;
    if(response.records.length === 0) {
        console.log('登録処理');
        alert('マッチング相手が見つかりませんでした。見つかるのを待ちましょう');
    } else if(response.records.length === 1) {
        console.log('1件見つかりました');
        alert('マッチング成功!当日は終業15分後に会社前集合です');
        match = response.records[0].レコード番号.value;
        record.マッチング先.value = match;    
    } else if(response.records.length >= 2) {
        console.log('複数見つかりました');
        alert('マッチング成功!当日は終業15分後に会社前集合です。'); 
        match = response.records[Math.floor(Math.random() * response.records.length)].レコード番号.value;
        record.マッチング先.value = match;
    }
    return event;    
}).catch(function(error) {
  console.log(error);
});

});

kintone.events.on(['app.record.create.submit.success'], function(event) {
    var record = event.record;
    var recordId = record.レコード番号.value;
    var match = record.マッチング先.value;
    if(match !== "") {
        var setRecord = {
          マッチング先: {
            value: recordId
          }
        };
        kintoneUtility.rest.putRecord({
          app: 688,
          id: match,
          record: setRecord,
          isGuest: false
        }).then(function(response) {
          console.log(response);
        }).catch(function(error) {
          console.log(error);
        });
        
    }
    return event;
    
});

kintone.events.on(['app.record.detail.show'], function(event) {
    if(event.record.マッチング先 !== "") {
        alert('マッチングが成立しました');
    }
});

})();

実際に使ってみよう

ん?

よく考えたら…

うちの職場…

女性職員全員結婚してるやん。