import base64 import json from hashlib import sha256 from typing import Any from pydantic import BaseModel, Field, HttpUrl, field_validator from pydantic_extra_types.country import CountryAlpha2 class Message(BaseModel): email: str redirect_url: HttpUrl = Field(validation_alias="doubleOptInRedirectUrl") artist_name: str = Field("dev_mock", validation_alias="artistName") page_path: str = Field(validation_alias="pagePath") country: CountryAlpha2 @property def cache_id(self) -> str: return f"{self.page_path}:{sha256(self.email.encode()).hexdigest()}" class Record(BaseModel): message_id: str = Field(validation_alias="key") message: Message = Field(validation_alias="value") @field_validator("message", mode="before") @classmethod def message_loader(cls, encoded_message: str) -> Any: return json.loads(base64.b64decode(encoded_message)) @field_validator("message_id", mode="before") @classmethod def message_id_loader(cls, encoded_message_id: str) -> str: return base64.b64decode(encoded_message_id).decode() class Event(BaseModel): records: dict[str, list[Record]]