লক্ষ্য
এই কোডল্যাবে আপনি আইওএস-এ সুইফটে একটি ফায়ারস্টোর-ব্যাক রেস্তোঁরা সুপারিশ অ্যাপ্লিকেশন তৈরি করবেন। আপনি কীভাবে শিখবেন:
- কোনও iOS অ্যাপ্লিকেশন থেকে ফায়ার স্টোরে ডেটা পড়ুন এবং লিখুন
- রিয়েলটাইমে ফায়ার স্টোর ডেটার পরিবর্তনগুলি শুনুন
- ফায়ার স্টোর ডেটা সুরক্ষিত করতে ফায়ারবেস প্রমাণীকরণ এবং সুরক্ষা বিধিগুলি ব্যবহার করুন
- জটিল ফায়ারস্টোর প্রশ্ন লিখুন
পূর্বশর্ত
এই কোডল্যাবটি শুরু করার আগে নিশ্চিত হয়ে নিন যে আপনি ইনস্টল করেছেন:
- এক্সকোড সংস্করণ 8.3 (বা উচ্চতর)
- কোকোপডগুলি 1.2.1 (বা উচ্চতর)
প্রকল্পে ফায়ারবেস যুক্ত করুন
- ফায়ারবেস কনসোলে যান।
- নতুন প্রকল্প তৈরি করুন এবং আপনার প্রকল্পের নাম দিন "ফায়ার স্টোর আইওএস কোডল্যাব" Select
কোডটি ডাউনলোড করুন
নমুনা প্রকল্পটি ক্লোন করে এবং প্রকল্প ডিরেক্টরিতে pod update
চালিয়ে শুরু করুন:
git clone https://github.com/firebase/friendlyeats-ios cd friendlyeats-ios pod update
এক্সকোডে FriendlyEats.xcworkspace
খুলুন এবং এটি চালান (সিএমডি + আর)। অ্যাপ্লিকেশনটি সঠিকভাবে সংকলন করা উচিত এবং তাত্ক্ষণিকভাবে লঞ্চের সময় ক্র্যাশ করা উচিত, যেহেতু এটি একটি GoogleService-Info.plist
ফাইল হারিয়েছে। আমরা পরবর্তী পদক্ষেপে এটি সংশোধন করব।
ফায়ারবেস সেট আপ করুন
একটি নতুন ফায়ার স্টোর প্রকল্প তৈরি করতে ডকুমেন্টেশন অনুসরণ করুন । আপনি যখন আপনার প্রকল্পটি পেয়ে GoogleService-Info.plist
কনসোল থেকে আপনার প্রকল্পের GoogleService-Info.plist
সার্ভিস GoogleService-Info.plist
ফাইলটি ডাউনলোড করুন এবং এটিকে Xcode প্রকল্পের GoogleService-Info.plist
টেনে আনুন। অ্যাপটিটি সঠিকভাবে কনফিগার করেছে এবং আর আর লঞ্চে ক্রাশ হবে না তা নিশ্চিত করতে আবার প্রকল্পটি চালান। লগ ইন করার পরে, আপনাকে নীচের উদাহরণের মতো একটি ফাঁকা স্ক্রিন দেখতে হবে। আপনি যদি লগ ইন করতে অক্ষম হন তবে নিশ্চিত হয়ে নিন যে আপনি প্রমাণীকরণের অধীনে ফায়ারবেস কনসোলে ইমেল / পাসওয়ার্ড সাইন-ইন পদ্ধতি সক্ষম করেছেন।
এই বিভাগে আমরা ফায়ার স্টোরে কিছু ডেটা লিখব যাতে আমরা অ্যাপ্লিকেশন UI তৈরি করতে পারি। এটি ফায়ারবেস কনসোলের মাধ্যমে ম্যানুয়ালি করা যেতে পারে তবে একটি প্রাথমিক ফায়ারস্টোর রচনা প্রদর্শন করার জন্য আমরা অ্যাপ্লিকেশনটিতে এটি করব।
আমাদের অ্যাপ্লিকেশনটির প্রধান মডেল অবজেক্টটি একটি রেস্তোঁরা। ফায়ার স্টোর ডেটা ডকুমেন্টস, সংগ্রহ এবং উপ-সংগ্রহগুলিতে বিভক্ত। আমরা প্রতিটি রেস্তোঁরাগুলিকে একটি শীর্ষ স্তরের সংগ্রহগুলিতে একটি ডকুমেন্ট হিসাবে restaurants
। আপনি Firestore তথ্য মডেল সম্পর্কে আরো জানতে চান তাহলে, নথি এবং সংগ্রহের সম্পর্কে পড়তে ডকুমেন্টেশন ।
ফায়ার স্টোরে ডেটা যুক্ত করার আগে আমাদের রেস্তোঁরা সংগ্রহে একটি রেফারেন্স পাওয়া দরকার। RestaurantsTableViewController.didTapPopulateButton(_:)
পদ্ধতিতে লুপের জন্য নিম্নলিখিতটি অন্তর্ভুক্ত করুন।
এখন আমাদের কাছে সংগ্রহের রেফারেন্স রয়েছে আমরা কিছু ডেটা লিখতে পারি write কোডটি যোগ করার শেষ লাইনের ঠিক পরে নিম্নলিখিতটি যুক্ত করুন:
let collection = Firestore.firestore().collection("restaurants")
// ====== ADD THIS ======
let restaurant = Restaurant(
name: name,
category: category,
city: city,
price: price,
ratingCount: 0,
averageRating: 0
)
collection.addDocument(data: restaurant.dictionary)
উপরের কোডটি রেস্তোঁরা সংগ্রহে একটি নতুন দস্তাবেজ যুক্ত করে। ডকুমেন্টের ডেটা একটি অভিধান থেকে আসে, যা আমরা একটি রেস্তোরাঁ স্ট্রাক্ট থেকে পাই।
আমরা প্রায় সেখানেই রয়েছি Fire ফায়ার স্টোরে নথি লেখার আগে আমাদের ফায়ারস্টোরের সুরক্ষা বিধিগুলি খুলতে হবে এবং আমাদের ডাটাবেসের কোন অংশগুলি ব্যবহারকারীদের দ্বারা লিখিত হতে হবে তা বর্ণনা করতে হবে। আপাতত, আমরা কেবলমাত্র প্রমাণীকৃত ব্যবহারকারীদেরই পুরো ডাটাবেসটি পড়তে এবং লেখার অনুমতি দেব। এটি একটি প্রোডাকশন অ্যাপ্লিকেশনটির জন্য কিছুটা অনুমোদিত, তবে অ্যাপ্লিকেশন-বিল্ডিং প্রক্রিয়া চলাকালীন আমরা পর্যাপ্ত পরিমাণে স্বাচ্ছন্দ্য চাই যাতে পরীক্ষার সময় আমরা অবিচ্ছিন্নভাবে প্রমাণীকরণের সমস্যাগুলিতে না চলে যাই। এই কোডল্যাবের শেষে আমরা কীভাবে আপনার সুরক্ষা বিধিগুলি কঠোর করতে হবে এবং অযৌক্তিকভাবে পড়ার এবং লেখার সম্ভাবনা সীমাবদ্ধ করার বিষয়ে কথা বলব।
ফায়ারবেস কনসোলের বিধি ট্যাবে নিম্নলিখিত বিধিগুলি যুক্ত করুন এবং তারপরে প্রকাশ ক্লিক করুন ।
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // // WARNING: These rules are insecure! We will replace them with // more secure rules later in the codelab // allow read, write: if request.auth != null; } } }
আমরা পরে সুরক্ষা বিধিগুলি নিয়ে বিস্তারিত আলোচনা করব, তবে আপনি যদি তাড়াহুড়ো করেন তবে সুরক্ষা বিধিগুলির ডকুমেন্টেশনটি একবার দেখুন ।
অ্যাপ্লিকেশনটি চালান এবং সাইন ইন করুন Then তারপরে উপরের বাম দিকে " পপুলেট " বোতামটি আলতো চাপুন, যা রেস্তোঁরাার দলিলগুলির একটি ব্যাচ তৈরি করবে, যদিও আপনি এটি অ্যাপটিতে এখনও দেখতে পাবেন না।
এরপরে, ফায়ারবেস কনসোলের ফায়ারস্টোর ডেটা ট্যাবে নেভিগেট করুন। আপনার এখন রেস্তোঁরা সংগ্রহে নতুন এন্ট্রি দেখতে হবে:
অভিনন্দন, আপনি একটি আইওএস অ্যাপ্লিকেশন থেকে ফায়ারস্টোরে ডেটা লিখেছেন! পরবর্তী বিভাগে আপনি কীভাবে ফায়ারস্টোর থেকে ডেটা পুনরুদ্ধার করবেন এবং অ্যাপটিতে এটি প্রদর্শন করবেন তা শিখবেন।
এই বিভাগে আপনি কীভাবে ফায়ার স্টোর থেকে ডেটা পুনরুদ্ধার করবেন এবং অ্যাপটিতে এটি প্রদর্শন করবেন তা শিখবেন। দুটি মূল পদক্ষেপ একটি ক্যোয়ারী তৈরি করছে এবং একটি স্ন্যাপশট শ্রোতা যুক্ত করছে। এই শ্রোতা ক্যোয়ারীর সাথে মেলে এমন সমস্ত বিদ্যমান ডেটা সম্পর্কে অবহিত করা হবে এবং রিয়েল টাইমে আপডেটগুলি গ্রহণ করবে।
প্রথমে আসুন এমন ক্যোয়ারীটি তৈরি করুন যা রেস্তোঁরাগুলির ডিফল্ট, খণ্ডিত তালিকা সরবরাহ করবে। রেস্তোঁরাগুলি টেবিলভিউ কন্ট্রোলআরবেসকিউয়ারি RestaurantsTableViewController.baseQuery()
এর বাস্তবায়নটি একবার দেখুন:
return Firestore.firestore().collection("restaurants").limit(to: 50)
এই ক্যোয়ারী "রেস্তোঁরাগুলি" নামে শীর্ষ স্তরের সংগ্রহের 50 টি পর্যন্ত রেস্তোঁরা উদ্ধার করে। এখন আমাদের কাছে একটি প্রশ্ন রয়েছে, ফায়ারস্টোর থেকে আমাদের অ্যাপ্লিকেশনটিতে ডেটা লোড করার জন্য আমাদের একটি স্ন্যাপশট শ্রোতা সংযুক্ত করতে হবে। stopObserving()
এ কল করার ঠিক পরে RestaurantsTableViewController.observeQuery()
stopObserving()
পদ্ধতিতে নিম্নলিখিত কোডটি যুক্ত করুন।
listener = query.addSnapshotListener { [unowned self] (snapshot, error) in
guard let snapshot = snapshot else {
print("Error fetching snapshot results: \(error!)")
return
}
let models = snapshot.documents.map { (document) -> Restaurant in
if let model = Restaurant(dictionary: document.data()) {
return model
} else {
// Don't use fatalError here in a real app.
fatalError("Unable to initialize type \(Restaurant.self) with dictionary \(document.data())")
}
}
self.restaurants = models
self.documents = snapshot.documents
if self.documents.count > 0 {
self.tableView.backgroundView = nil
} else {
self.tableView.backgroundView = self.backgroundView
}
self.tableView.reloadData()
}
উপরের কোডটি ফায়ারস্টোর থেকে সংগ্রহ সংগ্রহ করে এবং এটি স্থানীয়ভাবে একটি অ্যারেতে সঞ্চয় করে। addSnapshotListener(_:)
কলটি addSnapshotListener(_:)
একটি স্ন্যাপশট শ্রোতাকে যুক্ত করে যা সার্ভারে ডেটা পরিবর্তনের সময় ভিউ কন্ট্রোলারটিকে আপডেট করবে। আমরা স্বয়ংক্রিয়ভাবে আপডেটগুলি পাই এবং ম্যানুয়ালি পরিবর্তনগুলি ঠেকাতে হবে না। মনে রাখবেন, এই স্ন্যাপশট শ্রোতাকে সার্ভার-সাইড পরিবর্তনের ফলাফল হিসাবে যে কোনও সময় ডাকা যেতে পারে তাই আমাদের অ্যাপ্লিকেশন পরিবর্তনগুলি পরিচালনা করতে পারে এটি গুরুত্বপূর্ণ।
আমাদের অভিধানগুলিকে স্ট্রাক্টগুলিতে ম্যাপিংয়ের পরে ( Restaurant.swift
), ডেটা প্রদর্শন করা কয়েকটি দেখার বৈশিষ্ট্য নির্ধারণের বিষয়। RestaurantTableViewCell.populate(restaurant:)
RestaurantsTableViewController.swift
RestaurantTableViewCell.populate(restaurant:)
নিম্নলিখিত লাইনগুলি যুক্ত করুন।
nameLabel.text = restaurant.name
cityLabel.text = restaurant.city
categoryLabel.text = restaurant.category
starsView.rating = Int(restaurant.averageRating.rounded())
priceLabel.text = priceString(from: restaurant.price)
এই tableView(_:cellForRowAtIndexPath:)
পদ্ধতিটি টেবিল ভিউ ডেটা উত্সের টেবিল ভিউ tableView(_:cellForRowAtIndexPath:)
পদ্ধতি থেকে কল করা হয়, যা পৃথক সারণী দর্শন কোষের আগে থেকে মান ধরণের সংগ্রহ ম্যাপিংয়ের যত্ন নেয়।
অ্যাপ্লিকেশনটি আবার চালনা করুন এবং যাচাই করুন যা আমরা কনসোলে আগে যে রেস্তোঁরাগুলি দেখেছি সেগুলি এখন সিমুলেটর বা ডিভাইসে দৃশ্যমান। আপনি যদি এই বিভাগটি সফলভাবে শেষ করেছেন তবে আপনার অ্যাপ্লিকেশন এখন ক্লাউড ফায়ারস্টোরের সাথে ডেটা পড়ছে এবং লিখছে!
বর্তমানে আমাদের অ্যাপ্লিকেশন রেস্তোঁরাগুলির একটি তালিকা প্রদর্শন করে, তবে তাদের প্রয়োজনের ভিত্তিতে ব্যবহারকারীর পক্ষে ফিল্টার করার কোনও উপায় নেই। এই বিভাগে আপনি ফায়ারস্টোর সক্ষম করতে ফায়ারস্টোরের উন্নত অনুসন্ধানগুলি ব্যবহার করবেন।
সমস্ত ডিম সিম রেস্তোঁরা আনার জন্য এখানে একটি সাধারণ ক্যোয়ারির উদাহরণ:
let filteredQuery = query.whereField("category", isEqualTo: "Dim Sum")
এর নাম থেকেই বোঝা যায়, যেখানে whereField(_:isEqualTo:)
পদ্ধতিটি আমাদের ক্যোয়ারীটিকে কেবলমাত্র সংগ্রহের সদস্যদের ডাউনলোড করতে সক্ষম করবে যার ক্ষেত্রগুলি আমাদের নির্ধারিত বিধিনিষেধ পূরণ করে। এই ক্ষেত্রে এটি কেবলমাত্র রেস্তোঁরাগুলিই ডাউনলোড করবে যেখানে category
"Dim Sum"
।
এই অ্যাপটিতে ব্যবহারকারী "সান ফ্রান্সিসকোতে পিজ্জা" বা "জনপ্রিয়তার দ্বারা অর্জিত লস অ্যাঞ্জেলেসে সীফুড" এর মতো নির্দিষ্ট প্রশ্ন তৈরি করতে একাধিক ফিল্টার চেইন করতে পারেন।
RestaurantsTableViewController.swift
query(withCategory:city:price:sortBy:)
খুলুন এবং query(withCategory:city:price:sortBy:)
মাঝখানে নিম্নলিখিত কোড ব্লকটি যুক্ত করুন query(withCategory:city:price:sortBy:)
:
if let category = category, !category.isEmpty {
filtered = filtered.whereField("category", isEqualTo: category)
}
if let city = city, !city.isEmpty {
filtered = filtered.whereField("city", isEqualTo: city)
}
if let price = price {
filtered = filtered.whereField("price", isEqualTo: price)
}
if let sortBy = sortBy, !sortBy.isEmpty {
filtered = filtered.order(by: sortBy)
}
উপরের স্নিপেটে একাধিক যুক্ত করা হয়েছে whereField
ব্যবহারকারীর ইনপুটের ভিত্তিতে একক যৌগিক ক্যোয়ারী তৈরি করতে whereField
এবং order
ক্লজগুলি যুক্ত করা হয়েছে। এখন আমাদের ক্যোয়ারী কেবল এমন রেস্তোঁরাগুলিই ফিরিয়ে দেবে যা ব্যবহারকারীর প্রয়োজনীয়তার সাথে মেলে।
আপনার প্রকল্পটি চালান এবং আপনি মূল্য, শহর এবং বিভাগ দ্বারা ফিল্টার করতে পারবেন যাচাই করুন (বিভাগ এবং শহরের নামগুলি ঠিক টাইপ করতে ভুলবেন না) make পরীক্ষার সময় আপনি আপনার লগগুলিতে ত্রুটি দেখতে পাবেন যা দেখতে এই জাতীয় দেখাচ্ছে:
Error fetching snapshot results: Error Domain=io.grpc Code=9 "The query requires an index. You can create it here: https://console.firebase.google.com/project/testapp-5d356/database/firestore/indexes?create_index=..." UserInfo={NSLocalizedDescription=The query requires an index. You can create it here: https://console.firebase.google.com/project/project-id/database/firestore/indexes?create_index=...}
এটি কারণ ফায়ারস্টোর বেশিরভাগ যৌগিক প্রশ্নের জন্য সূচীগুলির প্রয়োজন। প্রশ্নগুলিতে সূচকের প্রয়োজনীয়তা ফায়ারস্টোরকে স্কেল দ্রুত রাখে। ত্রুটি বার্তাটি থেকে লিঙ্কটি খোলার সাথে সাথে সঠিকভাবে পরামিতিগুলি পূরণ করে ফায়ারবেস কনসোলে স্বয়ংক্রিয়ভাবে সূচি তৈরির UI খুলবে Fire ফায়ারস্টোরের সূচীগুলি সম্পর্কে আরও জানতে, ডকুমেন্টেশনটি দেখুন ।
এই বিভাগে, আমরা ব্যবহারকারীদের রেস্তোঁরাগুলিতে পর্যালোচনা জমা দেওয়ার ক্ষমতা যুক্ত করব। এখনও অবধি, আমাদের সমস্ত লেখাই পারমাণবিক এবং তুলনামূলক সহজ। যদি সেগুলির মধ্যে কোনও ত্রুটিযুক্ত হয় তবে আমরা সম্ভবত ব্যবহারকারীকে তাদের পুনরায় চেষ্টা করতে বা স্বয়ংক্রিয়ভাবে তাদের আবার চেষ্টা করার জন্য অনুরোধ করব।
রেস্তোঁরায় একটি রেটিং যুক্ত করার জন্য আমাদের একাধিক পাঠ্য এবং লেখার সমন্বয় করতে হবে। প্রথমে পর্যালোচনাটি নিজে জমা দিতে হবে এবং তারপরে রেস্তোঁরাটির রেটিং গণনা এবং গড় রেটিং আপডেট করতে হবে। যদি এইগুলির মধ্যে একটি ব্যর্থ হয় তবে অন্যটি না হয়ে যায় তবে আমরা একটি বেমানান অবস্থায় রেখে এসেছি যেখানে আমাদের ডাটাবেসের একটি অংশের ডেটা অন্য উপাত্তের সাথে মেলে না।
সৌভাগ্যক্রমে, ফায়ার স্টোর লেনদেনের কার্যকারিতা সরবরাহ করে যা আমাদের একক পারমাণবিক ক্রিয়াকলাপে একাধিক পাঠ এবং লেখার কাজ সম্পাদন করতে দেয়, এটি নিশ্চিত করে যে আমাদের ডেটা ধারাবাহিক থাকবে।
RestaurantDetailViewController.reviewController(_:didSubmitFormWithReview:)
সমস্ত চলমান ঘোষণার নীচে নিম্নলিখিত কোড যুক্ত করুন।
let firestore = Firestore.firestore()
firestore.runTransaction({ (transaction, errorPointer) -> Any? in
// Read data from Firestore inside the transaction, so we don't accidentally
// update using stale client data. Error if we're unable to read here.
let restaurantSnapshot: DocumentSnapshot
do {
try restaurantSnapshot = transaction.getDocument(reference)
} catch let error as NSError {
errorPointer?.pointee = error
return nil
}
// Error if the restaurant data in Firestore has somehow changed or is malformed.
guard let data = restaurantSnapshot.data(),
let restaurant = Restaurant(dictionary: data) else {
let error = NSError(domain: "FireEatsErrorDomain", code: 0, userInfo: [
NSLocalizedDescriptionKey: "Unable to write to restaurant at Firestore path: \(reference.path)"
])
errorPointer?.pointee = error
return nil
}
// Update the restaurant's rating and rating count and post the new review at the
// same time.
let newAverage = (Float(restaurant.ratingCount) * restaurant.averageRating + Float(review.rating))
/ Float(restaurant.ratingCount + 1)
transaction.setData(review.dictionary, forDocument: newReviewReference)
transaction.updateData([
"numRatings": restaurant.ratingCount + 1,
"avgRating": newAverage
], forDocument: reference)
return nil
}) { (object, error) in
if let error = error {
print(error)
} else {
// Pop the review controller on success
if self.navigationController?.topViewController?.isKind(of: NewReviewViewController.self) ?? false {
self.navigationController?.popViewController(animated: true)
}
}
}
আপডেট ব্লকের ভিতরে, লেনদেনের অবজেক্টটি ব্যবহার করে আমরা যে সমস্ত ক্রিয়াকলাপ করি তা ফায়ার স্টোর দ্বারা একক পরমাণু আপডেট হিসাবে বিবেচিত হবে। যদি সার্ভারে আপডেট ব্যর্থ হয় তবে ফায়ার স্টোর স্বয়ংক্রিয়ভাবে কয়েকবার এটি চেষ্টা করবে। এর অর্থ হ'ল আমাদের ত্রুটির শর্তটি সম্ভবত একটি বারবার ত্রুটি ঘটছে, উদাহরণস্বরূপ যদি ডিভাইসটি সম্পূর্ণ অফলাইন থাকে বা ব্যবহারকারী যে পথে তারা লেখার চেষ্টা করছেন তাতে লেখার জন্য অনুমোদিত না হয়।
আমাদের অ্যাপ্লিকেশন ব্যবহারকারীরা আমাদের ডাটাবেসে প্রতিটি টুকরো ডেটা পড়তে এবং লিখতে সক্ষম হবেন না। উদাহরণস্বরূপ, প্রত্যেকের জন্য রেস্তোঁরাটির রেটিংগুলি দেখতে সক্ষম হওয়া উচিত, তবে কেবলমাত্র একজন অনুমোদিত ব্যবহারকারীকেই রেটিং পোস্ট করার অনুমতি দেওয়া উচিত। এটি ক্লায়েন্টে ভাল কোড লিখতে যথেষ্ট নয়, সম্পূর্ণ সুরক্ষিত হওয়ার জন্য আমাদের ব্যাকএন্ডে আমাদের ডেটা সুরক্ষা মডেলটি নির্দিষ্ট করতে হবে। এই বিভাগে আমরা কীভাবে আমাদের ডেটা সুরক্ষিত করতে ফায়ারবেস সুরক্ষা বিধিগুলি ব্যবহার করব তা শিখব।
প্রথমে কোডলব শুরুতে আমরা যে সুরক্ষা বিধিগুলি লিখেছিলাম সেগুলি আরও গভীরভাবে দেখি। ফায়ারবেস কনসোলটি খুলুন এবং ফায়ারস্টোর ট্যাবে ডেটাবেস> বিধিগুলিতে নেভিগেট করুন।
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
// Only authenticated users can read or write data
allow read, write: if request.auth != null;
}
}
}
উপরের বিধিগুলিতে request
পরিবর্তনশীল সমস্ত নিয়মে একটি বৈশ্বিক পরিবর্তনশীল এবং আমরা যে শর্তযুক্ত যুক্ত করেছি তা নিশ্চিত করে যে ব্যবহারকারীরা কিছু করার অনুমতি দেওয়ার আগে অনুরোধটি অনুমোদনপ্রাপ্ত। এটি অননুমোদিত ব্যবহারকারীদের আপনার ডেটাতে অননুমোদিত পরিবর্তনগুলি করতে ফায়ারস্টোর এপিআই ব্যবহার করা থেকে বিরত রাখে। এটি একটি ভাল শুরু, তবে আমরা আরও বেশি শক্তিশালী জিনিসগুলি করতে ফায়ারস্টোর বিধিগুলি ব্যবহার করতে পারি।
আসুন পর্যালোচনা লেখাগুলি সীমাবদ্ধ রাখুন যাতে পর্যালোচনার ব্যবহারকারীর আইডি অবশ্যই প্রমাণীকৃত ব্যবহারকারীর আইডির সাথে মেলে। এটি নিশ্চিত করে যে ব্যবহারকারীরা একে অপরের ছদ্মবেশ তৈরি করতে এবং প্রতারণামূলক পর্যালোচনাগুলি ছাড়তে পারে না। নিম্নলিখিতগুলির সাথে আপনার সুরক্ষা বিধিগুলি প্রতিস্থাপন করুন:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /restaurants/{any}/ratings/{rating} {
// Users can only write ratings with their user ID
allow read;
allow write: if request.auth != null
&& request.auth.uid == request.resource.data.userId;
}
match /restaurants/{any} {
// Only authenticated users can read or write data
allow read, write: if request.auth != null;
}
}
}
প্রথম ম্যাচের বিবৃতিটি restaurants
সংগ্রহের সাথে সম্পর্কিত যে কোনও দস্তাবেজের নামকরণের ratings
উপকোলিকেশনের সাথে মেলে। শর্তসাপেক্ষে allow write
যদি পর্যালোচনাটির ব্যবহারকারীর আইডি ব্যবহারকারীর সাথে মেলে না তবে কোনও পর্যালোচনা জমা দেওয়া থেকে বাধা দেয়। দ্বিতীয় ম্যাচের বিবৃতিটি কোনও প্রমাণীকৃত ব্যবহারকারীকে ডাটাবেসে রেস্তোঁরা পড়তে এবং লেখার অনুমতি দেয়।
এটি আমাদের পর্যালোচনার জন্য সত্যই ভাল কাজ করে, যেহেতু আমরা আমাদের অ্যাপ্লিকেশনটিতে এর আগে যে লিখিত অন্তর্নিহিত গ্যারান্টিটি স্পষ্টভাবে উল্লেখ করার জন্য সুরক্ষা বিধিগুলি ব্যবহার করেছি - ব্যবহারকারীরা কেবল তাদের নিজস্ব পর্যালোচনা লিখতে পারেন। যদি আমরা পর্যালোচনাগুলির জন্য কোনও সম্পাদনা যুক্ত করতে বা ফাংশন মুছতে হয়, এই একই নিয়মের সঠিক সেটগুলি ব্যবহারকারীদের অন্যান্য ব্যবহারকারীদের পর্যালোচনাগুলি সংশোধন বা মুছতে বাধা দেবে। তবে ফায়ারস্টোর বিধিগুলি সম্পূর্ণ নথির চেয়ে ডকুমেন্টের মধ্যে স্বতন্ত্র ক্ষেত্রগুলিতে লেখার সীমাবদ্ধ করতে আরও দানাদার ফ্যাশনে ব্যবহার করা যেতে পারে। ব্যবহারকারীরা কেবলমাত্র রেটিং, গড় রেটিং এবং কোনও রেস্তোঁরার রেটিংয়ের সংখ্যা আপডেট করার অনুমতি দিতে এটি ব্যবহার করতে পারি, কোনও রেস্তোরাঁর নাম বা অবস্থান পরিবর্তন করে এমন দূষিত ব্যবহারকারীর সম্ভাবনা অপসারণ করে।
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /restaurants/{restaurant} {
match /ratings/{rating} {
allow read: if request.auth != null;
allow write: if request.auth != null
&& request.auth.uid == request.resource.data.userId;
}
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null
&& request.resource.data.name == resource.data.name
&& request.resource.data.city == resource.data.city
&& request.resource.data.price == resource.data.price
&& request.resource.data.category == resource.data.category;
}
}
}
এখানে আমরা আমাদের লেখার অনুমতি তৈরি এবং আপডেটে ভাগ করেছি যাতে কোন অপারেশনের অনুমতি দেওয়া উচিত সে সম্পর্কে আমরা আরও নির্দিষ্টভাবে বলতে পারি। যে কোনও ব্যবহারকারীর ডাটাবেজে রেস্তোঁরাগুলি লিখতে পারে, কোডলব শুরুতে আমরা তৈরি করা পপুলেট বোতামটির কার্যকারিতা সংরক্ষণ করে, তবে একবার রেস্তোঁরাটির নাম, অবস্থান, দাম এবং বিভাগটি লেখা গেলে এটি পরিবর্তন করা যায় না। আরও সুনির্দিষ্টভাবে, শেষ নিয়মে একই নাম, শহর, দাম এবং ডাটাবেসে ইতিমধ্যে বিদ্যমান ক্ষেত্রগুলির বিভাগ বজায় রাখতে কোনও রেস্তোঁরা আপডেটের অপারেশন প্রয়োজন।
সুরক্ষা বিধি দিয়ে আপনি কী করতে পারেন সে সম্পর্কে আরও জানতে, ডকুমেন্টেশনটি একবার দেখুন।
এই কোডল্যাবে আপনি কীভাবে ফায়ারস্টোরের সাথে বুনিয়াদি এবং উন্নত পড়া এবং লেখার পাশাপাশি সুরক্ষা বিধি দ্বারা ডেটা অ্যাক্সেস সুরক্ষিত রাখতে শিখলেন। আপনি codelab-complete
শাখায় পুরো সমাধানটি খুঁজে পেতে পারেন।
ফায়ার স্টোর সম্পর্কে আরও জানতে, নিম্নলিখিত সংস্থানগুলি দেখুন: