ডেটা সংযোগের জন্য সাধারণ অভিব্যক্তি ভাষা সিনট্যাক্স রেফারেন্স

এই রেফারেন্স গাইডগুলি @auth(expr:) এবং @check(expr:) নির্দেশাবলীর জন্য অভিব্যক্তি তৈরির জন্য প্রাসঙ্গিক কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) সিনট্যাক্স কভার করে।

CEL এর জন্য সম্পূর্ণ রেফারেন্স তথ্য CEL স্পেসিফিকেশনে প্রদান করা হয়েছে।

পরীক্ষা ভেরিয়েবল প্রশ্ন এবং মিউটেশন পাস

@auth(expr) সিনট্যাক্স আপনাকে প্রশ্ন এবং মিউটেশন থেকে ভেরিয়েবল অ্যাক্সেস এবং পরীক্ষা করার অনুমতি দেয়।

উদাহরণস্বরূপ, আপনি একটি অপারেশন ভেরিয়েবল অন্তর্ভুক্ত করতে পারেন, যেমন $status , vars.status ব্যবহার করে।

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

এক্সপ্রেশনের জন্য উপলভ্য ডেটা: অনুরোধ, প্রতিক্রিয়া, এই

আপনি এর জন্য ডেটা ব্যবহার করেন:

  • @auth(expr:) এবং @check(expr:) নির্দেশে CEL এক্সপ্রেশন সহ মূল্যায়ন
  • সার্ভার এক্সপ্রেশন ব্যবহার করে অ্যাসাইনমেন্ট, <field>_expr

উভয় @auth(expr:) এবং @check(expr:) CEL অভিব্যক্তি নিম্নলিখিত মূল্যায়ন করতে পারে:

  • request.operationName
  • vars ( request.variables এর উপনাম)
  • auth ( request.auth এর জন্য উপনাম)

মিউটেশনে, আপনি এর বিষয়বস্তু অ্যাক্সেস করতে এবং বরাদ্দ করতে পারেন:

  • response (মাল্টি-স্টেপ লজিকে আংশিক ফলাফল পরীক্ষা করতে)

উপরন্তু, @check(expr:) অভিব্যক্তি মূল্যায়ন করতে পারে:

  • this (বর্তমান ক্ষেত্রের মান)
  • response (মাল্টি-স্টেপ লজিকে আংশিক ফলাফল পরীক্ষা করতে)

request.operationName বাইন্ডিং

request.operarationName বাইন্ডিং অপারেশনের ধরন সঞ্চয় করে, হয় প্রশ্ন বা মিউটেশন।

vars বাইন্ডিং (request.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 বাধ্যতামূলক (request.auth)

Authentication আপনার ডেটাতে অ্যাক্সেসের অনুরোধকারী ব্যবহারকারীদের সনাক্ত করে এবং সেই তথ্যটিকে একটি বাঁধাই হিসাবে প্রদান করে যা আপনি আপনার অভিব্যক্তিতে তৈরি করতে পারেন।

আপনার ফিল্টার এবং এক্সপ্রেশনে, আপনি request.auth এর জন্য একটি উপনাম হিসাবে auth ব্যবহার করতে পারেন।

প্রমাণীকরণে নিম্নলিখিত তথ্য রয়েছে:

  • uid : একটি অনন্য ব্যবহারকারী আইডি, অনুরোধকারী ব্যবহারকারীকে বরাদ্দ করা হয়েছে।
  • token : Authentication দ্বারা সংগৃহীত মানগুলির একটি মানচিত্র।

auth.token এর বিষয়বস্তু সম্পর্কে আরও বিশদ বিবরণের জন্য প্রমাণীকরণ টোকেনে ডেটা দেখুন

response বাঁধাই

response বাইন্ডিং-এর মধ্যে থাকে যে ডেটা একত্রিত করা হচ্ছে সেইভাবে একটি ক্যোয়ারী বা মিউটেশনের প্রতিক্রিয়া হিসাবে সার্ভার দ্বারা একত্রিত করা হচ্ছে

অপারেশন এগিয়ে যাওয়ার সাথে সাথে, প্রতিটি পদক্ষেপ সফলভাবে সম্পন্ন হওয়ার সাথে সাথে response সফলভাবে-সম্পন্ন পদক্ষেপগুলির প্রতিক্রিয়া ডেটা থাকে।

response বাইন্ডিং (একাধিক) নেস্টেড ক্ষেত্র এবং (যদি প্রযোজ্য) এমবেডেড ক্যোয়ারী সহ এর সংশ্লিষ্ট অপারেশনের আকৃতি অনুযায়ী গঠন করা হয়।

মনে রাখবেন যে আপনি যখন এম্বেড করা ক্যোয়ারী রেসপন্স ডেটা অ্যাক্সেস করেন, তখন এম্বেড করা ক্যোয়ারীতে অনুরোধ করা ডেটার উপর নির্ভর করে ক্ষেত্রগুলিতে যেকোনো ডেটা টাইপ থাকতে পারে; আপনি যখন _insert s এবং _delete s এর মত মিউটেশন ফিল্ড দ্বারা প্রত্যাবর্তিত ডেটা অ্যাক্সেস করেন, তখন সেগুলিতে UUID কী, মুছে ফেলার সংখ্যা, নাল থাকতে পারে ( মিউটেশন রেফারেন্স দেখুন)।

যেমন:

  • একটি এমবেডেড ক্যোয়ারী রয়েছে এমন একটি মিউটেশনে, response বাইন্ডিং-এ response.query.<fieldName>.<fieldName>.... , এই ক্ষেত্রে, response.query.todoList এবং response.query.todoList.priority
mutation CheckTodoPriority(
  $uniqueListName: String!
) {
  # This query is identified as `response.query`
  query @check(expr: "response.query.todoList.priority == 'high'", message: "This list is not for high priority items!") {
    # This field is identified as `response.query.todoList`
    todoList(where: { name: $uniqueListName }) {
      # This field is identified as `response.query.todoList.priority`
      priority
    }
  }
}
  • একটি মাল্টি-স্টেপ মিউটেশনে, উদাহরণস্বরূপ একাধিক _insert ক্ষেত্রের সাথে, response বাইন্ডিং এর response.<fieldName>.<fieldName>.... , এই ক্ষেত্রে, response.todoList_insert.id
mutation CreateTodoListWithFirstItem(
  $listName: String!,
  $itemContent: String!
) @transaction {
  # Step 1
  todoList_insert(data: {
    id_expr: "uuidV4()",
    name: $listName,
  })
  # Step 2:
  todo_insert(data: {
    listId_expr: "response.todoList_insert.id" # <-- Grab the newly generated ID from the partial response so far.
    content: $itemContent,
  })
}

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 বা [] হয়, তাহলে ক্ষেত্রে পৌঁছানো যাবে না এবং সেই পথের জন্য CEL মূল্যায়ন বাদ দেওয়া হবে। অন্য কথায়, মূল্যায়ন তখনই সঞ্চালিত হয় যখন 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() af সূচক, কল, ক্ষেত্র অ্যাক্সেস বাম থেকে ডান
!a -a ইউনারি নেগেটিভ ডান থেকে বাম
a/ba%ba*b মাল্টিপ্লেটিভ অপারেটর বাম থেকে ডান
a+b ab সংযোজন অপারেটর বাম থেকে ডান
a>b a>=b a<b a<=b রিলেশনাল অপারেটর বাম থেকে ডান
a in b তালিকা বা মানচিত্রে অস্তিত্ব বাম থেকে ডান
type(a) == t তুলনা টাইপ করুন, যেখানে t bool, int, float, সংখ্যা, স্ট্রিং, তালিকা, মানচিত্র, টাইমস্ট্যাম্প বা সময়কাল হতে পারে বাম থেকে ডান
a==ba!=b তুলনা অপারেটর বাম থেকে ডান
a && b শর্তাধীন এবং বাম থেকে ডান
a || b শর্তাধীন বা বাম থেকে ডান
a ? true_value : false_value টার্নারি এক্সপ্রেশন বাম থেকে ডান

প্রমাণীকরণ টোকেনে ডেটা

auth.token অবজেক্টে নিম্নলিখিত মান থাকতে পারে:

মাঠ বর্ণনা
email অ্যাকাউন্টের সাথে যুক্ত ইমেল ঠিকানা, যদি উপস্থিত থাকে।
email_verified true যদি ব্যবহারকারী যাচাই করে থাকে যে তাদের email ঠিকানায় অ্যাক্সেস আছে। কিছু প্রদানকারী স্বয়ংক্রিয়ভাবে তাদের মালিকানাধীন ইমেল ঠিকানা যাচাই করে।
phone_number অ্যাকাউন্টের সাথে যুক্ত ফোন নম্বর, যদি উপস্থিত থাকে।
name ব্যবহারকারীর প্রদর্শনের নাম, যদি সেট করা থাকে।
sub ব্যবহারকারীর Firebase UID. এটি একটি প্রকল্পের মধ্যে অনন্য।
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 অ্যাকাউন্টের সাথে সংশ্লিষ্ট ভাড়াটে আইডি, যদি উপস্থিত থাকে। উদাহরণস্বরূপ, tenant2-m6tyz

JWT আইডি টোকেনে অতিরিক্ত ক্ষেত্র

এছাড়াও আপনি নিম্নলিখিত auth.token ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারেন:

কাস্টম টোকেন দাবি
alg অ্যালগরিদম "RS256"
iss ইস্যুকারী আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
sub বিষয় আপনার প্রকল্পের পরিষেবা অ্যাকাউন্ট ইমেল ঠিকানা
aud শ্রোতা "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat জারি করা-সময় বর্তমান সময়, ইউনিক্স যুগের পর থেকে সেকেন্ডে
exp মেয়াদ শেষ হওয়ার সময় সময়, UNIX যুগ থেকে সেকেন্ডে, যে সময়ে টোকেনের মেয়াদ শেষ হয়। এটি iat এর চেয়ে সর্বোচ্চ 3600 সেকেন্ড পরে হতে পারে।
দ্রষ্টব্য: এটি শুধুমাত্র সেই সময়টিকে নিয়ন্ত্রণ করে যখন কাস্টম টোকেনের মেয়াদ শেষ হয়ে যায়। কিন্তু একবার আপনি signInWithCustomToken() ব্যবহার করে কোনো ব্যবহারকারীকে সাইন ইন করলে, তাদের সেশন বাতিল না হওয়া পর্যন্ত বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে।
<claims> (ঐচ্ছিক) ঐচ্ছিক কাস্টম দাবি টোকেনে অন্তর্ভুক্ত করার জন্য, যা এক্সপ্রেশনে auth.token (বা request.auth.token ) এর মাধ্যমে অ্যাক্সেস করা যেতে পারে। উদাহরণস্বরূপ, আপনি যদি একটি কাস্টম দাবি adminClaim তৈরি করেন, আপনি auth.token.adminClaim এর মাধ্যমে এটি অ্যাক্সেস করতে পারেন।