Skip to content

Commit 9e86443

Browse files
authored
Merge pull request #220 from devonfw-forge/sp2_219-disabling-sharing-location-force-refresh_be
SP2 219 disabling sharing location must force refresh
2 parents ba19a5e + 0ce699a commit 9e86443

File tree

4 files changed

+32
-2
lines changed

4 files changed

+32
-2
lines changed

wayat/backend/app/business/wayat_management/controllers/user.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
UpdatePreferencesRequest, UserWithPhoneResponse, PendingFriendsRequestsResponse, HandleFriendRequestRequest,
1515
UserDTO,
1616
)
17+
from app.business.wayat_management.services.map import MapService
1718
from app.business.wayat_management.services.user import UserService
1819
from app.common import get_user
1920
from app.common.exceptions.http import HTTPError
@@ -87,9 +88,14 @@ async def add_contact(request: AddContactsRequest, user_service: UserService = D
8788
@router.post("/preferences", description="Update the preferences of a user")
8889
async def update_preferences(request: UpdatePreferencesRequest,
8990
user_service: UserService = Depends(UserService),
91+
map_service: MapService = Depends(MapService),
9092
user: FirebaseAuthenticatedUser = Depends(get_user())):
9193
logger.info(f"Updating preferences for user {user.uid} with values {request.dict(exclude_unset=True)}")
9294
await user_service.update_user(user.uid, **request.dict(exclude_unset=True))
95+
if request.share_location is False:
96+
# share_location was set to false in this request, so we must delete the user
97+
# from all the maps in which he's present
98+
await map_service.vanish_user(user.uid)
9399

94100

95101
@router.get("/contacts", description="Get the list of contacts for a user", response_model=ListUsersWithPhoneResponse)

wayat/backend/app/business/wayat_management/services/map.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,8 @@ def _in_range(self, latitude: float, longitude: float, contact_location: Locatio
143143
distance = haversine_distance(latitude, longitude, location.latitude, location.longitude)
144144
logger.debug(f"Distance of {distance} calculated")
145145
return distance < self._distance_threshold
146+
147+
async def vanish_user(self, uid: str):
148+
coroutines = [self.regenerate_map_status(uid=contact_uid)
149+
for contact_uid in await self._status_repository.find_maps_containing_user(uid)]
150+
await asyncio.gather(*coroutines)

wayat/backend/app/domain/wayat_management/models/status.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ class ContactRefInfo(BaseModel):
1515

1616
class AppStatusEntity(BaseFirebaseModel):
1717
active: bool = False
18-
contact_refs: list[ContactRefInfo] = Field(default_factory=list)
18+
contact_refs: list[ContactRefInfo] = Field(default_factory=list)
19+
contact_refs_members: list[str] = Field(default_factory=list)

wayat/backend/app/domain/wayat_management/repositories/status.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
from typing import AsyncIterable
2+
13
from fastapi import Depends
4+
from google.cloud.firestore import DocumentSnapshot
25

36
from app.common.infra.gcp.base_firebase_repository import BaseFirestoreRepository, get_async_client
47
from app.domain.wayat_management.models.status import AppStatusEntity, ContactRefInfo
@@ -14,7 +17,8 @@ async def initialize(self, uid: str):
1417

1518
async def set_contact_refs(self, uid: str, contact_refs: list[ContactRefInfo]):
1619
await self.update(document_id=uid, data={
17-
"contact_refs": [contact.dict() for contact in contact_refs]
20+
"contact_refs": [contact.dict() for contact in contact_refs],
21+
"contact_refs_members": [contact.uid for contact in contact_refs]
1822
})
1923

2024
async def set_active(self, uid: str, value: bool, read_first=True):
@@ -34,3 +38,17 @@ async def set_active_batch(self, uid_list: list[str], value: bool):
3438
ref = self._get_document_reference(uid)
3539
batch.update(ref, {"active": value})
3640
await batch.commit()
41+
42+
async def find_maps_containing_user(self, uid: str) -> list[str]:
43+
"""
44+
Given a User uid, returns a list of uids containing those Users whose map contains the initial User.
45+
:param uid: The User to search in the maps
46+
:return: A list of uids of Users that have the given uid in their map
47+
"""
48+
result_stream = (
49+
self
50+
._get_collection_reference()
51+
.where("contact_refs_members", "array_contains", uid)
52+
.stream()
53+
) # type: AsyncIterable[DocumentSnapshot]
54+
return [document.id async for document in result_stream]

0 commit comments

Comments
 (0)