Coverage for bc/kwai-bc-identity/src/kwai_bc_identity/user_invitations/user_invitation_tables.py: 100%
19 statements
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2024-01-01 00:00 +0000
1"""Module that defines all dataclasses for the tables containing invitations."""
3from dataclasses import dataclass
4from datetime import datetime
5from typing import Self
7from kwai_core.db.table_row import TableRow
8from kwai_core.domain.value_objects.email_address import EmailAddress
9from kwai_core.domain.value_objects.name import Name
10from kwai_core.domain.value_objects.timestamp import Timestamp
11from kwai_core.domain.value_objects.traceable_time import TraceableTime
12from kwai_core.domain.value_objects.unique_id import UniqueId
14from kwai_bc_identity.user_invitations.user_invitation import (
15 UserInvitationEntity,
16 UserInvitationIdentifier,
17)
18from kwai_bc_identity.users.user import UserEntity
21@dataclass(kw_only=True, frozen=True, slots=True)
22class UserInvitationRow(TableRow):
23 """Represent a table row in the invitations table.
25 Attributes:
26 id(int): the id of the invitation
27 email(str): the email that received this invitation
28 first_name(str): the firstname of the invited
29 last_name(str): the lastname of the invited
30 uuid(str): a unique uuid for the invitation
31 expired_at(datetime): the timestamp when the invitation expires
32 remark(str|None): a remark about the invitation
33 user_id(int): the user that created the invitation
34 confirmed_at(datetime|None): the timestamp when the invitation was used
35 revoked(bool): is the invitation revoked?
36 created_at(datetime): the timestamp of creation
37 updated_at(datetime|None): the timestamp of the last modification
38 mailed_at(datetime|None): the timestamp of sending the email
39 """
41 __table_name__ = "user_invitations"
43 id: int
44 email: str
45 first_name: str
46 last_name: str
47 uuid: str
48 expired_at: datetime
49 remark: str | None
50 user_id: int
51 confirmed_at: datetime | None
52 revoked: int
53 created_at: datetime
54 updated_at: datetime | None
55 mailed_at: datetime | None
57 def create_entity(self, user: UserEntity) -> UserInvitationEntity:
58 """Create a user invitation entity from the table row.
60 Args:
61 user: The associated user entity
63 Returns:
64 A user invitation entity.
65 """
66 return UserInvitationEntity(
67 id=UserInvitationIdentifier(self.id),
68 email=EmailAddress(self.email),
69 name=Name(last_name=self.last_name, first_name=self.first_name),
70 uuid=UniqueId.create_from_string(self.uuid),
71 expired_at=Timestamp.create_utc(self.expired_at),
72 user=user,
73 remark=self.remark or "",
74 mailed_at=Timestamp.create_utc(self.mailed_at),
75 confirmed_at=Timestamp.create_utc(self.confirmed_at),
76 revoked=self.revoked == 1,
77 traceable_time=TraceableTime(
78 created_at=Timestamp.create_utc(self.created_at),
79 updated_at=Timestamp.create_utc(self.updated_at),
80 ),
81 )
83 @classmethod
84 def persist(cls, invitation: UserInvitationEntity) -> Self:
85 """Persist a user invitation entity into a table row.
87 Args:
88 invitation: The user invitation entity to persist.
90 Returns:
91 A dataclass containing the table row data.
92 """
93 return UserInvitationRow(
94 id=invitation.id.value,
95 email=str(invitation.email),
96 first_name=invitation.name.first_name,
97 last_name=invitation.name.last_name,
98 uuid=str(invitation.uuid),
99 expired_at=invitation.expired_at.timestamp,
100 mailed_at=invitation.mailed_at.timestamp,
101 remark=invitation.remark,
102 user_id=invitation.user.id.value,
103 confirmed_at=invitation.confirmed_at.timestamp,
104 revoked=1 if invitation.revoked else 0,
105 created_at=invitation.traceable_time.created_at.timestamp,
106 updated_at=invitation.traceable_time.updated_at.timestamp,
107 )