Cloud Functions के लिए SQL Connect ट्रिगर

Cloud Functions for Firebase की मदद से, Firebase SQL Connect में इवेंट मैनेज किए जा सकते हैं. Cloud Functions की मदद से, इवेंट के जवाब में सर्वर-साइड कोड चलाया जा सकता है. जैसे, आपकी SQL Connect सेवा में म्यूटेशन को लागू करना. इससे आपको अपने सर्वर को डिप्लॉय किए बिना, कस्टम लॉजिक जोड़ने की सुविधा मिलती है.

इस्तेमाल के सामान्य उदाहरण

  • डेटा सिंक करना: म्यूटेशन होने के बाद, डेटा को अन्य सिस्टम (जैसे, Cloud Firestore, BigQuery या बाहरी एपीआई) के साथ कॉपी या सिंक करना.

  • एसिंक्रोनस वर्कफ़्लो: डेटाबेस में बदलाव होने के बाद, लंबे समय तक चलने वाली प्रोसेस शुरू करें. जैसे, इमेज प्रोसेसिंग या डेटा एग्रीगेशन.

  • उपयोगकर्ता की दिलचस्पी: अपने ऐप्लिकेशन में किसी खास म्यूटेशन इवेंट के बाद, उपयोगकर्ताओं को ईमेल या 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

उपयोगकर्ता की पुष्टि करने की जानकारी ऐक्सेस करना

इवेंट को ट्रिगर करने वाले प्रिंसिपल के लिए, उपयोगकर्ता की पुष्टि करने की जानकारी को ऐक्सेस किया जा सकता है. ऑथेंटिकेशन कॉन्टेक्स्ट में उपलब्ध डेटा के बारे में ज़्यादा जानने के लिए, ऑथेंटिकेशन कॉन्टेक्स्ट देखें.

यहां दिए गए उदाहरण में, पुष्टि करने की जानकारी पाने का तरीका बताया गया है:

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

पुष्टि करने का टाइप और आईडी इस तरह से भरा जाएगा:

म्यूटेशन की प्रोसेस किसने शुरू की authtype authid
पुष्टि किया गया असली उपयोगकर्ता app_user Firebase Auth टोकन का यूआईडी
असली उपयोगकर्ता की पुष्टि नहीं की गई है unauthenticated खाली
Admin SDK का इस्तेमाल करके, असली उपयोगकर्ता की ओर से कार्रवाई करना app_user किसी दूसरे उपयोगकर्ता के तौर पर काम करने वाले उपयोगकर्ता का Firebase Auth टोकन यूआईडी
Admin SDK, बिना पुष्टि वाले अनुरोध की नकल कर रहा है unauthenticated खाली
सभी अनुमतियों वाला Admin 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 इवेंट जनरेट होने का टाइमस्टैंप (आईएसओ 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, मौजूदा डेटाबेस के अनुरोधों को प्रॉक्सी करता है. इसलिए, डेटा का "पहले" वाला स्नैपशॉट, लेन-देन के हिसाब से नहीं पाया जा सकता. इसके बजाय, आपके पास म्यूटेशन को भेजे गए आर्ग्युमेंट और उससे मिले डेटा का ऐक्सेस होता है.

इसका एक नतीजा यह है कि इनफ़ाइनाइट लूप से बचने के लिए, "पहले" और "बाद" के स्नैपशॉट की तुलना करने की रणनीति का इस्तेमाल नहीं किया जा सकता. इनफ़ाइनाइट लूप में, इवेंट ट्रिगर उसी इवेंट को ट्रिगर करता है. अगर आपको म्यूटेशन इवेंट से ट्रिगर होने वाले फ़ंक्शन से म्यूटेशन करना है, तो इवेंट फ़िल्टर का इस्तेमाल करें. साथ ही, यह पक्का करें कि कोई भी म्यूटेशन खुद को ट्रिगर न कर सके, भले ही वह सीधे तौर पर न हो.