diff --git a/talkcorner/database/models/forum.py b/talkcorner/database/models/forum.py index 53a9290..0a51a82 100644 --- a/talkcorner/database/models/forum.py +++ b/talkcorner/database/models/forum.py @@ -1,10 +1,10 @@ -import datetime as dt import uuid -import sqlalchemy as sa +from datetime import datetime from typing import Optional -import sqlalchemy.orm as so +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column from talkcorner.database.models.base import BaseModel from talkcorner.schemas.forum import Forum as ForumScheme @@ -13,15 +13,15 @@ class Forum(BaseModel): __tablename__ = "forums" - id: so.Mapped[int] = so.mapped_column(primary_key=True, autoincrement=True) - title: so.Mapped[str] = so.mapped_column(nullable=False) - description: so.Mapped[Optional[str]] = so.mapped_column() - created_at: so.Mapped[dt.datetime] = so.mapped_column( - nullable=False, default=dt.datetime.utcnow + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + title: Mapped[str] = mapped_column(nullable=False) + description: Mapped[Optional[str]] = mapped_column() + created_at: Mapped[datetime] = mapped_column( + nullable=False, default=datetime.utcnow ) - creator_id: so.Mapped[uuid.UUID] = so.mapped_column( - sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False + creator_id: Mapped[uuid.UUID] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) def to_scheme(self) -> ForumScheme: diff --git a/talkcorner/database/models/subforum.py b/talkcorner/database/models/subforum.py index 7e8f8fb..6178d5c 100644 --- a/talkcorner/database/models/subforum.py +++ b/talkcorner/database/models/subforum.py @@ -1,7 +1,7 @@ import uuid -import sqlalchemy as sa -import sqlalchemy.orm as so +from sqlalchemy import UniqueConstraint, ForeignKey +from sqlalchemy.orm import Mapped, mapped_column from talkcorner.database.models.base import BaseModel from talkcorner.schemas.subforum import Subforum as SubforumScheme @@ -10,23 +10,23 @@ class Subforum(BaseModel): __tablename__ = "subforums" __table_args__ = ( - sa.UniqueConstraint( + UniqueConstraint( "parent_forum_id", "child_forum_id", name="subforums_parent_child_forums" ), ) - id: so.Mapped[int] = so.mapped_column(primary_key=True, autoincrement=True) + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) - parent_forum_id: so.Mapped[int] = so.mapped_column( - sa.ForeignKey("forums.id", ondelete="CASCADE"), nullable=False + parent_forum_id: Mapped[int] = mapped_column( + ForeignKey("forums.id", ondelete="CASCADE"), nullable=False ) - child_forum_id: so.Mapped[int] = so.mapped_column( - sa.ForeignKey("forums.id", ondelete="CASCADE"), nullable=False + child_forum_id: Mapped[int] = mapped_column( + ForeignKey("forums.id", ondelete="CASCADE"), nullable=False ) - creator_id: so.Mapped[uuid.UUID] = so.mapped_column( - sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False + creator_id: Mapped[uuid.UUID] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) def to_scheme(self) -> SubforumScheme: diff --git a/talkcorner/database/models/topic/main.py b/talkcorner/database/models/topic/main.py index 550dc9b..45184f7 100644 --- a/talkcorner/database/models/topic/main.py +++ b/talkcorner/database/models/topic/main.py @@ -1,9 +1,9 @@ import uuid -import datetime as dt +from datetime import datetime -import sqlalchemy as sa -import sqlalchemy.orm as so import uuid6 +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column from talkcorner.database.models.base import BaseModel from talkcorner.schemas.topic.main import Topic as TopicScheme @@ -12,21 +12,21 @@ class Topic(BaseModel): __tablename__ = "topics" - id: so.Mapped[uuid.UUID] = so.mapped_column(primary_key=True, default=uuid6.uuid7) + id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid6.uuid7) - forum_id: so.Mapped[int] = so.mapped_column( - sa.ForeignKey("forums.id", ondelete="CASCADE"), nullable=False + forum_id: Mapped[int] = mapped_column( + ForeignKey("forums.id", ondelete="CASCADE"), nullable=False ) - title: so.Mapped[str] = so.mapped_column(nullable=False) - body: so.Mapped[str] = so.mapped_column(nullable=False) + title: Mapped[str] = mapped_column(nullable=False) + body: Mapped[str] = mapped_column(nullable=False) - created_at: so.Mapped[dt.datetime] = so.mapped_column( - nullable=False, default=dt.datetime.utcnow + created_at: Mapped[datetime] = mapped_column( + nullable=False, default=datetime.utcnow ) - creator_id: so.Mapped[uuid.UUID] = so.mapped_column( - sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False + creator_id: Mapped[uuid.UUID] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) def to_scheme(self) -> TopicScheme: diff --git a/talkcorner/database/models/topic/message.py b/talkcorner/database/models/topic/message.py index b7ce93b..986d5b5 100644 --- a/talkcorner/database/models/topic/message.py +++ b/talkcorner/database/models/topic/message.py @@ -1,9 +1,9 @@ import uuid -import datetime as dt +from datetime import datetime -import sqlalchemy as sa -import sqlalchemy.orm as so import uuid6 +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column from talkcorner.database.models.base import BaseModel from talkcorner.schemas.topic.message import TopicMessage as TopicMessageScheme @@ -12,20 +12,20 @@ class TopicMessage(BaseModel): __tablename__ = "topic_messages" - id: so.Mapped[uuid.UUID] = so.mapped_column(primary_key=True, default=uuid6.uuid7) + id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid6.uuid7) - topic_id: so.Mapped[uuid.UUID] = so.mapped_column( - sa.ForeignKey("topics.id", ondelete="CASCADE"), nullable=False + topic_id: Mapped[uuid.UUID] = mapped_column( + ForeignKey("topics.id", ondelete="CASCADE"), nullable=False ) - body: so.Mapped[str] = so.mapped_column(nullable=False) + body: Mapped[str] = mapped_column(nullable=False) - created_at: so.Mapped[dt.datetime] = so.mapped_column( - nullable=False, default=dt.datetime.utcnow + created_at: Mapped[datetime] = mapped_column( + nullable=False, default=datetime.utcnow ) - creator_id: so.Mapped[uuid.UUID] = so.mapped_column( - sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False + creator_id: Mapped[uuid.UUID] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) def to_scheme(self) -> TopicMessageScheme: diff --git a/talkcorner/database/models/user.py b/talkcorner/database/models/user.py index a512b64..6c5a8b5 100644 --- a/talkcorner/database/models/user.py +++ b/talkcorner/database/models/user.py @@ -1,9 +1,8 @@ import uuid -import datetime as dt - -import sqlalchemy.orm as so +from datetime import datetime import uuid6 +from sqlalchemy.orm import Mapped, mapped_column from talkcorner.database.models.base import BaseModel from talkcorner.schemas.user import User as UserScheme @@ -12,16 +11,14 @@ class User(BaseModel): __tablename__ = "users" - id: so.Mapped[uuid.UUID] = so.mapped_column(primary_key=True, default=uuid6.uuid7) - username: so.Mapped[str] = so.mapped_column(nullable=False, unique=True) - password: so.Mapped[str] = so.mapped_column(nullable=False) - email: so.Mapped[str] = so.mapped_column(nullable=False, unique=True) - email_token: so.Mapped[uuid.UUID] = so.mapped_column( - unique=True, default=uuid6.uuid7 - ) - email_verified: so.Mapped[bool] = so.mapped_column(nullable=False, default=False) - created_at: so.Mapped[dt.datetime] = so.mapped_column( - nullable=False, default=dt.datetime.utcnow + id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid6.uuid7) + username: Mapped[str] = mapped_column(nullable=False, unique=True) + password: Mapped[str] = mapped_column(nullable=False) + email: Mapped[str] = mapped_column(nullable=False, unique=True) + email_token: Mapped[uuid.UUID] = mapped_column(unique=True, default=uuid6.uuid7) + email_verified: Mapped[bool] = mapped_column(nullable=False, default=False) + created_at: Mapped[datetime] = mapped_column( + nullable=False, default=datetime.utcnow ) def to_scheme(self) -> UserScheme: diff --git a/talkcorner/database/repositories/forum.py b/talkcorner/database/repositories/forum.py index 84302e9..2dca356 100644 --- a/talkcorner/database/repositories/forum.py +++ b/talkcorner/database/repositories/forum.py @@ -1,9 +1,9 @@ import uuid -import sqlalchemy as sa - from typing import Optional, List +from sqlalchemy import update, ScalarResult, select, delete +from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession from talkcorner.exceptions.forum import ( @@ -40,14 +40,14 @@ async def patch( excluded_forum_patch = forum_patch.model_dump(exclude_unset=True) stmt = ( - sa.update(models.Forum) + update(models.Forum) .where(models.Forum.id == forum_id, models.Forum.creator_id == creator_id) .values(**excluded_forum_patch) .returning(models.Forum) ) - result: sa.ScalarResult[models.Forum] = await self._session.scalars( - sa.select(models.Forum).from_statement(stmt) + result: ScalarResult[models.Forum] = await self._session.scalars( + select(models.Forum).from_statement(stmt) ) forum: Optional[models.Forum] = result.one_or_none() @@ -61,13 +61,13 @@ async def create( self, title: str, description: Optional[str], creator_id: uuid.UUID ) -> Forum: stmt = ( - sa.insert(models.Forum) + insert(models.Forum) .values(title=title, description=description, creator_id=creator_id) .returning(models.Forum) ) - result: sa.ScalarResult[models.Forum] = await self._session.scalars( - sa.select(models.Forum).from_statement(stmt) + result: ScalarResult[models.Forum] = await self._session.scalars( + select(models.Forum).from_statement(stmt) ) forum: models.Forum = result.one() @@ -76,13 +76,13 @@ async def create( async def delete(self, forum_id: int, creator_id: uuid.UUID) -> Forum: stmt = ( - sa.delete(models.Forum) + delete(models.Forum) .where(models.Forum.id == forum_id, models.Forum.creator_id == creator_id) .returning(models.Forum) ) - result: sa.ScalarResult[models.Forum] = await self._session.scalars( - sa.select(models.Forum).from_statement(stmt) + result: ScalarResult[models.Forum] = await self._session.scalars( + select(models.Forum).from_statement(stmt) ) forum: Optional[models.Forum] = result.one_or_none() diff --git a/talkcorner/database/repositories/subforum.py b/talkcorner/database/repositories/subforum.py index 8bb9176..a71eb8b 100644 --- a/talkcorner/database/repositories/subforum.py +++ b/talkcorner/database/repositories/subforum.py @@ -1,7 +1,7 @@ import uuid from typing import Optional, List -import sqlalchemy as sa +from sqlalchemy import update, ScalarResult, select, delete from sqlalchemy.dialects.postgresql import insert from sqlalchemy.exc import IntegrityError, DBAPIError @@ -42,7 +42,7 @@ async def patch( # type: ignore excluded_subforum_patch = subforum_patch.model_dump(exclude_unset=True) stmt = ( - sa.update(models.Subforum) + update(models.Subforum) .where( models.Subforum.id == subforum_id, models.Subforum.creator_id == creator_id, @@ -52,8 +52,8 @@ async def patch( # type: ignore ) try: - result: sa.ScalarResult[models.Subforum] = await self._session.scalars( - sa.select(models.Subforum).from_statement(stmt) + result: ScalarResult[models.Subforum] = await self._session.scalars( + select(models.Subforum).from_statement(stmt) ) except IntegrityError as e: self._parse_error(err=e) @@ -79,8 +79,8 @@ async def create( # type: ignore ) try: - result: sa.ScalarResult[models.Subforum] = await self._session.scalars( - sa.select(models.Subforum).from_statement(stmt) + result: ScalarResult[models.Subforum] = await self._session.scalars( + select(models.Subforum).from_statement(stmt) ) except IntegrityError as e: self._parse_error(err=e) @@ -91,7 +91,7 @@ async def create( # type: ignore async def delete(self, subforum_id: int, creator_id: uuid.UUID) -> Subforum: stmt = ( - sa.delete(models.Subforum) + delete(models.Subforum) .where( models.Subforum.id == subforum_id, models.Subforum.creator_id == creator_id, @@ -99,8 +99,8 @@ async def delete(self, subforum_id: int, creator_id: uuid.UUID) -> Subforum: .returning(models.Subforum) ) - result: sa.ScalarResult[models.Subforum] = await self._session.scalars( - sa.select(models.Subforum).from_statement(stmt) + result: ScalarResult[models.Subforum] = await self._session.scalars( + select(models.Subforum).from_statement(stmt) ) subforum: Optional[models.Subforum] = result.one_or_none() diff --git a/talkcorner/database/repositories/topic/main.py b/talkcorner/database/repositories/topic/main.py index b1ee3bb..9b73eeb 100644 --- a/talkcorner/database/repositories/topic/main.py +++ b/talkcorner/database/repositories/topic/main.py @@ -1,7 +1,8 @@ import uuid from typing import Optional, List -import sqlalchemy as sa +from sqlalchemy import update, ScalarResult, select, delete +from sqlalchemy.dialects.postgresql import insert from sqlalchemy.exc import IntegrityError, DBAPIError from sqlalchemy.ext.asyncio import AsyncSession @@ -41,15 +42,15 @@ async def patch( # type: ignore excluded_topic_patch = topic_patch.model_dump(exclude_unset=True) stmt = ( - sa.update(models.Topic) + update(models.Topic) .where(models.Topic.id == topic_id, models.Topic.creator_id == creator_id) .values(**excluded_topic_patch) .returning(models.Topic) ) try: - result: sa.ScalarResult[models.Topic] = await self._session.scalars( - sa.select(models.Topic).from_statement(stmt) + result: ScalarResult[models.Topic] = await self._session.scalars( + select(models.Topic).from_statement(stmt) ) except IntegrityError as e: self._parse_error(err=e, forum_id=topic_patch.forum_id) @@ -65,14 +66,14 @@ async def create( # type: ignore self, forum_id: int, title: str, body: str, creator_id: uuid.UUID ) -> Topic: stmt = ( - sa.insert(models.Topic) + insert(models.Topic) .values(forum_id=forum_id, title=title, body=body, creator_id=creator_id) .returning(models.Topic) ) try: - result: sa.ScalarResult[models.Topic] = await self._session.scalars( - sa.select(models.Topic).from_statement(stmt) + result: ScalarResult[models.Topic] = await self._session.scalars( + select(models.Topic).from_statement(stmt) ) except IntegrityError as e: self._parse_error(err=e, forum_id=forum_id) @@ -83,13 +84,13 @@ async def create( # type: ignore async def delete(self, topic_id: uuid.UUID, creator_id: uuid.UUID) -> Topic: stmt = ( - sa.delete(models.Topic) + delete(models.Topic) .where(models.Topic.id == topic_id, models.Topic.creator_id == creator_id) .returning(models.Topic) ) - result: sa.ScalarResult[models.Topic] = await self._session.scalars( - sa.select(models.Topic).from_statement(stmt) + result: ScalarResult[models.Topic] = await self._session.scalars( + select(models.Topic).from_statement(stmt) ) topic: Optional[models.Topic] = result.one_or_none() diff --git a/talkcorner/database/repositories/topic/message.py b/talkcorner/database/repositories/topic/message.py index 642b49f..e363830 100644 --- a/talkcorner/database/repositories/topic/message.py +++ b/talkcorner/database/repositories/topic/message.py @@ -1,7 +1,8 @@ import uuid from typing import Optional, List -import sqlalchemy as sa +from sqlalchemy import update, ScalarResult, select, delete +from sqlalchemy.dialects.postgresql import insert from sqlalchemy.exc import IntegrityError, DBAPIError from sqlalchemy.ext.asyncio import AsyncSession @@ -46,7 +47,7 @@ async def patch( ) stmt = ( - sa.update(models.TopicMessage) + update(models.TopicMessage) .where( models.TopicMessage.id == topic_message_id, models.TopicMessage.creator_id == creator_id, @@ -55,8 +56,8 @@ async def patch( .returning(models.TopicMessage) ) - result: sa.ScalarResult[models.TopicMessage] = await self._session.scalars( - sa.select(models.TopicMessage).from_statement(stmt) + result: ScalarResult[models.TopicMessage] = await self._session.scalars( + select(models.TopicMessage).from_statement(stmt) ) topic_message: Optional[models.TopicMessage] = result.one_or_none() @@ -70,14 +71,14 @@ async def create( # type: ignore self, topic_id: uuid.UUID, body: str, creator_id: uuid.UUID ) -> TopicMessage: stmt = ( - sa.insert(models.TopicMessage) + insert(models.TopicMessage) .values(topic_id=topic_id, body=body, creator_id=creator_id) .returning(models.TopicMessage) ) try: - result: sa.ScalarResult[models.TopicMessage] = await self._session.scalars( - sa.select(models.TopicMessage).from_statement(stmt) + result: ScalarResult[models.TopicMessage] = await self._session.scalars( + select(models.TopicMessage).from_statement(stmt) ) except IntegrityError as e: self._parse_error(err=e, topic_id=topic_id) @@ -90,7 +91,7 @@ async def delete( self, topic_message_id: uuid.UUID, creator_id: uuid.UUID ) -> TopicMessage: stmt = ( - sa.delete(models.TopicMessage) + delete(models.TopicMessage) .where( models.TopicMessage.id == topic_message_id, models.TopicMessage.creator_id == creator_id, @@ -98,8 +99,8 @@ async def delete( .returning(models.TopicMessage) ) - result: sa.ScalarResult[models.TopicMessage] = await self._session.scalars( - sa.select(models.TopicMessage).from_statement(stmt) + result: ScalarResult[models.TopicMessage] = await self._session.scalars( + select(models.TopicMessage).from_statement(stmt) ) topic_message: Optional[models.TopicMessage] = result.one_or_none() diff --git a/talkcorner/database/repositories/user.py b/talkcorner/database/repositories/user.py index 0b61eb9..60bb859 100644 --- a/talkcorner/database/repositories/user.py +++ b/talkcorner/database/repositories/user.py @@ -1,9 +1,8 @@ import uuid -import sqlalchemy as sa - from typing import Optional, List +from sqlalchemy import ScalarResult, select, update from sqlalchemy.dialects.postgresql import insert from sqlalchemy.exc import DBAPIError, IntegrityError from sqlalchemy.ext.asyncio import AsyncSession @@ -48,8 +47,8 @@ async def read_all(self, offset: int, limit: int) -> List[User]: return [user.to_scheme() for user in users] async def read_by_login(self, username: str) -> User: - result: sa.ScalarResult[models.User] = await self._session.scalars( - sa.select(models.User).where(models.User.username == username) + result: ScalarResult[models.User] = await self._session.scalars( + select(models.User).where(models.User.username == username) ) user: Optional[models.User] = result.first() @@ -61,15 +60,13 @@ async def read_by_login(self, username: str) -> User: async def verify_email(self, user_id: uuid.UUID) -> User: stmt = ( - sa.update(models.User) + update(models.User) .where(models.User.id == user_id) .values(email_verified=True) .returning(models.User) ) - result = await self._session.scalars( - sa.select(models.User).from_statement(stmt) - ) + result = await self._session.scalars(select(models.User).from_statement(stmt)) user: Optional[models.User] = result.first() @@ -93,8 +90,8 @@ async def create( # type: ignore ) try: - result: sa.ScalarResult[models.User] = await self._session.scalars( - sa.select(models.User).from_statement(stmt) + result: ScalarResult[models.User] = await self._session.scalars( + select(models.User).from_statement(stmt) ) except IntegrityError as e: self._parse_error_on_create(err=e) diff --git a/talkcorner/schemas/forum.py b/talkcorner/schemas/forum.py index 341d188..e122232 100644 --- a/talkcorner/schemas/forum.py +++ b/talkcorner/schemas/forum.py @@ -1,5 +1,5 @@ -import datetime as dt import uuid +from datetime import datetime from typing import Optional from pydantic import Field @@ -20,7 +20,7 @@ class ForumValidators(BaseSchema): class Forum(ForumValidators): id: int - created_at: dt.datetime + created_at: datetime creator_id: uuid.UUID diff --git a/talkcorner/schemas/topic/main.py b/talkcorner/schemas/topic/main.py index 7902d11..91584bd 100644 --- a/talkcorner/schemas/topic/main.py +++ b/talkcorner/schemas/topic/main.py @@ -1,5 +1,5 @@ import uuid -import datetime as dt +from datetime import datetime from typing import Optional from pydantic import Field @@ -20,7 +20,7 @@ class Topic(TopicValidators): forum_id: int - created_at: dt.datetime + created_at: datetime creator_id: uuid.UUID diff --git a/talkcorner/schemas/topic/message.py b/talkcorner/schemas/topic/message.py index 8601976..6eb4917 100644 --- a/talkcorner/schemas/topic/message.py +++ b/talkcorner/schemas/topic/message.py @@ -1,5 +1,5 @@ import uuid -import datetime as dt +from datetime import datetime from typing import Optional from pydantic import Field @@ -18,7 +18,7 @@ class TopicMessage(TopicMessageValidators): topic_id: uuid.UUID - created_at: dt.datetime + created_at: datetime creator_id: uuid.UUID diff --git a/talkcorner/schemas/user.py b/talkcorner/schemas/user.py index a2b1f09..83a7710 100644 --- a/talkcorner/schemas/user.py +++ b/talkcorner/schemas/user.py @@ -1,5 +1,5 @@ import uuid -import datetime as dt +from datetime import datetime from typing import Optional from pydantic import Field, EmailStr @@ -26,7 +26,7 @@ class User(UserValidators): email_token: uuid.UUID email_verified: bool - created_at: dt.datetime + created_at: datetime class UserLogin(UserValidators): diff --git a/talkcorner/services/auth/token.py b/talkcorner/services/auth/token.py index face95d..98b419e 100644 --- a/talkcorner/services/auth/token.py +++ b/talkcorner/services/auth/token.py @@ -1,4 +1,4 @@ -import datetime as dt +from datetime import datetime, timedelta from typing import Any from jose import jwt @@ -10,7 +10,7 @@ def create_access_token( ) -> str: return jwt.encode( claims={ - "exp": dt.datetime.utcnow() + dt.timedelta(minutes=expire_minutes), + "exp": datetime.utcnow() + timedelta(minutes=expire_minutes), **payload, }, key=secret_key,