Coverage for polar/models/email_verification.py: 100%
19 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from datetime import datetime, timedelta
2from uuid import UUID
4from sqlalchemy import TIMESTAMP, ForeignKey, String, Uuid
5from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship
7from polar.config import settings
8from polar.kit.db.models import RecordModel
9from polar.kit.utils import utc_now
10from polar.models.user import User
13def get_expires_at() -> datetime:
14 return utc_now() + timedelta(seconds=settings.EMAIL_VERIFICATION_TTL_SECONDS)
17class EmailVerification(RecordModel):
18 __tablename__ = "email_verification"
20 email: Mapped[str] = mapped_column(String, nullable=False)
21 token_hash: Mapped[str] = mapped_column(String, index=True, nullable=False)
22 expires_at: Mapped[datetime] = mapped_column(
23 TIMESTAMP(timezone=True), nullable=False, default=get_expires_at
24 )
25 user_id: Mapped[UUID] = mapped_column(
26 Uuid, ForeignKey("users.id", ondelete="cascade"), nullable=False
27 )
29 @declared_attr
30 def user(cls) -> Mapped[User]:
31 return relationship(User)