Coverage for polar/models/email_verification.py: 95%

19 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 17:15 +0000

1from datetime import datetime, timedelta 1ab

2from uuid import UUID 1ab

3 

4from sqlalchemy import TIMESTAMP, ForeignKey, String, Uuid 1ab

5from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship 1ab

6 

7from polar.config import settings 1ab

8from polar.kit.db.models import RecordModel 1ab

9from polar.kit.utils import utc_now 1ab

10from polar.models.user import User 1ab

11 

12 

13def get_expires_at() -> datetime: 1ab

14 return utc_now() + timedelta(seconds=settings.EMAIL_VERIFICATION_TTL_SECONDS) 

15 

16 

17class EmailVerification(RecordModel): 1ab

18 __tablename__ = "email_verification" 1ab

19 

20 email: Mapped[str] = mapped_column(String, nullable=False) 1ab

21 token_hash: Mapped[str] = mapped_column(String, index=True, nullable=False) 1ab

22 expires_at: Mapped[datetime] = mapped_column( 1ab

23 TIMESTAMP(timezone=True), nullable=False, default=get_expires_at 

24 ) 

25 user_id: Mapped[UUID] = mapped_column( 1ab

26 Uuid, ForeignKey("users.id", ondelete="cascade"), nullable=False 

27 ) 

28 

29 @declared_attr 1ab

30 def user(cls) -> Mapped[User]: 1ab

31 return relationship(User) 1ab