একটি কলযোগ্য ক্লাউড ফাংশন দিয়ে ডেটা মুছুন

এই পৃষ্ঠাটিতে বর্ণনা করা হয়েছে কীভাবে ডেটা ডিলিট করার জন্য একটি কলযোগ্য ক্লাউড ফাংশন ব্যবহার করতে হয়। একবার এই ফাংশনটি ডেপ্লয় করলে, আপনি আপনার মোবাইল অ্যাপ বা ওয়েবসাইট থেকে সরাসরি এটিকে কল করে রিকার্সিভলি ডকুমেন্ট এবং কালেকশন ডিলিট করতে পারবেন। উদাহরণস্বরূপ, আপনি এই সমাধানটি ব্যবহার করে নির্দিষ্ট ব্যবহারকারীদের সম্পূর্ণ কালেকশন ডিলিট করার ক্ষমতা দিতে পারেন।

কালেকশন মুছে ফেলার অন্যান্য উপায় জানতে, ডেটা মুছুন (Delete data) দেখুন।

সমাধান: কলযোগ্য ক্লাউড ফাংশন ব্যবহার করে ডেটা মুছে ফেলুন

নিম্নলিখিত কারণগুলোর জন্য সীমিত রিসোর্সযুক্ত মোবাইল অ্যাপ থেকে সম্পূর্ণ কালেকশন মুছে ফেলা কঠিন হতে পারে:

  • এমন কোনো অপারেশন নেই যা কোনো কালেকশনকে অ্যাটমিকভাবে ডিলিট করে।
  • একটি ডকুমেন্ট মুছে ফেললে তার উপ-সংগ্রহগুলিতে থাকা ডকুমেন্টগুলি মুছে যায় না।
  • আপনার ডকুমেন্টগুলিতে যদি ডাইনামিক সাবকালেকশন থাকে, তাহলে একটি নির্দিষ্ট পাথের জন্য কোন ডেটা ডিলিট করতে হবে তা জানা কঠিন হতে পারে।
  • ৫০০টিরও বেশি ডকুমেন্টের একটি সংগ্রহ মুছে ফেলার জন্য একাধিক ব্যাচড রাইট অপারেশন অথবা শত শত একক ডিলিট অপারেশনের প্রয়োজন হয়।
  • অনেক অ্যাপে, ব্যবহারকারীদের সম্পূর্ণ কালেকশন মুছে ফেলার অনুমতি দেওয়া সমীচীন নয়।

সৌভাগ্যবশত, আপনি সম্পূর্ণ কালেকশন বা কালেকশন ট্রি নিরাপদে এবং উন্নত পারফরম্যান্সের সাথে ডিলিট করার জন্য একটি কলযোগ্য ক্লাউড ফাংশন লিখতে পারেন। নিচের ক্লাউড ফাংশনটি একটি কলযোগ্য ফাংশন ইমপ্লিমেন্ট করে, যার মানে হলো এটিকে আপনার মোবাইল অ্যাপ বা ওয়েবসাইট থেকে সরাসরি কল করা যাবে, ঠিক যেমনটি আপনি একটি লোকাল ফাংশনের ক্ষেত্রে করে থাকেন।

ফাংশনটি স্থাপন করতে এবং একটি ডেমো চেষ্টা করতে, নমুনা কোডটি দেখুন।

ক্লাউড ফাংশন

নিচের ক্লাউড ফাংশনটি একটি কালেকশন এবং তার সমস্ত ডিসেন্ডেন্টকে ডিলিট করে।

আপনার ক্লাউড ফাংশনের জন্য নিজস্ব রিকার্সিভ ডিলিট লজিক প্রয়োগ করার পরিবর্তে, আপনি ফায়ারবেস কমান্ড লাইন ইন্টারফেস (CLI)-এ থাকা firestore:delete কমান্ডটি ব্যবহার করতে পারেন। আপনি firebase-tools প্যাকেজটি ব্যবহার করে ফায়ারবেস CLI-এর যেকোনো ফাংশন আপনার Node.js অ্যাপ্লিকেশনে ইম্পোর্ট করতে পারেন।

Firebase CLI Cloud Firestore REST API ব্যবহার করে নির্দিষ্ট পাথের অধীনে থাকা সমস্ত ডকুমেন্ট খুঁজে বের করে এবং সেগুলোকে একে একে ডিলিট করে। এই বাস্তবায়নের জন্য আপনার অ্যাপের নির্দিষ্ট ডেটা হায়ারার্কি সম্পর্কে কোনো জ্ঞানের প্রয়োজন হয় না এবং এটি এমনকি সেইসব "অনাথ" ডকুমেন্টও খুঁজে বের করে ডিলিট করে দেবে, যেগুলোর আর কোনো প্যারেন্ট নেই।

নোড.জেএস

/**
 * 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 
    };
  });

ক্লায়েন্ট আহ্বান

ফাংশনটি কল করতে, Firebase SDK থেকে ফাংশনটির একটি রেফারেন্স নিন এবং প্রয়োজনীয় প্যারামিটারগুলো পাস করুন:

ওয়েব
/**
 * 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);
        });
}
সুইফট
দ্রষ্টব্য: এই পণ্যটি watchOS এবং App Clip টার্গেটগুলিতে উপলব্ধ নয়।
    // Snippet not yet written
    
উদ্দেশ্য-সি
দ্রষ্টব্য: এই পণ্যটি watchOS এবং App Clip টার্গেটগুলিতে উপলব্ধ নয়।
    // Snippet not yet written
    

Kotlin

/**
 * 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
                    // ...
                }
            });
}

কলযোগ্য ক্লাউড ফাংশনের জন্য ক্লায়েন্ট SDK ব্যবহার করে, ব্যবহারকারীর অথেনটিকেশন স্টেট এবং path প্যারামিটার নির্বিঘ্নে রিমোট ফাংশনে পাঠানো হয়। ফাংশনটি সম্পন্ন হলে, ক্লায়েন্ট ফলাফল বা একটি এক্সেপশন সহ একটি কলব্যাক পাবে। অ্যান্ড্রয়েড, অ্যাপল বা অন্য কোনো প্ল্যাটফর্ম থেকে কীভাবে ক্লাউড ফাংশন কল করতে হয়, তা জানতে ডকুমেন্টেশন পড়ুন।

সীমাবদ্ধতা

উপরে দেখানো সমাধানটি একটি কলযোগ্য ফাংশন থেকে কালেকশন মুছে ফেলার পদ্ধতি প্রদর্শন করে, কিন্তু আপনাকে নিম্নলিখিত সীমাবদ্ধতাগুলো সম্পর্কে সচেতন থাকতে হবে:

  • সামঞ্জস্যতা - উপরের কোডটি একবারে একটি করে ডকুমেন্ট ডিলিট করে। যদি কোনো ডিলিট অপারেশন চলাকালীন আপনি কোয়েরি করেন, তাহলে আপনার ফলাফলে একটি আংশিকভাবে সম্পন্ন অবস্থা প্রতিফলিত হতে পারে, যেখানে শুধুমাত্র কিছু নির্দিষ্ট ডকুমেন্ট ডিলিট হয়েছে। ডিলিট অপারেশনগুলো যে একইভাবে সফল বা ব্যর্থ হবে তারও কোনো নিশ্চয়তা নেই, তাই আংশিক ডিলিটের পরিস্থিতি সামাল দেওয়ার জন্য প্রস্তুত থাকুন।
  • টাইমআউট - উপরের ফাংশনটি টাইমআউট হওয়ার আগে সর্বোচ্চ ৫৪০ সেকেন্ড চলার জন্য কনফিগার করা হয়েছে। ডিলিট করার কোডটি সর্বোত্তম ক্ষেত্রে প্রতি সেকেন্ডে ৪০০০টি ডকুমেন্ট ডিলিট করতে পারে। যদি আপনাকে ২০,০০,০০০-এর বেশি ডকুমেন্ট ডিলিট করতে হয়, তবে অপারেশনটি আপনার নিজের সার্ভারে চালানোর কথা বিবেচনা করা উচিত, যাতে এটি টাইমআউট না হয়। আপনার নিজের সার্ভার থেকে কীভাবে একটি কালেকশন ডিলিট করতে হয় তার উদাহরণের জন্য, ‘ডিলিট কালেকশনস’ দেখুন।
  • একসাথে অনেক বেশি সংখ্যক ডকুমেন্ট ডিলিট করলে গুগল ক্লাউড কনসোলের ডেটা ভিউয়ারটি লোড হতে দেরি হতে পারে অথবা টাইমআউট এরর দেখাতে পারে।