আপনার ক্লাউড ফাংশন কোডকে ফায়ারবেস এক্সটেনশন হিসাবে পুনরায় ব্যবহার করুন

১. শুরু করার আগে

একটি ফায়ারবেস এক্সটেনশন HTTP অনুরোধের প্রতিক্রিয়ায় অথবা ফায়ারবেস এবং গুগলের অন্যান্য পণ্য যেমন ফায়ারবেস ক্লাউড মেসেজিং, ক্লাউড ফায়ারস্টোর, অথবা পাব/সাব থেকে ইভেন্ট ট্রিগার করার জন্য একটি নির্দিষ্ট কাজ বা কাজের সেট সম্পাদন করে।

তুমি কী তৈরি করবে

এই কোডল্যাবে, আপনি জিওহ্যাশিংয়ের জন্য একটি ফায়ারবেস এক্সটেনশন তৈরি করবেন। একবার স্থাপন করা হলে, আপনার এক্সটেনশনটি ফায়ারস্টোর ইভেন্টের প্রতিক্রিয়ায় বা কলযোগ্য ফাংশন ইনভোকেশনের মাধ্যমে X- এবং Y-কোঅর্ডিনেটগুলিকে জিওহ্যাশে রূপান্তরিত করে। এটি আপনার সমস্ত টার্গেট প্ল্যাটফর্মে ডেটা সংরক্ষণের জন্য জিওফায়ার লাইব্রেরি বাস্তবায়নের বিকল্প হিসাবে ব্যবহার করা যেতে পারে, যা আপনার সময় বাঁচাবে।

ফায়ারবেস কনসোলে জিওহ্যাশ এক্সটেনশনটি দেখানো হচ্ছে

তুমি কি শিখবে

  • বিদ্যমান ক্লাউড ফাংশন কোড কীভাবে নেবেন এবং এটিকে একটি বিতরণযোগ্য ফায়ারবেস এক্সটেনশনে রূপান্তর করবেন
  • কিভাবে একটি extension.yaml ফাইল সেট আপ করবেন
  • একটি এক্সটেনশনে সংবেদনশীল স্ট্রিং (API কী) কীভাবে সংরক্ষণ করবেন
  • এক্সটেনশনের ডেভেলপারদের তাদের চাহিদা অনুযায়ী এটি কনফিগার করার অনুমতি কীভাবে দেওয়া যায়
  • এক্সটেনশনটি কীভাবে পরীক্ষা এবং স্থাপন করবেন

তোমার যা লাগবে

  • ফায়ারবেস সিএলআই (ইনস্টল এবং লগইন)
  • একটি গুগল অ্যাকাউন্ট, যেমন একটি জিমেইল অ্যাকাউন্ট
  • Node.js এবং npm
  • আপনার প্রিয় উন্নয়ন পরিবেশ

2. সেট আপ করুন

কোডটি পান

এই এক্সটেনশনটির জন্য আপনার যা যা প্রয়োজন তা একটি GitHub রেপোতে আছে। শুরু করতে, কোডটি নিন এবং আপনার পছন্দের ডেভেলপমেন্ট পরিবেশে এটি খুলুন।

  1. ডাউনলোড করা জিপ ফাইলটি আনপ্যাক করুন।
  2. প্রয়োজনীয় নির্ভরতা ইনস্টল করতে, functions ডিরেক্টরিতে টার্মিনালটি খুলুন এবং npm install কমান্ডটি চালান।

ফায়ারবেস সেট আপ করুন

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

এড়িয়ে যেতে চান?

আপনি কোডল্যাবের একটি সম্পূর্ণ সংস্করণ ডাউনলোড করতে পারেন। যদি আপনি পথে আটকে যান অথবা একটি সম্পূর্ণ এক্সটেনশন কেমন দেখতে চান, তাহলে GitHub রিপোজিটরির codelab-end শাখাটি দেখুন অথবা সম্পূর্ণ জিপটি ডাউনলোড করুন।

৩. কোডটি পর্যালোচনা করুন

  • জিপ ফাইল থেকে index.ts ফাইলটি খুলুন। লক্ষ্য করুন যে এর মধ্যে দুটি ক্লাউড ফাংশন ঘোষণা রয়েছে।

এই ফাংশনগুলি কী করে?

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

ফাংশন ধ্রুবক

ধ্রুবকগুলি index.ts ফাইলের শীর্ষে প্রথম দিকে ঘোষণা করা হয়। এই ধ্রুবকগুলির কিছু এক্সটেনশনের সংজ্ঞায়িত ট্রিগারগুলিতে উল্লেখ করা হয়েছে।

সূচক.টিএস

import {firestore} from "firebase-functions";
import {initializeApp} from "firebase-admin/app";
import {GeoHashService, ResultStatusCode} from "./fake-geohash-service";
import {onCall} from "firebase-functions/v1/https";
import {fieldValueExists} from "./utils";

const documentPath = "users/{uid}";
const xField = "xv";
const yField = "yv";
const apiKey = "1234567890";
const outputField = "hash";

initializeApp();

const service = new GeoHashService(apiKey);

ফায়ারস্টোর ট্রিগার

index.ts ফাইলের প্রথম ফাংশনটি এরকম দেখাচ্ছে:

সূচক.টিএস

export const locationUpdate = firestore.document(documentPath)
  .onWrite((change) => {
    // item deleted
    if (change.after == null) {
      return 0;
    }
    // double check that both values exist for computation
    if (
      !fieldValueExists(change.after.data(), xField) ||
      !fieldValueExists(change.after.data(), yField)
    ) {
      return 0;
    }
    const x: number = change.after.data()![xField];
    const y: number = change.after.data()![yField];
    const hash = service.convertToHash(x, y);
    // This is to check whether the hash value has changed. If
    // it hasn't, you don't want to write to the document again as it
    // would create a recursive write loop.
    if (fieldValueExists(change.after.data(), outputField)
      && change.after.data()![outputField] == hash) {
      return 0;
    }
    return change.after.ref
      .update(
        {
          [outputField]: hash.hash,
        }
      );
  });

এই ফাংশনটি একটি Firestore ট্রিগার । যখন ডাটাবেসে একটি লেখার ইভেন্ট ঘটে, তখন ফাংশনটি একটি xv ক্ষেত্র এবং একটি yv ক্ষেত্র অনুসন্ধান করে সেই ইভেন্টে প্রতিক্রিয়া দেখায়, এবং যদি এই দুটি ক্ষেত্রই বিদ্যমান থাকে, তাহলে এটি জিওহ্যাশ গণনা করে এবং একটি নির্দিষ্ট ডকুমেন্ট আউটপুট অবস্থানে আউটপুট লেখে। ইনপুট ডকুমেন্টটি users/{uid} ধ্রুবক দ্বারা সংজ্ঞায়িত করা হয়, যার অর্থ হল ফাংশনটি users/ সংগ্রহের কাছে লেখা প্রতিটি ডকুমেন্ট পড়ে এবং তারপর সেই ডকুমেন্টগুলির জন্য একটি জিওহ্যাশ প্রক্রিয়া করে। তারপর এটি হ্যাশটিকে একই ডকুমেন্টের একটি হ্যাশ ফিল্ডে আউটপুট করে।

কলযোগ্য ফাংশন

index.ts ফাইলের পরবর্তী ফাংশনটি এরকম দেখাচ্ছে:

সূচক.টিএস

export const callableHash = onCall((data, context) => {
  if (context.auth == undefined) {
    return {error: "Only authorized users are allowed to call this endpoint"};
  }
  const x = data[xField];
  const y = data[yField];
  if (x == undefined || y == undefined) {
    return {error: "Either x or y parameter was not declared"};
  }
  const result = service.convertToHash(x, y);
  if (result.status != ResultStatusCode.ok) {
    return {error: `Something went wrong ${result.message}`};
  }
  return {result: result.hash};
});

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

৪. একটি extension.yaml ফাইল সেট আপ করুন

এখন যেহেতু আপনি জানেন যে আপনার এক্সটেনশনের ক্লাউড ফাংশন কোডটি কী করে, আপনি এটি বিতরণের জন্য প্যাকেজ করতে প্রস্তুত। প্রতিটি ফায়ারবেস এক্সটেনশনের সাথে একটি extension.yaml ফাইল আসে যা এক্সটেনশনটি কী করে এবং এটি কীভাবে আচরণ করে তা বর্ণনা করে।

একটি extension.yaml ফাইলের জন্য আপনার এক্সটেনশন সম্পর্কে কিছু প্রাথমিক মেটাডেটা প্রয়োজন। নিম্নলিখিত প্রতিটি ধাপ আপনাকে বুঝতে সাহায্য করবে যে সমস্ত ক্ষেত্রগুলির অর্থ কী এবং কেন আপনার সেগুলি প্রয়োজন।

  1. আপনার আগে ডাউনলোড করা প্রজেক্টের রুট ডিরেক্টরিতে একটি extension.yaml ফাইল তৈরি করুন। নিম্নলিখিতগুলি যোগ করে শুরু করুন:
name: geohash-ext
version: 0.0.1
specVersion: v1beta  # Firebase Extensions specification version (do not edit)

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

  1. YAML ফাইলে কিছু ব্যবহারকারী-বান্ধব বিবরণ যোগ করুন:
...

displayName: Latitude and longitude to GeoHash converter
description: A converter for changing your Latitude and longitude coordinates to geohashes.

যখন ডেভেলপাররা আপনার এক্সটেনশনের সাথে ইন্টারঅ্যাক্ট করে তখন ডিসপ্লে নেম হল আপনার এক্সটেনশনের নামের একটি বন্ধুত্বপূর্ণ উপস্থাপনা। বর্ণনাটি এক্সটেনশনটি কী করে তার একটি সংক্ষিপ্ত সারসংক্ষেপ দেয়। যখন এক্সটেনশনটি extensions.dev এ স্থাপন করা হয়, তখন এটি দেখতে এরকম কিছু দেখায়:

extensions.dev-তে দেখা যায় Geohash কনভার্টার এক্সটেনশন

  1. আপনার এক্সটেনশনে কোডটির লাইসেন্স উল্লেখ করুন।
...

license: Apache-2.0  # The license you want for the extension
  1. এক্সটেনশনটি কে লিখেছেন এবং এটি ইনস্টল করার জন্য বিলিংয়ের প্রয়োজন কিনা তা নির্দেশ করুন:
...

author:
  authorName: AUTHOR_NAME
  url: https://github.com/Firebase

billingRequired: true

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

এই এক্সটেনশনটি সনাক্ত করার জন্য extension.yaml ফাইলে প্রয়োজনীয় ন্যূনতম সংখ্যক ফিল্ড এটি অন্তর্ভুক্ত করে। এক্সটেনশনে আপনি যে অন্যান্য শনাক্তকরণ তথ্য নির্দিষ্ট করতে পারেন সে সম্পর্কে আরও তথ্যের জন্য, ডকুমেন্টেশন দেখুন।

৫. ক্লাউড ফাংশন কোডকে এক্সটেনশন রিসোর্সে রূপান্তর করুন

এক্সটেনশন রিসোর্স হলো এমন একটি আইটেম যা ফায়ারবেস একটি এক্সটেনশন ইনস্টলেশনের সময় প্রকল্পে তৈরি করে। এরপর এক্সটেনশনটি সেই রিসোর্সের মালিক হয় এবং একটি নির্দিষ্ট পরিষেবা অ্যাকাউন্ট থাকে যা সেগুলিতে কাজ করে। এই প্রকল্পে, সেই রিসোর্সগুলি হল ক্লাউড ফাংশন, যা extension.yaml ফাইলে সংজ্ঞায়িত করা আবশ্যক কারণ এক্সটেনশনটি ফাংশন ফোল্ডারের কোড থেকে স্বয়ংক্রিয়ভাবে রিসোর্স তৈরি করবে না। যদি আপনার ক্লাউড ফাংশনগুলিকে স্পষ্টভাবে একটি রিসোর্স হিসাবে ঘোষণা করা না হয়, তাহলে এক্সটেনশনটি স্থাপনের সময় সেগুলি স্থাপন করা যাবে না।

ব্যবহারকারী-সংজ্ঞায়িত স্থাপনার অবস্থান

  1. ব্যবহারকারীকে এই এক্সটেনশনটি কোথায় স্থাপন করতে চান তা নির্দিষ্ট করার অনুমতি দিন এবং সিদ্ধান্ত নিন যে এক্সটেনশনটি তাদের শেষ ব্যবহারকারীদের কাছাকাছি হোস্ট করা ভাল হবে নাকি তাদের ডাটাবেসের কাছাকাছি। extension.yaml ফাইলে, একটি অবস্থান বেছে নেওয়ার বিকল্প অন্তর্ভুক্ত করুন।

এক্সটেনশন.ইয়ামল

আপনি এখন ফাংশন রিসোর্সের জন্য কনফিগারেশন লিখতে প্রস্তুত।

  1. extension.yaml ফাইলে, locationUpdate ফাংশনের জন্য একটি রিসোর্স অবজেক্ট তৈরি করুন। extension.yaml ফাইলে নিম্নলিখিতটি যুক্ত করুন:
resources:
  - name: locationUpdate
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/users/{uid}

আপনি প্রকল্পের index.ts ফাইলে সংজ্ঞায়িত ফাংশনের নাম হিসাবে name সংজ্ঞায়িত করেন। আপনি যে type ফাংশন স্থাপন করা হচ্ছে তা নির্দিষ্ট করেন, যা আপাতত সর্বদা firebaseextensions.v1beta.function হওয়া উচিত। তারপর, আপনি এই ফাংশনের properties সংজ্ঞায়িত করেন। আপনি যে প্রথম বৈশিষ্ট্যটি সংজ্ঞায়িত করেন তা হল eventTrigger যা এই ফাংশনের সাথে সম্পর্কিত। এক্সটেনশনটি বর্তমানে যা সমর্থন করে তা প্রতিফলিত করতে, আপনি eventType of providers/cloud.firestore/eventTypes/document.write ব্যবহার করেন, যা আপনার এক্সটেনশন ডকুমেন্টেশনের জন্য Write Cloud Functions- এ পাওয়া যায়। আপনি resource ডকুমেন্টের অবস্থান হিসাবে সংজ্ঞায়িত করেন। যেহেতু আপনার বর্তমান লক্ষ্য হল কোডে যা আছে তা প্রতিফলিত করা, তাই ডকুমেন্ট পাথটি users/{uid} এর কথা শোনে, এর আগে ডিফল্ট ডাটাবেস অবস্থান থাকে।

  1. এক্সটেনশনটির Firestore ডাটাবেসের জন্য পড়ার এবং লেখার অনুমতি প্রয়োজন। extension.yaml ফাইলের একেবারে শেষে, ডেভেলপারের Firebase প্রকল্পে ডাটাবেসের সাথে কাজ করার জন্য এক্সটেনশনটির যে IAM ভূমিকাগুলিতে অ্যাক্সেস থাকা উচিত তা নির্দিষ্ট করুন।
roles:
  - role: datastore.user
    reason: Allows the extension to read / write to your Firestore instance.

datastore.user ভূমিকাটি এক্সটেনশনের জন্য সমর্থিত IAM ভূমিকার তালিকা থেকে আসে। যেহেতু এক্সটেনশনটি পড়া এবং লেখার জন্য তৈরি হবে, তাই datastore.user ভূমিকাটি এখানে উপযুক্ত।

  1. কলেবল ফাংশনটিও যোগ করতে হবে। extension.yaml ফাইলে, রিসোর্স প্রোপার্টির অধীনে একটি নতুন রিসোর্স তৈরি করুন। এই প্রোপার্টিগুলি একটি কলেবল ফাংশনের জন্য নির্দিষ্ট:
  - name: callableHash
    type: firebaseextensions.v1beta.function
    properties:
      httpsTrigger: {}

যদিও পূর্ববর্তী রিসোর্সে একটি eventTrigger ব্যবহার করা হয়েছিল, এখানে আপনি একটি httpsTrigger ব্যবহার করবেন, যা কলযোগ্য ফাংশন এবং HTTPS ফাংশন উভয়কেই অন্তর্ভুক্ত করে।

কোড চেক

আপনার index.ts ফাইলের কোড অনুসারে আপনার extension.yaml সবকিছুর সাথে মেলানোর জন্য এটি অনেক কনফিগারেশন ছিল। এই সময়ে সম্পূর্ণ extension.yaml ফাইলটি এইরকম দেখাবে:

এক্সটেনশন.ইয়ামল

name: geohash-ext
version: 0.0.1
specVersion: v1beta  # Firebase Extensions specification version (do not edit)

displayName: Latitude and Longitude to GeoHash converter
description: A converter for changing your Latitude and Longitude coordinates to geohashes.

license: Apache-2.0  # The license you want for the extension

author:
  authorName: Sparky
  url: https://github.com/Firebase

billingRequired: true

resources:
  - name: locationUpdate
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/users/{uid}
  - name: callableHash
    type: firebaseextensions.v1beta.function
    properties:
      httpsTrigger: {}

roles:
  - role: datastore.user
    reason: Allows the extension to read / write to your Firestore instance.

স্থিতি পরীক্ষা

এই মুহুর্তে, আপনার এক্সটেনশনের প্রাথমিক কার্যকরী অংশগুলি সেট আপ করা আছে, তাই আপনি আসলে Firebase এমুলেটর ব্যবহার করে এটি চেষ্টা করে দেখতে পারেন!

  1. যদি আপনি ইতিমধ্যেই না করে থাকেন, তাহলে ডাউনলোড করা এক্সটেনশন প্রকল্পের ফাংশন ফোল্ডারে npm run build কল করুন।
  2. আপনার হোস্ট সিস্টেমে একটি নতুন ডিরেক্টরি তৈরি করুন এবং firebase init ব্যবহার করে সেই ডিরেক্টরিটি আপনার Firebase প্রকল্পের সাথে সংযুক্ত করুন।
cd ..
mkdir sample-proj
cd sample-proj
firebase init --project=projectID-or-alias
    This command creates a `firebase.json` file in the directory. In the following steps, you push the configuration specified in this file to Firebase.
  1. একই ডিরেক্টরি থেকে, firebase ext:install চালান। /path/to/extension কে আপনার extension.yaml ফাইল ধারণকারী ডিরেক্টরির পরম পাথ দিয়ে প্রতিস্থাপন করুন।
firebase ext:install /path/to/extension
    This command does two things:
  • এটি আপনাকে এক্সটেনশন ইনস্ট্যান্সের জন্য কনফিগারেশন নির্দিষ্ট করতে অনুরোধ করে এবং এটি একটি *.env ফাইল তৈরি করে যাতে ইনস্ট্যান্সের জন্য কনফিগারেশন তথ্য থাকে।
  • এটি আপনার firebase.json এর extensions বিভাগে এক্সটেনশন ইনস্ট্যান্স যোগ করে। এটি এক্সটেনশন সংস্করণে ইনস্ট্যান্স আইডির মানচিত্র হিসেবে কাজ করে।
  • যেহেতু আপনি স্থানীয়ভাবে প্রকল্পটি স্থাপন করছেন, তাই আপনি নির্দিষ্ট করতে পারেন যে আপনি Google ক্লাউড সিক্রেট ম্যানেজারের পরিবর্তে একটি স্থানীয় ফাইল ব্যবহার করতে চান।

এক্সটেনশন ইনস্টলেশন প্রক্রিয়ার স্ক্রিনশট যা দেখায় যে এই এক্সটেনশনটি ইনস্টল করার সময় গোপন কাজের জন্য স্থানীয় ফাইল ব্যবহার করা হচ্ছে।

  1. নতুন কনফিগারেশন দিয়ে ফায়ারবেস এমুলেটরগুলি শুরু করুন:
firebase emulators:start
  1. emulators:start চালানোর পর, এমুলেটরগুলির ওয়েবভিউতে ফায়ারস্টোর ট্যাবে নেভিগেট করুন।
  2. users সংগ্রহে xv নম্বর ক্ষেত্র এবং yv নম্বর ক্ষেত্র সহ একটি নথি যুক্ত করুন।

Firebase Emulators-এ একটি ডায়ালগ বক্স দেখানো হবে যেখানে সংগ্রহ শুরু করার জন্য সংগ্রহ আইডিতে বাক্যাংশটি থাকবে।

  1. যদি আপনি এক্সটেনশনটি ইনস্টল করতে সফল হন, তাহলে এক্সটেনশনটি ডকুমেন্টে hash নামে একটি নতুন ক্ষেত্র তৈরি করবে।

xv, yv, এবং হ্যাশ ফিল্ড সম্বলিত একটি ব্যবহারকারী নথি সহ ব্যবহারকারী সংগ্রহ।

দ্বন্দ্ব এড়াতে পরিষ্কার করুন

  • পরীক্ষা শেষ হয়ে গেলে, এক্সটেনশনটি আনইনস্টল করুন—আপনি এক্সটেনশন কোডটি আপডেট করতে যাচ্ছেন এবং পরবর্তীতে বর্তমান এক্সটেনশনের সাথে কোনও বিরোধ করতে চান না।

এক্সটেনশনগুলি একই এক্সটেনশনের একাধিক সংস্করণ একসাথে ইনস্টল করার অনুমতি দেয়, তাই আনইনস্টল করে, আপনি নিশ্চিত করেন যে পূর্বে ইনস্টল করা এক্সটেনশনের সাথে কোনও বিরোধ নেই।

firebase ext:uninstall geohash-ext

বর্তমান সমাধানটি কাজ করে, কিন্তু প্রকল্পের শুরুতে যেমন উল্লেখ করা হয়েছে, কোনও পরিষেবার সাথে যোগাযোগের অনুকরণ করার জন্য একটি হার্ড-কোডেড API কী রয়েছে। আপনি কীভাবে মূলত সরবরাহ করা API কীটির পরিবর্তে শেষ ব্যবহারকারীর API কী ব্যবহার করতে পারেন? জানতে পড়ুন।

৬. এক্সটেনশন ব্যবহারকারীকে কনফিগারযোগ্য করে তুলুন

কোডল্যাবের এই পর্যায়ে, আপনার কাছে একটি এক্সটেনশন আছে যা আপনার লেখা ফাংশনগুলির মতামতযুক্ত সেটআপের সাথে ব্যবহারের জন্য কনফিগার করা হয়েছে, কিন্তু যদি আপনার ব্যবহারকারী কার্টেসিয়ান প্লেনে অবস্থান নির্দেশ করে এমন ক্ষেত্রগুলির জন্য y এবং x এর পরিবর্তে অক্ষাংশ এবং দ্রাঘিমাংশ ব্যবহার করতে চান? এছাড়াও, আপনি কীভাবে শেষ ব্যবহারকারীকে তাদের নিজস্ব API কী সরবরাহ করতে বলবেন, সরবরাহ করা API কী ব্যবহার করতে না দিয়ে? আপনি দ্রুত সেই API এর কোটা অতিক্রম করতে পারেন। এই ক্ষেত্রে, আপনি প্যারামিটার সেট আপ এবং ব্যবহার করেন।

extension.yaml ফাইলে মৌলিক পরামিতি নির্ধারণ করুন।

ডেভেলপারদের কাছে কাস্টম কনফিগারেশন থাকতে পারে এমন আইটেমগুলিকে রূপান্তর করে শুরু করুন। প্রথমটি হবে XFIELD এবং YFIELD প্যারামিটার।

  1. extension.yaml ফাইলে, নিম্নলিখিত কোডটি যোগ করুন, যা XFIELD এবং YFIELD ফিল্ড প্যারামিটার ব্যবহার করে। এই প্যারামিটারগুলি পূর্বে সংজ্ঞায়িত params YAML প্রোপার্টির ভিতরে থাকে:

এক্সটেনশন.ইয়ামল

params:
  - param: XFIELD
    label: The X Field Name
    description: >-
      The X Field is also known as the **longitude** value. What does
      your Firestore instance refer to as the X value or the longitude
      value. If no value is specified, the extension searches for
      field 'xv'.
    type: string
    validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
    validationErrorMessage: >-
      The field can only contain uppercase or lowercase letter, numbers,
      _, and . characters and must be less than 1500 bytes long. The field
      must also not start with a number.
    default: xv
    required: false
    immutable: false
    example: xv
  - param: YFIELD
    label: The Y Field Name
    description: >-
      The Y Field is also known as the **latitude** value. What does
      your Firestore instance refer to as the Y value or the latitude
      value. If no value is specified, the extension searches for
      field 'yv'.
    type: string
    validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
    validationErrorMessage: >-
      The field can only contain uppercase or lowercase letter, numbers,
      _, and . characters and must be less than 1500 bytes long. The field
      must also not start with a number.
    default: yv
    required: false
    immutable: false
    example: yv
  • প্যারামিটারটি এমনভাবে নামকরণ করে যা আপনার কাছে, অর্থাৎ এক্সটেনশন প্রযোজকের কাছে দৃশ্যমান। প্যারামিটারের মানগুলি নির্দিষ্ট করার সময় পরে এই মানটি ব্যবহার করুন।
  • label হল ডেভেলপারের কাছে একটি মানব-পঠনযোগ্য শনাক্তকারী যা তাদের জানাতে পারে যে প্যারামিটারটি কী করে।
  • description মানটির বিস্তারিত বর্ণনা দেয়। যেহেতু এটি মার্কডাউন সমর্থন করে, তাই এটি অতিরিক্ত ডকুমেন্টেশনের সাথে লিঙ্ক করতে পারে, অথবা এটি এমন শব্দগুলিকে হাইলাইট করতে পারে যা ডেভেলপারের জন্য গুরুত্বপূর্ণ হতে পারে।
  • type একজন ব্যবহারকারী কীভাবে প্যারামিটার মান সেট করবে তার ইনপুট প্রক্রিয়া সংজ্ঞায়িত করে। অনেক ধরণের আছে, যেমন string , select , multiSelect , selectResource , এবং secret । এই প্রতিটি বিকল্প সম্পর্কে আরও জানতে, ডকুমেন্টেশন দেখুন।
  • validationRegex ডেভেলপার এন্ট্রিকে একটি নির্দিষ্ট regex মানের মধ্যে সীমাবদ্ধ করে (উদাহরণস্বরূপ এটি এখানে পাওয়া সহজ ক্ষেত্রের নামের নির্দেশিকাগুলির উপর ভিত্তি করে); এবং যদি তা ব্যর্থ হয়...
  • validationErrorMessage ডেভেলপারকে ব্যর্থতার মান সম্পর্কে সতর্ক করে।
  • ডেভেলপার যদি কোনও টেক্সট ইনপুট না করে তাহলে মানটি কী হবে তা হল ডিফল্ট
  • required মানে হল ডেভেলপারকে কোনও টেক্সট লিখতে হবে না।
  • অপরিবর্তনীয় ডেভেলপারকে এই এক্সটেনশনটি আপডেট করতে এবং এই মান পরিবর্তন করতে দেয়। এই ক্ষেত্রে, ডেভেলপারদের তাদের প্রয়োজনীয়তা পরিবর্তনের সাথে সাথে ক্ষেত্রের নাম পরিবর্তন করতে সক্ষম হওয়া উচিত।
  • একটি বৈধ ইনপুট কেমন হতে পারে তার একটি ধারণা উদাহরণ থেকে পাওয়া যাবে।

এটা বোঝার অনেক কিছু ছিল!

  1. একটি বিশেষ প্যারামিটার যোগ করার আগে আপনাকে extension.yaml ফাইলে আরও তিনটি প্যারামিটার যোগ করতে হবে।
  - param: INPUTPATH
    label: The input document to listen to for changes
    description: >-
      This is the document where you write an x and y value to. Once
      that document has received a value, it notifies the extension to
      calculate a geohash and store that in an output document in a certain
      field. This accepts function [wildcard parameters](https://firebase.google.com/docs/functions/firestore-events#wildcards-parameters)
    type: string
    validationRegex: ^[^/]+(/[^/]*/[^/]*)*/[^/]+$
    validationErrorMessage: >-
      This must point to a document path, not a collection path from the root
      of the database. It must also not start or end with a '/' character.
    required: true
    immutable: false
    example: users/{uid}
  - param: OUTPUTFIELD
    label: Geohash field
    description: >-
      This specifies the field in the output document to store the geohash in.
    type: string
    validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
    validationErrorMessage: >-
      The field can only contain uppercase or lowercase letter, numbers,
      _, and . characters and must be less than 1500 bytes long. The field
      must also not start with a number.
    required: false
    default: hash
    immutable: false
    example: hash

সংবেদনশীল পরামিতি নির্ধারণ করুন

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

  • extension.yaml ফাইলে, নিম্নলিখিত কোডটি যোগ করুন:

এক্সটেনশন.ইয়ামল

  - param: APIKEY
    label: GeohashService API Key
    description: >-
      Your geohash service API Key. Since this is a demo, and not a real
      service, you can use : 1234567890.
    type: secret
    required: true
    immutable: false

প্যারামিটার ব্যবহার করার জন্য resource অ্যাট্রিবিউট আপডেট করুন

যেমনটি আগে উল্লেখ করা হয়েছে, রিসোর্স (ফাংশন নয়) কীভাবে রিসোর্সটি পর্যবেক্ষণ করা হবে তা সংজ্ঞায়িত করে, তাই নতুন প্যারামিটার ব্যবহার করার জন্য locationUpdate রিসোর্সটি আপডেট করতে হবে।

  • extension.yaml ফাইলে, নিম্নলিখিত কোডটি যোগ করুন:

এক্সটেনশন.ইয়ামল

## Change from this
  - name: locationUpdate
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/users/{uid}]

## To this
  - name: locationUpdate
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/${INPUTPATH}

extension.yaml ফাইলটি পরীক্ষা করুন।

  • extension.yaml ফাইলটি পর্যালোচনা করুন। এটি দেখতে এরকম কিছু হওয়া উচিত:

এক্সটেনশন.ইয়ামল

name: geohash-ext
version: 0.0.1
specVersion: v1beta  # Firebase Extensions specification version (do not edit)

displayName: Latitude and Longitude to GeoHash converter
description: A converter for changing your Latitude and Longitude coordinates to geohashes.

license: Apache-2.0  # The license you want to use for the extension

author:
  authorName: Sparky
  url: https://github.com/Firebase

billingRequired: true

params:
  - param: XFIELD
    label: The X Field Name
    description: >-
      The X Field is also known as the **longitude** value. What does
      your Firestore instance refer to as the X value or the longitude
      value. If you don't provide a value for this field, the extension will use 'xv' as the default value.
    type: string
    validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
    validationErrorMessage: >-
      The field can only contain uppercase or lowercase letter, numbers,
      _, and . characters and must be less than 1500 bytes long. The field
      must also not start with a number.
    default: xv
    required: false
    immutable: false
    example: xv
  - param: YFIELD
    label: The Y Field Name
    description: >-
      The Y Field is also known as the **latitude** value. What does
      your Firestore instance refer to as the Y value or the latitude
      Value. If you don't provide a value for this field, the extension will use 'yv' as the default value.
    type: string
    validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
    validationErrorMessage: >-
      The field can only contain uppercase or lowercase letter, numbers,
      _, and . characters and must be less than 1500 bytes long. The field
      must also not start with a number.
    default: yv
    required: false
    immutable: false
    example: yv
  - param: INPUTPATH
    label: The input document to listen to for changes
    description: >-
      This is the document where you write an x and y value to. Once
      that document has been modified, it notifies the extension to
      compute a geohash and store that in an output document in a certain
      field. This accepts function [wildcard parameters](https://firebase.google.com/docs/functions/firestore-events#wildcards-parameters)
    type: string
    validationRegex: ^[^/]+(/[^/]*/[^/]*)*/[^/]+$
    validationErrorMessage: >-
      This must point to a document path, not a collection path from the root
      of the database. It must also not start or end with a '/' character.
    required: true
    immutable: false
    example: users/{uid}
  - param: OUTPUTFIELD
    label: Geohash field
    description: >-
      This specifies the field in the output document to store the geohash in.
    type: string
    validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
    validationErrorMessage: >-
      The field can only contain uppercase or lowercase letter, numbers,
      _, and . characters and must be less than 1500 bytes long. The field
      must also not start with a number.
    required: false
    default: hash
    immutable: false
    example: hash
  - param: APIKEY
    label: GeohashService API Key
    description: >-
      Your geohash service API Key. Since this is a demo, and not a real
      service, you can use : 1234567890.
    type: secret
    required: true
    immutable: false

resources:
  - name: locationUpdate
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/${INPUTPATH}
  - name: callableHash
    type: firebaseextensions.v1beta.function
    properties:
      httpsTrigger: {}

roles:
  - role: datastore.user
    reason: Allows the extension to read / write to your Firestore instance.

কোডে প্যারামিটার অ্যাক্সেস করুন

এখন যেহেতু সমস্ত প্যারামিটার extension.yaml ফাইলে কনফিগার করা হয়েছে, সেগুলি index.ts ফাইলে যুক্ত করুন।

  • index.ts ফাইলে, ডিফল্ট মানগুলি process.env.PARAMETER_NAME দিয়ে প্রতিস্থাপন করুন, যা উপযুক্ত প্যারামিটার মানগুলি আনে এবং ডেভেলপারের Firebase প্রকল্পে স্থাপন করা ফাংশন কোডে সেগুলি পূরণ করে।

সূচক.টিএস

// Replace this:
const documentPath = "users/{uid}";
const xField = "xv";
const yField = "yv";
const apiKey = "1234567890";
const outputField = "hash";

// with this:
const documentPath = process.env.INPUTPATH!; // this value is ignored since its read from the resource
const xField = process.env.XFIELD!;
const yField = process.env.YFIELD!;
const apiKey = process.env.APIKEY!;
const outputField = process.env.OUTPUTFIELD!;

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

৭. ব্যবহারকারীর ডকুমেন্টেশন তৈরি করুন

এমুলেটর বা ফায়ারবেস এক্সটেনশন মার্কেটপ্লেসে কোড পরীক্ষা করার আগে, এক্সটেনশনটি নথিভুক্ত করা প্রয়োজন যাতে ডেভেলপাররা জানতে পারে যে এক্সটেনশনটি ব্যবহার করার সময় তারা কী পাচ্ছে।

  1. PREINSTALL.md ফাইল তৈরি করে শুরু করুন, যা কার্যকারিতা, ইনস্টলেশনের জন্য পূর্বশর্ত এবং সম্ভাব্য বিলিং প্রভাব বর্ণনা করতে ব্যবহৃত হয়।

প্রিইনস্টল.এমডি

Use this extension to automatically convert documents with a latitude and
longitude to a geohash in your database. Additionally, this extension includes a callable function that allows users to make one-time calls
to convert an x,y coordinate into a geohash.

Geohashing is supported for latitudes between 90 and -90 and longitudes
between 180 and -180.

#### Third Party API Key

This extension uses a fictitious third-party API for calculating the
geohash. You need to supply your own API keys. (Since it's fictitious,
you can use 1234567890 as an API key).

#### Additional setup

Before installing this extension, make sure that you've [set up a Cloud
Firestore database](https://firebase.google.com/docs/firestore/quickstart) in your Firebase project.

After installing this extension, you'll need to:

- Update your client code to point to the callable geohash function if you
want to perform arbitrary geohashes.

Detailed information for these post-installation tasks are provided after
you install this extension.

#### Billing
To install an extension, your project must be on the [Blaze (pay as you
go) plan](https://firebase.google.com/pricing)

- This extension uses other Firebase and Google Cloud Platform services,
which have associated charges if you exceed the service's no-cost tier:
 - Cloud Firestore
 - Cloud Functions (Node.js 16+ runtime. [See
FAQs](https://firebase.google.com/docs/functions/faq-and-troubleshooting#extensions-pricing))
 - [Cloud Secret Manager](https://cloud.google.com/secret-manager/pricing)
  1. এই প্রকল্পের জন্য README.md লেখার সময় বাঁচাতে, সুবিধাজনক পদ্ধতিটি ব্যবহার করুন:
firebase ext:info . --markdown > README.md

এটি আপনার PREINSTALL.md ফাইলের বিষয়বস্তু এবং আপনার extension.yaml ফাইল থেকে আপনার এক্সটেনশন সম্পর্কে অতিরিক্ত বিবরণ একত্রিত করে।

অবশেষে, এক্সটেনশনের ডেভেলপারকে নতুন ইনস্টল করা এক্সটেনশন সম্পর্কে কিছু অতিরিক্ত তথ্য জানান। ইনস্টলেশন সম্পন্ন করার পরে ডেভেলপার কিছু অতিরিক্ত নির্দেশাবলী এবং তথ্য পেতে পারেন এবং এখানে ক্লায়েন্ট কোড সেট আপ করার মতো কিছু বিস্তারিত পোস্ট-ইনস্টলেশন কাজ পেতে পারেন।

  1. একটি POSTINSTALL.md ফাইল তৈরি করুন, এবং তারপর ইনস্টলেশনের পরে নিম্নলিখিত তথ্য অন্তর্ভুক্ত করুন:

পোস্টইনস্টল.এমডি

Congratulations on installing the geohash extension!

#### Function information

* **Firestore Trigger** - ${function:locationUpdate.name} was installed
and is invoked when both an x field (${param:XFIELD}) and y field
(${param:YFIELD}) contain a value.

* **Callable Trigger** - ${function:callableHash.name} was installed and
can be invoked by writing the following client code:
 ```javascript
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const geoHash = httpsCallable(functions, '${function:callableHash.name}');
geoHash({ ${param:XFIELD}: -122.0840, ${param:YFIELD}: 37.4221 })
  .then((result) => {
    // Read result of the Cloud Function.
    /** @type {any} */
    const data = result.data;
    const error = data.error;
    if (error != null) {
        console.error(`callable error : ${error}`);
    }
    const result = data.result;
    console.log(result);
  });

পর্যবেক্ষণ

সর্বোত্তম পদ্ধতি হিসেবে, আপনি আপনার ইনস্টল করা এক্সটেনশনের কার্যকলাপ পর্যবেক্ষণ করতে পারেন, যার মধ্যে এর স্বাস্থ্য, ব্যবহার এবং লগের পরীক্ষাও অন্তর্ভুক্ত।

The output rendering looks something like this when it's deployed:

<img src="img/82b54a5c6ca34b3c.png" alt="A preview of the latitude and longitude geohash converter extension in the firebase console"  width="957.00" />


## Test the extension with the full configuration
Duration: 03:00


It's time to make sure that the user-configurable extension is working the way it is intended.

* Change into the functions folder and ensure that the latest compiled version of the extensions exists. In the extensions project functions directory, call:

```console
npm run build

এটি ফাংশনগুলিকে পুনরায় কম্পাইল করে যাতে সর্বশেষ সোর্স কোডটি এক্সটেনশনের পাশাপাশি স্থাপনের জন্য প্রস্তুত থাকে যখন এটি একটি এমুলেটরে বা সরাসরি Firebase-এ স্থাপন করা হয়।

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

ফায়ারবেস এমুলেটরগুলি ইনস্টল করুন এবং পরীক্ষা করুন

  1. আপনার হোস্ট সিস্টেমে একটি নতুন ডিরেক্টরি তৈরি করুন এবং firebase init ব্যবহার করে সেই ডিরেক্টরিটি আপনার Firebase প্রকল্পের সাথে সংযুক্ত করুন।
mkdir sample-proj
cd sample-proj
firebase init --project=projectID-or-alias
  1. সেই ডিরেক্টরি থেকে, এক্সটেনশনটি ইনস্টল করতে firebase ext:install চালান। /path/to/extension আপনার extension.yaml ফাইল ধারণকারী ডিরেক্টরির অ্যাবসোলিউট পাথ দিয়ে প্রতিস্থাপন করুন। এটি আপনার এক্সটেনশনের ইনস্টলেশন প্রক্রিয়া শুরু করে এবং একটি .env ফাইল তৈরি করে যাতে আপনার কনফিগারেশনগুলি থাকে এবং কনফিগারেশনটি Firebase বা এমুলেটরগুলিতে পুশ করা হয়।
firebase ext:install /path/to/extension
  • যেহেতু আপনি স্থানীয়ভাবে প্রকল্পটি স্থাপন করছেন, তাই উল্লেখ করুন যে আপনি গুগল ক্লাউড সিক্রেট ম্যানেজারের পরিবর্তে একটি স্থানীয় ফাইল ব্যবহার করতে চান।

অনুসরণ

  1. স্থানীয় এমুলেটর স্যুটটি শুরু করুন:
firebase emulators:start

একটি বাস্তব ফায়ারবেস প্রকল্প দিয়ে ইনস্টল করুন এবং পরীক্ষা করুন

আপনি আপনার এক্সটেনশনটি একটি প্রকৃত Firebase প্রকল্পে ইনস্টল করতে পারেন। আপনার পরীক্ষার জন্য একটি পরীক্ষামূলক প্রকল্প ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। আপনি যদি আপনার এক্সটেনশনের এন্ড-টু-এন্ড ফ্লো পরীক্ষা করতে চান অথবা যদি আপনার এক্সটেনশনের ট্রিগারটি এখনও Firebase এমুলেটর স্যুট দ্বারা সমর্থিত না হয় তবে এই পরীক্ষার কর্মপ্রবাহটি ব্যবহার করুন ( এক্সটেনশন এমুলেটর বিকল্পটি দেখুন)। এমুলেটরগুলি বর্তমানে ক্লাউড ফায়ারস্টোর, রিয়েলটাইম ডেটাবেস এবং পাব/সাবের জন্য HTTP অনুরোধ-ট্রিগার করা ফাংশন এবং ব্যাকগ্রাউন্ড ইভেন্ট-ট্রিগার করা ফাংশন সমর্থন করে।

  1. আপনার হোস্ট সিস্টেমে একটি নতুন ডিরেক্টরি তৈরি করুন এবং firebase init ব্যবহার করে সেই ডিরেক্টরিটি আপনার Firebase প্রকল্পের সাথে সংযুক্ত করুন।
cd ..
mkdir sample-proj
cd sample-proj
firebase init --project=projectID-or-alias
  1. তারপর, সেই ডিরেক্টরি থেকে, এক্সটেনশনটি ইনস্টল করতে firebase ext:install চালান। /path/to/extension আপনার extension.yaml ফাইল ধারণকারী ডিরেক্টরির অ্যাবসোলিউট পাথ দিয়ে প্রতিস্থাপন করুন। এটি আপনার এক্সটেনশনের ইনস্টলেশন প্রক্রিয়া শুরু করে এবং একটি .env ফাইল তৈরি করে যাতে আপনার কনফিগারেশনগুলি থাকে এবং কনফিগারেশনটি Firebase বা এমুলেটরগুলিতে পুশ করে।
firebase ext:install /path/to/extension
  • যেহেতু আপনি সরাসরি Firebase-এ স্থাপন করতে চান এবং Google Cloud Secret Manager ব্যবহার করতে চান, তাই এক্সটেনশনটি ইনস্টল করার আগে আপনাকে Secret Manager API সক্রিয় করতে হবে।
  1. আপনার ফায়ারবেস প্রকল্পে স্থাপন করুন।
firebase deploy

এক্সটেনশনটি পরীক্ষা করে দেখুন

  1. firebase deploy অথবা firebase emulators:start চালানোর পর, যথাযথভাবে Firebase কনসোলের Firestore ট্যাবে অথবা এমুলেটরগুলির ওয়েবভিউতে নেভিগেট করুন।
  2. x ক্ষেত্র এবং y ক্ষেত্র দ্বারা নির্দিষ্ট সংগ্রহে একটি নথি যুক্ত করুন। এই ক্ষেত্রে, আপডেট করা নথিগুলি u/{uid}x ক্ষেত্র xv এবং y ক্ষেত্র yv সহ অবস্থিত।

ফায়ারস্টোর রেকর্ড যোগ করার জন্য ফায়ারবেস এমুলেটর স্ক্রিন

  1. যদি আপনি এক্সটেনশনটি ইনস্টল করতে সফল হন, তাহলে দুটি ক্ষেত্র সংরক্ষণ করার পরে এক্সটেনশনটি ডকুমেন্টে hash নামে একটি নতুন ক্ষেত্র তৈরি করবে।

একটি এমুলেটর থেকে ফায়ারস্টোর ডাটাবেস স্ক্রিনে হ্যাশ যোগ করা দেখাচ্ছে

৮. অভিনন্দন!

আপনি আপনার প্রথম ক্লাউড ফাংশনটিকে সফলভাবে ফায়ারবেস এক্সটেনশনে রূপান্তর করেছেন!

আপনি একটি extension.yaml ফাইল যোগ করেছেন এবং এটি কনফিগার করেছেন যাতে ডেভেলপাররা আপনার এক্সটেনশনটি কীভাবে স্থাপন করতে চান তা নির্বাচন করতে পারেন। এরপর আপনি ব্যবহারকারীর ডকুমেন্টেশন তৈরি করেছেন যা এক্সটেনশন সেট আপ করার আগে এক্সটেনশনের ডেভেলপারদের কী করা উচিত এবং এক্সটেনশনটি সফলভাবে ইনস্টল করার পরে তাদের কী পদক্ষেপ নিতে হতে পারে তার নির্দেশিকা প্রদান করে।

একটি ফায়ারবেস ফাংশনকে বিতরণযোগ্য ফায়ারবেস এক্সটেনশনে রূপান্তর করার জন্য প্রয়োজনীয় মূল পদক্ষেপগুলি এখন আপনি জানেন।

এরপর কী?