Data Connect के लिए कॉमन एक्सप्रेशन लैंग्वेज सिंटैक्स का रेफ़रंस

इस रेफ़रंस गाइड में, @auth(expr:) और @check(expr:) निर्देशों के लिए एक्सप्रेशन बनाने के लिए, कॉमन एक्सप्रेशन लैंग्वेज (सीईएल) सिंटैक्स के बारे में बताया गया है.

सीईएल के लिए पूरी रेफ़रंस जानकारी, सीईएल स्पेसिफ़िकेशन में दी गई है.

क्वेरी और म्यूटेशन में पास किए गए वैरिएबल की जांच करना

@auth(expr) सिंटैक्स की मदद से, क्वेरी और बदलावों से वैरिएबल ऐक्सेस किए जा सकते हैं और उनकी जांच की जा सकती है.

उदाहरण के लिए, vars.status का इस्तेमाल करके, $status जैसे ऑपरेशन वैरिएबल को शामिल किया जा सकता है.

mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")

एक्सप्रेशन के लिए उपलब्ध डेटा

@auth(expr:) और @check(expr:), दोनों सीईएल एक्सप्रेशन इनका आकलन कर सकते हैं:

  • request.operationName
  • vars (request.variables का उपनाम)
  • auth (request.auth का उपनाम)

इसके अलावा, @check(expr:) एक्सप्रेशन का इस्तेमाल करके इनका आकलन किया जा सकता है:

  • this (मौजूदा फ़ील्ड की वैल्यू)

request.operationName ऑब्जेक्ट

request.operarationName ऑब्जेक्ट, ऑपरेशन का टाइप सेव करता है. यह क्वेरी या म्यूटेशन, दोनों में से कोई एक हो सकता है.

vars ऑब्जेक्ट

vars ऑब्जेक्ट की मदद से, आपके एक्सप्रेशन आपकी क्वेरी या म्यूटेशन में पास किए गए सभी वैरिएबल ऐक्सेस कर सकते हैं.

किसी एक्सप्रेशन में, vars.<variablename> का इस्तेमाल पूरी तरह से तय किए गए request.variables.<variablename> के लिए, किसी दूसरे नाम के तौर पर किया जा सकता है:

# The following are equivalent
mutation StringType($v: String!) @auth(expr: "vars.v == 'hello'")
mutation StringType($v: String!) @auth(expr: "request.variables.v == 'hello'")

auth ऑब्जेक्ट

Authentication, आपके डेटा को ऐक्सेस करने का अनुरोध करने वाले उपयोगकर्ताओं की पहचान करता है. साथ ही, उस जानकारी को ऑब्जेक्ट के तौर पर उपलब्ध कराता है, जिसे अपने एक्सप्रेशन में इस्तेमाल किया जा सकता है.

अपने फ़िल्टर और एक्सप्रेशन में, auth का इस्तेमाल request.auth के लिए किसी दूसरे नाम के तौर पर किया जा सकता है.

auth ऑब्जेक्ट में यह जानकारी शामिल होती है:

  • uid: अनुरोध करने वाले उपयोगकर्ता को असाइन किया गया यूनीक यूज़र आईडी.
  • token: Authentication से इकट्ठा की गई वैल्यू का मैप.

auth.token के कॉन्टेंट के बारे में ज़्यादा जानकारी के लिए, पुष्टि करने वाले टोकन में मौजूद डेटा देखें

this बाइंडिंग

बाइंडिंग this उस फ़ील्ड का आकलन करता है जिससे @check डायरेक्टिव जुड़ा है. सामान्य तौर पर, एक वैल्यू वाली क्वेरी के नतीजों का आकलन किया जा सकता है.

mutation UpdateMovieTitle($movieId: UUID!, $newTitle: String!) @auth(level: USER) @transaction {
  # Step 1: Query and check
  query @redact {
    moviePermission( # Look up a join table called MoviePermission with a compound key.
      key: {movieId: $movieId, userId_expr: "auth.uid"}
    ) {
      # Check if the user has the editor role for the movie. `this` is the string value of `role`.
      # If the parent moviePermission is null, the @check will also fail automatically.
      role @check(expr: "this == 'editor'", message: "You must be an editor of this movie to update title")
    }
  }
  # Step 2: Act
  movie_update(id: $movieId, data: {
    title: $newTitle
  })
}

अगर कोई पैरंट फ़ील्ड सूची है, तो रिटर्न किया गया फ़ील्ड कई बार दिख सकता है. ऐसे में, हर वैल्यू के साथ बाउंड किए गए this की मदद से, हर बार दिखने वाले फ़ील्ड की जांच की जाती है.

किसी भी पाथ के लिए, अगर कोई पैरंट null या [] है, तो फ़ील्ड तक नहीं पहुंचा जा सकेगा और उस पाथ के लिए सीईएल का आकलन नहीं किया जाएगा. दूसरे शब्दों में, आकलन सिर्फ़ तब होता है, जब this null या नॉन-null हो, लेकिन कभी भी undefined नहीं.

जब फ़ील्ड खुद ही कोई सूची या ऑब्जेक्ट होता है, तो this उसी स्ट्रक्चर का पालन करता है (इसमें ऑब्जेक्ट के मामले में चुने गए सभी डिसेंटेंट शामिल होते हैं), जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है.

mutation UpdateMovieTitle2($movieId: UUID!, $newTitle: String!) @auth(level: USER) @transaction {
  # Step 1: Query and check
  query {
    moviePermissions( # Now we query for a list of all matching MoviePermissions.
      where: {movieId: {eq: $movieId}, userId: {eq_expr: "auth.uid"}}
    # This time we execute the @check on the list, so `this` is the list of objects.
    # We can use the `.exists` macro to check if there is at least one matching entry.
    ) @check(expr: "this.exists(p, p.role == 'editor')", message: "You must be an editor of this movie to update title") {
      role
    }
  }
  # Step 2: Act
  movie_update(id: $movieId, data: {
    title: $newTitle
  })
}

कॉम्प्लेक्स एक्सप्रेशन का सिंटैक्स

&& और || ऑपरेटर को मिलाकर, ज़्यादा जटिल एक्सप्रेशन लिखे जा सकते हैं.

mutation UpsertUser($username: String!) @auth(expr: "(auth != null) && (vars.username == 'joe')")

नीचे दिए गए सेक्शन में, सभी उपलब्ध ऑपरेटर के बारे में बताया गया है.

ऑपरेटर और ऑपरेटर की प्राथमिकता

ऑपरेटर और उनके क्रम के रेफ़रंस के लिए, नीचे दी गई टेबल का इस्तेमाल करें.

a और b एक्सप्रेशन, f फ़ील्ड, और i इंडेक्स.

ऑपरेटर ब्यौरा असोसिएटिविटी
a[i] a() a.f इंडेक्स, कॉल, फ़ील्ड ऐक्सेस बाएं से दाएं
!a -a एक आर्ग्युमेंट वाला नेगेटिव दाएं से बाएं
a/b a%b a*b गुणा करने वाले ऑपरेटर बाएं से दाएं
a+b a-b ऐडिटिव ऑपरेटर बाएं से दाएं
a>b a>=b a<b a<=b रिलेशनल ऑपरेटर बाएं से दाएं
a in b सूची या मैप में मौजूद होना बाएं से दाएं
type(a) == t टाइप की तुलना, जहां t के तौर पर bool, int, float, number, string, list, map, timestamp या duration का इस्तेमाल किया जा सकता है बाएं से दाएं
a==b a!=b कंपैरिज़न ऑपरेटर बाएं से दाएं
a && b कंडीशनल ऐंड बाएं से दाएं
a || b कंडीशनल OR बाएं से दाएं
a ? true_value : false_value तीसरे डिग्री का एक्सप्रेशन बाएं से दाएं

पुष्टि करने वाले टोकन में डेटा

auth.token ऑब्जेक्ट में ये वैल्यू हो सकती हैं:

फ़ील्ड ब्यौरा
email खाते से जुड़ा ईमेल पता, अगर मौजूद हो.
email_verified true, अगर उपयोगकर्ता ने पुष्टि की है कि उसके पास email पते का ऐक्सेस है. ईमेल की सेवा देने वाली कुछ कंपनियां, अपने ईमेल पतों की पुष्टि अपने-आप करती हैं.
phone_number खाते से जुड़ा फ़ोन नंबर, अगर मौजूद हो.
name अगर सेट किया गया है, तो उपयोगकर्ता का डिसप्ले नेम.
sub उपयोगकर्ता का Firebase यूआईडी. यह किसी प्रोजेक्ट में यूनीक होता है.
firebase.identities इस उपयोगकर्ता के खाते से जुड़ी सभी पहचानों की डिक्शनरी. डिक्शनरी की कुंजियां इनमें से कोई भी हो सकती हैं: email, phone, google.com, facebook.com, github.com, twitter.com. डिक्शनरी की वैल्यू, खाते से जुड़े हर आइडेंटिटी प्रोवाइडर के लिए यूनीक आइडेंटिफ़ायर के कलेक्शन होती हैं. उदाहरण के लिए, auth.token.firebase.identities["google.com"][0] में खाते से जुड़ा पहला Google उपयोगकर्ता आईडी होता है.
firebase.sign_in_provider इस टोकन को पाने के लिए, साइन इन करने की सुविधा देने वाली कंपनी. यह इनमें से कोई एक स्ट्रिंग हो सकती है: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant खाते से जुड़ा tenantId, अगर मौजूद हो. उदाहरण के लिए, tenant2-m6tyz

JWT आईडी टोकन में अतिरिक्त फ़ील्ड

यहां दिए गए auth.token फ़ील्ड भी ऐक्सेस किए जा सकते हैं:

कस्टम टोकन पर दावे
alg एल्‍गोरि‍दम "RS256"
iss जारी करने वाला आपके प्रोजेक्ट के सेवा खाते का ईमेल पता
sub विषय आपके प्रोजेक्ट के सेवा खाते का ईमेल पता
aud ऑडियंस "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat जारी करने का समय यूनिक्स के टाइमस्टैंप के बाद से, सेकंड में मौजूदा समय
exp समाप्ति समय यूनिक्स के टाइमस्टैंप के बाद सेकंड में, टोकन की समयसीमा खत्म होने का समय. यह iat के मुकाबले ज़्यादा से ज़्यादा 3600 सेकंड बाद हो सकता है.
ध्यान दें: इससे सिर्फ़ कस्टम टोकन के खत्म होने का समय कंट्रोल होता है. हालांकि, signInWithCustomToken() का इस्तेमाल करके किसी उपयोगकर्ता को साइन इन करने के बाद, वह डिवाइस में तब तक साइन इन रहेगा, जब तक उसका सेशन अमान्य नहीं हो जाता या वह साइन आउट नहीं कर देता.
<claims> (ज़रूरी नहीं) टोकन में शामिल करने के लिए, ज़रूरी नहीं कि कस्टम दावे किए जाएं. इन्हें एक्सप्रेशन में auth.token (या request.auth.token) के ज़रिए ऐक्सेस किया जा सकता है. उदाहरण के लिए, अगर आपने कोई कस्टम दावा adminClaim किया है, तो उसे auth.token.adminClaim से ऐक्सेस किया जा सकता है.