Çağrılanabilir Cloud Functions işleviyle verileri silme

Sayfada, verileri silmek için çağrılabilir bir Cloud Functions işlevinin nasıl kullanılacağı açıklanmaktadır. Bu işlevi dağıttıktan sonra, dokümanları ve koleksiyonları yinelemeli olarak silmek için doğrudan mobil uygulamanızdan veya web sitenizden çağırabilirsiniz. Örneğin, belirli kullanıcılara koleksiyonların tamamını silme olanağı vermek için bu çözümü kullanabilirsiniz.

Koleksiyonları silmeyle ilgili diğer yöntemler için Verileri silme başlıklı makaleyi inceleyin.

Çözüm: Çağrılabilir Cloud Functions işleviyle veri silme

Kaynakları sınırlı olan bir mobil uygulamadaki koleksiyonların tamamını silmek aşağıdaki nedenlerle zor olabilir:

  • Koleksiyonları atomik olarak silen bir işlem yoktur.
  • Bir dokümanın silinmesi, alt koleksiyonlarındaki dokümanların silinmesine neden olmaz.
  • Belgelerinizde dinamik alt koleksiyonlar varsa belirli bir yol için hangi verilerin silineceğini bilmek zor olabilir.
  • 500'den fazla belge içeren bir koleksiyonu silmek için birden fazla toplu yazma işlemi veya yüzlerce tek silme işlemi gerekir.
  • Birçok uygulamada, son kullanıcılara koleksiyonların tamamını silme izni vermek uygun değildir.

Neyse ki koleksiyonların veya koleksiyon ağaçlarının tamamını güvenli ve yüksek performanslı bir şekilde silmek için çağrılabilir bir Cloud Function yazabilirsiniz. Aşağıdaki Cloud Functions, çağrılabilir bir işlev uygular. Yani yerel bir işlevde olduğu gibi doğrudan mobil uygulamanızdan veya web sitenizden çağrılabilir.

İşlevi dağıtmak ve bir demoyu denemek için örnek koda bakın.

Cloud Functions işlevi

Aşağıdaki Cloud işlevi, bir koleksiyonu ve tüm alt öğelerini siler.

Cloud işleviniz için kendi yinelenen silme mantığınızı uygulamak yerine Firebase Komut Satırı Arayüzü'ndeki (KSA) firestore:delete komutundan yararlanabilirsiniz. firebase-tools paketini kullanarak Firebase CLI'nin herhangi bir işlevini Node.js uygulamanıza aktarabilirsiniz.

Firebase CLI, belirtilen yol altındaki tüm dokümanları bulup tek tek silmek için Cloud Firestore REST API'yi kullanır. Bu uygulama için uygulamanızın veri hiyerarşisi hakkında bilgi sahibi olmanız gerekmez. Hatta artık üst öğesi olmayan "öksüz" dokümanları bulup silebilir.

Node.js

/**
 * Initiate a recursive delete of documents at a given path.
 * 
 * The calling user must be authenticated and have the custom "admin" attribute
 * set to true on the auth token.
 * 
 * This delete is NOT an atomic operation and it's possible
 * that it may fail after only deleting some documents.
 * 
 * @param {string} data.path the document or collection path to delete.
 */
exports.recursiveDelete = functions
  .runWith({
    timeoutSeconds: 540,
    memory: '2GB'
  })
  .https.onCall(async (data, context) => {
    // Only allow admin users to execute this function.
    if (!(context.auth && context.auth.token && context.auth.token.admin)) {
      throw new functions.https.HttpsError(
        'permission-denied',
        'Must be an administrative user to initiate delete.'
      );
    }

    const path = data.path;
    console.log(
      `User ${context.auth.uid} has requested to delete path ${path}`
    );

    // Run a recursive delete on the given document or collection path.
    // The 'token' must be set in the functions config, and can be generated
    // at the command line by running 'firebase login:ci'.
    await firebase_tools.firestore
      .delete(path, {
        project: process.env.GCLOUD_PROJECT,
        recursive: true,
        force: true,
        token: functions.config().fb.token
      });

    return {
      path: path 
    };
  });

İstemci Çağrısı

İşlevi çağırmak için Firebase SDK'sından işlevin referansını alın ve gerekli parametreleri iletin:

Web
/**
 * Call the 'recursiveDelete' callable function with a path to initiate
 * a server-side delete.
 */
function deleteAtPath(path) {
    var deleteFn = firebase.functions().httpsCallable('recursiveDelete');
    deleteFn({ path: path })
        .then(function(result) {
            logMessage('Delete success: ' + JSON.stringify(result));
        })
        .catch(function(err) {
            logMessage('Delete failed, see console,');
            console.warn(err);
        });
}
Swift
Not: Bu ürün, watchOS ve App Clip hedeflerinde kullanılamaz.
    // Snippet not yet written
    
Objective-C
Not: Bu ürün, watchOS ve App Clip hedeflerinde kullanılamaz.
    // Snippet not yet written
    

Kotlin+KTX

/**
 * Call the 'recursiveDelete' callable function with a path to initiate
 * a server-side delete.
 */
fun deleteAtPath(path: String) {
    val deleteFn = Firebase.functions.getHttpsCallable("recursiveDelete")
    deleteFn.call(hashMapOf("path" to path))
        .addOnSuccessListener {
            // Delete Success
            // ...
        }
        .addOnFailureListener {
            // Delete Failed
            // ...
        }
}

Java

/**
 * Call the 'recursiveDelete' callable function with a path to initiate
 * a server-side delete.
 */
public void deleteAtPath(String path) {
    Map<String, Object> data = new HashMap<>();
    data.put("path", path);

    HttpsCallableReference deleteFn =
            FirebaseFunctions.getInstance().getHttpsCallable("recursiveDelete");
    deleteFn.call(data)
            .addOnSuccessListener(new OnSuccessListener<HttpsCallableResult>() {
                @Override
                public void onSuccess(HttpsCallableResult httpsCallableResult) {
                    // Delete Success
                    // ...
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // Delete failed
                    // ...
                }
            });
}

Çağırılabilir bulut işlevleri için istemci SDK'sı kullanıldığında kullanıcıların kimlik doğrulama durumu ve path parametresi uzak işleve sorunsuz bir şekilde aktarılır. İşlev tamamlandığında istemci, sonucu veya bir istisnayı içeren bir geri çağırma alır. Android, Apple veya başka bir platformdan Cloud işlevini nasıl çağıracağınız hakkında bilgi edinmek için dokümanları okuyun.

Sınırlamalar

Yukarıda gösterilen çözümde, çağrılabilir bir işlevden koleksiyonların silinmesi gösterilmektedir ancak aşağıdaki sınırlamalara dikkat etmeniz gerekir:

  • Tutarlılık: Yukarıdaki kod, dokümanları tek tek siler. Devam eden bir silme işlemi sırasında sorgu yaparsanız sonuçlarınız, yalnızca hedeflenen bazı dokümanların silindiği kısmen tamamlanmış bir durumu yansıtabilir. Silme işlemlerinin her zaman başarılı veya başarısız olacağı da garanti edilmez. Bu nedenle, kısmi silme durumlarıyla başa çıkmaya hazır olun.
  • Zaman aşımları: Yukarıdaki işlev, zaman aşımı olmadan en fazla 540 saniye çalışacak şekilde yapılandırılmıştır. Silme kodu, en iyi durumda saniyede 4.000 doküman silebilir. 2.000.000'den fazla belgeyi silmeniz gerekiyorsa zaman aşımı olmaması için işlemi kendi sunucunuzda çalıştırabilirsiniz. Bir koleksiyonu kendi sunucunuzdan nasıl sileceğinize dair örnek için Koleksiyonları silme bölümüne bakın.
  • Çok sayıda belgeyi silmek, Google Cloud Console'daki veri görüntüleyicinin yavaş yüklenmesine veya zaman aşımı hatası döndürmesine neden olabilir.