Coverage for app / models / link.py: 100%

17 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-21 22:41 +0300

1from datetime import UTC, datetime 

2from typing import TYPE_CHECKING 

3 

4from sqlalchemy import ForeignKey, String 

5from sqlalchemy.orm import Mapped, mapped_column, relationship 

6 

7from app.models.base import Base 

8 

9if TYPE_CHECKING: 

10 from app.models.user import User 

11 

12 

13class Link(Base): 

14 __tablename__ = "links" 

15 

16 id: Mapped[int] = mapped_column(primary_key=True) 

17 user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id")) 

18 long_url: Mapped[str] = mapped_column(String(2048)) 

19 short_code: Mapped[str] = mapped_column(String(30), unique=True, index=True) 

20 created_at: Mapped[datetime] = mapped_column( 

21 default=lambda: datetime.now(tz=UTC).replace(tzinfo=None) 

22 ) 

23 expires_at: Mapped[datetime] 

24 last_visited_at: Mapped[datetime | None] = mapped_column(default=None) 

25 visits_counter: Mapped[int] = mapped_column(default=0) 

26 auto_prolong: Mapped[bool] = mapped_column(default=False) 

27 

28 user: Mapped["User"] = relationship(back_populates="urls")