Схема:
Код: Выделить всё
Firestore-root
|
--- users (collection)
| |
| --- $userOneUid (document)
| | |
| | --- //User data
| |
| --- $userTwoUid (document)
| | |
| | --- //User data
| |
| --- $userThreeUid (document)
| |
| --- //User data
|
--- requests (collection)
|
--- $userOneUid (document)
| |
| --- ownRequests (map)
| | |
| | --- $userTwoUid
| | |
| | --- displayName: "User Two"
| | |
| | --- photoUrl: "https://"
| | |
| | --- status: "requested"
| |
| --- friendRequests (map)
| | |
| | --- $userThreeUid
| | |
| | --- displayName: "User Three"
| | |
| | --- photoUrl: "https://"
| | |
| | --- status: "requested"
| |
| --- allFriends (map)
| |
| --- //All friends
|
--- $userTwoUid (document)
| |
| --- friendRequests (map)
| |
| --- $userOneUid
| |
| --- displayName: "User One"
| |
| --- photoUrl: "https://"
| |
| --- status: "requested"
|
--- $userThreeUid (document)
|
--- ownRequests (map)
|
--- $userOneUid
|
--- displayName: "User One"
|
--- photoUrl: "https://"
|
--- status: "requested"

Код: Выделить всё
# accept/reject friend request
@router.post("/accept_friend_request")
def accept_friend_request(friend_req: FriendRequest): # pass req uid and accept uid
requester_ref = db.collection('Requests').document(friend_req.requester)
recipient_ref = db.collection('Requests').document(friend_req.recipient)
transaction = db.transaction()
try:
transaction = db.transaction()
accept_friend_request_transaction(transaction, requester_ref, recipient_ref, friend_req)
transaction.commit()
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@firestore.transactional
def accept_friend_request_transaction(transaction: Transaction, requester_ref, recipient_ref, friend_req: FriendRequest):
requester_doc = requester_ref.get(transaction=transaction)
recipient_doc = recipient_ref.get(transaction=transaction)
if requester_doc.exists and recipient_doc.exists:
transaction.update(recipient_ref, {
f'allFriends.{friend_req.requester}': 'true'
})
transaction.update(requester_ref, {
f'allFriends.{friend_req.recipient}': 'true'
})
transaction.update(requester_ref, {
f'ownRequests.{friend_req.recipient}': firestore.DELETE_FIELD
})
transaction.update(recipient_ref, {
f'friendRequests.{friend_req.requester}': firestore.DELETE_FIELD
})
Подробнее здесь: https://stackoverflow.com/questions/789 ... rebase-map