Когда текущий пользователь нажимает кнопку «Мне нравится», я запускаю транзакцию, но хочу проверить, понравился ли пользователю этот пост или нет. Если пользователю уже понравилась запись, я хочу уменьшить likeCounter и изменить внешний вид likeButton, в противном случае я хочу увеличить его.
Моя база данных Firestore с использованием collection.document.collection.document .... stuff :
"posts":
- "post1":
- uid: user1
- likeCount: 2
- caption: "caption1"
- "likes":
- "user1":
- value: true
- "user2":
- value: true
- "post2":
- uid: user1
- likeCount: 1
- caption: "caption2"
- "likes":
- "user1":
- value: true
- "user4":
- value: true
- "post3":
- uid: user2
- likeCount: 3
- caption: "caption3"
- "likes":
- "user1":
- value: true
- "user3":
- value: true
- "user4":
- value: true
Это моя функция incrementLikes (), которая вызывается всякий раз, когда пользователь нажимает на likeButton
func incrementLikes() {
let ref = Api.Post.REF_POSTS.document(self.post!.id!)
Firestore.firestore().runTransaction({ (transaction, errorPointer) -> Any? in
let sfDocument: DocumentSnapshot
do {
try sfDocument = transaction.getDocument(ref)
} catch let fetchError as NSError {
errorPointer?.pointee = fetchError
return nil
}
guard let oldLikes = sfDocument.data()?["likeCount"] as? Int else {
let error = NSError(
domain: "AppErrorDomain",
code: -1,
userInfo: [
NSLocalizedDescriptionKey: "Unable to retrieve likes from snapshot \(sfDocument)"
]
)
errorPointer?.pointee = error
return nil
}
transaction.updateData(["likeCount": oldLikes - 1], forDocument: ref)
if let currentUser = Auth.auth().currentUser {
ref.collection(K.likesCollection).document(currentUser.uid).delete()
}
DispatchQueue.main.async {
self.likeImageView.image = UIImage(systemName: K.heart)
self.likeImageView.tintColor = UIColor.black
}
return nil
}) { (object, error) in
if let error = error {
print("Transaction failed: \(error)")
} else {
print("Transaction successfully committed!")
}
}
}
Я хочу знать, структурирована ли моя база данных правильно, наиболее масштабируемая путь, а также где и как я должен разместить наблюдателя, чтобы увидеть, понравился ли пользователю этот пост или нет.