diff --git a/alembic.ini b/alembic.ini index 7c69d1d..aec9de8 100644 --- a/alembic.ini +++ b/alembic.ini @@ -61,8 +61,9 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # are written from script.py.mako # output_encoding = utf-8 -sqlalchemy.url = postgresql://hw14:1234@localhost/hw14 - +;sqlalchemy.url = postgresql://hw14:1234@localhost/hw14 +[alembic:env] +sqlalchemy.url = postgresql+asyncpg://user:password@localhost:5438/dbname [post_write_hooks] # post_write_hooks defines scripts or Python functions that are run @@ -103,7 +104,7 @@ qualname = sqlalchemy.engine [logger_alembic] level = INFO -handlers = +handlers = console qualname = alembic [handler_console] diff --git a/app/src/conf/config.py b/app/src/conf/config.py index 042e983..937cb04 100644 --- a/app/src/conf/config.py +++ b/app/src/conf/config.py @@ -9,6 +9,8 @@ class Settings(BaseSettings): env_file=pathlib.Path(__file__).resolve().parent.parent.parent.parent / ".env", env_file_encoding="utf-8", extra="ignore", + + ) api_name: str diff --git a/app/src/routes/auth.py b/app/src/routes/auth.py index 5ccc1f8..c1d7825 100644 --- a/app/src/routes/auth.py +++ b/app/src/routes/auth.py @@ -30,7 +30,7 @@ from app.src.schemas.tokens import TokenModel, TokenPasswordSetModel from app.src.repository import users as repository_users from app.src.services.auth import auth_service -from app.src.services.email import ( +from app.src.services.email_service import ( send_email_for_verification, send_email_for_password_reset, ) diff --git a/app/src/services/auth.py b/app/src/services/auth.py index 11cc0d2..5c49e56 100644 --- a/app/src/services/auth.py +++ b/app/src/services/auth.py @@ -2,7 +2,6 @@ Module of authentication class and methods """ - from datetime import datetime, timedelta, timezone from os import urandom from typing import Optional @@ -18,6 +17,7 @@ from app.src.conf.config import settings from app.src.database.connect_db import get_session, get_redis_db1 from app.src.repository import users as repository_users +# from .auth_service import get_current_user # Функція для отримання поточного користувача class Auth: @@ -51,7 +51,7 @@ def get_password_hash(self, password: str): return self.pwd_context.hash(password) async def create_access_token( - self, data: dict, expires_delta: Optional[float] = None + self, data: dict, expires_delta: Optional[float] = None ): """ Creates the access token. @@ -76,8 +76,19 @@ async def create_access_token( ) return encoded_access_token + async def role_required(role: str): + def decorator(current_user: User = Depends(get_current_user)): + if current_user.role != role: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Not enough permissions", + ) + return current_user + + return decorator + async def create_refresh_token( - self, data: dict, expires_delta: Optional[float] = None + self, data: dict, expires_delta: Optional[float] = None ): """ Creates the refresh token. @@ -107,7 +118,7 @@ async def create_refresh_token( return encoded_refresh_token async def create_email_verification_token( - self, data: dict, expires_delta: Optional[float] = None + self, data: dict, expires_delta: Optional[float] = None ): """ Creates the email verification token. @@ -137,7 +148,7 @@ async def create_email_verification_token( return encoded_email_verification_token async def create_password_reset_token( - self, data: dict, expires_delta: Optional[float] = None + self, data: dict, expires_delta: Optional[float] = None ): """ Creates the password reset token. @@ -167,7 +178,7 @@ async def create_password_reset_token( return encoded_password_reset_token async def create_password_set_token( - self, data: dict, expires_delta: Optional[float] = None + self, data: dict, expires_delta: Optional[float] = None ): """ Creates the password set token. @@ -313,10 +324,10 @@ async def decode_password_set_token(self, password_set_token: str): raise credentials_exception async def get_current_user( - self, - access_token: str = Depends(oauth2_scheme), - session: AsyncSession = Depends(get_session), - cache: Redis = Depends(get_redis_db1), + self, + access_token: str = Depends(oauth2_scheme), + session: AsyncSession = Depends(get_session), + cache: Redis = Depends(get_redis_db1), ): """ Gets the current user. @@ -357,4 +368,4 @@ async def get_current_user( return user -auth_service = Auth() \ No newline at end of file +auth_service = Auth() diff --git a/app/src/services/email.py b/app/src/services/email_service.py similarity index 82% rename from app/src/services/email.py rename to app/src/services/email_service.py index 6ea1ae1..879e14e 100644 --- a/app/src/services/email.py +++ b/app/src/services/email_service.py @@ -2,7 +2,6 @@ Module of email sending functions """ - from pathlib import Path from fastapi_mail import FastMail, MessageSchema, ConnectionConfig, MessageType @@ -11,6 +10,15 @@ from app.src.conf.config import settings +# # Імпортуємо стандартний модуль через importlib +# import importlib +# +# email_message = importlib.import_module('email.message') + +# Використовуємо власний модуль +# from . import email_service # це ваш локальний файл +from app.src.services import email_service + conf = ConnectionConfig( MAIL_SERVER=settings.mail_server, @@ -28,7 +36,7 @@ async def send_email_for_verification( - email: EmailStr, username: str, email_verification_token: str, host: HttpUrl + email: EmailStr, username: str, email_verification_token: str, host: HttpUrl ): """ Sends an email for verification of the user's email. @@ -63,7 +71,7 @@ async def send_email_for_verification( async def send_email_for_password_reset( - email: EmailStr, username: str, password_reset_token: str, host: HttpUrl + email: EmailStr, username: str, password_reset_token: str, host: HttpUrl ): """ Sends an email for the user's password reset. @@ -94,4 +102,4 @@ async def send_email_for_password_reset( fm = FastMail(conf) await fm.send_message(message, template_name="password_reset_email.html") except ConnectionErrors as error_message: - print(f"Connection error: {str(error_message)}") \ No newline at end of file + print(f"Connection error: {str(error_message)}") diff --git a/main.py b/main.py index d847190..f3d3389 100644 --- a/main.py +++ b/main.py @@ -22,6 +22,12 @@ from app.src.database.connect_db import engine, get_session, redis_db0, pool_redis_db from app.src.routes import contacts, auth, users +import asyncio +import sys + +if sys.platform.startswith("win"): + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + @asynccontextmanager async def lifespan(app: FastAPI):