繁体   English   中英

24 小时后自动更改 Firestore 中的变量 - Swift

[英]Automatically change a variable in Firestore after 24 hours - Swift

我想在 Swift 中创建一个应用程序,用户可以在其中临时更改他们在 Firestore 文档上的数据,然后在 24 小时结束时它会像以前一样返回。 例如,在“姓名”文档中,存在姓名“迈克尔”; 他选择的用户想要将其更改为“Andrew”并且可以做到,但 24 小时后他必须返回“Michael”。 我能怎么做?

假设用户正在更改的文档位于名为MyDocs的集合中,对此的合理设计将按如下方式工作:

  1. 创建第二个集合,例如MyDocsToRestore ,它将维护用户更改的文档的副本。
  2. 在 MyDocs 上放置一个更新触发器,以保存旧文档数据以及应恢复的restoreAt日期。
exports.updateMyDocs = functions.firestore
    .document('MyDocs/{docId}')
    .onUpdate(async (change, context) => {
      // if we've got a backup, just change the restoreAt time
      const ref = doc(db, 'MyDocsToRestore', context.params.docId);
      const doc = await ref.get();
      const data = doc.exists ?  doc.data() : change.before.data();

      data.restoreAt = new Date();
      data.restoreAt.setDate(data.restoreAt.getDate() + 1);
      
      // save a copy in MyDocsToRestore
      await setDoc(ref, data);
    });
  1. 创建一个定期醒来的 function,它会经常醒来并查找restoreAt日期已过的文档。 (“每隔一段时间”表示尽可能不频繁,但相对于 24 小时到期具有可接受的精度)。 像这样...
exports.scheduledFunction = functions.pubsub.schedule('every 5 minutes').onRun(async (context) => {

  const q = query(collection(db, "MyDocsToRestore"), where("restoreAt", "<=", new Date()));

  const querySnapshot = await getDocs(q);
  const promises = querySnapshot.docs.map(doc => {
    const data = doc.data();
    delete data.restoreAt;
    return update(doc(db, 'MyDocs', doc.id), data);
  });
  return Promise.all(promises);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM