base logic

This commit is contained in:
IluaAir
2025-07-06 11:58:45 +03:00
parent 817a799ef5
commit 4de11f4149
23 changed files with 149 additions and 17 deletions

View File

@@ -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)

View File

@@ -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)]

View File

@@ -1,3 +0,0 @@
from fastapi import APIRouter
router = APIRouter(prefix="/users", tags=["Users"])

11
src/api/v1/__init__.py Normal file
View 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
View 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
View File

@@ -0,0 +1,5 @@
from fastapi import APIRouter
from src.core.settings import settings
router = APIRouter(prefix=settings.api.v1.users, tags=["Users"])

View File

@@ -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)

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

View 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
View File

11
src/services/auth.py Normal file
View 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
View 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

View 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
View 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()