ফায়ারবেস ডেটা কানেক্ট দিয়ে তৈরি করুন (ওয়েব), ফায়ারবেস ডেটা কানেক্ট দিয়ে তৈরি করুন (ওয়েব), ফায়ারবেস ডেটা কানেক্ট দিয়ে তৈরি করুন (ওয়েব)

1. আপনি শুরু করার আগে

FriendlyMovies অ্যাপ

এই কোডল্যাবে, আপনি একটি মুভি রিভিউ ওয়েব অ্যাপ তৈরি করতে একটি ক্লাউড SQL ডাটাবেসের সাথে Firebase Data Connect সংহত করবেন। সম্পূর্ণ অ্যাপটি দেখায় কিভাবে Firebase Data Connect SQL-চালিত অ্যাপ্লিকেশন তৈরির প্রক্রিয়াকে সহজ করে। এটি এই বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে:

  • প্রমাণীকরণ: আপনার অ্যাপের প্রশ্ন এবং মিউটেশনের জন্য কাস্টম প্রমাণীকরণ প্রয়োগ করুন, নিশ্চিত করুন যে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা আপনার ডেটার সাথে ইন্টারঅ্যাক্ট করতে পারে।
  • GraphQL স্কিমা: একটি চলচ্চিত্র পর্যালোচনা ওয়েব অ্যাপের প্রয়োজন অনুসারে তৈরি একটি নমনীয় GraphQL স্কিমা ব্যবহার করে আপনার ডেটা স্ট্রাকচার তৈরি এবং পরিচালনা করুন।
  • SQL ক্যোয়ারী এবং মিউটেশন: GraphQL দ্বারা চালিত ক্যোয়ারী এবং মিউটেশন ব্যবহার করে ক্লাউড SQL-এ ডেটা পুনরুদ্ধার, আপডেট এবং পরিচালনা করুন।
  • আংশিক স্ট্রিং ম্যাচ সহ উন্নত অনুসন্ধান: শিরোনাম, বিবরণ, বা ট্যাগের মতো ক্ষেত্রগুলির উপর ভিত্তি করে চলচ্চিত্রগুলি খুঁজে পেতে ফিল্টার এবং অনুসন্ধান বিকল্পগুলি ব্যবহার করুন৷
  • (ঐচ্ছিক) ভেক্টর অনুসন্ধান ইন্টিগ্রেশন: ইনপুট এবং পছন্দের উপর ভিত্তি করে একটি সমৃদ্ধ ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে Firebase Data Connect এর ভেক্টর অনুসন্ধান ব্যবহার করে সামগ্রী অনুসন্ধান কার্যকারিতা যোগ করুন।

পূর্বশর্ত

আপনার জাভাস্ক্রিপ্ট সম্পর্কে একটি প্রাথমিক বোঝার প্রয়োজন হবে।

আপনি কি শিখবেন

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

আপনি কি প্রয়োজন হবে

  • গিট
  • ভিজ্যুয়াল স্টুডিও কোড
  • nvm-windows (Windows) বা nvm (macOS/Linux) ব্যবহার করে Node.js ইনস্টল করুন
  • আপনি যদি ইতিমধ্যেই না করে থাকেন তাহলে Firebase কনসোলে একটি Firebase প্রকল্প তৈরি করুন৷
  • (ঐচ্ছিক) ভেক্টর অনুসন্ধানের জন্য, আপনার প্রজেক্টকে পে-অ্যাজ-ইউ-গো ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড করুন

2. আপনার উন্নয়ন পরিবেশ সেট আপ করুন

কোডল্যাবের এই পর্যায়টি Firebase Data Connect ব্যবহার করে আপনার মুভি রিভিউ অ্যাপ তৈরি শুরু করার জন্য পরিবেশ সেট আপ করার মাধ্যমে আপনাকে গাইড করবে।

  1. প্রকল্প সংগ্রহস্থল ক্লোন করুন এবং প্রয়োজনীয় নির্ভরতা ইনস্টল করুন:
    git clone https://github.com/firebaseextended/codelab-dataconnect-web
    cd codelab-dataconnect-web
    cd ./app && npm i
    npm run dev
    
  2. এই কমান্ডগুলি চালানোর পরে, ওয়েব অ্যাপ স্থানীয়ভাবে চলমান দেখতে আপনার ব্রাউজারে http://localhost:5173 খুলুন। এটি মুভি রিভিউ অ্যাপ তৈরি এবং এর বৈশিষ্ট্যগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার সামনের প্রান্ত হিসাবে কাজ করে। 93f6648a2532c606.png
  3. ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে ক্লোন করা codelab-dataconnect-web ফোল্ডারটি খুলুন । এখানেই আপনি আপনার স্কিমা নির্ধারণ করবেন, প্রশ্ন লিখবেন এবং অ্যাপটির কার্যকারিতা পরীক্ষা করবেন।
  4. ডেটা কানেক্ট বৈশিষ্ট্যগুলি ব্যবহার করতে, ফায়ারবেস ডেটা কানেক্ট ভিজ্যুয়াল স্টুডিও এক্সটেনশন ইনস্টল করুন।
    বিকল্পভাবে, আপনি ভিজ্যুয়াল স্টুডিও কোড মার্কেটপ্লেস থেকে এক্সটেনশনটি ইনস্টল করতে পারেন বা VS কোডের মধ্যে এটি অনুসন্ধান করতে পারেন। b03ee38c9a81b648.png
  5. Firebase কনসোলে একটি নতুন Firebase প্রকল্প খুলুন বা তৈরি করুন।
  6. আপনার Firebase প্রকল্পটিকে Firebase Data Connect VSCode এক্সটেনশনের সাথে সংযুক্ত করুন। এক্সটেনশনে, নিম্নলিখিতগুলি করুন:
    1. সাইন ইন বোতামে ক্লিক করুন।
    2. একটি ফায়ারবেস প্রকল্প সংযুক্ত করুন ক্লিক করুন এবং আপনার ফায়ারবেস প্রকল্প নির্বাচন করুন।
    4bb2fbf8f9fac29b.png
  7. Firebase ডেটা কানেক্ট VS কোড এক্সটেনশন ব্যবহার করে ফায়ারবেস এমুলেটর শুরু করুন:
    স্টার্ট এমুলেটর ক্লিক করুন, এবং তারপর নিশ্চিত করুন যে এমুলেটরগুলি টার্মিনালে চলছে। 6d3d95f4cb708db1.png

3. স্টার্টার কোডবেস পর্যালোচনা করুন

এই বিভাগে, আপনি অ্যাপের স্টার্টার কোডবেসের মূল ক্ষেত্রগুলি অন্বেষণ করবেন। অ্যাপটিতে কিছু কার্যকারিতা অনুপস্থিত থাকলেও, সামগ্রিক গঠন বোঝার জন্য এটি সহায়ক।

ফোল্ডার এবং ফাইল গঠন

নিম্নলিখিত উপ-বিভাগগুলি অ্যাপের ফোল্ডার এবং ফাইল কাঠামোর একটি ওভারভিউ প্রদান করে।

dataconnect/ ডিরেক্টরি

ফায়ারবেস ডেটা কানেক্ট কনফিগারেশন, সংযোগকারী (যা ক্যোয়ারী এবং মিউটেশন সংজ্ঞায়িত করে) এবং স্কিমা ফাইল ধারণ করে।

  • schema/schema.gql : GraphQL স্কিমা সংজ্ঞায়িত করে
  • connector/queries.gql : আপনার অ্যাপে প্রয়োজনীয় প্রশ্ন
  • connector/mutations.gql : আপনার অ্যাপে মিউটেশন প্রয়োজন
  • connector/connector.yaml : SDK জেনারেশনের জন্য কনফিগারেশন ফাইল

app/src/ ডিরেক্টরি

ফায়ারবেস ডেটা কানেক্টের সাথে অ্যাপ্লিকেশনের যুক্তি এবং মিথস্ক্রিয়া রয়েছে।

  • firebase.ts : আপনার ফায়ারবেস প্রজেক্টে একটি ফায়ারবেস অ্যাপের সাথে সংযোগ করার কনফিগারেশন।
  • lib/dataconnect-sdk/ : জেনারেট করা SDK ধারণ করে। আপনি connector/connector.yaml ফাইলে SDK জেনারেশনের অবস্থান সম্পাদনা করতে পারেন এবং যে কোনো সময় আপনি কোনো প্রশ্ন বা মিউটেশন সংজ্ঞায়িত করলে SDK স্বয়ংক্রিয়ভাবে তৈরি হবে।

4. চলচ্চিত্র পর্যালোচনার জন্য একটি স্কিমা সংজ্ঞায়িত করুন

এই বিভাগে, আপনি একটি স্কিমাতে মুভি অ্যাপ্লিকেশনের মূল সত্তাগুলির মধ্যে গঠন এবং সম্পর্কগুলিকে সংজ্ঞায়িত করবেন। ফায়ারবেস ডেটা কানেক্ট এবং গ্রাফকিউএল স্কিমা নির্দেশাবলী ব্যবহার করে সম্পর্ক স্থাপনের সাথে Movie , User , Actor এবং Review মতো সত্তাগুলি ডাটাবেস টেবিলে ম্যাপ করা হয়। একবার এটি জায়গায় হয়ে গেলে, আপনার অ্যাপটি শীর্ষ-রেটেড মুভিগুলি অনুসন্ধান করা এবং জেনার দ্বারা ফিল্টার করা থেকে ব্যবহারকারীদের পর্যালোচনাগুলি ছেড়ে দেওয়া, পছন্দগুলি চিহ্নিত করা, অনুরূপ চলচ্চিত্রগুলি অন্বেষণ করা বা ভেক্টর অনুসন্ধানের মাধ্যমে পাঠ্য ইনপুটের উপর ভিত্তি করে প্রস্তাবিত চলচ্চিত্রগুলি খুঁজে পেতে সবকিছু পরিচালনা করার জন্য প্রস্তুত হবে৷

মূল সত্তা এবং সম্পর্ক

Movie ধরণে শিরোনাম, জেনার এবং ট্যাগের মতো মূল বিবরণ থাকে, যা অ্যাপটি অনুসন্ধান এবং মুভি প্রোফাইলের জন্য ব্যবহার করে। User ধরন ব্যবহারকারীর ইন্টারঅ্যাকশন ট্র্যাক করে, যেমন পর্যালোচনা এবং পছন্দ। Reviews ব্যবহারকারীদের চলচ্চিত্রের সাথে সংযুক্ত করে, অ্যাপটিকে ব্যবহারকারীর তৈরি রেটিং এবং প্রতিক্রিয়া দেখাতে দেয়৷

সিনেমা, অভিনেতা এবং ব্যবহারকারীদের মধ্যে সম্পর্ক অ্যাপটিকে আরও গতিশীল করে তোলে। MovieActor যোগদানের টেবিল কাস্টের বিবরণ এবং অভিনেতা ফিল্মগ্রাফি প্রদর্শন করতে সাহায্য করে। FavoriteMovie টাইপ ব্যবহারকারীদের পছন্দের সিনেমা করতে দেয়, তাই অ্যাপটি একটি ব্যক্তিগতকৃত পছন্দের তালিকা দেখাতে পারে এবং জনপ্রিয় বাছাইগুলি হাইলাইট করতে পারে।

Movie টেবিল সেট আপ করুন

Movie ধরন title , genre , releaseYear এবং rating মত ক্ষেত্র সহ একটি মুভি সত্তার জন্য মূল কাঠামোকে সংজ্ঞায়িত করে।

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type Movie
  @table {
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  releaseYear: Int
  genre: String
  rating: Float
  description: String
  tags: [String]
}

মূল টেকওয়ে:

  • id: প্রতিটি মুভির জন্য একটি অনন্য UUID, @default(expr: "uuidV4()") ব্যবহার করে তৈরি।

MovieMetadata টেবিল সেট আপ করুন

MovieMetadata টাইপ Movie টাইপের সাথে ওয়ান টু ওয়ান সম্পর্ক স্থাপন করে। এতে সিনেমার পরিচালকের মতো অতিরিক্ত ডেটা অন্তর্ভুক্ত রয়েছে।

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type MovieMetadata
  @table {
  # @ref creates a field in the current table (MovieMetadata)
  # It is a reference that holds the primary key of the referenced type
  # In this case, @ref(fields: "movieId", references: "id") is implied
  movie: Movie! @ref
  # movieId: UUID <- this is created by the above @ref
  director: String
}

মূল টেকওয়ে:

  • মুভি ! @রেফ: Movie ধরন উল্লেখ করে, একটি বিদেশী মূল সম্পর্ক স্থাপন করে।

Actor টেবিল সেট আপ করুন

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type Actor @table {
  id: UUID!
  imageUrl: String!
  name: String! @col(name: "name", dataType: "varchar(30)")
}

Actor টাইপ মুভি ডেটাবেসে একজন অভিনেতাকে প্রতিনিধিত্ব করে, যেখানে প্রতিটি অভিনেতা একাধিক সিনেমার অংশ হতে পারে, বহু-থেকে-অনেক সম্পর্ক তৈরি করে।

MovieActor টেবিল সেট আপ করুন

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type MovieActor @table(key: ["movie", "actor"]) {
  # @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
  # In this case, @ref(fields: "id") is implied
  movie: Movie!
  # movieId: UUID! <- this is created by the implied @ref, see: implicit.gql

  actor: Actor!
  # actorId: UUID! <- this is created by the implied  @ref, see: implicit.gql

  role: String! # "main" or "supporting"
}

মূল টেকওয়ে:

  • মুভি: মুভির ধরন উল্লেখ করে, পরোক্ষভাবে একটি বিদেশী কী মুভিআইডি তৈরি করে: UUID!।
  • অভিনেতা: অভিনেতার ধরন উল্লেখ করে, পরোক্ষভাবে একটি বিদেশী কী অভিনেতা আইডি তৈরি করে: UUID!।
  • ভূমিকা: চলচ্চিত্রে অভিনেতার ভূমিকা সংজ্ঞায়িত করে (যেমন, "প্রধান" বা "সমর্থক")।

User টেবিল সেট আপ করুন

User ধরন এমন একটি ব্যবহারকারী সত্তাকে সংজ্ঞায়িত করে যারা পর্যালোচনা ছেড়ে বা সিনেমা পছন্দ করে সিনেমার সাথে ইন্টারঅ্যাক্ট করে।

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type User
  @table {
  id: String! @col(name: "auth_uid")
  username: String! @col(dataType: "varchar(50)")
  # The following are generated from the @ref in the Review table
  # reviews_on_user
  # movies_via_Review
}

FavoriteMovie টেবিল সেট আপ করুন

FavoriteMovie টাইপ হল একটি যোগদানের টেবিল যা ব্যবহারকারীদের এবং তাদের প্রিয় চলচ্চিত্রগুলির মধ্যে বহু-থেকে-অনেক সম্পর্কগুলি পরিচালনা করে৷ প্রতিটি টেবিল একজন User একটি Movie সাথে লিঙ্ক করে।

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type FavoriteMovie
  @table(name: "FavoriteMovies", singular: "favorite_movie", plural: "favorite_movies", key: ["user", "movie"]) {
  # @ref is implicit
  user: User!
  movie: Movie!
}

মূল টেকওয়ে:

  • মুভি: মুভির ধরন উল্লেখ করে, পরোক্ষভাবে একটি বিদেশী কী movieId: UUID! .
  • ব্যবহারকারী: ব্যবহারকারীর প্রকার উল্লেখ করে, অন্তর্নিহিতভাবে একটি বিদেশী কী userId: UUID! .

Review টেবিল সেট আপ করুন

Review টাইপ রিভিউ সত্তার প্রতিনিধিত্ব করে এবং User এবং Movie ধরনকে অনেক-থেকে-অনেক সম্পর্কের মধ্যে লিঙ্ক করে (একজন ব্যবহারকারী অনেক রিভিউ দিতে পারে এবং প্রতিটি মুভির অনেক রিভিউ থাকতে পারে)।

আপনার dataconnect/schema/schema.gql ফাইলে কোড স্নিপেটটি অনুলিপি করুন এবং আটকান :

type Review @table(name: "Reviews", key: ["movie", "user"]) {
  id: UUID! @default(expr: "uuidV4()")
  user: User!
  movie: Movie!
  rating: Int
  reviewText: String
  reviewDate: Date! @default(expr: "request.time")
}

মূল টেকওয়ে:

  • ব্যবহারকারী: যে ব্যবহারকারী পর্যালোচনা ছেড়েছেন তাকে উল্লেখ করে।
  • মুভি: রিভিউ করা মুভির রেফারেন্স।
  • পর্যালোচনার তারিখ: @default(expr: "request.time") ব্যবহার করে পর্যালোচনা তৈরি করার সময় স্বয়ংক্রিয়ভাবে সেট করুন।

স্বয়ংক্রিয়ভাবে তৈরি ক্ষেত্র এবং ডিফল্ট

স্বয়ংক্রিয়ভাবে অনন্য আইডি এবং টাইমস্ট্যাম্প তৈরি করতে স্কিমা @default(expr: "uuidV4()") এর মত এক্সপ্রেশন ব্যবহার করে। উদাহরণ স্বরূপ, Movie এবং Review প্রকারের id ক্ষেত্রটি স্বয়ংক্রিয়ভাবে একটি UUID দিয়ে তৈরি হয় যখন একটি নতুন রেকর্ড তৈরি হয়।

এখন স্কিমা সংজ্ঞায়িত করা হয়েছে, আপনার মুভি অ্যাপটির ডেটা কাঠামো এবং সম্পর্কের জন্য একটি শক্ত ভিত্তি রয়েছে!

5. শীর্ষ এবং সর্বশেষ চলচ্চিত্র পুনরুদ্ধার করুন

FriendlyMovies অ্যাপ

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

মক মুভি, অভিনেতা, এবং পর্যালোচনা ডেটা সন্নিবেশ করুন

  1. VSCode-এ, dataconnect/moviedata_insert.gql খুলুন । Firebase Data Connect এক্সটেনশনের এমুলেটরগুলি চলছে তা নিশ্চিত করুন৷
  2. ফাইলের শীর্ষে আপনার একটি রান (স্থানীয়) বোতাম দেখতে হবে। আপনার ডাটাবেসে মক মুভি ডেটা সন্নিবেশ করতে এটিতে ক্লিক করুন।
    e424f75e63bf2e10.png
  3. ডেটা সফলভাবে যোগ করা হয়েছে তা নিশ্চিত করতে ডেটা কানেক্ট এক্সিকিউশন টার্মিনাল চেক করুন।
    e0943d7704fb84ea.png

সংযোগকারী প্রয়োগ করুন

  1. dataconnect/movie-connector/queries.gql খুলুন। আপনি মন্তব্যে একটি মৌলিক ListMovies ক্যোয়ারী পাবেন:
    query ListMovies @auth(level: PUBLIC) {
      movies {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        tags
        description
      }
    }
    
    এই ক্যোয়ারীটি সমস্ত চলচ্চিত্র এবং তাদের বিশদ (উদাহরণস্বরূপ, id , title , releaseYear ) নিয়ে আসে। যাইহোক, এটি সিনেমা সাজান না .
  2. বাছাই এবং সীমা বিকল্প যোগ করতে নিম্নলিখিত ক্যোয়ারী দিয়ে বিদ্যমান ListMovies ক্যোয়ারী প্রতিস্থাপন করুন :
    # List subset of fields for movies
    query ListMovies($orderByRating: OrderDirection, $orderByReleaseYear: OrderDirection, $limit: Int) @auth(level: PUBLIC) {
      movies(
        orderBy: [
          { rating: $orderByRating },
          { releaseYear: $orderByReleaseYear }
        ]
        limit: $limit
      ) {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        tags
        description
      }
    }
    
  3. আপনার স্থানীয় ডাটাবেসের বিরুদ্ধে ক্যোয়ারী চালানোর জন্য রান (স্থানীয়) বোতামে ক্লিক করুন। আপনি রান করার আগে কনফিগারেশন প্যানে ক্যোয়ারী ভেরিয়েবল ইনপুট করতে পারেন।
    c4d947115bb11b16.png

মূল টেকওয়ে:

  • movies() : ডাটাবেস থেকে মুভি ডেটা আনার জন্য GraphQL ক্যোয়ারী ক্ষেত্র।
  • orderByRating : রেটিং অনুযায়ী সিনেমা সাজানোর পরামিতি
  • orderByReleaseYear : মুক্তির বছর অনুসারে সিনেমা বাছাই করার প্যারামিটার (আরোহী/অবরোহী)।
  • limit : ফিরে আসা সিনেমার সংখ্যা সীমাবদ্ধ করে।

ওয়েব অ্যাপে একীভূত প্রশ্নগুলি

কোডল্যাবের এই অংশে, আপনি আপনার ওয়েব অ্যাপের পূর্ববর্তী বিভাগে সংজ্ঞায়িত প্রশ্নগুলি ব্যবহার করবেন। ফায়ারবেস ডেটা কানেক্ট এমুলেটররা .gql ফাইলের (বিশেষ করে, schema.gql , queries.gql , mutations.gql ) এবং connector.yaml ফাইলের তথ্যের উপর ভিত্তি করে SDK তৈরি করে। এই SDKগুলি সরাসরি আপনার আবেদনে কল করা যেতে পারে৷

  1. MovieService ( app/src/lib/MovieService.tsx ), উপরে ইম্পোর্ট স্টেটমেন্টটি আনকমেন্ট করুন :
    import { listMovies, ListMoviesData, OrderDirection } from "@movie/dataconnect";
    
    ফাংশন listMovies , রেসপন্স টাইপ ListMoviesData , এবং enum OrderDirection হল সমস্ত SDK গুলি ফায়ারবেস ডেটা কানেক্ট এমুলেটর দ্বারা তৈরি করা স্কিমা এবং আপনার পূর্বে সংজ্ঞায়িত করা প্রশ্নের উপর ভিত্তি করে।
  2. নিম্নলিখিত কোড দিয়ে handleGetTopMovies এবং handleGetLatestMovies ফাংশন প্রতিস্থাপন করুন:
    // Fetch top-rated movies
    export const handleGetTopMovies = async (
      limit: number
    ): Promise<ListMoviesData["movies"] | null> => {
      try {
        const response = await listMovies({
          orderByRating: OrderDirection.DESC,
          limit,
        });
        return response.data.movies;
      } catch (error) {
        console.error("Error fetching top movies:", error);
        return null;
      }
    };
    
    // Fetch latest movies
    export const handleGetLatestMovies = async (
      limit: number
    ): Promise<ListMoviesData["movies"] | null> => {
      try {
        const response = await listMovies({
          orderByReleaseYear: OrderDirection.DESC,
          limit,
        });
        return response.data.movies;
      } catch (error) {
        console.error("Error fetching latest movies:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • listMovies : একটি স্বয়ংক্রিয়-উত্পন্ন ফাংশন যা মুভিগুলির একটি তালিকা পুনরুদ্ধার করতে listMovies ক্যোয়ারীকে কল করে। এটি রেটিং বা প্রকাশের বছর অনুসারে বাছাই এবং ফলাফলের সংখ্যা সীমিত করার বিকল্পগুলি অন্তর্ভুক্ত করে।
  • ListMoviesData : অ্যাপের হোমপেজে সেরা 10টি এবং সর্বশেষ চলচ্চিত্র প্রদর্শন করতে ব্যবহৃত ফলাফলের ধরন।

কর্ম এটি দেখুন

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

6. চলচ্চিত্র এবং অভিনেতার বিবরণ প্রদর্শন করুন

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

ac7fefa7ff779231.png

সংযোগকারী বাস্তবায়ন

  1. আপনার প্রকল্পে dataconnect/movie-connector/queries.gql খুলুন
  2. চলচ্চিত্র এবং অভিনেতার বিবরণ পুনরুদ্ধার করতে নিম্নলিখিত প্রশ্নগুলি যোগ করুন :
    # Get movie by id
    query GetMovieById($id: UUID!) @auth(level: PUBLIC) {
    movie(id: $id) {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        description
        tags
        metadata: movieMetadatas_on_movie {
          director
        }
        mainActors: actors_via_MovieActor(where: { role: { eq: "main" } }) {
          id
          name
          imageUrl
        }
        supportingActors: actors_via_MovieActor(
          where: { role: { eq: "supporting" } }
        ) {
          id
          name
          imageUrl
        }
        reviews: reviews_on_movie {
          id
          reviewText
          reviewDate
          rating
          user {
            id
            username
          }
        }
      }
    }
    
    # Get actor by id
    query GetActorById($id: UUID!) @auth(level: PUBLIC) {
      actor(id: $id) {
        id
        name
        imageUrl
        mainActors: movies_via_MovieActor(where: { role: { eq: "main" } }) {
          id
          title
          genre
          tags
          imageUrl
        }
        supportingActors: movies_via_MovieActor(
          where: { role: { eq: "supporting" } }
        ) {
          id
          title
          genre
          tags
          imageUrl
        }
      }
    }
    
  3. আপনার পরিবর্তনগুলি সংরক্ষণ করুন এবং প্রশ্নগুলি পর্যালোচনা করুন৷

মূল টেকওয়ে:

  • movie() / actor() : Movies বা Actors টেবিল থেকে একটি একক মুভি বা অভিনেতা আনার জন্য গ্রাফকিউএল ক্যোয়ারী ক্ষেত্র।
  • _on_ : এটি একটি বিদেশী কী সম্পর্ক আছে এমন একটি সংশ্লিষ্ট প্রকার থেকে ক্ষেত্রগুলিতে সরাসরি অ্যাক্সেসের অনুমতি দেয়। উদাহরণ স্বরূপ, reviews_on_movie একটি নির্দিষ্ট মুভি সম্পর্কিত সমস্ত রিভিউ নিয়ে আসে।
  • _via_ : একটি যোগদান টেবিলের মাধ্যমে বহু-থেকে-অনেক সম্পর্ক নেভিগেট করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, actors_via_MovieActor MovieActor যোগদান টেবিলের মাধ্যমে Actor ধরন অ্যাক্সেস করে এবং where অবস্থা অভিনেতাদের তাদের ভূমিকার উপর ভিত্তি করে ফিল্টার করে (উদাহরণস্বরূপ, "প্রধান" বা "সমর্থক")।

মক ডেটা ইনপুট করে ক্যোয়ারী পরীক্ষা করুন

  1. ডেটা কানেক্ট এক্সিকিউশন প্যানে, আপনি মক আইডি ইনপুট করে ক্যোয়ারী পরীক্ষা করতে পারেন, যেমন:
    {"id": "550e8400-e29b-41d4-a716-446655440000"}
    
  2. GetMovieById জন্য Run (স্থানীয়) ক্লিক করুন "কোয়ান্টাম প্যারাডক্স" (উপরের আইডির সাথে সম্পর্কিত মক মুভি) সম্পর্কে বিশদ বিবরণ পুনরুদ্ধার করতে।

1b08961891e44da2.png

ওয়েব অ্যাপে একীভূত প্রশ্নগুলি

  1. MovieService ( app/src/lib/MovieService.tsx ), নিম্নোক্ত ইম্পোর্টগুলিকে আনকমেন্ট করুন :
    import { getMovieById, GetMovieByIdData } from "@movie/dataconnect";
    import { GetActorByIdData, getActorById } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোড দিয়ে handleGetMovieById এবং handleGetActorById ফাংশন প্রতিস্থাপন করুন :
    // Fetch movie details by ID
    export const handleGetMovieById = async (
      movieId: string
    ) => {
      try {
        const response = await getMovieById({ id: movieId });
        if (response.data.movie) {
          return response.data.movie;
        }
        return null;
      } catch (error) {
        console.error("Error fetching movie:", error);
        return null;
      }
    };
    
    // Calling generated SDK for GetActorById
    export const handleGetActorById = async (
      actorId: string
    ): Promise<GetActorByIdData["actor"] | null> => {
      try {
        const response = await getActorById({ id: actorId });
        if (response.data.actor) {
          return response.data.actor;
        }
        return null;
      } catch (error) {
        console.error("Error fetching actor:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • getMovieById / getActorById : এইগুলি স্বয়ংক্রিয়ভাবে তৈরি ফাংশন যা আপনার সংজ্ঞায়িত প্রশ্নগুলিকে কল করে, একটি নির্দিষ্ট চলচ্চিত্র বা অভিনেতার জন্য বিশদ তথ্য পুনরুদ্ধার করে।
  • GetMovieByIdData / GetActorByIdData : এগুলি হল ফলাফলের ধরন, অ্যাপে সিনেমা এবং অভিনেতার বিবরণ প্রদর্শন করতে ব্যবহৃত হয়।

কর্ম এটি দেখুন

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

7. ব্যবহারকারীর প্রমাণীকরণ পরিচালনা করুন

এই বিভাগে, আপনি Firebase প্রমাণীকরণ ব্যবহার করে ব্যবহারকারীর সাইন-ইন এবং সাইন-আউট কার্যকারিতা প্রয়োগ করবেন। এছাড়াও আপনি Firebase DataConnect-এ ব্যবহারকারীর ডেটা সরাসরি পুনরুদ্ধার বা আপসার্ট করতে Firebase প্রমাণীকরণ ডেটা ব্যবহার করবেন, আপনার অ্যাপের মধ্যে নিরাপদ ব্যবহারকারী ব্যবস্থাপনা নিশ্চিত করতে।

9890838045d5a00e.png

সংযোগকারী বাস্তবায়ন

  1. dataconnect/movie-connector/ -এ mutations.gql খুলুন
  2. বর্তমান প্রমাণীকৃত ব্যবহারকারী তৈরি বা আপডেট করতে নিম্নলিখিত মিউটেশন যোগ করুন:
    # Create or update the current authenticated user
    mutation UpsertUser($username: String!) @auth(level: USER) {
      user_upsert(
        data: {
          id_expr: "auth.uid"
          username: $username
        }
      )
    }
    

মূল টেকওয়ে:

  • id_expr: "auth.uid" : এটি auth.uid ব্যবহার করে, যা সরাসরি Firebase প্রমাণীকরণ দ্বারা সরবরাহ করা হয়, ব্যবহারকারী বা অ্যাপ দ্বারা নয়, ব্যবহারকারী আইডি নিরাপদে এবং স্বয়ংক্রিয়ভাবে পরিচালনা করা হয় তা নিশ্চিত করে নিরাপত্তার একটি অতিরিক্ত স্তর যোগ করে।

বর্তমান ব্যবহারকারী আনুন

  1. dataconnect/movie-connector/queries.gql খুলুন
  2. বর্তমান ব্যবহারকারীকে আনতে নিম্নলিখিত ক্যোয়ারী যোগ করুন :
    # Get user by ID
    query GetCurrentUser @auth(level: USER) {
      user(key: { id_expr: "auth.uid" }) {
        id
        username
        reviews: reviews_on_user {
          id
          rating
          reviewDate
          reviewText
          movie {
            id
            title
          }
        }
        favoriteMovies: favorite_movies_on_user {
          movie {
            id
            title
            genre
            imageUrl
            releaseYear
            rating
            description
            tags
            metadata: movieMetadatas_on_movie {
              director
            }
          }
        }
      }
    }
    

মূল টেকওয়ে:

  • auth.uid : এটি সরাসরি Firebase প্রমাণীকরণ থেকে পুনরুদ্ধার করা হয়, ব্যবহারকারী-নির্দিষ্ট ডেটাতে নিরাপদ অ্যাক্সেস নিশ্চিত করে।
  • _on_ ক্ষেত্র: এই ক্ষেত্রগুলি যোগদানের টেবিলের প্রতিনিধিত্ব করে:
    • reviews_on_user : মুভির id এবং title সহ ব্যবহারকারীর সাথে সম্পর্কিত সমস্ত পর্যালোচনা নিয়ে আসে।
    • favorite_movies_on_user : ব্যবহারকারীর পছন্দসই হিসাবে চিহ্নিত সমস্ত চলচ্চিত্র পুনরুদ্ধার করে, যার মধ্যে genre , releaseYear , rating এবং metadata সহ বিস্তারিত তথ্য রয়েছে।

ওয়েব অ্যাপে একীভূত প্রশ্নগুলি

  1. MovieService ( app/src/lib/MovieService.tsx ), নিম্নোক্ত ইম্পোর্টগুলিকে আনকমেন্ট করুন:
    import { upsertUser } from "@movie/dataconnect";
    import { getCurrentUser, GetCurrentUserData } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোড দিয়ে handleAuthStateChange এবং handleGetCurrentUser ফাংশন প্রতিস্থাপন করুন:
    // Handle user authentication state changes and upsert user
    export const handleAuthStateChange = (
      auth: any,
      setUser: (user: User | null) => void
    ) => {
      return onAuthStateChanged(auth, async (user) => {
        if (user) {
          setUser(user);
          const username = user.email?.split("@")[0] || "anon";
          await upsertUser({ username });
        } else {
          setUser(null);
        }
      });
    };
    
    // Fetch current user profile
    export const handleGetCurrentUser = async (): Promise<
      GetCurrentUserData["user"] | null
    > => {
      try {
        const response = await getCurrentUser();
        return response.data.user;
      } catch (error) {
        console.error("Error fetching user profile:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • handleAuthStateChange : এই ফাংশনটি প্রমাণীকরণের অবস্থার পরিবর্তনের জন্য শোনে। যখন একজন ব্যবহারকারী সাইন ইন করে, তখন এটি ব্যবহারকারীর ডেটা সেট করে এবং ডাটাবেসে ব্যবহারকারীর তথ্য তৈরি বা আপডেট করতে upsertUser মিউটেশনকে কল করে।
  • handleGetCurrentUser : getCurrentUser ক্যোয়ারী ব্যবহার করে বর্তমান ব্যবহারকারীর প্রোফাইল নিয়ে আসে, যা ব্যবহারকারীর রিভিউ এবং প্রিয় চলচ্চিত্রগুলি পুনরুদ্ধার করে।

কর্ম এটি দেখুন

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

8. ব্যবহারকারীর মিথস্ক্রিয়া বাস্তবায়ন করুন

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

b3d0ac1e181c9de9.png

ব্যবহারকারীকে একটি চলচ্চিত্র পছন্দ করতে দিন

এই বিভাগে, ব্যবহারকারীদের একটি মুভি পছন্দ করার জন্য আপনি ডাটাবেস সেট আপ করবেন।

সংযোগকারী বাস্তবায়ন

  1. dataconnect/movie-connector/ -এ mutations.gql খুলুন
  2. পছন্দের সিনেমা পরিচালনা করতে নিম্নলিখিত মিউটেশন যোগ করুন :
    # Add a movie to the user's favorites list
    mutation AddFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie_upsert(data: { userId_expr: "auth.uid", movieId: $movieId })
    }
    
    # Remove a movie from the user's favorites list
    mutation DeleteFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
    }
    
    

মূল টেকওয়ে:

  • userId_expr: "auth.uid" : auth.uid ব্যবহার করে, যা সরাসরি ফায়ারবেস প্রমাণীকরণ দ্বারা সরবরাহ করা হয়, নিশ্চিত করে যে শুধুমাত্র প্রমাণীকৃত ব্যবহারকারীর ডেটা অ্যাক্সেস বা পরিবর্তন করা হয়েছে।

একটি সিনেমা পছন্দসই কিনা পরীক্ষা করুন

  1. dataconnect/movie-connector/queries.gql খুলুন
  2. একটি চলচ্চিত্র পছন্দসই কিনা তা পরীক্ষা করতে নিম্নলিখিত ক্যোয়ারী যোগ করুন :
    query GetIfFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie(key: { userId_expr: "auth.uid", movieId: $movieId }) {
        movieId
      }
    }
    

মূল টেকওয়ে:

  • auth.uid : Firebase প্রমাণীকরণ ব্যবহার করে ব্যবহারকারী-নির্দিষ্ট ডেটাতে নিরাপদ অ্যাক্সেস নিশ্চিত করে।
  • favorite_movie : একটি নির্দিষ্ট মুভি বর্তমান ব্যবহারকারীর পছন্দের হিসাবে চিহ্নিত হয়েছে কিনা তা দেখতে favorite_movies যোগদানের টেবিল চেক করে।

ওয়েব অ্যাপে একীভূত প্রশ্নগুলি

  1. MovieService ( app/src/lib/MovieService.tsx ), নিম্নোক্ত ইম্পোর্টগুলিকে আনকমেন্ট করুন :
    import { addFavoritedMovie, deleteFavoritedMovie, getIfFavoritedMovie } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোড দিয়ে handleAddFavoritedMovie , handleDeleteFavoritedMovie , এবং handleGetIfFavoritedMovie ফাংশনগুলি প্রতিস্থাপন করুন :
    // Add a movie to user's favorites
    export const handleAddFavoritedMovie = async (
      movieId: string
    ): Promise<void> => {
      try {
        await addFavoritedMovie({ movieId });
      } catch (error) {
        console.error("Error adding movie to favorites:", error);
        throw error;
      }
    };
    
    // Remove a movie from user's favorites
    export const handleDeleteFavoritedMovie = async (
      movieId: string
    ): Promise<void> => {
      try {
        await deleteFavoritedMovie({ movieId });
      } catch (error) {
        console.error("Error removing movie from favorites:", error);
        throw error;
      }
    };
    
    // Check if the movie is favorited by the user
    export const handleGetIfFavoritedMovie = async (
      movieId: string
    ): Promise<boolean> => {
      try {
        const response = await getIfFavoritedMovie({ movieId });
        return !!response.data.favorite_movie;
      } catch (error) {
        console.error("Error checking if movie is favorited:", error);
        return false;
      }
    };
    

মূল টেকওয়ে:

  • handleAddFavoritedMovie and handleDeleteFavoritedMovie : ব্যবহারকারীর পছন্দের থেকে নিরাপদে একটি মুভি যুক্ত করতে বা সরাতে মিউটেশন ব্যবহার করুন৷
  • handleGetIfFavoritedMovie : একটি চলচ্চিত্র ব্যবহারকারীর পছন্দের হিসাবে চিহ্নিত হয়েছে কিনা তা পরীক্ষা করতে getIfFavoritedMovie ক্যোয়ারী ব্যবহার করে।

কর্ম এটি দেখুন

এখন, আপনি মুভি কার্ড এবং মুভির বিশদ পৃষ্ঠায় হার্ট আইকনে ক্লিক করে মুভি পছন্দ বা অপছন্দ করতে পারেন। উপরন্তু, আপনি আপনার প্রোফাইল পৃষ্ঠায় আপনার প্রিয় সিনেমা দেখতে পারেন.

ব্যবহারকারীদের রিভিউ ছেড়ে দিতে বা মুছে দিতে দিন

এরপরে, আপনি অ্যাপে ব্যবহারকারীর পর্যালোচনা পরিচালনার জন্য বিভাগটি বাস্তবায়ন করবেন।

সংযোগকারী বাস্তবায়ন

mutations.gql এ ( dataconnect/movie-connector/mutations.gql ): নিম্নলিখিত মিউটেশন যোগ করুন:

# Add a review for a movie
mutation AddReview($movieId: UUID!, $rating: Int!, $reviewText: String!)
@auth(level: USER) {
  review_insert(
    data: {
      userId_expr: "auth.uid"
      movieId: $movieId
      rating: $rating
      reviewText: $reviewText
      reviewDate_date: { today: true }
    }
  )
}

# Delete a user's review for a movie
mutation DeleteReview($movieId: UUID!) @auth(level: USER) {
  review_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
}

মূল টেকওয়ে:

  • userId_expr: "auth.uid" : নিশ্চিত করে যে পর্যালোচনাগুলি প্রমাণীকৃত ব্যবহারকারীর সাথে যুক্ত।
  • reviewDate_date: { today: true } : স্বয়ংক্রিয়ভাবে ডেটাকানেক্ট ব্যবহার করে পর্যালোচনার জন্য বর্তমান তারিখ তৈরি করে, ম্যানুয়াল ইনপুটের প্রয়োজনীয়তা দূর করে৷

ওয়েব অ্যাপে একীভূত প্রশ্নগুলি

  1. MovieService ( app/src/lib/MovieService.tsx ), নিম্নোক্ত ইম্পোর্টগুলিকে আনকমেন্ট করুন :
    import { addReview, deleteReview } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোড দিয়ে handleAddReview এবং handleDeleteReview ফাংশন প্রতিস্থাপন করুন :
    // Add a review to a movie
    export const handleAddReview = async (
      movieId: string,
      rating: number,
      reviewText: string
    ): Promise<void> => {
      try {
        await addReview({ movieId, rating, reviewText });
      } catch (error) {
        console.error("Error adding review:", error);
        throw error;
      }
    };
    
    // Delete a review from a movie
    export const handleDeleteReview = async (movieId: string): Promise<void> => {
      try {
        await deleteReview({ movieId });
      } catch (error) {
        console.error("Error deleting review:", error);
        throw error;
      }
    };
    

মূল টেকওয়ে:

  • handleAddReview : নির্দিষ্ট মুভির জন্য একটি পর্যালোচনা যোগ করতে addReview মিউটেশনকে কল করে, এটিকে নিরাপদে প্রমাণিত ব্যবহারকারীর সাথে লিঙ্ক করে।
  • handleDeleteReview : প্রমাণীকৃত ব্যবহারকারীর দ্বারা একটি চলচ্চিত্রের জন্য একটি পর্যালোচনা অপসারণ করতে deleteReview মিউটেশন ব্যবহার করে।

কর্ম এটি দেখুন

ব্যবহারকারীরা এখন মুভির বিশদ পৃষ্ঠায় মুভির রিভিউ দিতে পারবেন। তারা তাদের প্রোফাইল পৃষ্ঠায় তাদের পর্যালোচনা দেখতে এবং মুছে ফেলতে পারে, তাদের অ্যাপের সাথে তাদের মিথস্ক্রিয়াগুলির উপর সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে।

9. উন্নত ফিল্টার এবং আংশিক পাঠ্য ম্যাচিং

এই বিভাগে, আপনি উন্নত অনুসন্ধান ক্ষমতা প্রয়োগ করবেন, ব্যবহারকারীদের রেটিং এবং রিলিজ বছরের পরিসরের উপর ভিত্তি করে চলচ্চিত্রগুলি অনুসন্ধান করতে, জেনার এবং ট্যাগ দ্বারা ফিল্টার করতে, শিরোনাম বা বিবরণে আংশিক পাঠ্য ম্যাচিং সঞ্চালন করতে এবং এমনকি আরও সুনির্দিষ্ট ফলাফলের জন্য একাধিক ফিল্টার একত্রিত করতে পারবেন৷

ece70ee0ab964e28.png

সংযোগকারী বাস্তবায়ন

  1. dataconnect/movie-connector/queries.gql খুলুন।
  2. বিভিন্ন অনুসন্ধান ক্ষমতা সমর্থন করতে নিম্নলিখিত ক্যোয়ারী যোগ করুন :
    # Search for movies, actors, and reviews
    query SearchAll(
      $input: String
      $minYear: Int!
      $maxYear: Int!
      $minRating: Float!
      $maxRating: Float!
      $genre: String!
    ) @auth(level: PUBLIC) {
      moviesMatchingTitle: movies(
        where: {
          _and: [
            { releaseYear: { ge: $minYear } }
            { releaseYear: { le: $maxYear } }
            { rating: { ge: $minRating } }
            { rating: { le: $maxRating } }
            { genre: { contains: $genre } }
            { title: { contains: $input } }
          ]
        }
      ) {
        id
        title
        genre
        rating
        imageUrl
      }
      moviesMatchingDescription: movies(
        where: {
          _and: [
            { releaseYear: { ge: $minYear } }
            { releaseYear: { le: $maxYear } }
            { rating: { ge: $minRating } }
            { rating: { le: $maxRating } }
            { genre: { contains: $genre } }
            { description: { contains: $input } }
          ]
        }
      ) {
        id
        title
        genre
        rating
        imageUrl
      }
      actorsMatchingName: actors(where: { name: { contains: $input } }) {
        id
        name
        imageUrl
      }
      reviewsMatchingText: reviews(where: { reviewText: { contains: $input } }) {
        id
        rating
        reviewText
        reviewDate
        movie {
          id
          title
        }
        user {
          id
          username
        }
      }
    }
    

মূল টেকওয়ে:

  • _and অপারেটর: একটি একক ক্যোয়ারীতে একাধিক শর্ত একত্রিত করে, releaseYear , rating , এবং genre মত বিভিন্ন ক্ষেত্র দ্বারা অনুসন্ধানকে ফিল্টার করার অনুমতি দেয়৷
  • অপারেটর contains : ক্ষেত্রগুলির মধ্যে আংশিক পাঠ্য মিলের জন্য অনুসন্ধান করে। এই ক্যোয়ারীতে, এটি title , description , name , বা reviewText মধ্যে মিলগুলি সন্ধান করে।
  • where ধারা: ডেটা ফিল্টার করার শর্তগুলি নির্দিষ্ট করে। প্রতিটি বিভাগ (চলচ্চিত্র, অভিনেতা, পর্যালোচনা) অনুসন্ধানের জন্য নির্দিষ্ট মানদণ্ড সংজ্ঞায়িত করতে একটি where ধারা ব্যবহার করে।

ওয়েব অ্যাপে একীভূত প্রশ্নগুলি

  1. MovieService ( app/src/lib/MovieService.tsx ), নিম্নোক্ত ইম্পোর্টগুলিকে আনকমেন্ট করুন :
    import { searchAll, SearchAllData } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোড দিয়ে handleSearchAll ফাংশন প্রতিস্থাপন করুন :
    // Function to perform the search using the query and filters
    export const handleSearchAll = async (
      searchQuery: string,
      minYear: number,
      maxYear: number,
      minRating: number,
      maxRating: number,
      genre: string
    ): Promise<SearchAllData | null> => {
      try {
        const response = await searchAll({
          input: searchQuery,
          minYear,
          maxYear,
          minRating,
          maxRating,
          genre,
        });
    
        return response.data;
      } catch (error) {
        console.error("Error performing search:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • handleSearchAll : এই ফাংশন ব্যবহারকারীর ইনপুট, বছর, রেটিং, জেনার এবং আংশিক পাঠ্য মিলের মতো পরামিতি অনুসারে ফলাফলগুলি ফিল্টার করার জন্য একটি অনুসন্ধান সম্পাদন করতে searchAll কোয়েরি ব্যবহার করে।

কর্ম এটি দেখুন

ওয়েব অ্যাপে নেভিবার থেকে "উন্নত অনুসন্ধান" পৃষ্ঠায় যান৷ আপনি এখন বিভিন্ন ফিল্টার এবং ইনপুট ব্যবহার করে মুভি, অভিনেতা এবং পর্যালোচনা অনুসন্ধান করতে পারেন, বিস্তারিত এবং উপযোগী অনুসন্ধান ফলাফল পেতে পারেন।

10. ঐচ্ছিক: ক্লাউডে স্থাপন করুন (বিলিং প্রয়োজন)

এখন আপনি স্থানীয় উন্নয়ন পুনরাবৃত্তির মাধ্যমে কাজ করেছেন, এটি আপনার স্কিমা, ডেটা এবং অনুসন্ধানগুলি সার্ভারে স্থাপন করার সময়। এটি Firebase Data Connect VS Code এক্সটেনশন বা Firebase CLI ব্যবহার করে করা যেতে পারে।

আপনার Firebase মূল্য পরিকল্পনা আপগ্রেড করুন

PostgreSQL-এর জন্য ক্লাউড এসকিউএল-এর সাথে Firebase ডেটা কানেক্টকে একীভূত করতে, আপনার Firebase প্রজেক্টকে পে-অ্যাজ-ইউ গো (Blaze) মূল্য পরিকল্পনায় থাকতে হবে, যার মানে এটি একটি ক্লাউড বিলিং অ্যাকাউন্টের সাথে লিঙ্ক করা আছে।

  • একটি ক্লাউড বিলিং অ্যাকাউন্টের জন্য একটি অর্থপ্রদানের পদ্ধতি প্রয়োজন, যেমন একটি ক্রেডিট কার্ড৷
  • আপনি Firebase এবং Google ক্লাউডে নতুন হলে, আপনি $300 ক্রেডিট এবং একটি বিনামূল্যের ট্রায়াল ক্লাউড বিলিং অ্যাকাউন্টের জন্য যোগ্য কিনা তা পরীক্ষা করুন।
  • আপনি যদি একটি ইভেন্টের অংশ হিসাবে এই কোডল্যাবটি করছেন, তাহলে আপনার সংগঠককে জিজ্ঞাসা করুন যদি কোনো ক্লাউড ক্রেডিট উপলব্ধ থাকে।

আপনার প্রকল্পকে ব্লেজ প্ল্যানে আপগ্রেড করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. Firebase কনসোলে, আপনার প্ল্যান আপগ্রেড করতে নির্বাচন করুন।
  2. ব্লেজ প্ল্যান নির্বাচন করুন। আপনার প্রকল্পের সাথে একটি ক্লাউড বিলিং অ্যাকাউন্ট লিঙ্ক করতে অন-স্ক্রীন নির্দেশাবলী অনুসরণ করুন।
    এই আপগ্রেডের অংশ হিসাবে আপনার যদি একটি ক্লাউড বিলিং অ্যাকাউন্ট তৈরি করার প্রয়োজন হয়, তাহলে আপগ্রেড সম্পূর্ণ করতে আপনাকে Firebase কনসোলে আপগ্রেড প্রবাহে ফিরে যেতে হতে পারে।

আপনার ওয়েব অ্যাপটিকে আপনার Firebase প্রকল্পের সাথে সংযুক্ত করুন

  1. Firebase কনসোল ব্যবহার করে আপনার Firebase প্রকল্পে আপনার ওয়েব অ্যাপ নিবন্ধন করুন:
    1. আপনার প্রকল্প খুলুন, এবং তারপরে অ্যাপ যোগ করুন ক্লিক করুন।
    2. আপাতত SDK সেটআপ এবং কনফিগারেশন সেটআপ উপেক্ষা করুন, তবে জেনারেট করা firebaseConfig অবজেক্টটি কপি করতে ভুলবেন না।
    7030822793e4d75b.png
  2. app/src/lib/firebase.tsx এ বিদ্যমান firebaseConfig প্রতিস্থাপন করুন যে কনফিগারেশনটি আপনি Firebase কনসোল থেকে কপি করেছেন।
    const firebaseConfig = {
      apiKey: "API_KEY",
      authDomain: "PROJECT_ID.firebaseapp.com",
      projectId: "PROJECT_ID",
      storageBucket: "PROJECT_ID.firebasestorage.app",
      messagingSenderId: "SENDER_ID",
      appId: "APP_ID"
    };
    
  3. ওয়েব অ্যাপ তৈরি করুন: VS কোডে ফিরে, app ফোল্ডারে, হোস্টিং স্থাপনার জন্য ওয়েব অ্যাপ তৈরি করতে Vite ব্যবহার করুন:
    cd app
    npm run build
    

আপনার Firebase প্রকল্পে Firebase প্রমাণীকরণ সেট আপ করুন

  1. Google সাইন-ইন দিয়ে Firebase প্রমাণীকরণ সেট আপ করুন। 62af2f225e790ef6.png
  2. (ঐচ্ছিক) Firebase কনসোল ব্যবহার করে Firebase প্রমাণীকরণের জন্য ডোমেনগুলিকে অনুমতি দিন (উদাহরণস্বরূপ, http://127.0.0.1 )।
    1. প্রমাণীকরণ সেটিংসে, অনুমোদিত ডোমেনে যান।
    2. "ডোমেন যোগ করুন" ক্লিক করুন এবং তালিকায় আপনার স্থানীয় ডোমেন অন্তর্ভুক্ত করুন।

c255098f12549886.png

Firebase CLI এর সাথে স্থাপন করুন

  1. dataconnect/dataconnect.yaml এ, নিশ্চিত করুন যে আপনার ইনস্ট্যান্স আইডি, ডাটাবেস এবং পরিষেবা আইডি আপনার প্রকল্পের সাথে মেলে:
    specVersion: "v1alpha"
    serviceId: "your-service-id"
    location: "us-central1"
    schema:
      source: "./schema"
      datasource:
        postgresql:
          database: "your-database-id"
          cloudSql:
            instanceId: "your-instance-id"
    connectorDirs: ["./movie-connector"]
    
  2. আপনার প্রজেক্টের সাথে Firebase CLI সেট আপ আছে কিনা নিশ্চিত করুন:
    npm i -g firebase-tools
    firebase login --reauth
    firebase use --add
    
  3. আপনার টার্মিনালে, স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান:
    firebase deploy --only dataconnect,hosting
    
  4. আপনার স্কিমা পরিবর্তনগুলি তুলনা করতে এই কমান্ডটি চালান:
    firebase dataconnect:sql:diff
    
  5. পরিবর্তনগুলি গ্রহণযোগ্য হলে, তাদের সাথে প্রয়োগ করুন:
    firebase dataconnect:sql:migrate
    

PostgreSQL দৃষ্টান্তের জন্য আপনার ক্লাউড SQL চূড়ান্ত স্থাপন করা স্কিমা এবং ডেটা সহ আপডেট করা হবে। আপনি Firebase কনসোলে স্ট্যাটাস নিরীক্ষণ করতে পারেন।

আপনি এখন আপনার অ্যাপ your-project.web.app/ এ লাইভ দেখতে সক্ষম হবেন। অতিরিক্তভাবে, আপনি ফায়ারবেস ডেটা কানেক্ট প্যানেলে রান (উৎপাদন) ক্লিক করতে পারেন, ঠিক যেমন আপনি স্থানীয় এমুলেটরগুলির সাথে করেছিলেন, উৎপাদন পরিবেশে ডেটা যোগ করতে।

11. ঐচ্ছিক: Firebase Data Connect সহ ভেক্টর অনুসন্ধান (বিলিং প্রয়োজন)

এই বিভাগে, আপনি Firebase Data Connect ব্যবহার করে আপনার চলচ্চিত্র পর্যালোচনা অ্যাপে ভেক্টর অনুসন্ধান সক্ষম করবেন। এই বৈশিষ্ট্যটি বিষয়বস্তু-ভিত্তিক অনুসন্ধানের জন্য অনুমতি দেয়, যেমন ভেক্টর এম্বেডিং ব্যবহার করে অনুরূপ বর্ণনা সহ চলচ্চিত্রগুলি সন্ধান করা।

এই ধাপে Google ক্লাউডে স্থাপন করার জন্য আপনি এই কোডল্যাবের শেষ ধাপটি সম্পূর্ণ করেছেন।

4b5aca5a447d2feb.png

একটি ক্ষেত্রের জন্য এম্বেডিং অন্তর্ভুক্ত করতে স্কিমা আপডেট করুন

dataconnect/schema/schema.gql এ, Movie টেবিলে descriptionEmbedding ক্ষেত্র যোগ করুন:

type Movie
  # The below parameter values are generated by default with @table, and can be edited manually.
  @table {
  # implicitly calls @col to generates a column name. ex: @col(name: "movie_id")
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  releaseYear: Int
  genre: String
  rating: Float
  description: String
  tags: [String]
  descriptionEmbedding: Vector @col(size:768) # Enables vector search
}

মূল টেকওয়ে:

  • descriptionEmbedding: Vector @col(size:768) : এই ক্ষেত্রটি আপনার অ্যাপে ভেক্টর-ভিত্তিক বিষয়বস্তু অনুসন্ধান সক্ষম করে, চলচ্চিত্রের বর্ণনার শব্দার্থিক এম্বেডিং সংরক্ষণ করে।

Vertex AI সক্রিয় করুন

  1. Google ক্লাউড থেকে Vertex AI API সেট আপ করতে পূর্বশর্ত নির্দেশিকা অনুসরণ করুন। এমবেডিং জেনারেশন এবং ভেক্টর অনুসন্ধান কার্যকারিতা সমর্থন করার জন্য এই পদক্ষেপটি অপরিহার্য।
  2. Firebase Data Connect VS Code এক্সটেনশন ব্যবহার করে "Deploy to Production" এ ক্লিক করে pgvector এবং ভেক্টর অনুসন্ধান সক্রিয় করতে আপনার স্কিমা পুনরায় স্থাপন করুন

এম্বেডিং সহ ডাটাবেস পপুলেট করুন

  1. ভিএস কোডে dataconnect ফোল্ডারটি খুলুন
  2. আপনার ডাটাবেস মুভির জন্য এমবেডিং সহ পপুলেট করতে optional_vector_embed.gqlRun(স্থানীয়) ক্লিক করুন।

b858da780f6ec103.png

একটি ভেক্টর অনুসন্ধান ক্যোয়ারী যোগ করুন

dataconnect/movie-connector/queries.gql এ, ভেক্টর অনুসন্ধান করতে নিম্নলিখিত ক্যোয়ারী যোগ করুন:

# Search movie descriptions using L2 similarity with Vertex AI
query SearchMovieDescriptionUsingL2Similarity($query: String!)
@auth(level: PUBLIC) {
  movies_descriptionEmbedding_similarity(
    compare_embed: { model: "textembedding-gecko@003", text: $query }
    method: L2
    within: 2
    limit: 5
  ) {
    id
    title
    description
    tags
    rating
    imageUrl
  }
}

মূল টেকওয়ে:

  • compare_embed : তুলনা করার জন্য এমবেডিং মডেল ( textembedding-gecko@003 ) এবং ইনপুট টেক্সট ( $query ) নির্দিষ্ট করে।
  • method : সাদৃশ্য পদ্ধতি ( L2 ) নির্দিষ্ট করে, যা ইউক্লিডীয় দূরত্বকে প্রতিনিধিত্ব করে।
  • within : কাছাকাছি বিষয়বস্তুর মিলগুলিতে ফোকাস করে 2 বা তার কম দূরত্বের L2 মুভিগুলিতে অনুসন্ধান সীমাবদ্ধ করে৷
  • limit : ফলাফলের সংখ্যা 5 এ সীমাবদ্ধ করে।

আপনার অ্যাপে ভেক্টর অনুসন্ধান ফাংশন প্রয়োগ করুন

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

  1. app/src/lib/ MovieService.ts এ, SDK থেকে নিম্নোক্ত ইম্পোর্টগুলিকে আনকমেন্ট করুন , এটি অন্য যেকোনো প্রশ্নের মতো কাজ করবে।
    import {
      searchMovieDescriptionUsingL2similarity,
      SearchMovieDescriptionUsingL2similarityData,
    } from "@movie/dataconnect";
    
  2. অ্যাপে ভেক্টর-ভিত্তিক অনুসন্ধান সংহত করতে নিম্নলিখিত ফাংশন যোগ করুন :
    // Perform vector-based search for movies based on description
    export const searchMoviesByDescription = async (
      query: string
    ): Promise<
      | SearchMovieDescriptionUsingL2similarityData["movies_descriptionEmbedding_similarity"]
      | null
    > => {
      try {
        const response = await searchMovieDescriptionUsingL2similarity({ query });
        return response.data.movies_descriptionEmbedding_similarity;
      } catch (error) {
        console.error("Error fetching movie descriptions:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • searchMoviesByDescription : এই ফাংশনটি searchMovieDescriptionUsingL2similarity ক্যোয়ারীকে কল করে, একটি ভেক্টর-ভিত্তিক বিষয়বস্তু অনুসন্ধান করতে ইনপুট পাঠ্য পাস করে।

কর্ম এটি দেখুন

নেভিগেট করুন "ভেক্টর অনুসন্ধান" বিভাগে এবং "রোমান্টিক এবং আধুনিক" এর মত বাক্যাংশ টাইপ করুন। আপনি মুভিগুলির একটি তালিকা দেখতে পাবেন যা আপনার অনুসন্ধান করা বিষয়বস্তুর সাথে মেলে, অথবা, যেকোন চলচ্চিত্রের মুভির বিবরণ পৃষ্ঠায় যান এবং পৃষ্ঠার নীচে অনুরূপ চলচ্চিত্র বিভাগটি দেখুন৷

7b71f1c75633c1be.png

12. উপসংহার

অভিনন্দন, আপনি ওয়েব অ্যাপ ব্যবহার করতে সক্ষম হবেন! আপনি যদি আপনার নিজের মুভি ডেটা নিয়ে খেলতে চান, চিন্তা করবেন না, _insert.gql ফাইলগুলি অনুকরণ করে Firebase ডেটা কানেক্ট এক্সটেনশন ব্যবহার করে আপনার নিজস্ব ডেটা সন্নিবেশ করুন, অথবা VS কোডের ডেটা কানেক্ট এক্সিকিউশন প্যানের মাধ্যমে যোগ করুন৷

আরও জানুন

,

1. আপনি শুরু করার আগে

FriendlyMovies অ্যাপ

এই কোডল্যাবে, আপনি একটি মুভি রিভিউ ওয়েব অ্যাপ তৈরি করতে একটি ক্লাউড SQL ডাটাবেসের সাথে Firebase Data Connect সংহত করবেন। সম্পূর্ণ অ্যাপটি দেখায় কিভাবে Firebase Data Connect SQL-চালিত অ্যাপ্লিকেশন তৈরির প্রক্রিয়াকে সহজ করে। এটি এই বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে:

  • প্রমাণীকরণ: আপনার অ্যাপের প্রশ্ন এবং মিউটেশনের জন্য কাস্টম প্রমাণীকরণ প্রয়োগ করুন, নিশ্চিত করুন যে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা আপনার ডেটার সাথে ইন্টারঅ্যাক্ট করতে পারে।
  • GraphQL স্কিমা: একটি চলচ্চিত্র পর্যালোচনা ওয়েব অ্যাপের প্রয়োজন অনুসারে তৈরি একটি নমনীয় GraphQL স্কিমা ব্যবহার করে আপনার ডেটা স্ট্রাকচার তৈরি এবং পরিচালনা করুন।
  • SQL ক্যোয়ারী এবং মিউটেশন: GraphQL দ্বারা চালিত ক্যোয়ারী এবং মিউটেশন ব্যবহার করে ক্লাউড SQL-এ ডেটা পুনরুদ্ধার, আপডেট এবং পরিচালনা করুন।
  • আংশিক স্ট্রিং ম্যাচ সহ উন্নত অনুসন্ধান: শিরোনাম, বিবরণ, বা ট্যাগের মতো ক্ষেত্রগুলির উপর ভিত্তি করে চলচ্চিত্রগুলি খুঁজে পেতে ফিল্টার এবং অনুসন্ধান বিকল্পগুলি ব্যবহার করুন৷
  • (ঐচ্ছিক) ভেক্টর অনুসন্ধান ইন্টিগ্রেশন: ইনপুট এবং পছন্দের উপর ভিত্তি করে একটি সমৃদ্ধ ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে Firebase Data Connect এর ভেক্টর অনুসন্ধান ব্যবহার করে সামগ্রী অনুসন্ধান কার্যকারিতা যোগ করুন।

পূর্বশর্ত

আপনার জাভাস্ক্রিপ্ট সম্পর্কে একটি প্রাথমিক বোঝার প্রয়োজন হবে।

আপনি কি শিখবেন

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

আপনি কি প্রয়োজন হবে

  • গিট
  • ভিজ্যুয়াল স্টুডিও কোড
  • nvm-windows (Windows) বা nvm (macOS/Linux) ব্যবহার করে Node.js ইনস্টল করুন
  • আপনি যদি ইতিমধ্যেই না করে থাকেন তাহলে Firebase কনসোলে একটি Firebase প্রকল্প তৈরি করুন৷
  • (ঐচ্ছিক) ভেক্টর অনুসন্ধানের জন্য, আপনার প্রজেক্টকে পে-অ্যাজ-ইউ-গো ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড করুন

2. আপনার উন্নয়ন পরিবেশ সেট আপ করুন

কোডল্যাবের এই পর্যায়টি Firebase Data Connect ব্যবহার করে আপনার মুভি রিভিউ অ্যাপ তৈরি শুরু করার জন্য পরিবেশ সেট আপ করার মাধ্যমে আপনাকে গাইড করবে।

  1. প্রকল্প সংগ্রহস্থল ক্লোন করুন এবং প্রয়োজনীয় নির্ভরতা ইনস্টল করুন:
    git clone https://github.com/firebaseextended/codelab-dataconnect-web
    cd codelab-dataconnect-web
    cd ./app && npm i
    npm run dev
    
  2. এই কমান্ডগুলি চালানোর পরে, ওয়েব অ্যাপ স্থানীয়ভাবে চলমান দেখতে আপনার ব্রাউজারে http://localhost:5173 খুলুন। এটি মুভি রিভিউ অ্যাপ তৈরি এবং এর বৈশিষ্ট্যগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার সামনের প্রান্ত হিসাবে কাজ করে। 93f6648a2532c606.png
  3. ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে ক্লোন করা codelab-dataconnect-web ফোল্ডারটি খুলুন । এখানেই আপনি আপনার স্কিমা নির্ধারণ করবেন, প্রশ্ন লিখবেন এবং অ্যাপটির কার্যকারিতা পরীক্ষা করবেন।
  4. ডেটা কানেক্ট বৈশিষ্ট্যগুলি ব্যবহার করতে, ফায়ারবেস ডেটা কানেক্ট ভিজ্যুয়াল স্টুডিও এক্সটেনশন ইনস্টল করুন।
    বিকল্পভাবে, আপনি ভিজ্যুয়াল স্টুডিও কোড মার্কেটপ্লেস থেকে এক্সটেনশনটি ইনস্টল করতে পারেন বা VS কোডের মধ্যে এটি অনুসন্ধান করতে পারেন। b03ee38c9a81b648.png
  5. Firebase কনসোলে একটি নতুন Firebase প্রকল্প খুলুন বা তৈরি করুন।
  6. আপনার Firebase প্রকল্পটিকে Firebase Data Connect VSCode এক্সটেনশনের সাথে সংযুক্ত করুন। এক্সটেনশনে, নিম্নলিখিতগুলি করুন:
    1. সাইন ইন বোতামে ক্লিক করুন।
    2. একটি ফায়ারবেস প্রকল্প সংযুক্ত করুন ক্লিক করুন এবং আপনার ফায়ারবেস প্রকল্প নির্বাচন করুন।
    4bb2fbf8f9fac29b.png
  7. Firebase ডেটা কানেক্ট VS কোড এক্সটেনশন ব্যবহার করে ফায়ারবেস এমুলেটর শুরু করুন:
    স্টার্ট এমুলেটর ক্লিক করুন, এবং তারপর নিশ্চিত করুন যে এমুলেটরগুলি টার্মিনালে চলছে। 6d3d95f4cb708db1.png

3. স্টার্টার কোডবেস পর্যালোচনা করুন

এই বিভাগে, আপনি অ্যাপের স্টার্টার কোডবেসের মূল ক্ষেত্রগুলি অন্বেষণ করবেন। অ্যাপটিতে কিছু কার্যকারিতা অনুপস্থিত থাকলেও, সামগ্রিক গঠন বোঝার জন্য এটি সহায়ক।

ফোল্ডার এবং ফাইল গঠন

নিম্নলিখিত উপ-বিভাগগুলি অ্যাপের ফোল্ডার এবং ফাইল কাঠামোর একটি ওভারভিউ প্রদান করে।

dataconnect/ ডিরেক্টরি

ফায়ারবেস ডেটা কানেক্ট কনফিগারেশন, সংযোগকারী (যা ক্যোয়ারী এবং মিউটেশন সংজ্ঞায়িত করে) এবং স্কিমা ফাইল ধারণ করে।

  • schema/schema.gql : GraphQL স্কিমা সংজ্ঞায়িত করে
  • connector/queries.gql : আপনার অ্যাপে প্রয়োজনীয় প্রশ্ন
  • connector/mutations.gql : আপনার অ্যাপে মিউটেশন প্রয়োজন
  • connector/connector.yaml : SDK জেনারেশনের জন্য কনফিগারেশন ফাইল

app/src/ ডিরেক্টরি

ফায়ারবেস ডেটা কানেক্টের সাথে অ্যাপ্লিকেশনের যুক্তি এবং মিথস্ক্রিয়া রয়েছে।

  • firebase.ts : আপনার ফায়ারবেস প্রজেক্টে একটি ফায়ারবেস অ্যাপের সাথে সংযোগ করার কনফিগারেশন।
  • lib/dataconnect-sdk/ : জেনারেট করা SDK ধারণ করে। আপনি connector/connector.yaml ফাইলে SDK জেনারেশনের অবস্থান সম্পাদনা করতে পারেন এবং যে কোনো সময় আপনি কোনো প্রশ্ন বা মিউটেশন সংজ্ঞায়িত করলে SDK স্বয়ংক্রিয়ভাবে তৈরি হবে।

4. চলচ্চিত্র পর্যালোচনার জন্য একটি স্কিমা সংজ্ঞায়িত করুন

এই বিভাগে, আপনি একটি স্কিমাতে মুভি অ্যাপ্লিকেশনের মূল সত্তাগুলির মধ্যে গঠন এবং সম্পর্কগুলিকে সংজ্ঞায়িত করবেন। ফায়ারবেস ডেটা কানেক্ট এবং গ্রাফকিউএল স্কিমা নির্দেশাবলী ব্যবহার করে সম্পর্ক স্থাপনের সাথে Movie , User , Actor এবং Review মতো সত্তাগুলি ডাটাবেস টেবিলে ম্যাপ করা হয়। একবার এটি জায়গায় হয়ে গেলে, আপনার অ্যাপটি শীর্ষ-রেটেড মুভিগুলি অনুসন্ধান করা এবং জেনার দ্বারা ফিল্টার করা থেকে ব্যবহারকারীদের পর্যালোচনাগুলি ছেড়ে দেওয়া, পছন্দগুলি চিহ্নিত করা, অনুরূপ চলচ্চিত্রগুলি অন্বেষণ করা বা ভেক্টর অনুসন্ধানের মাধ্যমে পাঠ্য ইনপুটের উপর ভিত্তি করে প্রস্তাবিত চলচ্চিত্রগুলি খুঁজে পেতে সবকিছু পরিচালনা করার জন্য প্রস্তুত হবে৷

মূল সত্তা এবং সম্পর্ক

Movie টাইপটিতে শিরোনাম, জেনার এবং ট্যাগগুলির মতো মূল বিশদ রয়েছে যা অ্যাপটি অনুসন্ধান এবং চলচ্চিত্রের প্রোফাইলগুলির জন্য ব্যবহার করে। User টাইপ ব্যবহারকারী ইন্টারঅ্যাকশনগুলি, যেমন পর্যালোচনা এবং পছন্দের মতো ট্র্যাক করে। Reviews ব্যবহারকারীদের চলচ্চিত্রের সাথে সংযুক্ত করে, অ্যাপ্লিকেশনটিকে ব্যবহারকারী-উত্পাদিত রেটিং এবং প্রতিক্রিয়া দেখায়।

সিনেমা, অভিনেতা এবং ব্যবহারকারীদের মধ্যে সম্পর্ক অ্যাপ্লিকেশনটিকে আরও গতিশীল করে তোলে। MovieActor যোগদান টেবিলটি কাস্টের বিশদ এবং অভিনেতা ফিল্মোগ্রাফি প্রদর্শন করতে সহায়তা করে। FavoriteMovie টাইপ ব্যবহারকারীদের পছন্দসই সিনেমাগুলিতে অনুমতি দেয়, তাই অ্যাপ্লিকেশনটি একটি ব্যক্তিগতকৃত পছন্দের তালিকা প্রদর্শন করতে পারে এবং জনপ্রিয় বাছাইগুলি হাইলাইট করতে পারে।

Movie টেবিল সেট আপ করুন

Movie ধরণটি title , genre , releaseYear এবং rating মতো ক্ষেত্রগুলি সহ একটি চলচ্চিত্রের সত্তার মূল কাঠামোকে সংজ্ঞায়িত করে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type Movie
  @table {
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  releaseYear: Int
  genre: String
  rating: Float
  description: String
  tags: [String]
}

মূল টেকওয়ে:

  • আইডি: প্রতিটি চলচ্চিত্রের জন্য একটি অনন্য ইউইউড, @default(expr: "uuidV4()") ব্যবহার করে উত্পাদিত।

MovieMetadata টেবিল সেট আপ করুন

MovieMetadata প্রকারটি Movie ধরণের সাথে এক থেকে এক সম্পর্ক স্থাপন করে। এটিতে সিনেমার পরিচালকের মতো অতিরিক্ত ডেটা অন্তর্ভুক্ত রয়েছে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type MovieMetadata
  @table {
  # @ref creates a field in the current table (MovieMetadata)
  # It is a reference that holds the primary key of the referenced type
  # In this case, @ref(fields: "movieId", references: "id") is implied
  movie: Movie! @ref
  # movieId: UUID <- this is created by the above @ref
  director: String
}

মূল টেকওয়ে:

  • মুভি ! @রেফ: একটি বিদেশী মূল সম্পর্ক স্থাপন করে Movie ধরণের উল্লেখ করে।

Actor টেবিল সেট আপ করুন

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type Actor @table {
  id: UUID!
  imageUrl: String!
  name: String! @col(name: "name", dataType: "varchar(30)")
}

Actor প্রকারটি মুভি ডাটাবেসে একজন অভিনেতার প্রতিনিধিত্ব করে, যেখানে প্রতিটি অভিনেতা একাধিক চলচ্চিত্রের অংশ হতে পারে, যা বহু থেকে বহু সম্পর্ক তৈরি করে।

MovieActor টেবিল সেট আপ করুন

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type MovieActor @table(key: ["movie", "actor"]) {
  # @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
  # In this case, @ref(fields: "id") is implied
  movie: Movie!
  # movieId: UUID! <- this is created by the implied @ref, see: implicit.gql

  actor: Actor!
  # actorId: UUID! <- this is created by the implied  @ref, see: implicit.gql

  role: String! # "main" or "supporting"
}

মূল টেকওয়ে:

  • মুভি: মুভি ধরণের উল্লেখগুলি, স্পষ্টভাবে একটি বিদেশী কী মুভিআইডি তৈরি করে: ইউইড!
  • অভিনেতা: অভিনেতার প্রকারের রেফারেন্স, স্পষ্টভাবে একটি বিদেশী কী অভিনেতা উত্পন্ন করে: ইউইড!।
  • ভূমিকা: মুভিতে অভিনেতার ভূমিকা সংজ্ঞায়িত করে (যেমন, "প্রধান" বা "সমর্থনকারী")।

User টেবিল সেট আপ করুন

User ধরণটি এমন কোনও ব্যবহারকারী সত্তাকে সংজ্ঞায়িত করে যারা পর্যালোচনা রেখে বা চলচ্চিত্রের পছন্দসই করে চলচ্চিত্রের সাথে যোগাযোগ করে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type User
  @table {
  id: String! @col(name: "auth_uid")
  username: String! @col(dataType: "varchar(50)")
  # The following are generated from the @ref in the Review table
  # reviews_on_user
  # movies_via_Review
}

FavoriteMovie টেবিল সেট আপ করুন

FavoriteMovie টাইপটি একটি যোগদানের টেবিল যা ব্যবহারকারী এবং তাদের পছন্দের চলচ্চিত্রগুলির মধ্যে বহু থেকে বহু সম্পর্ক পরিচালনা করে। প্রতিটি টেবিল একটি User একটি Movie সাথে লিঙ্ক করে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type FavoriteMovie
  @table(name: "FavoriteMovies", singular: "favorite_movie", plural: "favorite_movies", key: ["user", "movie"]) {
  # @ref is implicit
  user: User!
  movie: Movie!
}

মূল টেকওয়ে:

  • মুভি: সিনেমার ধরণের উল্লেখগুলি, স্পষ্টভাবে একটি বিদেশী কী movieId: UUID! .
  • ব্যবহারকারী: ব্যবহারকারীর প্রকারের রেফারেন্স, স্পষ্টভাবে একটি বিদেশী কী userId: UUID! .

Review সারণী সেট আপ করুন

Review প্রকারটি পর্যালোচনা সত্তাকে প্রতিনিধিত্ব করে এবং User এবং Movie প্রকারগুলিকে অনেক থেকে বহু সম্পর্কের সাথে লিঙ্ক করে (একজন ব্যবহারকারী অনেক পর্যালোচনা ছেড়ে যেতে পারে এবং প্রতিটি চলচ্চিত্রের অনেক পর্যালোচনা থাকতে পারে)।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type Review @table(name: "Reviews", key: ["movie", "user"]) {
  id: UUID! @default(expr: "uuidV4()")
  user: User!
  movie: Movie!
  rating: Int
  reviewText: String
  reviewDate: Date! @default(expr: "request.time")
}

মূল টেকওয়ে:

  • ব্যবহারকারী: পর্যালোচনা ছেড়ে যাওয়া ব্যবহারকারীকে উল্লেখ করে।
  • মুভি: মুভিটি পর্যালোচনা করা হচ্ছে রেফারেন্স।
  • পর্যালোচনা তারিখ: @default(expr: "request.time") ব্যবহার করে পর্যালোচনাটি তৈরি করা হলে স্বয়ংক্রিয়ভাবে সেট করা হয়েছে।

অটো-উত্পন্ন ক্ষেত্র এবং ডিফল্ট

স্কিমা স্বয়ংক্রিয়ভাবে অনন্য আইডি এবং টাইমস্ট্যাম্পগুলি তৈরি করতে @default(expr: "uuidV4()") এর মতো অভিব্যক্তি ব্যবহার করে। উদাহরণস্বরূপ, Movie এবং Review প্রকারের id ক্ষেত্রটি যখন নতুন রেকর্ড তৈরি করা হয় তখন স্বয়ংক্রিয়ভাবে ইউইউডের সাথে জনবহুল হয়।

এখন যেহেতু স্কিমাটি সংজ্ঞায়িত করা হয়েছে, আপনার মুভি অ্যাপ্লিকেশনটির ডেটা কাঠামো এবং সম্পর্কের জন্য একটি দৃ foundation ় ভিত্তি রয়েছে!

5। শীর্ষ এবং সর্বশেষ সিনেমাগুলি পুনরুদ্ধার করুন

বন্ধুত্বপূর্ণ মোভিজ অ্যাপ্লিকেশন

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

মক মুভি, অভিনেতা এবং পর্যালোচনা ডেটা সন্নিবেশ করান

  1. ভিএসকোডে, dataconnect/moviedata_insert.gql খুলুন । ফায়ারবেস ডেটা কানেক্ট এক্সটেনশন চলমান রয়েছে তা নিশ্চিত করুন।
  2. আপনার ফাইলের শীর্ষে একটি রান (স্থানীয়) বোতামটি দেখতে হবে। আপনার ডাটাবেসে মক মুভি ডেটা সন্নিবেশ করতে এটি ক্লিক করুন।
    E424F75E63BF2E10.png
  3. ডেটা সফলভাবে যুক্ত হয়েছে তা নিশ্চিত করতে ডেটা কানেক্ট এক্সিকিউশন টার্মিনালটি পরীক্ষা করুন।
    E0943d7704fb84ea.png

সংযোগকারী বাস্তবায়ন করুন

  1. dataconnect/movie-connector/queries.gql খুলুন। মন্তব্যগুলিতে আপনি একটি প্রাথমিক ListMovies ক্যোয়ারী পাবেন:
    query ListMovies @auth(level: PUBLIC) {
      movies {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        tags
        description
      }
    }
    
    এই ক্যোয়ারীটি সমস্ত সিনেমা এবং তাদের বিশদ আনতে পারে (উদাহরণস্বরূপ, id , title , releaseYear )। তবে এটি সিনেমাগুলি বাছাই করে না
  2. বাছাই এবং সীমাবদ্ধ বিকল্পগুলি যুক্ত করতে নিম্নলিখিত ক্যোয়ারির সাথে বিদ্যমান ListMovies ক্যোয়ারীটি প্রতিস্থাপন করুন :
    # List subset of fields for movies
    query ListMovies($orderByRating: OrderDirection, $orderByReleaseYear: OrderDirection, $limit: Int) @auth(level: PUBLIC) {
      movies(
        orderBy: [
          { rating: $orderByRating },
          { releaseYear: $orderByReleaseYear }
        ]
        limit: $limit
      ) {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        tags
        description
      }
    }
    
  3. আপনার স্থানীয় ডাটাবেসের বিরুদ্ধে ক্যোয়ারীটি কার্যকর করতে রান (স্থানীয়) বোতামটি ক্লিক করুন। আপনি চলার আগে কনফিগারেশন ফলকে ক্যোয়ারী ভেরিয়েবলগুলি ইনপুট করতে পারেন।
    C4D947115BB11B16.png

মূল টেকওয়ে:

  • movies() : ডাটাবেস থেকে মুভি ডেটা আনার জন্য গ্রাফকিউএল ক্যোয়ারী ক্ষেত্র।
  • orderByRating : রেটিং (আরোহী/অবতরণ) দ্বারা সিনেমাগুলি বাছাই করার জন্য প্যারামিটার।
  • orderByReleaseYear : রিলিজ বছর (আরোহী/অবতরণ) দ্বারা সিনেমাগুলি বাছাই করার জন্য প্যারামিটার।
  • limit : ফিরে আসা চলচ্চিত্রের সংখ্যা সীমাবদ্ধ করে।

ওয়েব অ্যাপে প্রশ্নগুলি সংহত করুন

কোডল্যাবের এই অংশে, আপনি আপনার ওয়েব অ্যাপের পূর্ববর্তী বিভাগে সংজ্ঞায়িত প্রশ্নগুলি ব্যবহার করবেন। ফায়ারবেস ডেটা কানেক্ট এমুলেটরগুলি .gql ফাইলগুলির (বিশেষত, schema.gql , queries.gql , mutations.gql ) এবং connector.yaml ফাইলের তথ্যের ভিত্তিতে এসডিকে উত্পন্ন করে। এই এসডিকে সরাসরি আপনার অ্যাপ্লিকেশনটিতে কল করা যেতে পারে।

  1. MovieService সার্ভিসে ( app/src/lib/MovieService.tsx ), শীর্ষে আমদানি বিবৃতিটি আপত্তি নেই :
    import { listMovies, ListMoviesData, OrderDirection } from "@movie/dataconnect";
    
    ফাংশন listMovies , প্রতিক্রিয়া প্রকারের ListMoviesData এবং এনাম OrderDirection হ'ল স্কিমা এবং আপনি পূর্বে সংজ্ঞায়িত ক্যোয়ারীগুলির উপর ভিত্তি করে ফায়ারবেস ডেটা কানেক্ট এমুলেটরগুলির দ্বারা উত্পাদিত সমস্ত এসডিকে।
  2. নিম্নলিখিত কোড সহ handleGetTopMovies এবং handleGetLatestMovies ফাংশনগুলি প্রতিস্থাপন করুন:
    // Fetch top-rated movies
    export const handleGetTopMovies = async (
      limit: number
    ): Promise<ListMoviesData["movies"] | null> => {
      try {
        const response = await listMovies({
          orderByRating: OrderDirection.DESC,
          limit,
        });
        return response.data.movies;
      } catch (error) {
        console.error("Error fetching top movies:", error);
        return null;
      }
    };
    
    // Fetch latest movies
    export const handleGetLatestMovies = async (
      limit: number
    ): Promise<ListMoviesData["movies"] | null> => {
      try {
        const response = await listMovies({
          orderByReleaseYear: OrderDirection.DESC,
          limit,
        });
        return response.data.movies;
      } catch (error) {
        console.error("Error fetching latest movies:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • listMovies : একটি অটো-উত্পাদিত ফাংশন যা সিনেমাগুলির একটি তালিকা পুনরুদ্ধার করতে listMovies ক্যোয়ারীকে কল করে। এটিতে রেটিং বা প্রকাশের বছর এবং ফলাফলের সংখ্যা সীমাবদ্ধ করে বাছাইয়ের বিকল্পগুলি অন্তর্ভুক্ত রয়েছে।
  • ListMoviesData : ফলাফলের ধরণটি অ্যাপের হোমপেজে শীর্ষ 10 এবং সর্বশেষ চলচ্চিত্রগুলি প্রদর্শন করতে ব্যবহৃত হয়।

কর্ম এটি দেখুন

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

6 .. মুভি এবং অভিনেতার বিশদ প্রদর্শন করুন

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

AC7FEFA7FF779231.png

সংযোগকারীগুলি প্রয়োগ করুন

  1. আপনার প্রকল্পে dataconnect/movie-connector/queries.gql খুলুন
  2. সিনেমা এবং অভিনেতার বিশদ পুনরুদ্ধার করতে নিম্নলিখিত প্রশ্নগুলি যুক্ত করুন :
    # Get movie by id
    query GetMovieById($id: UUID!) @auth(level: PUBLIC) {
    movie(id: $id) {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        description
        tags
        metadata: movieMetadatas_on_movie {
          director
        }
        mainActors: actors_via_MovieActor(where: { role: { eq: "main" } }) {
          id
          name
          imageUrl
        }
        supportingActors: actors_via_MovieActor(
          where: { role: { eq: "supporting" } }
        ) {
          id
          name
          imageUrl
        }
        reviews: reviews_on_movie {
          id
          reviewText
          reviewDate
          rating
          user {
            id
            username
          }
        }
      }
    }
    
    # Get actor by id
    query GetActorById($id: UUID!) @auth(level: PUBLIC) {
      actor(id: $id) {
        id
        name
        imageUrl
        mainActors: movies_via_MovieActor(where: { role: { eq: "main" } }) {
          id
          title
          genre
          tags
          imageUrl
        }
        supportingActors: movies_via_MovieActor(
          where: { role: { eq: "supporting" } }
        ) {
          id
          title
          genre
          tags
          imageUrl
        }
      }
    }
    
  3. আপনার পরিবর্তনগুলি সংরক্ষণ করুন এবং প্রশ্নগুলি পর্যালোচনা করুন।

মূল টেকওয়ে:

  • movie() / actor() : Movies বা Actors টেবিল থেকে একক সিনেমা বা অভিনেতা আনার জন্য গ্রাফকিউএল ক্যোয়ারী ক্ষেত্রগুলি।
  • _on_ : এটি কোনও সম্পর্কিত ধরণের থেকে সরাসরি অ্যাক্সেসের অনুমতি দেয় যা বিদেশী কী সম্পর্কযুক্ত। উদাহরণস্বরূপ, reviews_on_movie একটি নির্দিষ্ট চলচ্চিত্রের সাথে সম্পর্কিত সমস্ত পর্যালোচনা আনতে পারে।
  • _via_ : একটি যোগদানের টেবিলের মাধ্যমে বহু থেকে বহু সম্পর্কের নেভিগেট করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, actors_via_MovieActor MovieActor যোগদানের টেবিলের মাধ্যমে Actor প্রকারটি অ্যাক্সেস করে এবং where শর্তটি অভিনেতাদের তাদের ভূমিকার ভিত্তিতে ফিল্টার করে (উদাহরণস্বরূপ, "প্রধান" বা "সমর্থনকারী")।

মক ডেটা ইনপুট করে ক্যোয়ারী পরীক্ষা করুন

  1. ডেটা কানেক্ট এক্সিকিউশন ফলকে, আপনি মক আইডিগুলি ইনপুট করে ক্যোয়ারীটি পরীক্ষা করতে পারেন, যেমন:
    {"id": "550e8400-e29b-41d4-a716-446655440000"}
    
  2. "কোয়ান্টাম প্যারাডক্স" (উপরের আইডিটির সাথে সম্পর্কিত মক মুভিটির সাথে সম্পর্কিত মক মুভি) সম্পর্কে বিশদটি পুনরুদ্ধার করতে GetMovieById জন্য রান (স্থানীয়) ক্লিক করুন।

1B08961891E44DA2.png

ওয়েব অ্যাপে প্রশ্নগুলি সংহত করুন

  1. MovieService সার্ভিসে ( app/src/lib/MovieService.tsx ), নিম্নলিখিত আমদানিগুলিকে আপত্তি নেই :
    import { getMovieById, GetMovieByIdData } from "@movie/dataconnect";
    import { GetActorByIdData, getActorById } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোড সহ handleGetMovieById এবং handleGetActorById ফাংশনগুলি প্রতিস্থাপন করুন :
    // Fetch movie details by ID
    export const handleGetMovieById = async (
      movieId: string
    ) => {
      try {
        const response = await getMovieById({ id: movieId });
        if (response.data.movie) {
          return response.data.movie;
        }
        return null;
      } catch (error) {
        console.error("Error fetching movie:", error);
        return null;
      }
    };
    
    // Calling generated SDK for GetActorById
    export const handleGetActorById = async (
      actorId: string
    ): Promise<GetActorByIdData["actor"] | null> => {
      try {
        const response = await getActorById({ id: actorId });
        if (response.data.actor) {
          return response.data.actor;
        }
        return null;
      } catch (error) {
        console.error("Error fetching actor:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • getMovieById / getActorById : এগুলি স্বয়ংক্রিয়ভাবে উত্পাদিত ফাংশন যা আপনার সংজ্ঞায়িত ক্যোয়ারীগুলিকে কল করে, একটি নির্দিষ্ট চলচ্চিত্র বা অভিনেতার জন্য বিশদ তথ্য পুনরুদ্ধার করে।
  • GetMovieByIdData / GetActorByIdData : এগুলি ফলাফলের ধরণ, অ্যাপটিতে সিনেমা এবং অভিনেতার বিশদ প্রদর্শন করতে ব্যবহৃত হয়।

কর্ম এটি দেখুন

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

7। ব্যবহারকারী প্রমাণীকরণ পরিচালনা করুন

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

9890838045D5A00E.PNG

সংযোগকারীগুলি প্রয়োগ করুন

  1. dataconnect/movie-connector/mutations.gql খুলুন
  2. বর্তমান প্রমাণীকরণকারী ব্যবহারকারী তৈরি বা আপডেট করতে নিম্নলিখিত রূপান্তর যুক্ত করুন:
    # Create or update the current authenticated user
    mutation UpsertUser($username: String!) @auth(level: USER) {
      user_upsert(
        data: {
          id_expr: "auth.uid"
          username: $username
        }
      )
    }
    

মূল টেকওয়ে:

  • id_expr: "auth.uid" : এটি auth.uid ব্যবহার করে, যা ব্যবহারকারী বা অ্যাপ্লিকেশন দ্বারা নয়, ফায়ারবেস প্রমাণীকরণ দ্বারা সরাসরি সরবরাহ করা হয়, ব্যবহারকারী আইডি সুরক্ষিত এবং স্বয়ংক্রিয়ভাবে পরিচালিত হয় তা নিশ্চিত করে সুরক্ষার একটি অতিরিক্ত স্তর যুক্ত করে।

বর্তমান ব্যবহারকারী আনুন

  1. dataconnect/movie-connector/queries.gql খুলুন
  2. বর্তমান ব্যবহারকারী আনতে নিম্নলিখিত ক্যোয়ারী যুক্ত করুন :
    # Get user by ID
    query GetCurrentUser @auth(level: USER) {
      user(key: { id_expr: "auth.uid" }) {
        id
        username
        reviews: reviews_on_user {
          id
          rating
          reviewDate
          reviewText
          movie {
            id
            title
          }
        }
        favoriteMovies: favorite_movies_on_user {
          movie {
            id
            title
            genre
            imageUrl
            releaseYear
            rating
            description
            tags
            metadata: movieMetadatas_on_movie {
              director
            }
          }
        }
      }
    }
    

মূল টেকওয়ে:

  • auth.uid : এটি ব্যবহারকারী-নির্দিষ্ট ডেটাতে সুরক্ষিত অ্যাক্সেস নিশ্চিত করে ফায়ারবেস প্রমাণীকরণ থেকে সরাসরি পুনরুদ্ধার করা হয়।
  • _on_ ক্ষেত্রগুলি: এই ক্ষেত্রগুলি যোগদানের টেবিলগুলি উপস্থাপন করে:
    • reviews_on_user : মুভিটির id এবং title সহ ব্যবহারকারীর সাথে সম্পর্কিত সমস্ত পর্যালোচনা আনুন।
    • favorite_movies_on_user : genre , releaseYear , rating এবং metadata মতো বিশদ তথ্য সহ ব্যবহারকারীর পছন্দের হিসাবে চিহ্নিত সমস্ত চলচ্চিত্র পুনরুদ্ধার করে।

ওয়েব অ্যাপে প্রশ্নগুলি সংহত করুন

  1. MovieService সার্ভিসে ( app/src/lib/MovieService.tsx ), নিম্নলিখিত আমদানিগুলিকে আপত্তি নেই:
    import { upsertUser } from "@movie/dataconnect";
    import { getCurrentUser, GetCurrentUserData } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোডের সাথে handleAuthStateChange এবং handleGetCurrentUser ফাংশনগুলি প্রতিস্থাপন করুন:
    // Handle user authentication state changes and upsert user
    export const handleAuthStateChange = (
      auth: any,
      setUser: (user: User | null) => void
    ) => {
      return onAuthStateChanged(auth, async (user) => {
        if (user) {
          setUser(user);
          const username = user.email?.split("@")[0] || "anon";
          await upsertUser({ username });
        } else {
          setUser(null);
        }
      });
    };
    
    // Fetch current user profile
    export const handleGetCurrentUser = async (): Promise<
      GetCurrentUserData["user"] | null
    > => {
      try {
        const response = await getCurrentUser();
        return response.data.user;
      } catch (error) {
        console.error("Error fetching user profile:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • handleAuthStateChange : এই ফাংশনটি প্রমাণীকরণ রাষ্ট্রের পরিবর্তনের জন্য শোনায়। যখন কোনও ব্যবহারকারী সাইন ইন করে, এটি ব্যবহারকারীর ডেটা সেট করে এবং ডাটাবেসে ব্যবহারকারীর তথ্য তৈরি বা আপডেট করতে upsertUser মিউটেশনকে কল করে।
  • handleGetCurrentUser : getCurrentUser ক্যোয়ারী ব্যবহার করে বর্তমান ব্যবহারকারীর প্রোফাইলটি আনা, যা ব্যবহারকারীর পর্যালোচনা এবং প্রিয় চলচ্চিত্রগুলি পুনরুদ্ধার করে।

কর্ম এটি দেখুন

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

8। ব্যবহারকারীর মিথস্ক্রিয়া প্রয়োগ করুন

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

b3d0ac1e181c9de9.png

কোনও ব্যবহারকারীকে একটি সিনেমা পছন্দ করুন

এই বিভাগে, আপনি ব্যবহারকারীদের একটি চলচ্চিত্র পছন্দ করতে দিতে ডাটাবেস সেট আপ করবেন।

সংযোগকারীগুলি প্রয়োগ করুন

  1. dataconnect/movie-connector/mutations.gql খুলুন
  2. পছন্দসই সিনেমাগুলি পরিচালনা করতে নিম্নলিখিত রূপান্তরগুলি যুক্ত করুন :
    # Add a movie to the user's favorites list
    mutation AddFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie_upsert(data: { userId_expr: "auth.uid", movieId: $movieId })
    }
    
    # Remove a movie from the user's favorites list
    mutation DeleteFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
    }
    
    

মূল টেকওয়ে:

  • userId_expr: "auth.uid" : auth.uid ব্যবহার করে, যা সরাসরি ফায়ারবেস প্রমাণীকরণ দ্বারা সরবরাহ করা হয়, এটি নিশ্চিত করে যে কেবল প্রমাণীকৃত ব্যবহারকারীর ডেটা অ্যাক্সেস বা সংশোধন করা হয়েছে।

কোনও সিনেমা পছন্দসই কিনা তা পরীক্ষা করুন

  1. dataconnect/movie-connector/queries.gql খুলুন
  2. কোনও সিনেমা পছন্দসই কিনা তা পরীক্ষা করতে নিম্নলিখিত ক্যোয়ারী যুক্ত করুন :
    query GetIfFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie(key: { userId_expr: "auth.uid", movieId: $movieId }) {
        movieId
      }
    }
    

মূল টেকওয়ে:

  • auth.uid : ফায়ারবেস প্রমাণীকরণ ব্যবহার করে ব্যবহারকারী-নির্দিষ্ট ডেটাতে সুরক্ষিত অ্যাক্সেস নিশ্চিত করে।
  • favorite_movie : কোনও নির্দিষ্ট চলচ্চিত্রটি বর্তমান ব্যবহারকারীর দ্বারা প্রিয় হিসাবে চিহ্নিত হয়েছে কিনা তা দেখতে favorite_movies টেবিলের সাথে যোগ দেয়।

ওয়েব অ্যাপে প্রশ্নগুলি সংহত করুন

  1. MovieService সার্ভিসে ( app/src/lib/MovieService.tsx ), নিম্নলিখিত আমদানিগুলিকে আপত্তি নেই :
    import { addFavoritedMovie, deleteFavoritedMovie, getIfFavoritedMovie } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোডটি সহ handleAddFavoritedMovie , handleDeleteFavoritedMovie এবং handleGetIfFavoritedMovie ফাংশনগুলি প্রতিস্থাপন করুন :
    // Add a movie to user's favorites
    export const handleAddFavoritedMovie = async (
      movieId: string
    ): Promise<void> => {
      try {
        await addFavoritedMovie({ movieId });
      } catch (error) {
        console.error("Error adding movie to favorites:", error);
        throw error;
      }
    };
    
    // Remove a movie from user's favorites
    export const handleDeleteFavoritedMovie = async (
      movieId: string
    ): Promise<void> => {
      try {
        await deleteFavoritedMovie({ movieId });
      } catch (error) {
        console.error("Error removing movie from favorites:", error);
        throw error;
      }
    };
    
    // Check if the movie is favorited by the user
    export const handleGetIfFavoritedMovie = async (
      movieId: string
    ): Promise<boolean> => {
      try {
        const response = await getIfFavoritedMovie({ movieId });
        return !!response.data.favorite_movie;
      } catch (error) {
        console.error("Error checking if movie is favorited:", error);
        return false;
      }
    };
    

মূল টেকওয়ে:

  • handleAddFavoritedMovie এবং handleDeleteFavoritedMovie : ব্যবহারকারীর পছন্দের থেকে কোনও সিনেমা যুক্ত করতে বা অপসারণ করতে মিউটেশনগুলি ব্যবহার করুন।
  • handleGetIfFavoritedMovie : কোনও সিনেমা ব্যবহারকারীর দ্বারা প্রিয় হিসাবে চিহ্নিত হয়েছে কিনা তা যাচাই করতে getIfFavoritedMovie ক্যোয়ারী ব্যবহার করে।

কর্ম এটি দেখুন

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

ব্যবহারকারীদের পর্যালোচনা ছেড়ে বা মুছতে দিন

এরপরে, আপনি অ্যাপটিতে ব্যবহারকারী পর্যালোচনা পরিচালনার জন্য বিভাগটি প্রয়োগ করবেন।

সংযোগকারীগুলি প্রয়োগ করুন

mutations.gql ( dataconnect/movie-connector/mutations.gql ): নিম্নলিখিত রূপান্তরগুলি যুক্ত করুন:

# Add a review for a movie
mutation AddReview($movieId: UUID!, $rating: Int!, $reviewText: String!)
@auth(level: USER) {
  review_insert(
    data: {
      userId_expr: "auth.uid"
      movieId: $movieId
      rating: $rating
      reviewText: $reviewText
      reviewDate_date: { today: true }
    }
  )
}

# Delete a user's review for a movie
mutation DeleteReview($movieId: UUID!) @auth(level: USER) {
  review_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
}

মূল টেকওয়ে:

  • userId_expr: "auth.uid" : পর্যালোচনাগুলি অনুমোদিত ব্যবহারকারীর সাথে যুক্ত রয়েছে তা নিশ্চিত করে।
  • reviewDate_date: { today: true } : ম্যানুয়াল ইনপুটটির প্রয়োজনীয়তা দূর করে ডাটাকনেক্ট ব্যবহার করে পর্যালোচনার জন্য স্বয়ংক্রিয়ভাবে বর্তমান তারিখটি উত্পন্ন করে।

ওয়েব অ্যাপে প্রশ্নগুলি সংহত করুন

  1. MovieService সার্ভিসে ( app/src/lib/MovieService.tsx ), নিম্নলিখিত আমদানিগুলিকে আপত্তি নেই :
    import { addReview, deleteReview } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোডের সাথে handleAddReview এবং handleDeleteReview ফাংশনগুলি প্রতিস্থাপন করুন :
    // Add a review to a movie
    export const handleAddReview = async (
      movieId: string,
      rating: number,
      reviewText: string
    ): Promise<void> => {
      try {
        await addReview({ movieId, rating, reviewText });
      } catch (error) {
        console.error("Error adding review:", error);
        throw error;
      }
    };
    
    // Delete a review from a movie
    export const handleDeleteReview = async (movieId: string): Promise<void> => {
      try {
        await deleteReview({ movieId });
      } catch (error) {
        console.error("Error deleting review:", error);
        throw error;
      }
    };
    

মূল টেকওয়ে:

  • handleAddReview : নির্দিষ্ট চলচ্চিত্রের জন্য একটি পর্যালোচনা যুক্ত করতে addReview মিউটেশনকে কল করে, এটি সুরক্ষিতভাবে প্রমাণিত ব্যবহারকারীর সাথে সংযুক্ত করে।
  • handleDeleteReview : অনুমোদিত ব্যবহারকারীর দ্বারা চলচ্চিত্রের জন্য একটি পর্যালোচনা অপসারণ করতে deleteReview মিউটেশন ব্যবহার করে।

কর্ম এটি দেখুন

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

9। উন্নত ফিল্টার এবং আংশিক পাঠ্য ম্যাচিং

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

ECE70EE0AB964E28.png

সংযোগকারীগুলি প্রয়োগ করুন

  1. dataconnect/movie-connector/queries.gql খুলুন।
  2. বিভিন্ন অনুসন্ধানের ক্ষমতা সমর্থন করতে নিম্নলিখিত ক্যোয়ারী যুক্ত করুন :
    # Search for movies, actors, and reviews
    query SearchAll(
      $input: String
      $minYear: Int!
      $maxYear: Int!
      $minRating: Float!
      $maxRating: Float!
      $genre: String!
    ) @auth(level: PUBLIC) {
      moviesMatchingTitle: movies(
        where: {
          _and: [
            { releaseYear: { ge: $minYear } }
            { releaseYear: { le: $maxYear } }
            { rating: { ge: $minRating } }
            { rating: { le: $maxRating } }
            { genre: { contains: $genre } }
            { title: { contains: $input } }
          ]
        }
      ) {
        id
        title
        genre
        rating
        imageUrl
      }
      moviesMatchingDescription: movies(
        where: {
          _and: [
            { releaseYear: { ge: $minYear } }
            { releaseYear: { le: $maxYear } }
            { rating: { ge: $minRating } }
            { rating: { le: $maxRating } }
            { genre: { contains: $genre } }
            { description: { contains: $input } }
          ]
        }
      ) {
        id
        title
        genre
        rating
        imageUrl
      }
      actorsMatchingName: actors(where: { name: { contains: $input } }) {
        id
        name
        imageUrl
      }
      reviewsMatchingText: reviews(where: { reviewText: { contains: $input } }) {
        id
        rating
        reviewText
        reviewDate
        movie {
          id
          title
        }
        user {
          id
          username
        }
      }
    }
    

মূল টেকওয়ে:

  • _and অপারেটর: একক ক্যোয়ারিতে একাধিক শর্তের সংমিশ্রণ করে, যা releaseYear , rating এবং genre মতো বেশ কয়েকটি ক্ষেত্র দ্বারা অনুসন্ধানটি ফিল্টার করার অনুমতি দেয়।
  • অপারেটর contains : ক্ষেত্রগুলির মধ্যে আংশিক পাঠ্য ম্যাচগুলির সন্ধান করে। এই ক্যোয়ারিতে এটি title , description , name বা reviewText মধ্যে ম্যাচগুলি সন্ধান করে।
  • where ধারা: ফিল্টারিং ডেটাগুলির শর্তগুলি নির্দিষ্ট করে। প্রতিটি বিভাগ (চলচ্চিত্র, অভিনেতা, পর্যালোচনা) অনুসন্ধানের জন্য নির্দিষ্ট মানদণ্ডকে সংজ্ঞায়িত করতে একটি where ব্যবহার করে।

ওয়েব অ্যাপে প্রশ্নগুলি সংহত করুন

  1. MovieService সার্ভিসে ( app/src/lib/MovieService.tsx ), নিম্নলিখিত আমদানিগুলিকে আপত্তি নেই :
    import { searchAll, SearchAllData } from "@movie/dataconnect";
    
  2. নিম্নলিখিত কোডের সাথে handleSearchAll ফাংশনটি প্রতিস্থাপন করুন :
    // Function to perform the search using the query and filters
    export const handleSearchAll = async (
      searchQuery: string,
      minYear: number,
      maxYear: number,
      minRating: number,
      maxRating: number,
      genre: string
    ): Promise<SearchAllData | null> => {
      try {
        const response = await searchAll({
          input: searchQuery,
          minYear,
          maxYear,
          minRating,
          maxRating,
          genre,
        });
    
        return response.data;
      } catch (error) {
        console.error("Error performing search:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • handleSearchAll : এই ফাংশনটি ব্যবহারকারীর ইনপুটটির উপর ভিত্তি করে অনুসন্ধান সম্পাদন করতে, বছর, রেটিং, জেনার এবং আংশিক পাঠ্য ম্যাচের মতো পরামিতিগুলির দ্বারা ফিল্টারিং ফলাফলের উপর ভিত্তি করে অনুসন্ধান সম্পাদন করতে searchAll ক্যোয়ারী ব্যবহার করে।

কর্ম এটি দেখুন

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

10। al চ্ছিক: মেঘে মোতায়েন করুন (বিলিং প্রয়োজনীয়)

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

আপনার ফায়ারবেস মূল্য পরিকল্পনা আপগ্রেড করুন

পোস্টগ্রিসকিউএল এর জন্য ক্লাউড এসকিউএল এর সাথে ফায়ারবেস ডেটা সংযুক্ত করার জন্য, আপনার ফায়ারবেস প্রকল্পটি বেতন-হিসাবে যেতে হবে (ব্লেজ) মূল্য নির্ধারণের পরিকল্পনায় , যার অর্থ এটি ক্লাউড বিলিং অ্যাকাউন্টের সাথে যুক্ত।

  • একটি ক্লাউড বিলিং অ্যাকাউন্টের জন্য ক্রেডিট কার্ডের মতো অর্থ প্রদানের পদ্ধতি প্রয়োজন।
  • আপনি যদি ফায়ারবেস এবং গুগল ক্লাউডে নতুন হন তবে আপনি $ 300 ক্রেডিট এবং একটি বিনামূল্যে ট্রায়াল ক্লাউড বিলিং অ্যাকাউন্টের জন্য যোগ্য কিনা তা পরীক্ষা করে দেখুন।
  • আপনি যদি কোনও ইভেন্টের অংশ হিসাবে এই কোডল্যাবটি করছেন তবে আপনার সংগঠককে জিজ্ঞাসা করুন যে কোনও ক্লাউড ক্রেডিট উপলব্ধ আছে কিনা।

আপনার প্রকল্পটি ব্লেজ পরিকল্পনায় আপগ্রেড করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ফায়ারবেস কনসোলে, আপনার পরিকল্পনাটি আপগ্রেড করতে নির্বাচন করুন।
  2. ব্লেজ পরিকল্পনা নির্বাচন করুন। আপনার প্রকল্পের সাথে ক্লাউড বিলিং অ্যাকাউন্টটি লিঙ্ক করতে অন-স্ক্রিন নির্দেশাবলী অনুসরণ করুন।
    এই আপগ্রেডের অংশ হিসাবে আপনার যদি ক্লাউড বিলিং অ্যাকাউন্ট তৈরি করার প্রয়োজন হয় তবে আপগ্রেডটি সম্পূর্ণ করতে আপনাকে ফায়ারবেস কনসোলে আপগ্রেড প্রবাহে ফিরে নেভিগেট করতে হবে।

আপনার ওয়েব অ্যাপ্লিকেশনটি আপনার ফায়ারবেস প্রকল্পে সংযুক্ত করুন

  1. ফায়ারবেস কনসোলটি ব্যবহার করে আপনার ফায়ারবেস প্রকল্পে আপনার ওয়েব অ্যাপটি নিবন্ধ করুন:
    1. আপনার প্রকল্পটি খুলুন, এবং তারপরে অ্যাপ্লিকেশন যুক্ত করুন ক্লিক করুন।
    2. আপাতত এসডিকে সেটআপ এবং কনফিগারেশন সেটআপ উপেক্ষা করুন, তবে উত্পন্ন firebaseConfig অবজেক্টটি অনুলিপি করার বিষয়টি নিশ্চিত করুন।
    7030822793e4d75b.png
  2. app/src/lib/firebase.tsx -এ বিদ্যমান firebaseConfig প্রতিস্থাপন করুন আপনি সবেমাত্র ফায়ারবেস কনসোল থেকে অনুলিপি করেছেন এমন কনফিগারেশনের সাথে।
    const firebaseConfig = {
      apiKey: "API_KEY",
      authDomain: "PROJECT_ID.firebaseapp.com",
      projectId: "PROJECT_ID",
      storageBucket: "PROJECT_ID.firebasestorage.app",
      messagingSenderId: "SENDER_ID",
      appId: "APP_ID"
    };
    
  3. ওয়েব অ্যাপটি তৈরি করুন: app ফোল্ডারে ভিএস কোডে ফিরে যান, স্থাপনার হোস্টিংয়ের জন্য ওয়েব অ্যাপটি তৈরি করতে ভিট ব্যবহার করুন:
    cd app
    npm run build
    

আপনার ফায়ারবেস প্রকল্পে ফায়ারবেস প্রমাণীকরণ সেট আপ করুন

  1. গুগল সাইন-ইন দিয়ে ফায়ারবেস প্রমাণীকরণ সেট আপ করুন। 62AF2F225E790EF6.PNG
  2. (Al চ্ছিক) ফায়ারবেস কনসোল ব্যবহার করে ফায়ারবেস প্রমাণীকরণের জন্য ডোমেনগুলি অনুমতি দিন (উদাহরণস্বরূপ, http://127.0.0.1 )।
    1. প্রমাণীকরণ সেটিংসে, অনুমোদিত ডোমেনগুলিতে যান।
    2. "ডোমেন যুক্ত করুন" ক্লিক করুন এবং আপনার স্থানীয় ডোমেনটি তালিকায় অন্তর্ভুক্ত করুন।

C255098F12549886.png

ফায়ারবেস সিএলআই দিয়ে মোতায়েন করুন

  1. dataconnect/dataconnect.yaml , আপনার উদাহরণ আইডি, ডাটাবেস এবং পরিষেবা আইডি আপনার প্রকল্পের সাথে মেলে তা নিশ্চিত করুন:
    specVersion: "v1alpha"
    serviceId: "your-service-id"
    location: "us-central1"
    schema:
      source: "./schema"
      datasource:
        postgresql:
          database: "your-database-id"
          cloudSql:
            instanceId: "your-instance-id"
    connectorDirs: ["./movie-connector"]
    
  2. আপনার প্রকল্পের সাথে আপনার ফায়ারবেস সিএলআই সেট আপ রয়েছে তা নিশ্চিত করুন:
    npm i -g firebase-tools
    firebase login --reauth
    firebase use --add
    
  3. আপনার টার্মিনালে, মোতায়েন করার জন্য নিম্নলিখিত কমান্ডটি চালান:
    firebase deploy --only dataconnect,hosting
    
  4. আপনার স্কিমা পরিবর্তনগুলির তুলনা করতে এই কমান্ডটি চালান:
    firebase dataconnect:sql:diff
    
  5. যদি পরিবর্তনগুলি গ্রহণযোগ্য হয় তবে সেগুলি প্রয়োগ করুন:
    firebase dataconnect:sql:migrate
    

পোস্টগ্রিসকিউএল উদাহরণের জন্য আপনার ক্লাউড এসকিউএল চূড়ান্ত মোতায়েন স্কিমা এবং ডেটা সহ আপডেট করা হবে। আপনি ফায়ারবেস কনসোলে স্থিতি পর্যবেক্ষণ করতে পারেন।

আপনার এখন আপনার অ্যাপ্লিকেশনটি your-project.web.app/ / এ সরাসরি দেখতে সক্ষম হওয়া উচিত। অতিরিক্তভাবে, আপনি উত্পাদনের পরিবেশে ডেটা যুক্ত করতে স্থানীয় এমুলেটরগুলির সাথে যেমন করেছেন ঠিক তেমন ফায়ারবেস ডেটা কানেক্ট প্যানেলে রান (উত্পাদন) ক্লিক করতে পারেন।

১১। al চ্ছিক: ফায়ারবেস ডেটা কানেক্টের সাথে ভেক্টর অনুসন্ধান (বিলিং প্রয়োজনীয়)

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

এই পদক্ষেপের প্রয়োজন যে আপনি গুগল ক্লাউডে মোতায়েন করার জন্য এই কোডল্যাবের শেষ পদক্ষেপটি সম্পন্ন করেছেন।

4B5ACA5A447D2FEB.PNG

একটি ক্ষেত্রের জন্য এম্বেডিংগুলি অন্তর্ভুক্ত করতে স্কিমা আপডেট করুন

dataconnect/schema/schema.gql এ, Movie টেবিলে descriptionEmbedding ক্ষেত্রটি যুক্ত করুন:

type Movie
  # The below parameter values are generated by default with @table, and can be edited manually.
  @table {
  # implicitly calls @col to generates a column name. ex: @col(name: "movie_id")
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  releaseYear: Int
  genre: String
  rating: Float
  description: String
  tags: [String]
  descriptionEmbedding: Vector @col(size:768) # Enables vector search
}

মূল টেকওয়ে:

  • descriptionEmbedding: Vector @col(size:768) : এই ক্ষেত্রটি আপনার অ্যাপ্লিকেশনটিতে ভেক্টর-ভিত্তিক সামগ্রী অনুসন্ধান সক্ষম করে চলচ্চিত্রের বর্ণনার শব্দার্থক এম্বেডিংগুলি সঞ্চয় করে।

ভার্টেক্স এআই সক্রিয় করুন

  1. গুগল ক্লাউড থেকে ভার্টেক্স এআই এপিআই সেট আপ করার জন্য পূর্বশর্ত গাইড অনুসরণ করুন। এম্বেডিং প্রজন্ম এবং ভেক্টর অনুসন্ধান কার্যকারিতা সমর্থন করার জন্য এই পদক্ষেপটি প্রয়োজনীয়।
  2. ফায়ারবেস ডেটা কানেক্ট ভিএস কোড এক্সটেনশন ব্যবহার করে "ডিপ্লো টু প্রোডাকশন" এ ক্লিক করে pgvector এবং ভেক্টর অনুসন্ধান সক্রিয় করতে আপনার স্কিমাটি পুনরায় স্থাপন করুন।

এম্বেডিং সহ ডাটাবেসটি পপুলেট করুন

  1. ভিএস কোডে dataconnect ফোল্ডারটি খুলুন
  2. সিনেমাগুলির জন্য এম্বেডিং সহ আপনার ডাটাবেসটি পপুলেট করতে optional_vector_embed.gql -তে রান (স্থানীয়) ক্লিক করুন।

b858da780f6ec103.png

একটি ভেক্টর অনুসন্ধান ক্যোয়ারী যুক্ত করুন

dataconnect/movie-connector/queries.gql এ, ভেক্টর অনুসন্ধানগুলি সম্পাদন করতে নিম্নলিখিত ক্যোয়ারী যুক্ত করুন:

# Search movie descriptions using L2 similarity with Vertex AI
query SearchMovieDescriptionUsingL2Similarity($query: String!)
@auth(level: PUBLIC) {
  movies_descriptionEmbedding_similarity(
    compare_embed: { model: "textembedding-gecko@003", text: $query }
    method: L2
    within: 2
    limit: 5
  ) {
    id
    title
    description
    tags
    rating
    imageUrl
  }
}

মূল টেকওয়ে:

  • compare_embed : এম্বেডিং মডেল ( textembedding-gecko@003 ) এবং তুলনার জন্য ইনপুট পাঠ্য ( $query ) নির্দিষ্ট করে।
  • method : সাদৃশ্য পদ্ধতি ( L2 ) নির্দিষ্ট করে, যা ইউক্লিডিয়ান দূরত্বকে উপস্থাপন করে।
  • within : ঘনিষ্ঠ সামগ্রী ম্যাচগুলিতে ফোকাস করে 2 বা তারও কম এল 2 দূরত্বের সাথে সিনেমাগুলিতে অনুসন্ধান সীমাবদ্ধ করে।
  • limit : ফলাফলের সংখ্যাটি 5 এ ফিরে আসে।

আপনার অ্যাপ্লিকেশনটিতে ভেক্টর অনুসন্ধান ফাংশনটি প্রয়োগ করুন

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

  1. app/src/lib/ MovieService.ts , এসডিকে থেকে নিম্নলিখিত আমদানিগুলিকে অসম্পূর্ণ করা , এটি অন্য কোনও প্রশ্নের মতো কাজ করবে।
    import {
      searchMovieDescriptionUsingL2similarity,
      SearchMovieDescriptionUsingL2similarityData,
    } from "@movie/dataconnect";
    
  2. অ্যাপ্লিকেশনটিতে ভেক্টর-ভিত্তিক অনুসন্ধান সংহত করতে নিম্নলিখিত ফাংশনটি যুক্ত করুন :
    // Perform vector-based search for movies based on description
    export const searchMoviesByDescription = async (
      query: string
    ): Promise<
      | SearchMovieDescriptionUsingL2similarityData["movies_descriptionEmbedding_similarity"]
      | null
    > => {
      try {
        const response = await searchMovieDescriptionUsingL2similarity({ query });
        return response.data.movies_descriptionEmbedding_similarity;
      } catch (error) {
        console.error("Error fetching movie descriptions:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • searchMoviesByDescription : এই ফাংশনটি searchMovieDescriptionUsingL2similarity 2 সিসিমারিটি ক্যোয়ারীকে কল করে, ভেক্টর-ভিত্তিক সামগ্রী অনুসন্ধান সম্পাদনের জন্য ইনপুট পাঠ্যটি পাস করে।

কর্ম এটি দেখুন

নাভবারের "ভেক্টর অনুসন্ধান" বিভাগে নেভিগেট করুন এবং "রোমান্টিক এবং আধুনিক" এর মতো বাক্যাংশগুলিতে টাইপ করুন। আপনি এমন সিনেমাগুলির একটি তালিকা দেখতে পাবেন যা আপনি যে সামগ্রীটি অনুসন্ধান করছেন তার সাথে মেলে, বা কোনও চলচ্চিত্রের চলচ্চিত্রের বিশদ পৃষ্ঠায় যান এবং পৃষ্ঠার নীচে অনুরূপ সিনেমা বিভাগটি দেখুন।

7B71F1C75633C1BE.PNG

12. উপসংহার

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

আরও জানুন

,

1. আপনি শুরু করার আগে

বন্ধুত্বপূর্ণ মোভিজ অ্যাপ্লিকেশন

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

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

পূর্বশর্ত

আপনার জাভাস্ক্রিপ্টের একটি প্রাথমিক বোঝার প্রয়োজন হবে।

আপনি কি শিখবেন

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

আপনি কি প্রয়োজন হবে

2। আপনার উন্নয়ন পরিবেশ সেট আপ করুন

কোডল্যাবের এই পর্যায়ে ফায়ারবেস ডেটা কানেক্ট ব্যবহার করে আপনার চলচ্চিত্রের পর্যালোচনা অ্যাপটি তৈরি করা শুরু করার জন্য পরিবেশ স্থাপনের মাধ্যমে আপনাকে গাইড করবে।

  1. প্রকল্পের সংগ্রহস্থলটি ক্লোন করুন এবং প্রয়োজনীয় নির্ভরতা ইনস্টল করুন:
    git clone https://github.com/firebaseextended/codelab-dataconnect-web
    cd codelab-dataconnect-web
    cd ./app && npm i
    npm run dev
    
  2. এই কমান্ডগুলি চালানোর পরে, স্থানীয়ভাবে ওয়েব অ্যাপটি দেখতে আপনার ব্রাউজারে http: // লোকালহোস্ট: 5173 খুলুন। এটি মুভি রিভিউ অ্যাপ্লিকেশনটি তৈরি করতে এবং এর বৈশিষ্ট্যগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার সামনের প্রান্ত হিসাবে কাজ করে। 93F6648A2532C606.png
  3. ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে ক্লোনড codelab-dataconnect-web ফোল্ডারটি খুলুন । এখানেই আপনি আপনার স্কিমা সংজ্ঞায়িত করবেন, প্রশ্নগুলি লিখবেন এবং অ্যাপ্লিকেশনটির কার্যকারিতা পরীক্ষা করবেন।
  4. ডেটা সংযোগ বৈশিষ্ট্যগুলি ব্যবহার করতে, ফায়ারবেস ডেটা সংযুক্ত করুন ভিজ্যুয়াল স্টুডিও এক্সটেনশনটি সংহত করুন
    বিকল্পভাবে, আপনি ভিজ্যুয়াল স্টুডিও কোড মার্কেটপ্লেস থেকে এক্সটেনশনটি ইনস্টল করতে পারেন বা ভিএস কোডের মধ্যে এটি অনুসন্ধান করতে পারেন। B03EE38C9A81B648.png
  5. ফায়ারবেস কনসোলে একটি নতুন ফায়ারবেস প্রকল্প খুলুন বা তৈরি করুন।
  6. আপনার ফায়ারবেস প্রকল্পটি ফায়ারবেস ডেটা কানেক্ট ভিস্কোড এক্সটেনশনে সংযুক্ত করুন। এক্সটেনশনে, নিম্নলিখিতগুলি করুন:
    1. সাইন ইন বোতামে ক্লিক করুন।
    2. ফায়ারবেস প্রকল্পটি সংযুক্ত করুন ক্লিক করুন এবং আপনার ফায়ারবেস প্রকল্পটি নির্বাচন করুন।
    4bb2fbf8f9fac29b.png
  7. ফায়ারবেস ডেটা কানেক্ট ভিএস কোড এক্সটেনশন ব্যবহার করে ফায়ারবেস এমুলেটরগুলি শুরু করুন:
    এমুলেটরগুলি শুরু করুন ক্লিক করুন এবং তারপরে নিশ্চিত করুন যে এমুলেটরগুলি টার্মিনালে চলছে। 6D3D95F4CB708DB1.png

3। স্টার্টার কোডবেস পর্যালোচনা করুন

এই বিভাগে, আপনি অ্যাপের স্টার্টার কোডবেসের মূল অঞ্চলগুলি অন্বেষণ করবেন। অ্যাপ্লিকেশনটি কিছু কার্যকারিতা অনুপস্থিত থাকলেও সামগ্রিক কাঠামোটি বুঝতে এটি সহায়ক।

ফোল্ডার এবং ফাইল কাঠামো

নিম্নলিখিত উপ-বিভাগগুলি অ্যাপের ফোল্ডার এবং ফাইল কাঠামোর একটি ওভারভিউ সরবরাহ করে।

dataconnect/ ডিরেক্টরি

ফায়ারবেস ডেটা কানেক্ট কনফিগারেশন, সংযোগকারীগুলি (যা ক্যোয়ারী এবং মিউটেশনগুলি সংজ্ঞায়িত করে) এবং স্কিমা ফাইল রয়েছে।

  • schema/schema.gql : গ্রাফকিউএল স্কিমা সংজ্ঞায়িত করে
  • connector/queries.gql : আপনার অ্যাপ্লিকেশনটিতে প্রয়োজনীয় প্রশ্নগুলি
  • connector/mutations.gql : আপনার অ্যাপ্লিকেশনটিতে রূপান্তর প্রয়োজন
  • connector/connector.yaml : এসডিকে প্রজন্মের জন্য কনফিগারেশন ফাইল

app/src/ ডিরেক্টরি

ফায়ারবেস ডেটা কানেক্টের সাথে অ্যাপ্লিকেশন যুক্তি এবং মিথস্ক্রিয়া রয়েছে।

  • firebase.ts : আপনার ফায়ারবেস প্রকল্পে ফায়ারবেস অ্যাপের সাথে সংযোগ স্থাপনের জন্য কনফিগারেশন।
  • lib/dataconnect-sdk/ : উত্পন্ন এসডিকে রয়েছে। আপনি connector/connector.yaml ফাইল এবং এসডিকেগুলিতে এসডিকে প্রজন্মের অবস্থান সম্পাদনা করতে পারেন এবং আপনি কোনও ক্যোয়ারী বা মিউটেশন সংজ্ঞায়িত করার সময় স্বয়ংক্রিয়ভাবে উত্পন্ন হবে।

4 .. চলচ্চিত্রের পর্যালোচনাগুলির জন্য একটি স্কিমা সংজ্ঞায়িত করুন

এই বিভাগে, আপনি কোনও স্কিমাতে চলচ্চিত্রের অ্যাপ্লিকেশনটিতে মূল সত্তাগুলির মধ্যে কাঠামো এবং সম্পর্কগুলি সংজ্ঞায়িত করবেন। Movie , User , Actor এবং Review মতো সত্তাগুলি ডাটাবেস টেবিলগুলিতে ম্যাপ করা হয়, ফায়ারবেস ডেটা কানেক্ট এবং গ্রাফকিউএল স্কিমা নির্দেশিকাগুলি ব্যবহার করে প্রতিষ্ঠিত সম্পর্কের সাথে। একবার এটি জায়গায় হয়ে গেলে, আপনার অ্যাপ্লিকেশনটি ব্যবহারকারীদের পর্যালোচনা ছেড়ে দিতে, পছন্দসইগুলি চিহ্নিত করতে, অনুরূপ সিনেমাগুলি অন্বেষণ করতে বা ভেক্টর অনুসন্ধানের মাধ্যমে পাঠ্য ইনপুটের ভিত্তিতে প্রস্তাবিত সিনেমাগুলি সন্ধান করতে জেনার দ্বারা শীর্ষস্থানীয় চলচ্চিত্রগুলি অনুসন্ধান এবং ফিল্টারিং থেকে শুরু করে সমস্ত কিছু পরিচালনা করতে প্রস্তুত থাকবে।

মূল সত্তা এবং সম্পর্ক

Movie টাইপটিতে শিরোনাম, জেনার এবং ট্যাগগুলির মতো মূল বিশদ রয়েছে যা অ্যাপটি অনুসন্ধান এবং চলচ্চিত্রের প্রোফাইলগুলির জন্য ব্যবহার করে। User টাইপ ব্যবহারকারী ইন্টারঅ্যাকশনগুলি, যেমন পর্যালোচনা এবং পছন্দের মতো ট্র্যাক করে। Reviews ব্যবহারকারীদের চলচ্চিত্রের সাথে সংযুক্ত করে, অ্যাপ্লিকেশনটিকে ব্যবহারকারী-উত্পাদিত রেটিং এবং প্রতিক্রিয়া দেখায়।

সিনেমা, অভিনেতা এবং ব্যবহারকারীদের মধ্যে সম্পর্ক অ্যাপ্লিকেশনটিকে আরও গতিশীল করে তোলে। MovieActor যোগদান টেবিলটি কাস্টের বিশদ এবং অভিনেতা ফিল্মোগ্রাফি প্রদর্শন করতে সহায়তা করে। FavoriteMovie টাইপ ব্যবহারকারীদের পছন্দসই সিনেমাগুলিতে অনুমতি দেয়, তাই অ্যাপ্লিকেশনটি একটি ব্যক্তিগতকৃত পছন্দের তালিকা প্রদর্শন করতে পারে এবং জনপ্রিয় বাছাইগুলি হাইলাইট করতে পারে।

Movie টেবিল সেট আপ করুন

Movie ধরণটি title , genre , releaseYear এবং rating মতো ক্ষেত্রগুলি সহ একটি চলচ্চিত্রের সত্তার মূল কাঠামোকে সংজ্ঞায়িত করে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type Movie
  @table {
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  releaseYear: Int
  genre: String
  rating: Float
  description: String
  tags: [String]
}

মূল টেকওয়ে:

  • আইডি: প্রতিটি চলচ্চিত্রের জন্য একটি অনন্য ইউইউড, @default(expr: "uuidV4()") ব্যবহার করে উত্পাদিত।

MovieMetadata টেবিল সেট আপ করুন

MovieMetadata প্রকারটি Movie ধরণের সাথে এক থেকে এক সম্পর্ক স্থাপন করে। এটিতে সিনেমার পরিচালকের মতো অতিরিক্ত ডেটা অন্তর্ভুক্ত রয়েছে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type MovieMetadata
  @table {
  # @ref creates a field in the current table (MovieMetadata)
  # It is a reference that holds the primary key of the referenced type
  # In this case, @ref(fields: "movieId", references: "id") is implied
  movie: Movie! @ref
  # movieId: UUID <- this is created by the above @ref
  director: String
}

মূল টেকওয়ে:

  • মুভি ! @রেফ: একটি বিদেশী মূল সম্পর্ক স্থাপন করে Movie ধরণের উল্লেখ করে।

Actor টেবিল সেট আপ করুন

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type Actor @table {
  id: UUID!
  imageUrl: String!
  name: String! @col(name: "name", dataType: "varchar(30)")
}

Actor প্রকারটি মুভি ডাটাবেসে একজন অভিনেতার প্রতিনিধিত্ব করে, যেখানে প্রতিটি অভিনেতা একাধিক চলচ্চিত্রের অংশ হতে পারে, যা বহু থেকে বহু সম্পর্ক তৈরি করে।

MovieActor টেবিল সেট আপ করুন

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type MovieActor @table(key: ["movie", "actor"]) {
  # @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
  # In this case, @ref(fields: "id") is implied
  movie: Movie!
  # movieId: UUID! <- this is created by the implied @ref, see: implicit.gql

  actor: Actor!
  # actorId: UUID! <- this is created by the implied  @ref, see: implicit.gql

  role: String! # "main" or "supporting"
}

মূল টেকওয়ে:

  • মুভি: মুভি ধরণের উল্লেখগুলি, স্পষ্টভাবে একটি বিদেশী কী মুভিআইডি তৈরি করে: ইউইড!
  • অভিনেতা: অভিনেতার প্রকারের রেফারেন্স, স্পষ্টভাবে একটি বিদেশী কী অভিনেতা উত্পন্ন করে: ইউইড!।
  • ভূমিকা: মুভিতে অভিনেতার ভূমিকা সংজ্ঞায়িত করে (যেমন, "প্রধান" বা "সমর্থনকারী")।

User টেবিল সেট আপ করুন

User ধরণটি এমন কোনও ব্যবহারকারী সত্তাকে সংজ্ঞায়িত করে যারা পর্যালোচনা রেখে বা চলচ্চিত্রের পছন্দসই করে চলচ্চিত্রের সাথে যোগাযোগ করে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type User
  @table {
  id: String! @col(name: "auth_uid")
  username: String! @col(dataType: "varchar(50)")
  # The following are generated from the @ref in the Review table
  # reviews_on_user
  # movies_via_Review
}

FavoriteMovie টেবিল সেট আপ করুন

FavoriteMovie টাইপটি একটি যোগদানের টেবিল যা ব্যবহারকারী এবং তাদের পছন্দের চলচ্চিত্রগুলির মধ্যে বহু থেকে বহু সম্পর্ক পরিচালনা করে। প্রতিটি টেবিল একটি User একটি Movie সাথে লিঙ্ক করে।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type FavoriteMovie
  @table(name: "FavoriteMovies", singular: "favorite_movie", plural: "favorite_movies", key: ["user", "movie"]) {
  # @ref is implicit
  user: User!
  movie: Movie!
}

মূল টেকওয়ে:

  • মুভি: সিনেমার ধরণের উল্লেখগুলি, স্পষ্টভাবে একটি বিদেশী কী movieId: UUID! .
  • ব্যবহারকারী: ব্যবহারকারীর প্রকারের রেফারেন্স, স্পষ্টভাবে একটি বিদেশী কী userId: UUID! .

Review সারণী সেট আপ করুন

Review প্রকারটি পর্যালোচনা সত্তাকে প্রতিনিধিত্ব করে এবং User এবং Movie প্রকারগুলিকে অনেক থেকে বহু সম্পর্কের সাথে লিঙ্ক করে (একজন ব্যবহারকারী অনেক পর্যালোচনা ছেড়ে যেতে পারে এবং প্রতিটি চলচ্চিত্রের অনেক পর্যালোচনা থাকতে পারে)।

আপনার dataconnect/schema/schema.gql ফাইলটিতে কোড স্নিপেটটি অনুলিপি করুন এবং পেস্ট করুন :

type Review @table(name: "Reviews", key: ["movie", "user"]) {
  id: UUID! @default(expr: "uuidV4()")
  user: User!
  movie: Movie!
  rating: Int
  reviewText: String
  reviewDate: Date! @default(expr: "request.time")
}

মূল টেকওয়ে:

  • ব্যবহারকারী: পর্যালোচনা ছেড়ে যাওয়া ব্যবহারকারীকে উল্লেখ করে।
  • মুভি: মুভিটি পর্যালোচনা করা হচ্ছে রেফারেন্স।
  • পর্যালোচনা তারিখ: @default(expr: "request.time") ব্যবহার করে পর্যালোচনাটি তৈরি করা হলে স্বয়ংক্রিয়ভাবে সেট করা হয়েছে।

অটো-উত্পন্ন ক্ষেত্র এবং ডিফল্ট

স্কিমা স্বয়ংক্রিয়ভাবে অনন্য আইডি এবং টাইমস্ট্যাম্পগুলি তৈরি করতে @default(expr: "uuidV4()") এর মতো অভিব্যক্তি ব্যবহার করে। উদাহরণস্বরূপ, Movie এবং Review প্রকারের id ক্ষেত্রটি যখন নতুন রেকর্ড তৈরি করা হয় তখন স্বয়ংক্রিয়ভাবে ইউইউডের সাথে জনবহুল হয়।

এখন যেহেতু স্কিমাটি সংজ্ঞায়িত করা হয়েছে, আপনার মুভি অ্যাপ্লিকেশনটির ডেটা কাঠামো এবং সম্পর্কের জন্য একটি দৃ foundation ় ভিত্তি রয়েছে!

5। শীর্ষ এবং সর্বশেষ সিনেমাগুলি পুনরুদ্ধার করুন

বন্ধুত্বপূর্ণ মোভিজ অ্যাপ্লিকেশন

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

মক মুভি, অভিনেতা এবং পর্যালোচনা ডেটা সন্নিবেশ করান

  1. ভিএসকোডে, dataconnect/moviedata_insert.gql খুলুন । ফায়ারবেস ডেটা কানেক্ট এক্সটেনশন চলমান রয়েছে তা নিশ্চিত করুন।
  2. আপনার ফাইলের শীর্ষে একটি রান (স্থানীয়) বোতামটি দেখতে হবে। আপনার ডাটাবেসে মক মুভি ডেটা সন্নিবেশ করতে এটি ক্লিক করুন।
    E424F75E63BF2E10.png
  3. ডেটা সফলভাবে যুক্ত হয়েছে তা নিশ্চিত করতে ডেটা কানেক্ট এক্সিকিউশন টার্মিনালটি পরীক্ষা করুন।
    E0943d7704fb84ea.png

সংযোগকারী বাস্তবায়ন করুন

  1. dataconnect/movie-connector/queries.gql খুলুন। মন্তব্যগুলিতে আপনি একটি প্রাথমিক ListMovies ক্যোয়ারী পাবেন:
    query ListMovies @auth(level: PUBLIC) {
      movies {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        tags
        description
      }
    }
    
    এই ক্যোয়ারীটি সমস্ত সিনেমা এবং তাদের বিশদ আনতে পারে (উদাহরণস্বরূপ, id , title , releaseYear )। তবে এটি সিনেমাগুলি বাছাই করে না
  2. বাছাই এবং সীমাবদ্ধ বিকল্পগুলি যুক্ত করতে নিম্নলিখিত ক্যোয়ারির সাথে বিদ্যমান ListMovies ক্যোয়ারীটি প্রতিস্থাপন করুন :
    # List subset of fields for movies
    query ListMovies($orderByRating: OrderDirection, $orderByReleaseYear: OrderDirection, $limit: Int) @auth(level: PUBLIC) {
      movies(
        orderBy: [
          { rating: $orderByRating },
          { releaseYear: $orderByReleaseYear }
        ]
        limit: $limit
      ) {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        tags
        description
      }
    }
    
  3. আপনার স্থানীয় ডাটাবেসের বিরুদ্ধে ক্যোয়ারীটি কার্যকর করতে রান (স্থানীয়) বোতামটি ক্লিক করুন। আপনি চলার আগে কনফিগারেশন ফলকে ক্যোয়ারী ভেরিয়েবলগুলি ইনপুট করতে পারেন।
    C4D947115BB11B16.png

মূল টেকওয়ে:

  • movies() : ডাটাবেস থেকে মুভি ডেটা আনার জন্য গ্রাফকিউএল ক্যোয়ারী ক্ষেত্র।
  • orderByRating : রেটিং (আরোহী/অবতরণ) দ্বারা সিনেমাগুলি বাছাই করার জন্য প্যারামিটার।
  • orderByReleaseYear : Parameter to sort movies by release year (ascending/descending).
  • limit : Restricts the number of movies returned.

Integrate queries in the web app

In this part of the codelab, you'll use the queries defined in the previous section in your web app. The Firebase Data Connect emulators generate SDKs based on the information in the .gql files (specifically, schema.gql , queries.gql , mutations.gql ) and the connector.yaml file. These SDKs can be directly called in your application.

  1. In MovieService ( app/src/lib/MovieService.tsx ), uncomment the import statement at the top:
    import { listMovies, ListMoviesData, OrderDirection } from "@movie/dataconnect";
    
    The function listMovies , the response type ListMoviesData , and the enum OrderDirection are all SDKs generated by the Firebase Data Connect emulators based on the schema and the queries you've previously defined .
  2. Replace the handleGetTopMovies and handleGetLatestMovies functions with the following code:
    // Fetch top-rated movies
    export const handleGetTopMovies = async (
      limit: number
    ): Promise<ListMoviesData["movies"] | null> => {
      try {
        const response = await listMovies({
          orderByRating: OrderDirection.DESC,
          limit,
        });
        return response.data.movies;
      } catch (error) {
        console.error("Error fetching top movies:", error);
        return null;
      }
    };
    
    // Fetch latest movies
    export const handleGetLatestMovies = async (
      limit: number
    ): Promise<ListMoviesData["movies"] | null> => {
      try {
        const response = await listMovies({
          orderByReleaseYear: OrderDirection.DESC,
          limit,
        });
        return response.data.movies;
      } catch (error) {
        console.error("Error fetching latest movies:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • listMovies : An auto-generated function that calls the listMovies query to retrieve a list of movies. It includes options for sorting by rating or release year and limiting the number of results.
  • ListMoviesData : The result type used to display the top 10 and latest movies on the app's homepage.

কর্ম এটি দেখুন

Reload your web app to see the query in action. The homepage now dynamically displays the list of movies, fetching data directly from your local database. You'll see the top-rated and latest movies appear seamlessly, reflecting the data you've just set up.

6. Display movie and actor details

In this section, you'll implement the functionality to retrieve detailed information for a movie or an actor using their unique IDs. This involves not only fetching data from their respective tables but also joining related tables to display comprehensive details, such as movie reviews and actor filmographies.

ac7fefa7ff779231.png

Implement connectors

  1. Open dataconnect/movie-connector/queries.gql in your project.
  2. Add the following queries to retrieve movie and actor details:
    # Get movie by id
    query GetMovieById($id: UUID!) @auth(level: PUBLIC) {
    movie(id: $id) {
        id
        title
        imageUrl
        releaseYear
        genre
        rating
        description
        tags
        metadata: movieMetadatas_on_movie {
          director
        }
        mainActors: actors_via_MovieActor(where: { role: { eq: "main" } }) {
          id
          name
          imageUrl
        }
        supportingActors: actors_via_MovieActor(
          where: { role: { eq: "supporting" } }
        ) {
          id
          name
          imageUrl
        }
        reviews: reviews_on_movie {
          id
          reviewText
          reviewDate
          rating
          user {
            id
            username
          }
        }
      }
    }
    
    # Get actor by id
    query GetActorById($id: UUID!) @auth(level: PUBLIC) {
      actor(id: $id) {
        id
        name
        imageUrl
        mainActors: movies_via_MovieActor(where: { role: { eq: "main" } }) {
          id
          title
          genre
          tags
          imageUrl
        }
        supportingActors: movies_via_MovieActor(
          where: { role: { eq: "supporting" } }
        ) {
          id
          title
          genre
          tags
          imageUrl
        }
      }
    }
    
  3. Save your changes and review the queries.

মূল টেকওয়ে:

  • movie() / actor() : GraphQL query fields for fetching a single movie or actor from the Movies or Actors table.
  • _on_ : This allows direct access to fields from an associated type that has a foreign key relationship. For example, reviews_on_movie fetches all reviews related to a specific movie.
  • _via_ : Used to navigate many-to-many relationships through a join table. For instance, actors_via_MovieActor accesses the Actor type through the MovieActor join table, and the where condition filters actors based on their role (for example, "main" or "supporting").

Test the query by inputting mock data

  1. In the Data Connect execution pane, you can test the query by inputting mock IDs, such as:
    {"id": "550e8400-e29b-41d4-a716-446655440000"}
    
  2. Click Run (local) for GetMovieById to retrieve the details about "Quantum Paradox" (the mock movie that the above ID relates to).

1b08961891e44da2.png

Integrate queries in the web app

  1. In MovieService ( app/src/lib/MovieService.tsx ), uncomment the following imports:
    import { getMovieById, GetMovieByIdData } from "@movie/dataconnect";
    import { GetActorByIdData, getActorById } from "@movie/dataconnect";
    
  2. Replace the handleGetMovieById and handleGetActorById functions with the following code:
    // Fetch movie details by ID
    export const handleGetMovieById = async (
      movieId: string
    ) => {
      try {
        const response = await getMovieById({ id: movieId });
        if (response.data.movie) {
          return response.data.movie;
        }
        return null;
      } catch (error) {
        console.error("Error fetching movie:", error);
        return null;
      }
    };
    
    // Calling generated SDK for GetActorById
    export const handleGetActorById = async (
      actorId: string
    ): Promise<GetActorByIdData["actor"] | null> => {
      try {
        const response = await getActorById({ id: actorId });
        if (response.data.actor) {
          return response.data.actor;
        }
        return null;
      } catch (error) {
        console.error("Error fetching actor:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • getMovieById / getActorById : These are auto-generated functions that call the queries you defined, retrieving detailed information for a specific movie or actor.
  • GetMovieByIdData / GetActorByIdData : These are the result types, used to display movie and actor details in the app.

কর্ম এটি দেখুন

Now, go to your web app's homepage. Click on a movie, and you'll be able to view all its details, including actors and reviews—information pulled from related tables. Similarly, clicking on an actor will display the movies they were part of.

7. Handle user authentication

In this section, you'll implement user sign-in and sign-out functionality using Firebase Authentication. You'll also use Firebase Authentication data to directly retrieve or upsert user data in Firebase DataConnect, ensuring secure user management within your app.

9890838045d5a00e.png

Implement connectors

  1. Open mutations.gql in dataconnect/movie-connector/ .
  2. Add the following mutation to create or update the current authenticated user:
    # Create or update the current authenticated user
    mutation UpsertUser($username: String!) @auth(level: USER) {
      user_upsert(
        data: {
          id_expr: "auth.uid"
          username: $username
        }
      )
    }
    

মূল টেকওয়ে:

  • id_expr: "auth.uid" : This uses auth.uid , which is provided directly by Firebase Authentication, not by the user or the app, adding an extra layer of security by ensuring the user ID is handled securely and automatically.

Fetch the current user

  1. Open queries.gql in dataconnect/movie-connector/ .
  2. Add the following query to fetch the current user:
    # Get user by ID
    query GetCurrentUser @auth(level: USER) {
      user(key: { id_expr: "auth.uid" }) {
        id
        username
        reviews: reviews_on_user {
          id
          rating
          reviewDate
          reviewText
          movie {
            id
            title
          }
        }
        favoriteMovies: favorite_movies_on_user {
          movie {
            id
            title
            genre
            imageUrl
            releaseYear
            rating
            description
            tags
            metadata: movieMetadatas_on_movie {
              director
            }
          }
        }
      }
    }
    

মূল টেকওয়ে:

  • auth.uid : This is retrieved directly from Firebase Authentication, ensuring secure access to user-specific data.
  • _on_ fields: These fields represent the join tables:
    • reviews_on_user : Fetches all reviews related to the user, including the movie's id and title .
    • favorite_movies_on_user : Retrieves all movies marked as favorites by the user, including detailed information like genre , releaseYear , rating , and metadata .

Integrate queries in the web app

  1. In MovieService ( app/src/lib/MovieService.tsx ), uncomment the following imports:
    import { upsertUser } from "@movie/dataconnect";
    import { getCurrentUser, GetCurrentUserData } from "@movie/dataconnect";
    
  2. Replace the handleAuthStateChange and handleGetCurrentUser functions with the following code:
    // Handle user authentication state changes and upsert user
    export const handleAuthStateChange = (
      auth: any,
      setUser: (user: User | null) => void
    ) => {
      return onAuthStateChanged(auth, async (user) => {
        if (user) {
          setUser(user);
          const username = user.email?.split("@")[0] || "anon";
          await upsertUser({ username });
        } else {
          setUser(null);
        }
      });
    };
    
    // Fetch current user profile
    export const handleGetCurrentUser = async (): Promise<
      GetCurrentUserData["user"] | null
    > => {
      try {
        const response = await getCurrentUser();
        return response.data.user;
      } catch (error) {
        console.error("Error fetching user profile:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • handleAuthStateChange : This function listens for authentication state changes. When a user signs in, it sets the user's data and calls the upsertUser mutation to create or update the user's information in the database.
  • handleGetCurrentUser : Fetches the current user's profile using the getCurrentUser query, which retrieves the user's reviews and favorite movies.

কর্ম এটি দেখুন

Now, click on the "Sign in with Google" button in the navbar. You can sign in using the Firebase Authentication emulator. After signing in, click on "My Profile". It will be empty for now, but you've set up the foundation for user-specific data handling in your app.

8. Implement user interactions

In this section of the codelab, you'll implement user interactions in the movie review app, specifically letting users manage their favorite movies and leave or delete reviews.

b3d0ac1e181c9de9.png

Let a user favorite a movie

In this section, you'll set up the database to let users favorite a movie.

Implement connectors

  1. Open mutations.gql in dataconnect/movie-connector/ .
  2. Add the following mutations to handle favoriting movies:
    # Add a movie to the user's favorites list
    mutation AddFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie_upsert(data: { userId_expr: "auth.uid", movieId: $movieId })
    }
    
    # Remove a movie from the user's favorites list
    mutation DeleteFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
    }
    
    

মূল টেকওয়ে:

  • userId_expr: "auth.uid" : Uses auth.uid , which is provided directly by Firebase Authentication, ensuring that only the authenticated user's data is accessed or modified.

Check if a movie is favorited

  1. Open queries.gql in dataconnect/movie-connector/ .
  2. Add the following query to check if a movie is favorited:
    query GetIfFavoritedMovie($movieId: UUID!) @auth(level: USER) {
      favorite_movie(key: { userId_expr: "auth.uid", movieId: $movieId }) {
        movieId
      }
    }
    

মূল টেকওয়ে:

  • auth.uid : Ensures secure access to user-specific data using Firebase Authentication.
  • favorite_movie : Checks the favorite_movies join table to see if a specific movie is marked as a favorite by the current user.

Integrate queries in the web app

  1. In MovieService ( app/src/lib/MovieService.tsx ), uncomment the following imports:
    import { addFavoritedMovie, deleteFavoritedMovie, getIfFavoritedMovie } from "@movie/dataconnect";
    
  2. Replace the handleAddFavoritedMovie , handleDeleteFavoritedMovie , and handleGetIfFavoritedMovie functions with the following code:
    // Add a movie to user's favorites
    export const handleAddFavoritedMovie = async (
      movieId: string
    ): Promise<void> => {
      try {
        await addFavoritedMovie({ movieId });
      } catch (error) {
        console.error("Error adding movie to favorites:", error);
        throw error;
      }
    };
    
    // Remove a movie from user's favorites
    export const handleDeleteFavoritedMovie = async (
      movieId: string
    ): Promise<void> => {
      try {
        await deleteFavoritedMovie({ movieId });
      } catch (error) {
        console.error("Error removing movie from favorites:", error);
        throw error;
      }
    };
    
    // Check if the movie is favorited by the user
    export const handleGetIfFavoritedMovie = async (
      movieId: string
    ): Promise<boolean> => {
      try {
        const response = await getIfFavoritedMovie({ movieId });
        return !!response.data.favorite_movie;
      } catch (error) {
        console.error("Error checking if movie is favorited:", error);
        return false;
      }
    };
    

মূল টেকওয়ে:

  • handleAddFavoritedMovie and handleDeleteFavoritedMovie : Use the mutations to add or remove a movie from the user's favorites securely.
  • handleGetIfFavoritedMovie : Uses the getIfFavoritedMovie query to check if a movie is marked as a favorite by the user.

কর্ম এটি দেখুন

Now, you can favorite or unfavorite movies by clicking the heart icon on the movie cards and the movie details page. Additionally, you can view your favorite movies on your profile page.

Let users leave or delete reviews

Next, you'll implement the section for managing user reviews in the app.

Implement connectors

In mutations.gql ( dataconnect/movie-connector/mutations.gql ): Add the following mutations:

# Add a review for a movie
mutation AddReview($movieId: UUID!, $rating: Int!, $reviewText: String!)
@auth(level: USER) {
  review_insert(
    data: {
      userId_expr: "auth.uid"
      movieId: $movieId
      rating: $rating
      reviewText: $reviewText
      reviewDate_date: { today: true }
    }
  )
}

# Delete a user's review for a movie
mutation DeleteReview($movieId: UUID!) @auth(level: USER) {
  review_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
}

মূল টেকওয়ে:

  • userId_expr: "auth.uid" : Ensures that reviews are associated with the authenticated user.
  • reviewDate_date: { today: true } : Automatically generates the current date for the review using DataConnect, eliminating the need for manual input.

Integrate queries in the web app

  1. In MovieService ( app/src/lib/MovieService.tsx ), uncomment the following imports:
    import { addReview, deleteReview } from "@movie/dataconnect";
    
  2. Replace the handleAddReview and handleDeleteReview functions with the following code:
    // Add a review to a movie
    export const handleAddReview = async (
      movieId: string,
      rating: number,
      reviewText: string
    ): Promise<void> => {
      try {
        await addReview({ movieId, rating, reviewText });
      } catch (error) {
        console.error("Error adding review:", error);
        throw error;
      }
    };
    
    // Delete a review from a movie
    export const handleDeleteReview = async (movieId: string): Promise<void> => {
      try {
        await deleteReview({ movieId });
      } catch (error) {
        console.error("Error deleting review:", error);
        throw error;
      }
    };
    

মূল টেকওয়ে:

  • handleAddReview : Calls the addReview mutation to add a review for the specified movie, securely linking it to the authenticated user.
  • handleDeleteReview : Uses the deleteReview mutation to remove a review for a movie by the authenticated user.

কর্ম এটি দেখুন

Users can now leave reviews for movies on the movie details page. They can also view and delete their reviews on their profile page, giving them full control over their interactions with the app.

9. Advanced filters and partial text matching

In this section, you'll implement advanced search capabilities, allowing users to search movies based on a range of ratings and release years, filter by genres and tags, perform partial text matching in titles or descriptions, and even combine multiple filters for more precise results.

ece70ee0ab964e28.png

Implement connectors

  1. Open queries.gql in dataconnect/movie-connector/ .
  2. Add the following query to support various search capabilities:
    # Search for movies, actors, and reviews
    query SearchAll(
      $input: String
      $minYear: Int!
      $maxYear: Int!
      $minRating: Float!
      $maxRating: Float!
      $genre: String!
    ) @auth(level: PUBLIC) {
      moviesMatchingTitle: movies(
        where: {
          _and: [
            { releaseYear: { ge: $minYear } }
            { releaseYear: { le: $maxYear } }
            { rating: { ge: $minRating } }
            { rating: { le: $maxRating } }
            { genre: { contains: $genre } }
            { title: { contains: $input } }
          ]
        }
      ) {
        id
        title
        genre
        rating
        imageUrl
      }
      moviesMatchingDescription: movies(
        where: {
          _and: [
            { releaseYear: { ge: $minYear } }
            { releaseYear: { le: $maxYear } }
            { rating: { ge: $minRating } }
            { rating: { le: $maxRating } }
            { genre: { contains: $genre } }
            { description: { contains: $input } }
          ]
        }
      ) {
        id
        title
        genre
        rating
        imageUrl
      }
      actorsMatchingName: actors(where: { name: { contains: $input } }) {
        id
        name
        imageUrl
      }
      reviewsMatchingText: reviews(where: { reviewText: { contains: $input } }) {
        id
        rating
        reviewText
        reviewDate
        movie {
          id
          title
        }
        user {
          id
          username
        }
      }
    }
    

মূল টেকওয়ে:

  • _and operator: Combines multiple conditions in a single query, allowing the search to be filtered by several fields like releaseYear , rating , and genre .
  • contains operator: Searches for partial text matches within fields. In this query, it looks for matches within title , description , name , or reviewText .
  • where clause: Specifies the conditions for filtering data. Each section (movies, actors, reviews) uses a where clause to define the specific criteria for the search.

Integrate queries in the web app

  1. In MovieService ( app/src/lib/MovieService.tsx ), uncomment the following imports:
    import { searchAll, SearchAllData } from "@movie/dataconnect";
    
  2. Replace the handleSearchAll function with the following code:
    // Function to perform the search using the query and filters
    export const handleSearchAll = async (
      searchQuery: string,
      minYear: number,
      maxYear: number,
      minRating: number,
      maxRating: number,
      genre: string
    ): Promise<SearchAllData | null> => {
      try {
        const response = await searchAll({
          input: searchQuery,
          minYear,
          maxYear,
          minRating,
          maxRating,
          genre,
        });
    
        return response.data;
      } catch (error) {
        console.error("Error performing search:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • handleSearchAll : This function uses the searchAll query to perform a search based on the user's input, filtering results by parameters like year, rating, genre, and partial text matches.

কর্ম এটি দেখুন

Head over to the "Advanced Search" page from the navbar in the web app. You can now search for movies, actors, and reviews using various filters and inputs, getting detailed and tailored search results.

10. Optional: Deploy to Cloud (billing required)

Now that you've worked through the local development iteration, it's time to deploy your schema, data, and queries to the server. This can be done using the Firebase Data Connect VS Code extension or the Firebase CLI.

Upgrade your Firebase pricing plan

To integrate Firebase Data Connect with Cloud SQL for PostgreSQL, your Firebase project needs to be on the pay-as-you go (Blaze) pricing plan , which means it's linked to a Cloud Billing account .

  • A Cloud Billing account requires a payment method, like a credit card.
  • If you're new to Firebase and Google Cloud, check if you're eligible for a $300 credit and a Free Trial Cloud Billing account .
  • If you're doing this codelab as part of an event, ask your organizer if there are any Cloud credits available.

To upgrade your project to the Blaze plan, follow these steps:

  1. In the Firebase console, select to upgrade your plan .
  2. Select the Blaze plan. Follow the on-screen instructions to link a Cloud Billing account to your project.
    If you needed to create a Cloud Billing account as part of this upgrade, you might need to navigate back to the upgrade flow in the Firebase console to complete the upgrade.

Connect your web app to your Firebase project

  1. Register your web app in your Firebase project using the Firebase console :
    1. Open your project, and then click Add App .
    2. Ignore the SDK setup and configuration setup for now, but make sure to copy the generated firebaseConfig object.
    7030822793e4d75b.png
  2. Replace the existing firebaseConfig in app/src/lib/firebase.tsx with the configuration you just copied from the Firebase console.
    const firebaseConfig = {
      apiKey: "API_KEY",
      authDomain: "PROJECT_ID.firebaseapp.com",
      projectId: "PROJECT_ID",
      storageBucket: "PROJECT_ID.firebasestorage.app",
      messagingSenderId: "SENDER_ID",
      appId: "APP_ID"
    };
    
  3. Build the web app: Back in VS Code, in the app folder, use Vite to build the web app for hosting deployment:
    cd app
    npm run build
    

Set up Firebase Authentication in your Firebase project

  1. Set up Firebase Authentication with Google Sign-In. 62af2f225e790ef6.png
  2. (Optional) Allow domains for Firebase Authentication using the Firebase console (for example, http://127.0.0.1 ).
    1. In the Authentication settings, go to Authorized Domains .
    2. Click "Add Domain" and include your local domain in the list.

c255098f12549886.png

Deploy with the Firebase CLI

  1. In dataconnect/dataconnect.yaml , ensure that your instance ID, database, and service ID match your project:
    specVersion: "v1alpha"
    serviceId: "your-service-id"
    location: "us-central1"
    schema:
      source: "./schema"
      datasource:
        postgresql:
          database: "your-database-id"
          cloudSql:
            instanceId: "your-instance-id"
    connectorDirs: ["./movie-connector"]
    
  2. Make sure that you have the Firebase CLI set up with your project:
    npm i -g firebase-tools
    firebase login --reauth
    firebase use --add
    
  3. In your terminal, run the following command to deploy:
    firebase deploy --only dataconnect,hosting
    
  4. Run this command to compare your schema changes:
    firebase dataconnect:sql:diff
    
  5. If the changes are acceptable, apply them with:
    firebase dataconnect:sql:migrate
    

Your Cloud SQL for PostgreSQL instance will be updated with the final deployed schema and data. You can monitor the status in the Firebase console.

You should now be able to see your app live at your-project.web.app/ . Additionally, you can click Run (Production) in the Firebase Data Connect panel, just as you did with the local emulators, to add data to the production environment.

11. Optional: Vector search with Firebase Data Connect (billing required)

In this section, you'll enable vector search in your movie review app using Firebase Data Connect. This feature allows for content-based searches, such as finding movies with similar descriptions using vector embeddings.

This step requires that you completed the last step of this codelab to deploy to Google Cloud.

4b5aca5a447d2feb.png

Update the schema to include embeddings for a field

In dataconnect/schema/schema.gql , add the descriptionEmbedding field to the Movie table:

type Movie
  # The below parameter values are generated by default with @table, and can be edited manually.
  @table {
  # implicitly calls @col to generates a column name. ex: @col(name: "movie_id")
  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  releaseYear: Int
  genre: String
  rating: Float
  description: String
  tags: [String]
  descriptionEmbedding: Vector @col(size:768) # Enables vector search
}

মূল টেকওয়ে:

  • descriptionEmbedding: Vector @col(size:768) : This field stores the semantic embeddings of movie descriptions, enabling vector-based content search in your app.

Activate Vertex AI

  1. Follow the prerequisites guide to set up Vertex AI APIs from Google Cloud. This step is essential to support the embedding generation and vector search functionality.
  2. Re-deploy your schema to activate pgvector and vector search by clicking on "Deploy to Production" using the Firebase Data Connect VS Code extension.

Populate the database with embeddings

  1. Open the dataconnect folder in VS Code.
  2. Click Run(local) in optional_vector_embed.gql to populate your database with embeddings for the movies.

b858da780f6ec103.png

Add a vector search query

In dataconnect/movie-connector/queries.gql , add the following query to perform vector searches:

# Search movie descriptions using L2 similarity with Vertex AI
query SearchMovieDescriptionUsingL2Similarity($query: String!)
@auth(level: PUBLIC) {
  movies_descriptionEmbedding_similarity(
    compare_embed: { model: "textembedding-gecko@003", text: $query }
    method: L2
    within: 2
    limit: 5
  ) {
    id
    title
    description
    tags
    rating
    imageUrl
  }
}

মূল টেকওয়ে:

  • compare_embed : Specifies the embedding model ( textembedding-gecko@003 ) and the input text ( $query ) for comparison.
  • method : Specifies the similarity method ( L2 ), which represents the Euclidean distance.
  • within : Limits the search to movies with an L2 distance of 2 or less, focusing on close content matches.
  • limit : Restricts the number of results returned to 5.

Implement the vector search function in your app

Now that the schema and query are set up, integrate the vector search into your app's service layer. This step allows you to call the search query from your web app.

  1. In app/src/lib/ MovieService.ts , uncomment the following imports from the SDKs, this will work like any other query.
    import {
      searchMovieDescriptionUsingL2similarity,
      SearchMovieDescriptionUsingL2similarityData,
    } from "@movie/dataconnect";
    
  2. Add the following function to integrate vector-based search into the app:
    // Perform vector-based search for movies based on description
    export const searchMoviesByDescription = async (
      query: string
    ): Promise<
      | SearchMovieDescriptionUsingL2similarityData["movies_descriptionEmbedding_similarity"]
      | null
    > => {
      try {
        const response = await searchMovieDescriptionUsingL2similarity({ query });
        return response.data.movies_descriptionEmbedding_similarity;
      } catch (error) {
        console.error("Error fetching movie descriptions:", error);
        return null;
      }
    };
    

মূল টেকওয়ে:

  • searchMoviesByDescription : This function calls the searchMovieDescriptionUsingL2similarity query, passing the input text to perform a vector-based content search.

কর্ম এটি দেখুন

Navigate to the "Vector Search" section in the navbar and type in phrases like "romantic and modern". You'll see a list of movies that match the content you're searching for, or, go into the movie details page of any movie, and check out the similar movies section at the bottom of the page.

7b71f1c75633c1be.png

12. উপসংহার

Congratulations, you should be able to use the web app! If you want to play with your own movie data, don't worry, insert your own data using the Firebase Data Connect extension by mimicking the _insert.gql files, or add them through the Data Connect execution pane in VS Code.

আরও জানুন