2017-03-10 10 views
3

データベースルールを作成して、そのレコードの書き込み操作が発生していないときに特定のレコードのキーを更新する必要があります。Firebase:5分間隔で書き込み操作が行われない場合のデータベースの更新

シナリオ:複数のユーザーがテキストを更新できるコラボレーティブメモ帳です。 1人のユーザーが書き込みを開始すると、lock: trueを有効にして他のユーザーのためにロックされます。他の人は、ロックが解除されるまで更新することができません。ユーザーが書き込みを開始して長時間放置されたり、アプリを終了したりすると、そのノートの状態は常にlock: trueになり、他人には更新されません。どのようにこの状況を克服するのですか?

5分の書き込み操作がない場合、データベースのルールを使用して状態をlock: falseに変更できますか?または、アプリケーション自体でこれを処理する必要がありますか?

+0

だから何あなたがここに提示してきたが[XY問題](http://meta.stackexchange.com/questions/です66377/what-is-the-xy-problem/66378#66378)。基本的には、ソリューションが 'lock:true'を使用していると判断し、問題の解決方法を尋ねる代わりに、解決方法を尋ねました。最高の答えはおそらく単にタイムスタンプをロックし、これに基づいて5mの書き込みを防止するためのセキュリティルールを書くだけなので、ここの答えはマークを見逃してしまいます。 – Kato

答えて

3

データベースのルールを使用して状態をロックに変更することは可能ですか?5分の書き込み操作がない場合はfalseですか? No.

あなたができることは次のとおりです。(私はあなたの質問の目的であるため、最初にルールオプションに取り組んでいますが、2番目のオプションがより適しているかもしれません)あなたの選択はあなたの選択です。

あなたのDB構造はこれと少し似ていると仮定します。

root: { 
    notes: { 
    $note: { 
     locked: true, 
     lockedBy: uid, 
     lockedOn: 1489181073472 // Time in milliseconds since UNIX epoch 
    } 
    } 
} 

あなたはロックが5分以上のためにされている場合は、他のユーザーがノートのデータを上書きすることを可能にするために、次のデータベースルールを使用することができます。基本的には、これは単にlocked: trueを無視します。欠点は、falseの値を聞いているリスナーがあれば、呼び出されないことです。ステップバイ

{ 
"rules": { 
    "notes": { 
     "$note": { 
     ".read" : true, 
     ".write": "data.child('lockedBy').val() === auth.uid || data.child('lock').val() === false || (data.child('lockedOn').val() + 300000) < now" 
     } 
    } 
    } 
} 

ステップ:どのようなこれらのルールはしますか(書き込みものを、読み出し1はかなり自明です):

このルールは常ににロックするために置かれた人が書くことができることができます:

data.child('lockedBy').val() === auth.uid 

この規則は、ロックがfalseの場合、人々は書くことができますが保証:

data.child('lock').val() === false 

そして、最後のものは、lockedOnが少なくとも5分以上経過していれば、人々が書き込むことができることを確認します。

(data.child('lockedOn').val() + 300000) < now 

あなたは明らかに、ユーザーが認証さなどとされていることを確認するためにいくつかのより多くのルールを追加したいと思いますが、それは質問の範囲外です。

まだ、これは実際にあなたが望むものはありません。ロックが5分間以上オンであったかどうかを検出できるようにしたい場合は、そのロックを削除します。 Firebaseのチームが(昨日、どのタイミングで)のCloud FunctionsをFirebaseのにリリースして以来、運が良かったのです。基本的に、関数はNode.js環境を提供します。この環境では、クライアント側のコードと同じように、サーバー上でのみ関数を実行できます。現在ロックされているすべての音符をモニターし、5分以上ロックされていないことを確認する関数を書くことができます。彼らはあなたがそれらを更新することができます。これは、あなたがそれをクライアント側で行う必要なく、あなたが望むことをすることを可能にします。

リンク:

Introducing Cloud Functions for Firebase

Functions docs

Understand Firebase Realtime Database Rules

+0

これは公正な答えですが、 'lock'ブール値の存在は完全に余計です。クライアントとセキュリティルールは、タイムスタンプに基づいて単独でロックすることも、複雑さが少なく、結果も向上させることができます。 – Kato

+0

ピーテルは良い答えをありがとう!クラウド機能は、cronジョブのような操作を実行するときに非常に有望です。しかしatm私はangularfire2プラグインを使用しているので、アップデートがあるまで待つ必要があります。私にとっては、データベースルールを使用するのが最善の選択肢です。私はアプリケーションで変更を加えることで私の問題を解決したので、この答えを受け入れる:) –

関連する問題