Cloud Functions-এর মাধ্যমে SQL Connect এক্সটেন্ড করা

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

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

  • ডেটা সিঙ্ক্রোনাইজেশন: মিউটেশন হওয়ার পরে অন্যান্য সিস্টেমের (যেমন Cloud Firestore, BigQuery বা এক্সটার্নাল API) সাথে ডেটা রেপ্লিকেট বা সিঙ্ক করা।

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

  • ব্যবহারকারীর এনগেজমেন্ট: আপনার অ্যাপ্লিকেশনে অ্যাকাউন্ট তৈরির মতো নির্দিষ্ট মিউটেশন ইভেন্টের পরে ব্যবহারকারীদের ইমেল বা Cloud Messaging বিজ্ঞপ্তি পাঠান।

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

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

একটি বেসিক মিউটেশন ইভেন্ট ফাংশন

নিম্নলিখিত প্রাথমিক উদাহরণটি হল একটি ফাংশন যা আপনার SQL Connect পরিষেবায় সম্পন্ন হওয়া যেকোনও মিউটেশনের বিবরণ লগ করে:

Node.js

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,
    });
  }
);

Python

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)

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

ফাংশনের লোকেশন সেট করুন

ইভেন্ট যাতে ফাংশন ট্রিগার করতে পারে তার জন্য ফাংশন লোকেশন অবশ্যই SQL Connect পরিষেবা লোকেশন-এর সাথে মিলতে হবে। ডিফল্ট হিসেবে, ফাংশন অঞ্চল হল us-central1।

Node.js

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

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

Python

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

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

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

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

Node.js

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

Python

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-এ ব্যবহারের জন্য উপলভ্য। আরও তথ্যের জন্য পাথ প্যাটার্ন বুঝুন দেখুন।

যেমন:

Node.js

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

Python

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 দেখুন।

নিম্নলিখিত উদাহরণ থেকে কীভাবে যাচাইকরণের তথ্য ফিরিয়ে আনা যায় তা জানুন:

Node.js

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

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

Python

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

auth-এর ধরন ও auth আইডি এইভাবে দেখানো হবে:

মিউটেশন শুরু করেছেন authtype authid
যাচাই করা ব্যবহারকারী app_user Firebase Auth টোকেন UID
যাচাই না করা এন্ড ইউজার unauthenticated খালি
অ্যাডমিন SDK কোনও ব্যবহারকারীর ছদ্মবেশ ধারণ করছে app_user ছদ্মবেশী ব্যবহারকারীর Firebase Auth টোকেন UID
অ্যাডমিন SDK একটি যাচাই না করা অনুরোধের ছদ্মবেশ ধারণ করছে unauthenticated খালি
সম্পূর্ণ অনুমতি সহ অ্যাডমিন SDK 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 ইভেন্টটি কখন তৈরি করা হয়েছিল তার টাইমস্ট্যাম্প (ISO 8601 ফর্ম্যাট)।
subject string ঐচ্ছিক৷ ইভেন্টের প্রসঙ্গ সম্পর্কে অতিরিক্ত তথ্য, যেমন অপারেশনের নাম।
params object ক্যাপচার করা পাথ প্যাটার্নের ম্যাপ।
authType string ইভেন্ট ট্রিগার করা প্রিন্সিপালের ধরন বোঝায় এমন enum।
authId string ইভেন্ট ট্রিগার করা প্রিন্সিপালের অনন্য শনাক্তকারী।
data MutationEventData SQL Connect ইভেন্টের পেলোড। পরের বিভাগ দেখুন।

ডেটা পেলোড

MutationEventData অবজেক্টে SQL 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: মিউটেশন এক্সিকিউশনের সময় হওয়া যেকোনও সমস্যার অ্যারে। মিউটেশন সফল হলে, এই অ্যারে খালি থাকবে।

উদাহরণ

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

Node.js

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

Python

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-এর মতো অন্যান্য ডেটাবেস ট্রিগারের মতো, SQL Connect ইভেন্ট ডেটার "আগের" স্ন্যাপশট প্রদান করে না। যেহেতু SQL Connect অন্তর্নিহিত ডেটাবেসে অনুরোধ প্রক্সি করে, তাই ডেটার "আগের" স্ন্যাপশট ট্রানজ্যাকশনালি পাওয়া যায় না। পরিবর্তে, আপনি মিউটেশনে পাঠানো আর্গুমেন্ট এবং এর মাধ্যমে ফেরত পাঠানো ডেটা অ্যাক্সেস করতে পারবেন।

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