ক্লাউড ফাংশনের সাথে ডেটা সংযোগ প্রসারিত করুন

Cloud Functions for Firebase মাধ্যমে, আপনি Firebase Data Connect এর ইভেন্টগুলো পরিচালনা করতে পারেন। Cloud Functions আপনাকে বিভিন্ন ইভেন্টের প্রতিক্রিয়ায় সার্ভার-সাইড কোড চালানোর সুযোগ দেয়, যেমন আপনার Data Connect সার্ভিসে কোনো মিউটেশনের এক্সিকিউশন। এর ফলে আপনি নিজের সার্ভার স্থাপন না করেই কাস্টম লজিক যোগ করতে পারেন।

সাধারণ ব্যবহারের ক্ষেত্রগুলি

  • ডেটা সিঙ্ক্রোনাইজেশন: কোনো পরিবর্তন ঘটার পর অন্যান্য সিস্টেমের (যেমন Cloud Firestore , বিগকোয়েরি বা এক্সটার্নাল এপিআই) সাথে ডেটা প্রতিলিপি বা সিঙ্ক্রোনাইজ করুন।

  • অ্যাসিঙ্ক্রোনাস ওয়ার্কফ্লো: ডাটাবেস পরিবর্তনের পর ইমেজ প্রসেসিং বা ডেটা অ্যাগ্রিগেশনের মতো দীর্ঘ সময় ধরে চলা প্রসেসগুলো চালু করে।

  • ব্যবহারকারীর সম্পৃক্ততা: আপনার অ্যাপ্লিকেশনের কোনো নির্দিষ্ট পরিবর্তনমূলক ঘটনার (যেমন অ্যাকাউন্ট তৈরি) পর ব্যবহারকারীদের ইমেল বা Cloud Messaging নোটিফিকেশন পাঠান।

Data Connect মিউটেশনে একটি ফাংশন ট্রিগার করুন

আপনি onMutationExecuted ইভেন্ট হ্যান্ডলার ব্যবহার করে যখনই কোনো Data Connect মিউটেশন এক্সিকিউট হয়, তখন একটি ফাংশন ট্রিগার করতে পারেন। মিউটেশনটি এক্সিকিউট হওয়ার পরেই এই ট্রিগারটি ঘটে।

একটি মৌলিক মিউটেশন ইভেন্ট ফাংশন

নিম্নলিখিত সাধারণ উদাহরণটি এমন একটি ফাংশন, যা আপনার Data Connect সার্ভিসে সম্পাদিত যেকোনো মিউটেশনের বিবরণ লগ করে:

নোড.জেএস

import { onMutationExecuted } from "firebase-functions/dataconnect";
import { logger } from "firebase-functions";

export const logMutation = onMutationExecuted(
  {
    /* Trigger on all mutations, spanning all services and connectors
       in us-central1 */
  },
  (event) => {
    logger.info("A mutation was executed!", {
      data: event.data,
    });
  }
);

পাইথন

from firebase_functions import dataconnect_fn, logger

@dataconnect_fn.on_mutation_executed()
def log_mutation(event: dataconnect_fn.Event):
  logger.info("A mutation was executed!", event.data)

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

ফাংশনের অবস্থান সেট করুন

ইভেন্ট দ্বারা ফাংশনটি ট্রিগার হওয়ার জন্য ফাংশনের অবস্থান অবশ্যই Data Connect সার্ভিসের অবস্থানের সাথে মিলতে হবে। ডিফল্টরূপে, ফাংশন রিজিয়ন হলো us-central1

নোড.জেএস

import { onMutationExecuted } from "firebase-functions/dataconnect";

export const onMutationRegionOption = onMutationExecuted(
  {
    region: "europe-west1"  // Set if Data Connect service location is not us-central1
  },
  (event) => { /* ... */ }
);

পাইথন

@dataconnect_fn.on_mutation_executed(
  region="europe-west1"  # Set if Data Connect service location is not us-central1
)
def mutation_executed_handler_region_option(event: dataconnect_fn.Event):
  pass

ইভেন্ট ফিল্টার করুন

onMutationExecuted হ্যান্ডলারটিকে নির্দিষ্ট অ্যাট্রিবিউটের উপর ভিত্তি করে ইভেন্ট ফিল্টার করার জন্য বিভিন্ন অপশন দিয়ে কনফিগার করা যায়। এটি তখন কাজে আসে যখন আপনি শুধুমাত্র নির্দিষ্ট কিছু মিউটেশনের জন্য আপনার ফাংশনটি ট্রিগার করতে চান।

আপনি service , connector এবং operation অনুযায়ী ফিল্টার করতে পারেন:

নোড.জেএস

import { onMutationExecuted } from "firebase-functions/dataconnect";
import { logger } from "firebase-functions";

// Trigger this function only for the CreateUser mutation
// in the users connector of the myAppService service.
export const onUserCreate = onMutationExecuted(
  {
    service: "myAppService",
    connector: "users",
    operation: "CreateUser",
  },
  (event) => {
    logger.info("A new user was created!", event.data);
    // Add logic here: for example, sending a welcome email.
  }
);

পাইথন

from firebase_functions import dataconnect_fn, logger

@dataconnect_fn.on_mutation_executed(
  service="myAppService",
  connector="users",
  operation="CreateUser"
):
def on_user_create(event: dataconnect_fn.Event):
  logger.info("A new user was created!", event.data)

ওয়াইল্ডকার্ড এবং ক্যাপচার গ্রুপ

আপনি একাধিক মানের উপর ভিত্তি করে আপনার ট্রিগার ফিল্টার করতে ওয়াইল্ডকার্ড এবং ক্যাপচার গ্রুপ ব্যবহার করতে পারেন। ক্যাপচার করা যেকোনো গ্রুপ ব্যবহারের জন্য event.params এ উপলব্ধ থাকে। আরও তথ্যের জন্য ‘Understand path patterns’ দেখুন।

উদাহরণ:

নোড.জেএস

import { onMutationExecuted } from "firebase-functions/dataconnect";

// Trigger on all operations that match the pattern `User*`, on any service and
// connector.
export const onMutationWildcards = onMutationExecuted(
  {
    operation: "User*",
  },
  (event) => {}
);

// Trigger on all operations that match the pattern `User*`, on any service and
// connector. Capture the operation name in the variable `op`.
export const onMutationCaptureWildcards = onMutationExecuted(
  {
    operation: "{op=User*}",
  },
  (event) => {
    // `event.params.op` contains the operation name.
  }
);

// Trigger on all operations on the service `myAppService`. Capture the
// operation name in the variable `operation`.
export const onMutationCaptures = onMutationExecuted(
  {
    service: "myAppService",
    operation: "{operation}",
  },
  (event) => {
    // `event.params.operation` contains the operation name.
  }
);

পাইথন

from firebase_functions import dataconnect_fn

# Trigger on all operations that match the pattern `User*`, on any service and
# connector.
@dataconnect_fn.on_mutation_executed(
  operation="User*"
)
def on_mutation_wildcards(event: dataconnect_fn.Event):
  pass

# Trigger on all operations that match the pattern `User*`, on any service and
# connector. Capture the operation name in the variable `op`.
@dataconnect_fn.on_mutation_executed(
  operation="{op=User*}"
)
def on_mutation_capture_wildcards(event: dataconnect_fn.Event):
  # `event.params["op"]` contains the operation name.
  pass

# Trigger on all operations on the service `myAppService`. Capture the
# operation name in the variable `operation`.
@dataconnect_fn.on_mutation_executed(
  service="myAppService",
  operation="{operation}"
)
def on_mutation_captures(event: dataconnect_fn.Event):
  # `event.params["operation"]` contains the operation name.
  pass

ব্যবহারকারীর প্রমাণীকরণ তথ্য অ্যাক্সেস করুন

যে প্রিন্সিপাল ইভেন্টটি ট্রিগার করেছে, আপনি তার ব্যবহারকারী প্রমাণীকরণ তথ্য অ্যাক্সেস করতে পারেন। প্রমাণীকরণ কনটেক্সটে উপলব্ধ ডেটা সম্পর্কে আরও তথ্যের জন্য, প্রমাণীকরণ কনটেক্সট (Auth Context) দেখুন।

নিম্নলিখিত উদাহরণটি প্রমাণীকরণ তথ্য পুনরুদ্ধার করার পদ্ধতি প্রদর্শন করে:

নোড.জেএস

import { onMutationExecuted } from "firebase-functions/dataconnect";

export const onMutation = onMutationExecuted(
  { operation: "MyMutation" },
  (event) => {
    // mutationExecuted event provides authType and authId:
    // event.authType
    // event.authId
  }
);

পাইথন

from firebase_functions import dataconnect_fn

@dataconnect_fn.on_mutation_executed(operation="MyMutation")
def mutation_executed_handler(event: dataconnect_fn.Event):
  # mutationExecuted event provides auth_type and auth_id, which are accessed as follows
  # event.auth_type
  # event.auth_id
  pass

অথোরাইজেশন টাইপ এবং অথোরাইজেশন আইডি নিম্নরূপভাবে পূরণ করা হবে:

মিউটেশন দ্বারা শুরু করা প্রমাণীকরণ প্রকার অনুমোদিত
প্রমাণীকৃত শেষ ব্যবহারকারী app_user ফায়ারবেস অথেন্টিকেশন টোকেন UID
অপ্রমাণিত শেষ ব্যবহারকারী unauthenticated খালি
অ্যাডমিন এসডিকে একজন শেষ ব্যবহারকারীর ছদ্মবেশ ধারণ করছে app_user ছদ্মবেশী ব্যবহারকারীর ফায়ারবেস অথেন্টিকেশন টোকেনের UID
অ্যাডমিন এসডিকে একটি প্রমাণীকরণবিহীন অনুরোধের ছদ্মবেশ ধারণ করছে unauthenticated খালি
সম্পূর্ণ অনুমতি সহ অ্যাডমিন এসডিকে admin খালি

ইভেন্ট ডেটা অ্যাক্সেস করুন

আপনার ফাংশনে পাঠানো CloudEvent অবজেক্টটিতে সেই ইভেন্ট সম্পর্কিত তথ্য থাকে, যা এটিকে ট্রিগার করেছে।

ইভেন্টের বৈশিষ্ট্য

বৈশিষ্ট্য প্রকার বর্ণনা
id string ঘটনাটির জন্য একটি অনন্য শনাক্তকারী।
source string যে কানেক্টর রিসোর্সটি ইভেন্টটি তৈরি করেছে (উদাহরণস্বরূপ, //firebasedataconnect.googleapis.com/projects/*/locations/*/services/*/connectors/* )।
specversion string CloudEvents স্পেসিফিকেশন সংস্করণ (যেমন, "1.0")।
type string ইভেন্টের ধরণ: google.firebase.dataconnect.connector.v1.mutationExecuted .
time string ইভেন্টটি কখন তৈরি হয়েছিল তার টাইমস্ট্যাম্প (আইএসও ৮৬০১ ফরম্যাট)।
subject string ঐচ্ছিক। ইভেন্টের প্রেক্ষাপট সম্পর্কিত অতিরিক্ত তথ্য, যেমন অপারেশনের নাম।
params object ধারণকৃত পথের বিন্যাসের একটি মানচিত্র।
authType string যে প্রিন্সিপাল ইভেন্টটি ট্রিগার করেছে, তার ধরন নির্দেশকারী একটি এনাম।
authId string যে মূল ব্যক্তি ঘটনাটি ঘটিয়েছে তার একটি অনন্য শনাক্তকারী।
data MutationEventData Data Connect ইভেন্টের পেলোড। পরবর্তী বিভাগটি দেখুন।

ডেটা পেলোড

MutationEventData অবজেক্টটিতে Data Connect ইভেন্টের পেলোড থাকে:

{
  // ...
  "authType": // ...
  "data": {
    "payload": {
      "variables": {
        "userId": "user123",
        "updateData": {
          "displayName": "New Name"
        }
      },
      "data": {
        "updateUser": {
          "id": "user123",
          "displayName": "New Name",
          "email": "user@example.com"
        }
      },
      "errors": []
    }
  }
}
  • payload.variables : একটি অবজেক্ট, যাতে মিউটেশনে পাঠানো ভেরিয়েবলগুলো থাকে।
  • payload.data : মিউটেশন দ্বারা ফেরত আসা ডেটা ধারণকারী একটি অবজেক্ট।
  • payload.errors : মিউটেশনটি কার্যকর করার সময় ঘটা যেকোনো ত্রুটির একটি অ্যারে। মিউটেশনটি সফল হলে, এই অ্যারেটি খালি থাকবে।

উদাহরণ

যেভাবে আপনি মিউটেশন ভেরিয়েবল এবং রিটার্ন করা ডেটা অ্যাক্সেস করতে পারবেন তা নিচে দেওয়া হলো:

নোড.জেএস

import { onMutationExecuted } from "firebase-functions/dataconnect";
import { logger } from "firebase-functions";

export const processNewUserData = onMutationExecuted(
  {
    "service": "myAppService",
    "connector": "users",
    "operation": "CreateUser",
  },
  (event) => {
    // The variables passed to the mutation
    const mutationVariables = event.data.payload.variables;

    // The data returned by the mutation
    const returnedData = event.data.payload.data;

    logger.info("Processing mutation with variables:", mutationVariables);
    logger.info("Mutation returned:", returnedData);

    // ... your custom logic here
  }
);

পাইথন

from firebase_functions import dataconnect_fn, logger

@dataconnect_fn.on_mutation_executed(
  service="myAppService",
  connector="users",
  operation="CreateUser"
):
def process_new_user_data(event: dataconnect_fn.Event):
  # The variables passed to the mutation
  mutation_vars = event.data.payload.variables
  # The data returned by the mutation
  returned_data = event.data.payload.data

  logger.info("Processing mutation with variables:", mutationVariables)
  logger.info("Mutation returned", returnedData)

  # ... your custom logic here

উল্লেখ্য যে, Cloud Firestore বা Realtime Database মতো অন্যান্য কিছু ডেটাবেস ট্রিগারের বিপরীতে, Data Connect ইভেন্টটি ডেটার কোনো "আগের" স্ন্যাপশট প্রদান করে না। যেহেতু Data Connect অন্তর্নিহিত ডেটাবেসে অনুরোধগুলোকে প্রক্সি করে, তাই ডেটার "আগের" স্ন্যাপশটটি ট্রানজ্যাকশনালি পাওয়া যায় না। এর পরিবর্তে, আপনি মিউটেশনে পাঠানো আর্গুমেন্টগুলো এবং এর দ্বারা ফেরত আসা ডেটা অ্যাক্সেস করতে পারেন।

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