Skip to content

Commit

Permalink
Merge pull request #94 from ethyca/fix-registration-validation
Browse files Browse the repository at this point in the history
Default `Registration` datetimes to `now()`, expose `send_async()`
  • Loading branch information
PSalant726 authored Oct 31, 2022
2 parents 70ac20d + c1dea79 commit 93ee966
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 41 deletions.
4 changes: 2 additions & 2 deletions fideslog/api/database/registrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ def create(database: Session, registration: Registration) -> None:
client_id=registration.client_id,
email=registration.email,
organization=registration.organization,
created_at=datetime.now(timezone.utc),
updated_at=datetime.now(timezone.utc),
created_at=registration.created_at,
updated_at=registration.updated_at,
)
)

Expand Down
6 changes: 3 additions & 3 deletions fideslog/api/schemas/registration.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# pylint: disable= no-self-argument, no-self-use

from datetime import datetime
from datetime import datetime, timezone

from pydantic import BaseModel, EmailStr, Field, validator

Expand All @@ -23,11 +23,11 @@ class Registration(BaseModel):
description="The organization in which the user is registered.",
)
created_at: datetime = Field(
None,
datetime.now(tz=timezone.utc),
description="The UTC timestamp when the registration occurred, in ISO 8601 format. Must include the UTC timezone, and represent a datetime in the past.",
)
updated_at: datetime = Field(
None,
datetime.now(tz=timezone.utc),
description="The UTC timestamp when the registration was last updated, in ISO 8601 format. Must include the UTC timezone, and represent a datetime in the past.",
)

Expand Down
73 changes: 40 additions & 33 deletions fideslog/sdk/python/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,53 @@ def register(self, registration: Registration) -> None:
"""

__set_event_loop()
run(self.__send(registration))
run(self.send_async(registration))

async def register_async(self, registration: Registration) -> None:
"""
Asynchronously record a new `Registration`.
"""

await self.send_async(registration)

def send(self, event: AnalyticsEvent) -> None:
"""
Record a new analytics event.
"""

__set_event_loop()
run(self.__send(event))
run(self.send_async(event))

async def send_async(
self,
event_or_registration: Union[AnalyticsEvent, Registration],
) -> None:
"""
Asynchronously record a new `AnalyticsEvent` or `Registration`.
"""

async with ClientSession(
self.server_url,
headers=REQUIRED_HEADERS,
timeout=ClientTimeout(connect=3.05, total=120),
) as session:
try:
async with session.post(
url=(
"/events"
if isinstance(event_or_registration, AnalyticsEvent)
else "/registrations"
),
json=self.__get_request_payload(event_or_registration),
) as resp:
resp.raise_for_status()

except ClientConnectionError as err:
raise UnreachableServerError(err.__str__()) from err
except ClientResponseError as err:
raise AnalyticsSendError(err.message, err.status) from err
except Exception as err:
raise UnknownError(err) from err

def __get_request_payload(
self,
Expand Down Expand Up @@ -153,34 +191,3 @@ def __get_analytics_payload(self, event: AnalyticsEvent) -> Dict:
payload[extra] = event_dict[extra]

return payload

async def __send(
self,
event_or_registration: Union[AnalyticsEvent, Registration],
) -> None:
"""
Asynchronously record a new `AnalyticsEvent` or `Registration`.
"""

async with ClientSession(
self.server_url,
headers=REQUIRED_HEADERS,
timeout=ClientTimeout(connect=3.05, total=120),
) as session:
try:
async with session.post(
url=(
"/events"
if isinstance(event_or_registration, AnalyticsEvent)
else "/registrations"
),
json=self.__get_request_payload(event_or_registration),
) as resp:
resp.raise_for_status()

except ClientConnectionError as err:
raise UnreachableServerError(err.__str__()) from err
except ClientResponseError as err:
raise AnalyticsSendError(err.message, err.status) from err
except Exception as err:
raise UnknownError(err) from err
14 changes: 11 additions & 3 deletions fideslog/sdk/python/registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,20 @@ class Registration:
Represents a user registering their information.
"""

def __init__(self, email: str, organization: str) -> None:
def __init__(
self,
email: str,
organization: str,
created_at: datetime = datetime.now(tz=timezone.utc),
updated_at: datetime = datetime.now(tz=timezone.utc),
) -> None:
"""
Define a new user registration.
:param email: The user's email address.
:param organization: The user's organization.
:param created_at: The UTC timestamp when the registration occurred, in ISO 8601 format. Must include the UTC timezone, and represent a datetime in the past.
:param updated_at: The UTC timestamp when the registration was last updated, in ISO 8601 format. Must include the UTC timezone, and represent a datetime in the past.
"""

try:
Expand All @@ -23,8 +31,8 @@ def __init__(self, email: str, organization: str) -> None:
assert len(organization) > 0, "organization must be provided"
self.organization = organization

self.created_at = datetime.now(timezone.utc)
self.updated_at = datetime.now(timezone.utc)
self.created_at = created_at
self.updated_at = updated_at

except AssertionError as err:
raise InvalidEventError(str(err)) from None

0 comments on commit 93ee966

Please sign in to comment.