base logic
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
from fastapi import APIRouter
|
||||
from src.api.users import router as users_router
|
||||
from src.api.tasks import router as tasks_router
|
||||
|
||||
router = APIRouter()
|
||||
from src.api.v1 import router as v1_router
|
||||
from src.core.settings import settings
|
||||
|
||||
router = APIRouter(prefix=settings.api.prefix)
|
||||
|
||||
router.include_router(router=v1_router)
|
||||
|
||||
router.include_router(router=users_router)
|
||||
router.include_router(router=tasks_router)
|
||||
|
||||
@@ -3,7 +3,7 @@ from typing import Annotated, AsyncGenerator
|
||||
from fastapi import Depends
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from src.db.database import async_session_maker
|
||||
from src.core.database import async_session_maker
|
||||
|
||||
|
||||
async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
||||
@@ -11,6 +11,6 @@ async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
||||
yield db
|
||||
|
||||
|
||||
DBDep = Annotated[AsyncSession, Depends(get_db)]
|
||||
sessionDep = Annotated[AsyncSession, Depends(get_db)]
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
from fastapi import APIRouter
|
||||
|
||||
router = APIRouter(prefix="/users", tags=["Users"])
|
||||
11
src/api/v1/__init__.py
Normal file
11
src/api/v1/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from fastapi import APIRouter
|
||||
from src.api.v1.auth import router as auth_router
|
||||
from src.api.v1.users import router as users_router
|
||||
from src.api.v1.tasks import router as tasks_router
|
||||
from src.core.settings import settings
|
||||
|
||||
router = APIRouter(prefix=settings.api.v1.prefix)
|
||||
|
||||
router.include_router(router=auth_router)
|
||||
router.include_router(router=users_router)
|
||||
router.include_router(router=tasks_router)
|
||||
13
src/api/v1/auth.py
Normal file
13
src/api/v1/auth.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.api.dependacies.db_dep import sessionDep
|
||||
from src.schemas.users import UserCreate
|
||||
from src.core.settings import settings
|
||||
from src.services.auth import AuthService
|
||||
|
||||
router = APIRouter(prefix=settings.api.v1.auth, tags=['Auth'])
|
||||
|
||||
|
||||
@router.post(path='/signup')
|
||||
async def registration(session: sessionDep, credential: UserCreate):
|
||||
await AuthService(session).registration(credential)
|
||||
5
src/api/v1/users.py
Normal file
5
src/api/v1/users.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from fastapi import APIRouter
|
||||
|
||||
from src.core.settings import settings
|
||||
|
||||
router = APIRouter(prefix=settings.api.v1.users, tags=["Users"])
|
||||
@@ -4,7 +4,7 @@ from sqlalchemy import TIMESTAMP, func
|
||||
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||
|
||||
from src.settings import settings
|
||||
from src.core.settings import settings
|
||||
|
||||
engine = create_async_engine(settings.db.url, echo=True)
|
||||
|
||||
@@ -7,6 +7,17 @@ BASE_DIR = Path(__file__).parent
|
||||
DB_PATH = BASE_DIR / "db/taskncoffee.db"
|
||||
|
||||
|
||||
class ApiV1Prefix(BaseModel):
|
||||
prefix: str = "/v1"
|
||||
auth: str = "/auth"
|
||||
users: str = "/users"
|
||||
|
||||
|
||||
class ApiPrefix(BaseModel):
|
||||
prefix: str = "/api"
|
||||
v1: ApiV1Prefix = ApiV1Prefix()
|
||||
|
||||
|
||||
class DbSettings(BaseModel):
|
||||
url: str = f"sqlite+aiosqlite:///{DB_PATH}"
|
||||
|
||||
@@ -22,7 +33,7 @@ class AccessToken(BaseSettings):
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
|
||||
api: ApiPrefix = ApiPrefix()
|
||||
db: DbSettings = DbSettings()
|
||||
access_token: AccessToken = AccessToken()
|
||||
|
||||
@@ -11,4 +11,4 @@ app = FastAPI()
|
||||
app.include_router(router=router)
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run("src.main:app", port=5000, log_level="info", reload=True)
|
||||
uvicorn.run("src.main:app", port=8000, log_level="info", reload=True)
|
||||
|
||||
@@ -4,7 +4,7 @@ from typing import Optional, TYPE_CHECKING
|
||||
from sqlalchemy import ForeignKey, Text, Date, Enum, String
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from src.db.database import Base
|
||||
from src.core.database import Base
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.models.users import UsersORM
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from typing import Optional, TYPE_CHECKING
|
||||
|
||||
from sqlalchemy import String, BigInteger, Integer, Boolean, VARCHAR
|
||||
from sqlalchemy import String, BigInteger, Integer, Boolean
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from src.db.database import Base
|
||||
from src.core.database import Base
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.models.tasks import TasksORM
|
||||
|
||||
0
src/repository/__init__.py
Normal file
0
src/repository/__init__.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from pydantic import BaseModel, EmailStr
|
||||
|
||||
|
||||
class UserRead(BaseModel):
|
||||
username: str
|
||||
email: EmailStr | None
|
||||
is_active: bool
|
||||
is_superuser: bool
|
||||
|
||||
|
||||
class UserCreate(BaseModel):
|
||||
username: str
|
||||
email: EmailStr | None = None
|
||||
password: str
|
||||
|
||||
|
||||
0
src/services/__init__.py
Normal file
0
src/services/__init__.py
Normal file
11
src/services/auth.py
Normal file
11
src/services/auth.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from src.schemas.users import UserCreate
|
||||
from src.services.base import BaseService
|
||||
|
||||
|
||||
class AuthService(BaseService):
|
||||
|
||||
|
||||
async def registration(self, data: UserCreate):
|
||||
...
|
||||
|
||||
|
||||
9
src/services/base.py
Normal file
9
src/services/base.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from src.utils.db_manager import DBManager
|
||||
|
||||
|
||||
class BaseService:
|
||||
session: DBManager | None
|
||||
|
||||
def __init__(self, session: DBManager):
|
||||
self.session = session
|
||||
|
||||
9
src/utils/auth_manager.py
Normal file
9
src/utils/auth_manager.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from passlib.context import CryptContext
|
||||
|
||||
|
||||
class AuthManger:
|
||||
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
||||
|
||||
@classmethod
|
||||
def verify_password(cls, plain_password, hashed_password):
|
||||
return cls.pwd_context.verify(plain_password, hashed_password)
|
||||
12
src/utils/db_manager.py
Normal file
12
src/utils/db_manager.py
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
|
||||
class DBManager:
|
||||
def __init__(self, session_factory):
|
||||
self.session_factory = session_factory
|
||||
|
||||
async def __aenter__(self):
|
||||
self.session = self.session_factory()
|
||||
|
||||
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
||||
await self.session.rollback()
|
||||
await self.session.close()
|
||||
Reference in New Issue
Block a user