From 839bc2136c2bae4a7214da47089da900760b8510 Mon Sep 17 00:00:00 2001 From: RudychukDmytro Date: Wed, 22 May 2024 12:51:22 +0300 Subject: [PATCH] deleted table users --- Makefile | 2 + alembic/env.py | 2 +- .../31d4f3f51824_initial_migration.py | 46 +++++++ alembic/versions/67e9162f25f9_initial.py | 62 --------- chat/core/config.py | 13 +- chat/core/dependencies.py | 124 +++++++++++------- chat/customer_router.py | 24 ++-- chat/database/crud.py | 52 +++----- chat/database/database.py | 5 - chat/database/models.py | 57 +------- chat/database/schemas.py | 19 +-- chat/router.py | 4 +- chat/{shop_owner_router.py => shop_router.py} | 16 +-- main.py | 4 +- prospector.yaml | 38 ++++++ 15 files changed, 212 insertions(+), 256 deletions(-) create mode 100644 alembic/versions/31d4f3f51824_initial_migration.py delete mode 100644 alembic/versions/67e9162f25f9_initial.py rename chat/{shop_owner_router.py => shop_router.py} (61%) create mode 100644 prospector.yaml diff --git a/Makefile b/Makefile index 57d28ec..1c5885c 100644 --- a/Makefile +++ b/Makefile @@ -24,3 +24,5 @@ all: build push all_arm: build_arm push_arm +prospector: + prospector --profile=prospector.yaml diff --git a/alembic/env.py b/alembic/env.py index d1e71b5..14d630a 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -7,7 +7,7 @@ from chat.core.config import settings from chat.database.database import Base -from chat.database.models import User, Chat, Message +from chat.database.models import Chat, Message # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/alembic/versions/31d4f3f51824_initial_migration.py b/alembic/versions/31d4f3f51824_initial_migration.py new file mode 100644 index 0000000..aa1c514 --- /dev/null +++ b/alembic/versions/31d4f3f51824_initial_migration.py @@ -0,0 +1,46 @@ +"""Initial migration + +Revision ID: 31d4f3f51824 +Revises: +Create Date: 2024-05-21 16:34:16.476888 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '31d4f3f51824' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('chat', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('customer_id', sa.Integer(), nullable=False), + sa.Column('shop_id', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('message', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('chat_id', sa.Integer(), nullable=True), + sa.Column('owner_id', sa.Integer(), nullable=False), + sa.Column('body', sa.Text(), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('deleted_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['chat_id'], ['chat.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('message') + op.drop_table('chat') + # ### end Alembic commands ### diff --git a/alembic/versions/67e9162f25f9_initial.py b/alembic/versions/67e9162f25f9_initial.py deleted file mode 100644 index 19e6ce2..0000000 --- a/alembic/versions/67e9162f25f9_initial.py +++ /dev/null @@ -1,62 +0,0 @@ -"""initial - -Revision ID: 67e9162f25f9 -Revises: -Create Date: 2024-04-02 20:47:03.725768 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = '67e9162f25f9' -down_revision: Union[str, None] = None -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('user', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('email', sa.String(), nullable=True), - sa.Column('full_name', sa.String(), nullable=True), - sa.Column('profile_picture', sa.String(), nullable=True), - sa.Column('phone_number', sa.String(), nullable=True), - sa.Column('shop_id', sa.Integer(), nullable=True), - sa.Column('last_check', sa.DateTime(), nullable=True), - sa.PrimaryKeyConstraint('id') - ) - op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True) - op.create_table('chat', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('customer_id', sa.Integer(), nullable=True), - sa.Column('shop_owner_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['customer_id'], ['user.id'], ondelete='CASCADE'), - sa.ForeignKeyConstraint(['shop_owner_id'], ['user.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id') - ) - op.create_table('message', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('chat_id', sa.Integer(), nullable=True), - sa.Column('owner_id', sa.Integer(), nullable=True), - sa.Column('body', sa.Text(), nullable=True), - sa.Column('created_at', sa.DateTime(), nullable=True), - sa.Column('deleted_at', sa.DateTime(), nullable=True), - sa.ForeignKeyConstraint(['chat_id'], ['chat.id'], ), - sa.ForeignKeyConstraint(['owner_id'], ['user.id'], ), - sa.PrimaryKeyConstraint('id') - ) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('message') - op.drop_table('chat') - op.drop_index(op.f('ix_user_email'), table_name='user') - op.drop_table('user') - # ### end Alembic commands ### diff --git a/chat/core/config.py b/chat/core/config.py index 830d02b..a69b309 100644 --- a/chat/core/config.py +++ b/chat/core/config.py @@ -1,15 +1,9 @@ import os -import sys -from datetime import datetime from pathlib import Path -from typing import Optional, Any, Union, Literal +from typing import Optional, Any -from pydantic import PostgresDsn, field_validator, EmailStr -from pydantic_core.core_schema import ValidationInfo from pydantic_settings import BaseSettings, SettingsConfigDict -# from pytz import timezone - ENV_PATH = f"{Path(__file__).parent.parent.parent.absolute()}/.env" @@ -25,8 +19,3 @@ class Settings(BaseSettings): settings = Settings() -# TIMEZONE = timezone('Europe/Kyiv') - - -# def default_time(): -# return datetime.now(tz=TIMEZONE) diff --git a/chat/core/dependencies.py b/chat/core/dependencies.py index 6819beb..6fc3a48 100644 --- a/chat/core/dependencies.py +++ b/chat/core/dependencies.py @@ -1,43 +1,32 @@ -# +from datetime import datetime +from typing import Annotated -from datetime import datetime, timedelta -from typing import Optional, Annotated - -import jwt import requests -from fastapi import Depends +import jwt +from fastapi import Depends, HTTPException from fastapi.security import ( HTTPBearer, HTTPAuthorizationCredentials, ) from jose import JWTError +from requests import RequestException from chat.core.config import settings -from chat.core.exceptions import IncorrectTokenFormat, Unauthorized, TokenExpired, UserIsNotPresent -from chat.database.crud import get_user, create_user -from chat.database.database import dbDep -from chat.database.models import User -from chat.database.schemas import UserCopy +from chat.core.exceptions import IncorrectTokenFormat, Unauthorized, TokenExpired, NotFound # Don't use localhost:8080 to avoid slow performance -FLASK_INFO_URL = "http://127.0.0.1:8080/accounts/info" +FLASK_INFO_USER_ID_URL = "http://127.0.0.1:5000/accounts/info/for_chat" +FLASK_INFO_SHOP_ID_URL = "http://127.0.0.1:5000/shops/shop_info/for_chat" +FLASK_INFO_SHOP_OWNER_ID_URL = "http://127.0.0.1:5000/shops/shop_owner_info/for_chat" + auth_scheme = HTTPBearer(scheme_name="TokenScheme", auto_error=True) session = requests.Session() -def get_user_info(token, user_id): - headers = {"Authorization": f"Bearer {token}"} - response = session.get(FLASK_INFO_URL, headers=headers) - if response.status_code == 200: - return UserCopy(id=user_id, **response.json()) - else: - return None - - -def get_token(token: Annotated[HTTPAuthorizationCredentials, Depends(auth_scheme)]): - token = token.credentials +def get_token(credentials: Annotated[HTTPAuthorizationCredentials, Depends(auth_scheme)]): + token = credentials.credentials if "Bearer " in token: token = token.replace("Bearer ", "") if token: @@ -45,33 +34,72 @@ def get_token(token: Annotated[HTTPAuthorizationCredentials, Depends(auth_scheme raise Unauthorized(detail="Access token is required") -def get_current_user(db: dbDep, token: str = Depends(get_token), ) -> Optional[User]: +def get_user_id_from_service(token: str) -> int: + headers = {"Authorization": f"Bearer {token}"} + response = session.get(FLASK_INFO_USER_ID_URL, headers=headers) + if response.status_code == 200: + data = response.json() + user_id = data.get("user_id") + if user_id is not None: + return user_id + else: + raise IncorrectTokenFormat(detail="User ID not found in the response") + else: + raise Unauthorized(detail="Invalid token or user not authorized") + + +def get_current_user(token: str = Depends(get_token)): try: payload = jwt.decode(token, settings.SECRET, algorithms=["HS256"]) - except JWTError as ex: - if str(ex) == "Signature has expired.": - raise IncorrectTokenFormat(detail="Signature has expired") - raise IncorrectTokenFormat(detail="qw") - expire: str = payload.get("exp") + except jwt.ExpiredSignatureError: + raise HTTPException(status_code=401, detail="Signature has expired") + except jwt.InvalidTokenError: + raise HTTPException(status_code=400, detail="Invalid token format") + + expire: int = payload.get("exp") if expire and int(expire) < datetime.now().timestamp(): raise TokenExpired() - user_id = payload.get("sub") - if not user_id: - raise IncorrectTokenFormat() - - user = get_user(db, user_id=user_id) - if not user: - user_info = get_user_info(token, user_id=user_id) - if user_info: - user = create_user(db, user_info) - return user - raise UserIsNotPresent() - if not user.last_check or user.last_check + timedelta(minutes=5) < datetime.now(): - print("updated") - user = user.update(get_user_info(token, user_id=user_id)) - db.commit() - return user - - -UserDep: User = Annotated[get_current_user, Depends()] + # Validate token with the external service and get user_id + user_id = get_user_id_from_service(token) + return user_id + + +UserDep = Annotated[int, Depends(get_current_user)] + + +def check_shop_id(shop_id: int, token: str = Depends(get_token)): + headers = {"Authorization": f"Bearer {token}"} + try: + response = session.get(f"{FLASK_INFO_SHOP_ID_URL}/{shop_id}", headers=headers) + if response.status_code == 200: + data = response.json() + shop_owner = data.get("shop_owner") + if shop_owner is not None: + return shop_owner + else: + raise NotFound(status_code=404, detail="shop_owner not found in response") + else: + raise NotFound(status_code=404, detail=f"Shop with id {shop_id} not found") + except RequestException as e: + raise HTTPException(status_code=503, detail="Could not connect to the shop service") from e + + +def get_shop_id_with_token_user(token: str = Depends(get_token)): + headers = {"Authorization": f"Bearer {token}"} + try: + response = session.get(f"{FLASK_INFO_SHOP_OWNER_ID_URL}", headers=headers) + if response.status_code == 200: + data = response.json() + shop_id = data.get("shop_id") + if shop_id is not None: + return shop_id + else: + raise NotFound(status_code=404, detail="shop_id not found in response") + else: + raise NotFound(status_code=404, detail=f"Owner shop not found") + except RequestException as e: + raise HTTPException(status_code=503, detail="Could not connect to the shop service") from e + + +ShopDep = Annotated[int, Depends(get_shop_id_with_token_user)] \ No newline at end of file diff --git a/chat/customer_router.py b/chat/customer_router.py index 014a2e8..1e18e4f 100644 --- a/chat/customer_router.py +++ b/chat/customer_router.py @@ -1,12 +1,12 @@ from fastapi import APIRouter from fastapi.templating import Jinja2Templates -from starlette.requests import Request from chat.core.dependencies import UserDep from chat.database.crud import (get_or_create_chat, create_message, get_messages, get_chats_by_customer_id) from chat.database.database import dbDep -from chat.database.schemas import MessageSchema, CustomerMessageCreateSchema, ChatsSchema, ChatModelSchema +from chat.database.schemas import MessageSchema, CustomerMessageCreateSchema, ChatModelSchema +from chat.core.exceptions import BadRequest templates = Jinja2Templates(directory="templates") @@ -14,21 +14,23 @@ @router.post("/create_chat") -def create_chat(user: UserDep, db: dbDep, shop_owner_id): - return get_or_create_chat(db=db, customer_id=user.id, shop_owner_id=shop_owner_id) +def create_chat(user_id: UserDep, db: dbDep, shop_id): + if shop_id is not int: + raise BadRequest(status_code=400, detail="shop_id must be an integer") + return get_or_create_chat(db=db, customer_id=user_id, shop_id=shop_id) @router.post("/send_message", response_model=MessageSchema) -def send_message(user: UserDep, db: dbDep, message: CustomerMessageCreateSchema): - message = create_message(db, customer_id=user.id, shop_owner_id=message.shop_owner_id, message_body=message.body) +def send_message(user_id: UserDep, db: dbDep, message: CustomerMessageCreateSchema): + message = create_message(db, customer_id=user_id, shop_id=message.shop_id, message_body=message.body) return message -@router.get("/chat/{shop_owner_id}") -def get_chat(user: UserDep, db: dbDep, shop_owner_id: int): - return get_messages(db=db, customer_id=user.id, shop_owner_id=shop_owner_id) +@router.get("/chat/{shop_id}") +def get_chat(user_id: UserDep, db: dbDep, shop_id: int): + return get_messages(db=db, customer_id=user_id, shop_id=shop_id) @router.get("/chats", response_model=list[ChatModelSchema]) -def get_customer_chats(user: UserDep, db: dbDep): - return get_chats_by_customer_id(db, user.id) +def get_customer_chats(user_id: UserDep, db: dbDep): + return get_chats_by_customer_id(db, user_id) diff --git a/chat/database/crud.py b/chat/database/crud.py index 420c282..f0d0060 100644 --- a/chat/database/crud.py +++ b/chat/database/crud.py @@ -1,47 +1,26 @@ from sqlalchemy.orm import Session +from chat.core.dependencies import check_shop_id from chat.core.exceptions import ChatCreationError -from chat.database import schemas -from chat.database.models import User, Message, Chat +from chat.database.models import Message, Chat from chat.database.schemas import ChatSchema -def get_user(db: Session, user_id: int) -> User: - return db.query(User).filter(User.id == user_id).first() - - -def get_user_by_email(db: Session, email: str) -> User: - return db.query(User).filter(User.email == email).first() - - -def create_user(db: Session, user: schemas.UserCopy): - db_user = User( - id=user.id, - email=user.email, - full_name=user.full_name, - profile_picture=user.profile_picture, - phone_number=user.phone_number, - shop_id=user.shop_id) - db.add(db_user) - db.commit() - db.refresh(db_user) - return db_user - - -def get_or_create_chat(db: Session, customer_id: int, shop_owner_id: int): - if customer_id == shop_owner_id: - raise ChatCreationError() - room = db.query(Chat).filter_by(customer_id=customer_id, shop_owner_id=shop_owner_id).first() +def get_or_create_chat(db: Session, customer_id: int, shop_id: int): + shop_owner = check_shop_id(shop_id) + if customer_id == shop_owner: + return ChatCreationError + room = db.query(Chat).filter_by(customer_id=customer_id, shop_id=shop_id).first() if not room: - room = Chat(customer_id=customer_id, shop_owner_id=shop_owner_id) + room = Chat(customer_id=customer_id, shop_id=shop_id) db.add(room) db.commit() db.refresh(room) return room -def create_message(db: Session, customer_id: int, shop_owner_id: int, message_body: str): - chat = get_or_create_chat(db, customer_id=customer_id, shop_owner_id=shop_owner_id) +def create_message(db: Session, customer_id: int, shop_id: int, message_body: str): + chat = get_or_create_chat(db, customer_id=customer_id, shop_id=shop_id) message = Message(chat_id=chat.id, owner_id=customer_id, body=message_body) @@ -51,13 +30,12 @@ def create_message(db: Session, customer_id: int, shop_owner_id: int, message_bo return message -def get_messages(db: Session, customer_id: int, shop_owner_id: int, skip: int = 0, limit: int = 100): - chat = get_or_create_chat(db, customer_id=customer_id, shop_owner_id=shop_owner_id) +def get_messages(db: Session, customer_id: int, shop_id: int, skip: int = 0, limit: int = 100): + chat = get_or_create_chat(db, customer_id=customer_id, shop_id=shop_id) messages = db.query(Message).where(Message.chat_id == chat.id, Message.deleted_at == None).offset(skip).limit( limit).all() return ChatSchema(**chat.__dict__, messages=messages) - # return db.query(Message).offset(skip).limit(limit).all() def get_message_by_id(db: Session, message_id: int) -> Message: @@ -69,12 +47,12 @@ def get_chats_by_customer_id(db: Session, user_id: int) -> list[Chat]: def get_chats_by_shop_owner_id(db: Session, user_id: int) -> list[Chat]: - return db.query(Chat).where(Chat.shop_owner_id == user_id).all() + return db.query(Chat).where(Chat.shop_id == user_id).all() -def soft_delete_message(db: Session, user: User, message_id: int): +def soft_delete_message(db: Session, user_id, message_id: int): message = get_message_by_id(db, message_id) - if message and message.owner_id == user.id: + if message and message.owner_id == user_id: message.delete() db.commit() return {"message": "Message deleted"} diff --git a/chat/database/database.py b/chat/database/database.py index 803c764..5ff7fc1 100644 --- a/chat/database/database.py +++ b/chat/database/database.py @@ -5,7 +5,6 @@ from sqlalchemy.orm import sessionmaker, DeclarativeBase SQLALCHEMY_DATABASE_URL = "sqlite:///./chat.db" -# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db" engine = create_engine( SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} @@ -15,10 +14,6 @@ class Base(DeclarativeBase): pass - # def __repr__(self): - # if hasattr(self, "id"): - # return '<%s: id=%r>' % (type(self).__name__, self.id) - # return DeclarativeBase.__repr__(self) def get_db(): diff --git a/chat/database/models.py b/chat/database/models.py index 8bf2c5a..7a96eaa 100644 --- a/chat/database/models.py +++ b/chat/database/models.py @@ -1,11 +1,9 @@ from datetime import datetime -from sqlalchemy import Column, ForeignKey, Integer, String, Text, DateTime -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import relationship, Mapped, object_session, mapped_column +from sqlalchemy import Column, ForeignKey, Integer, Text, DateTime +from sqlalchemy.orm import relationship, Mapped, mapped_column from chat.database.database import Base -from chat.database.schemas import UserCopy class SoftDeleteMixin: @@ -18,67 +16,22 @@ def undelete(self): self.deleted_at = None -class User(Base): - __tablename__ = "user" - - id = Column(Integer, primary_key=True) - email = Column(String, unique=True, index=True) - full_name = Column(String) - profile_picture = Column(String) - phone_number = Column(String) - shop_id = Column(Integer) - - last_check = Column(DateTime, nullable=True, default=datetime.now) - - messages = relationship("Message", back_populates="owner") - - def update(self, user: UserCopy): - self.email = user.email - self.full_name = user.full_name - self.profile_picture = user.profile_picture - self.phone_number = user.phone_number - self.shop_id = user.shop_id - self.last_check = datetime.now() - return self - - class Chat(Base): __tablename__ = "chat" id = Column(Integer, primary_key=True) - customer_id = Column(Integer, ForeignKey("user.id", ondelete="CASCADE")) - shop_owner_id = Column(Integer, ForeignKey("user.id", ondelete="CASCADE")) - - customer = relationship("User", foreign_keys=[customer_id]) - shop_owner = relationship("User", foreign_keys=[shop_owner_id]) + customer_id = Column(Integer, nullable=False) + shop_id = Column(Integer, nullable=False) messages = relationship("Message", back_populates="chat", cascade="all, delete-orphan") - # @hybrid_method - # def last_message(self, db: dbDep): - # msg = db.query(Message).where(Message.chat_id == self.id).order_by(Message.created_at).first() - # print(msg) - # return msg - - @hybrid_property - def last_message(self): - return object_session(self).query(Message).where(Message.chat_id == self.id).order_by(Message.id.desc()).first() - class Message(Base, SoftDeleteMixin): __tablename__ = "message" - # id = Column(Integer, primary_key=True) id: Mapped[int] = mapped_column(primary_key=True) chat_id = Column(Integer, ForeignKey('chat.id')) chat = relationship('Chat', back_populates='messages') - owner_id = Column(Integer, ForeignKey("user.id")) - owner = relationship("User", back_populates="messages") + owner_id = Column(Integer, nullable=False) body = Column(Text) created_at = Column(DateTime, default=datetime.now) - - @hybrid_property - def is_shop_owner(self): - if self.chat.shop_owner_id == self.owner_id: - return True - return False diff --git a/chat/database/schemas.py b/chat/database/schemas.py index f4bac9d..f1b92f8 100644 --- a/chat/database/schemas.py +++ b/chat/database/schemas.py @@ -4,7 +4,7 @@ class CustomerMessageCreateSchema(BaseModel): - shop_owner_id: int + shop_id: int body: str model_config = ConfigDict(from_attributes=True) @@ -22,18 +22,14 @@ class MessageSchema(BaseModel): chat_id: int owner_id: int body: str - is_shop_owner: Optional[bool] = None model_config = ConfigDict(from_attributes=True) - # @field_validator("is_shop_owner",mode="after") - # @classmethod - # def check_owner(cls): class ChatSchema(BaseModel): id: int customer_id: int - shop_owner_id: int + shop_id: int messages: list[MessageSchema] = [] model_config = ConfigDict(from_attributes=True) @@ -42,7 +38,7 @@ class ChatSchema(BaseModel): class ChatModelSchema(BaseModel): id: int customer_id: int - shop_owner_id: int + shop_id: int last_message: Optional[MessageSchema] = None model_config = ConfigDict(from_attributes=True) @@ -51,12 +47,3 @@ class ChatsSchema(BaseModel): chats: list[ChatModelSchema] model_config = ConfigDict(from_attributes=True) - - -class UserCopy(BaseModel): - id: int - email: str - full_name: str - profile_picture: str | None = None - phone_number: str | None = None - shop_id: int | None = None diff --git a/chat/router.py b/chat/router.py index 0b50afd..7abed8f 100644 --- a/chat/router.py +++ b/chat/router.py @@ -8,5 +8,5 @@ @router.delete("/delete_message/{message_id}") -def delete_message(user: UserDep, db: dbDep, message_id: int): - return soft_delete_message(db, user, message_id) +def delete_message(user_id: UserDep, db: dbDep, message_id: int): + return soft_delete_message(db, user_id, message_id) diff --git a/chat/shop_owner_router.py b/chat/shop_router.py similarity index 61% rename from chat/shop_owner_router.py rename to chat/shop_router.py index 0557d71..cc85662 100644 --- a/chat/shop_owner_router.py +++ b/chat/shop_router.py @@ -1,7 +1,7 @@ from fastapi import APIRouter from fastapi.templating import Jinja2Templates -from chat.core.dependencies import UserDep +from chat.core.dependencies import UserDep, ShopDep from chat.core.exceptions import ChatCreationError from chat.database.crud import create_message, get_messages, \ get_chats_by_shop_owner_id @@ -11,21 +11,21 @@ templates = Jinja2Templates(directory="templates") -router = APIRouter(prefix="/shop_owner", tags=["Shop owner"]) +router = APIRouter(prefix="/shop", tags=["Shop"]) @router.post("/send_message", response_model=MessageSchema) -def send_message(user: UserDep, db: dbDep, message: ShopOwnerMessageCreateSchema): - message = create_message(db, customer_id=message.customer_id, shop_owner_id=user.id, message_body=message.body) +def send_message(shop_id: ShopDep, db: dbDep, message: ShopOwnerMessageCreateSchema): + message = create_message(db, customer_id=message.customer_id, shop_id=shop_id, message_body=message.body) return message @router.get("/chat/{customer_id}", response_model=ChatSchema) -def get_chat(user: UserDep, db: dbDep, customer_id: int): - return get_messages(db, customer_id=customer_id, shop_owner_id=user.id) +def get_chat(user_id: UserDep, db: dbDep, customer_id: int): + return get_messages(db, customer_id=customer_id, shop_id=user_id) @router.get("/chats", response_model=ChatsSchema, responses={400: ChatCreationError.desc()}) -def get_shop_owner_chats(user: UserDep, db: dbDep): - chats = get_chats_by_shop_owner_id(db, user.id) +def get_shop_owner_chats(user_id: UserDep, db: dbDep): + chats = get_chats_by_shop_owner_id(db, user_id) return ChatsSchema(chats=chats) diff --git a/main.py b/main.py index c097709..009a32b 100644 --- a/main.py +++ b/main.py @@ -4,10 +4,10 @@ def init_app(): server = FastAPI() from chat.customer_router import router as customer_router - from chat.shop_owner_router import router as shop_owner_router + from chat.shop_router import router as shop_router from chat.router import router server.include_router(customer_router) - server.include_router(shop_owner_router) + server.include_router(shop_router) server.include_router(router) return server diff --git a/prospector.yaml b/prospector.yaml new file mode 100644 index 0000000..c25bc42 --- /dev/null +++ b/prospector.yaml @@ -0,0 +1,38 @@ +strictness: medium +doc-warnings: false +test-warnings: false +autodetect: true +member-warnings: false +inherits: + - default +ignore-paths: + - docs + - venv + - .venv + - conf + - migrations +ignore-patterns: + - (^|/)skip(this)?(/|$) + - venv/|.venv|conf/|migrations/ +max-line-length: 100 + +pylint: + run: true + disable: + - import-error + - bad-builtin + - too-few-public-methods + - use-symbolic-message-instead + - consider-using-f-string + +mypy: + run: true + options: + ignore-missing-imports: true + follow-imports: skip + +pycodestyle: + enable: + - W601 + options: + max-line-length: 100