diff --git a/events.py b/events.py index be5ab1996dead98fe63002c159a7ef27b3251cc9..f73538747a497901f328ddc622561f1c39ba3cfc 100644 --- a/events.py +++ b/events.py @@ -1,11 +1,10 @@ import base64 import json +from dataclasses import dataclass # noinspection PyPackageRequirements from cloudevents.http.event import CloudEvent -from dataclasses import dataclass -from typing import Any, TypedDict, Literal def get_event_type(cloud_event: CloudEvent) -> str: return cloud_event.data['message']['attributes']['eventType'] @@ -25,6 +24,8 @@ class UserPayload: email: str identity: str avatar: str + about_me: str + location: str def __init__(self, data: dict): self.id = data['user']['id'] @@ -32,6 +33,8 @@ class UserPayload: self.email = data['user']['email'] self.identity = data['user']['identity'] self.avatar = data['user']['avatar'] + self.about_me = data['user']['aboutMe'] + self.location = data['user']['location'] @dataclass @@ -60,10 +63,10 @@ class UserNameUpdatedEvent(UserEvent): 'type': 'profile', 'title_de': self.user.name, 'title_en': self.user.name, - 'description_de': None, # TODO add on sending side - 'description_en': None, # TODO add on sending side - 'location': None, # TODO add on sending side - 'location_lat_lng': None, # TODO add on sending side + 'description_de': self.user.about_me, + 'description_en': self.user.about_me, + 'location': self.user.location, + 'location_lat_lng': None, # TODO maybe enrich? 'image_url': self.user.avatar, 'link_locators': { 'profile': self.user.id @@ -76,6 +79,11 @@ class UserDeletedEvent(UserEvent): _validate_event_type(cloud_event, 'UserDeleted') super().__init__(cloud_event) +@dataclass +class LatLng: + latitude: float + longitude: float + @dataclass class SpacePayload: id: str @@ -83,6 +91,9 @@ class SpacePayload: slug: str avatar: str avatar_default_color: str + description: str + location: str + location_lat_lng: LatLng def __init__(self, data: dict): self.id = data['space']['id'] @@ -90,6 +101,10 @@ class SpacePayload: self.slug = data['space']['slug'] self.avatar = data['space']['avatar'] self.avatar_default_color = data['space']['avatarDefaultColor'] + self.description = data['space']['description'] + self.location = data['space']['location'] + contains_lat_lng = data['space']['locationLatLng'] is not None and data['space']['locationLatLng']['latitude'] is not None and data['space']['locationLatLng']['longitude'] is not None + self.location_lat_lng = LatLng(data['space']['locationLatLng'].get('latitude'), data['space']['locationLatLng'].get('longitude')) if contains_lat_lng else None @dataclass class SpaceEvent: @@ -108,10 +123,10 @@ class SpaceEvent: 'type': 'space', 'title_de': self.space.name, 'title_en': self.space.name, - 'description_de': None, # TODO add on sending side - 'description_en': None, # TODO add on sending side - 'location': None, - 'location_lat_lng': None, + 'description_de': self.space.description, + 'description_en': self.space.description, + 'location': self.space.location, + 'location_lat_lng': [self.space.location_lat_lng.latitude, self.space.location_lat_lng.longitude] if self.space.location_lat_lng is not None else None, 'image_url': self.space.avatar, 'link_locators': { 'space': self.space.slug diff --git a/main.py b/main.py index dfbba023cdd9a66b50a505d2f16d215a397c1da2..72c7151a198319583bc52df90d66813731b832d1 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ import os +import re import functions_framework from typing import Union @@ -14,6 +15,8 @@ from logging import getLogger logger = getLogger(__name__) +SEMVER_1XX_SERIES = r"^1\.\d+\.\d+$" + def process_user_name_updated_event(client: TypesenseClient, event: UserNameUpdatedEvent): logger.debug(f'Processing {event}') client.upsert(event.as_typesense_document()) @@ -41,23 +44,23 @@ def process_space_deleted_event(client: TypesenseClient, event: SpaceDeletedEven logger.info(f'Deleted space {event.space.id} in Typesense') def process_event(client: TypesenseClient, event: CloudEvent): - type_version = (get_event_type(event), get_event_version(event)) + type_version = (get_event_type(event), re.match(SEMVER_1XX_SERIES, get_event_version(event)) is not None) match type_version: - case ('UserNameUpdated', '1.0.0'): + case ('UserNameUpdated', True): process_user_name_updated_event(client, UserNameUpdatedEvent(event)) - case ('UserDeleted', '1.0.0'): + case ('UserDeleted', True): process_user_deleted_event(client, UserDeletedEvent(event)) - case ('UserEmailUpdated', '1.0.0'): + case ('UserEmailUpdated', True): # no need to process, it is sufficient to handle UserNameUpdated logger.debug('Ignoring UserEmailUpdated event') pass - case ('SpaceCreated', '1.0.0'): + case ('SpaceCreated', True): process_space_upserting_event(client, SpaceCreatedEvent(event)) pass - case ('SpaceUpdated', '1.0.0'): + case ('SpaceUpdated', True): process_space_upserting_event(client, SpaceUpdatedEvent(event)) pass - case ('SpaceDeleted', '1.0.0'): + case ('SpaceDeleted', True): process_space_deleted_event(client, SpaceDeletedEvent(event)) pass case (eventType, eventVersion): diff --git a/test_main.py b/test_main.py index 5ec5729b44cc735f7552c7d22f1b6e50bb669880..2793692a11b0e6d01d23f97d18a4d3fcb8a6beb0 100644 --- a/test_main.py +++ b/test_main.py @@ -22,6 +22,8 @@ user_payload = { 'email': 'daniel@holi.team', 'identity': 'danielholi.team', 'avatar': 'https://ik.imagekit.io/holi/_DEV_/avatar/149a3d29-a0da-4f52-8e1c-660376b7084b_yv31UW7lD0.jpg', + 'aboutMe': 'Daniel about himself', + 'location': 'Klitmøller, Denmark' } space_payload = { @@ -30,6 +32,12 @@ space_payload = { 'slug': 'daniels-space', 'avatar': 'https://ik.imagekit.io/holi/_DEV_/avatar/149a3d29-a0da-4f52-8e1c-660376b7084b_yv31UW7lD0.jpg', 'avatarDefaultColor': 'ffffff', + 'description': 'This is Daniels Space', + 'location': 'Klitmøller, Denmark', + 'locationLatLng': { + 'latitude': 57.0393497, + 'longitude': 8.474686, + } } def message_data(event_type, event_version, data): @@ -54,9 +62,9 @@ def test_user_name_updated(mock_client): 'type': 'profile', 'title_de': user_payload['name'], 'title_en': user_payload['name'], - 'description_de': None, - 'description_en': None, - 'location': None, + 'description_de': user_payload['aboutMe'], + 'description_en': user_payload['aboutMe'], + 'location': user_payload['location'], 'location_lat_lng': None, 'image_url': user_payload['avatar'], 'link_locators': { @@ -78,10 +86,10 @@ def test_space_created(mock_client): 'type': 'space', 'title_de': space_payload['name'], 'title_en': space_payload['name'], - 'description_de': None, - 'description_en': None, - 'location': None, - 'location_lat_lng': None, + 'description_de': space_payload['description'], + 'description_en': space_payload['description'], + 'location': space_payload['location'], + 'location_lat_lng': [space_payload['locationLatLng']['latitude'], space_payload['locationLatLng']['longitude']], 'image_url': space_payload['avatar'], 'link_locators': { 'space': space_payload['slug'], @@ -97,10 +105,10 @@ def test_space_updated(mock_client): 'type': 'space', 'title_de': space_payload['name'], 'title_en': space_payload['name'], - 'description_de': None, - 'description_en': None, - 'location': None, - 'location_lat_lng': None, + 'description_de': space_payload['description'], + 'description_en': space_payload['description'], + 'location': space_payload['location'], + 'location_lat_lng': [space_payload['locationLatLng']['latitude'], space_payload['locationLatLng']['longitude']], 'image_url': space_payload['avatar'], 'link_locators': { 'space': space_payload['slug'],