diff --git a/app/api/auth.py b/app/api/auth.py index f13e3c3..74c3921 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -1,4 +1,4 @@ -import datetime +import datetime as dt import typing import litestar @@ -24,7 +24,7 @@ async def retrieve_user_handler(token: Token, _connection: ASGIConnection) -> Ac jwt_cookie_auth: typing.Final = JWTCookieAuth[Actor]( retrieve_user_handler=retrieve_user_handler, token_secret=settings.jwt_secret, - default_token_expiration=datetime.timedelta(seconds=settings.jwt_lifetime_seconds), + default_token_expiration=dt.timedelta(seconds=settings.jwt_lifetime_seconds), secure=settings.jwt_cookie_secure, # Anchored: Litestar matches the joined patterns with an unanchored findall. exclude=[ diff --git a/app/database/tables.py b/app/database/tables.py index 315dedb..be7df5e 100644 --- a/app/database/tables.py +++ b/app/database/tables.py @@ -1,4 +1,4 @@ -import datetime +import datetime as dt import enum import typing import uuid @@ -73,8 +73,8 @@ class ChatMembersTable(BigIntBase): chat_id: orm.Mapped[int] = orm.mapped_column(sa.ForeignKey("chats.id")) user_id: orm.Mapped[int] = orm.mapped_column(sa.ForeignKey("users.id"), index=True) last_read_message_id: orm.Mapped[int | None] = orm.mapped_column(sa.BigInteger, nullable=True) - joined_at: orm.Mapped[datetime.datetime] = orm.mapped_column( - DateTimeUTC(timezone=True), default=lambda: datetime.datetime.now(tz=datetime.UTC) + joined_at: orm.Mapped[dt.datetime] = orm.mapped_column( + DateTimeUTC(timezone=True), default=lambda: dt.datetime.now(tz=dt.UTC) ) @@ -89,8 +89,8 @@ class MessagesTable(BigIntBase): user_id: orm.Mapped[int | None] = orm.mapped_column(sa.ForeignKey("users.id"), nullable=True, index=True) idempotency_key: orm.Mapped[uuid.UUID] = orm.mapped_column(GUID) text: orm.Mapped[str] = orm.mapped_column(sa.String) - created_at: orm.Mapped[datetime.datetime] = orm.mapped_column( - DateTimeUTC(timezone=True), default=lambda: datetime.datetime.now(tz=datetime.UTC) + created_at: orm.Mapped[dt.datetime] = orm.mapped_column( + DateTimeUTC(timezone=True), default=lambda: dt.datetime.now(tz=dt.UTC) ) - edited_at: orm.Mapped[datetime.datetime | None] = orm.mapped_column(DateTimeUTC(timezone=True), nullable=True) - deleted_at: orm.Mapped[datetime.datetime | None] = orm.mapped_column(DateTimeUTC(timezone=True), nullable=True) + edited_at: orm.Mapped[dt.datetime | None] = orm.mapped_column(DateTimeUTC(timezone=True), nullable=True) + deleted_at: orm.Mapped[dt.datetime | None] = orm.mapped_column(DateTimeUTC(timezone=True), nullable=True) diff --git a/app/schemas/api.py b/app/schemas/api.py index b87ddef..f0667eb 100644 --- a/app/schemas/api.py +++ b/app/schemas/api.py @@ -1,4 +1,4 @@ -import datetime +import datetime as dt import uuid from collections.abc import Iterable from typing import Annotated, Any, Self @@ -81,8 +81,8 @@ class Message(Base): chat_id: PositiveInt user_id: PositiveInt | None = None text: str - created_at: datetime.datetime - edited_at: datetime.datetime | None = None + created_at: dt.datetime + edited_at: dt.datetime | None = None class Messages(Collection[Message]): diff --git a/app/use_cases/delete_message.py b/app/use_cases/delete_message.py index 782de58..e0a1779 100644 --- a/app/use_cases/delete_message.py +++ b/app/use_cases/delete_message.py @@ -1,5 +1,5 @@ import dataclasses -import datetime +import datetime as dt from db_retry import Transaction, postgres_retry @@ -31,7 +31,7 @@ async def __call__(self, *, actor: Actor, message_id: int) -> None: if message.deleted_at is not None: # DELETE is idempotent; a second delete is not an error, unlike an edit. return - message.deleted_at = datetime.datetime.now(tz=datetime.UTC) + message.deleted_at = dt.datetime.now(tz=dt.UTC) await self.messages_repository.update(message, item_id=message_id) chat = await self.chats_repository.get_one(id=message.chat_id) diff --git a/app/use_cases/edit_message.py b/app/use_cases/edit_message.py index b4ff357..0b99773 100644 --- a/app/use_cases/edit_message.py +++ b/app/use_cases/edit_message.py @@ -1,5 +1,5 @@ import dataclasses -import datetime +import datetime as dt from db_retry import Transaction, postgres_retry @@ -32,7 +32,7 @@ async def __call__(self, *, actor: Actor, message_id: int, data: EditMessageRequ msg = "This message has been deleted" raise ConflictError(msg) message.text = data.text - message.edited_at = datetime.datetime.now(tz=datetime.UTC) + message.edited_at = dt.datetime.now(tz=dt.UTC) updated = await self.messages_repository.update(message, item_id=message_id) await self.transaction.commit() # Safe inside the block: commit() ended the transaction, so __aexit__ only closes. diff --git a/tests/api/test_auth_api.py b/tests/api/test_auth_api.py index 51b86d2..f605ada 100644 --- a/tests/api/test_auth_api.py +++ b/tests/api/test_auth_api.py @@ -1,4 +1,4 @@ -import datetime +import datetime as dt import pytest import sqlalchemy as sa @@ -141,5 +141,5 @@ async def test_retrieve_user_handler_resolves_an_actor_without_reading_the_datab foreign key. Nothing can reach that state today; a delete-user path would have to solve it alongside logout not revoking the JWT. """ - token = Token(sub="42", exp=datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(minutes=5)) + token = Token(sub="42", exp=dt.datetime.now(tz=dt.UTC) + dt.timedelta(minutes=5)) assert await retrieve_user_handler(token, None) == Actor(id=42) # ty: ignore[invalid-argument-type]