Skip to content

Commit fdf8cce

Browse files
committed
feat: new structure
1 parent 47bb361 commit fdf8cce

File tree

7 files changed

+82
-35
lines changed

7 files changed

+82
-35
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@ coverage
6767
*.sln
6868
*.sw?
6969
package-lock.json
70-
pnpm-lock.yaml
70+
pnpm-lock.yaml
71+
.env

backend/app/api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from fastapi import APIRouter
2-
from app.api.api_v1.endpoints import overlay
2+
from app.api.v1.endpoints import overlay
33

44
api_router = APIRouter()
55
api_router.include_router(overlay.router, prefix="/overlay", tags=["overlay"])
Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,21 @@
1-
from fastapi import APIRouter, Depends
1+
from fastapi import APIRouter, Depends, HTTPException
22
from sqlalchemy.ext.asyncio import AsyncSession
3-
from sqlalchemy.orm import Session
4-
from app.schemas.user import UserCreate
5-
from app.crud.user import create_user
3+
from sqlalchemy.future import select
4+
5+
from app.schemas.overlay import OverlaySchema, OverlayCreate
6+
from app.crud.overlay import Overlay
67
from app.db.session import get_db
78

89
router = APIRouter()
910

10-
@router.get("/", response_model=list[Overlay])
11+
@router.get("/", response_model=list[OverlaySchema])
1112
async def get_overlays(session: AsyncSession = Depends(get_db)):
12-
result = await session.execute(select(Overlay))
13-
overlays = result.scalars().all()
14-
return [Overlay(riotId=overlay.riotId, hdevApiKey=overlay.hdevApiKey, uuid=overlay.uuid) for overlay in overlays]
13+
return get_overlays(session)
1514

1615
@router.get("/{overlay_id}", response_model=OverlaySchema)
1716
async def get_overlay(overlay_id: str, session: AsyncSession = Depends(get_db)):
18-
result = await session.execute(select(Overlay).filter(Overlay.uuid == overlay_id))
19-
overlay = result.scalars().first()
20-
if overlay is None:
21-
raise HTTPException(status_code=404, detail="Overlay not found")
22-
return overlay
17+
return get_overlay(overlay_id, session)
2318

24-
@router.post("/")
19+
@router.post("/", response_model=OverlaySchema)
2520
async def add_overlay(overlay: OverlayCreate, session: AsyncSession = Depends(get_db)):
26-
overlay = Overlay(riotId=overlay.riotId, hdevApiKey=overlay.hdevApiKey)
27-
session.add(overlay)
28-
await session.commit()
29-
await session.refresh(overlay)
30-
return overlay
21+
return add_overlay(overlay, session)

backend/app/crud/overlay.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from fastapi import APIRouter, Depends, HTTPException
2+
from sqlalchemy.ext.asyncio import AsyncSession
3+
from sqlalchemy.future import select
4+
5+
from app.models.overlay import Overlay
6+
# Импорты для моделей, схем и сессий
7+
from app.schemas.overlay import OverlaySchema, OverlayCreate # Pydantic-схема OverlayCreate
8+
from app.db.session import get_db # Асинхронная сессия базы данных
9+
10+
router = APIRouter()
11+
12+
async def get_overlays(session: AsyncSession = Depends(get_db)):
13+
result = await session.execute(select(Overlay))
14+
overlays = result.scalars().all()
15+
return [OverlayCreate(riotId=overlay.riotId, hdevApiKey=overlay.hdevApiKey, uuid=overlay.uuid) for overlay in overlays]
16+
17+
async def get_overlay(overlay_id: str, session: AsyncSession = Depends(get_db)):
18+
result = await session.execute(select(Overlay).filter(Overlay.uuid == overlay_id))
19+
overlay = result.scalars().first()
20+
if overlay is None:
21+
raise HTTPException(status_code=404, detail="Overlay not found")
22+
return overlay
23+
24+
async def add_overlay(overlay: OverlaySchema, session: AsyncSession = Depends(get_db)):
25+
new_overlay = Overlay(riotId=overlay.riotId, hdevApiKey=overlay.hdevApiKey)
26+
session.add(new_overlay)
27+
await session.commit()
28+
await session.refresh(new_overlay)
29+
return new_overlay

backend/app/schemas/overlay.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1-
from uuid import UUID
1+
import uuid as uuid_pkg
22

33
from pydantic import BaseModel
44

5+
from app.models.overlay import OverlayBase
6+
7+
58
class OverlaySchema(BaseModel):
6-
uuid: UUID
9+
uuid: uuid_pkg.UUID
710
nickname: str
811
tag: str
912

1013
class Config:
1114
orm_mode = True # Включает поддержку ORM для SQLAlchemy моделей
15+
16+
# Схема для создания записи
17+
class OverlayCreate(OverlayBase):
18+
pass # Наследует все поля от OverlayBase, используется для валидации входных данных
19+
20+
# Схема для ответа
21+
class OverlayRead(OverlayBase):
22+
uuid: uuid_pkg.UUID # Добавляем поле UUID в схему для ответа
23+
24+
class Config:
25+
orm_mode = True # Поддержка работы с SQLAlchemy/SQLModel объектами

backend/app/settings.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
import ast
21
from os import environ
32
from pathlib import Path
43

54
from dotenv import load_dotenv
65

6+
def str_to_bool(value: str) -> bool:
7+
return value.lower() in ("true", "1", "yes")
8+
79
BASE_DIR = Path(__file__).resolve().parent.parent.parent
810

11+
print(BASE_DIR)
12+
913
dotenv_file = BASE_DIR / '.env'
1014
if dotenv_file.is_file():
1115
load_dotenv(dotenv_file)
1216

13-
DEBUG = ast.literal_eval(environ.get('DEBUG'))
17+
DEBUG = str_to_bool(environ.get("DEBUG", "False"))
1418

1519
PROJECT_NAME = environ.get('PROJECT_NAME')
1620
VERSION = environ.get('VERSION')

backend/main.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
1+
from fastapi import FastAPI
12
from contextlib import asynccontextmanager
2-
3-
from fastapi import FastAPI, Depends, HTTPException
43
from fastapi.middleware.cors import CORSMiddleware
4+
from app.api import api_router
5+
from app.db.session import init_db
6+
from app import settings
57

6-
from sqlmodel import select
7-
from sqlmodel.ext.asyncio.session import AsyncSession
8-
9-
from Valory.backend.app import settings
10-
from Valory.backend.app.api import api_router
118

9+
# Определение lifespan для управления событиями старта и завершения
1210
@asynccontextmanager
1311
async def lifespan(app: FastAPI):
1412
# Выполняется при старте приложения
1513
await init_db()
1614
print("Application startup complete.")
1715

18-
yield # Контроль передается приложению
16+
yield # Передача управления основному приложению
1917

20-
# Выполняется при завершении работы приложения
18+
# Выполняется при завершении приложения
2119
print("Application shutdown complete.")
2220

21+
22+
# Создание экземпляра FastAPI с lifespan
2323
app = FastAPI(
2424
title=settings.PROJECT_NAME,
2525
version=settings.VERSION,
2626
lifespan=lifespan
2727
)
2828

29+
# Подключение CORS middleware
2930
app.add_middleware(
3031
CORSMiddleware,
31-
allow_origins=["*"],
32+
allow_origins=["*"], # Замените "*" на список доменов в production
3233
allow_credentials=True,
3334
allow_methods=["*"],
3435
allow_headers=["*"],
3536
)
3637

38+
# Подключение роутов
3739
app.include_router(api_router, prefix="/api/v1")
40+
41+
42+
# Тестовый маршрут
43+
@app.get("/")
44+
async def read_root():
45+
return {"message": "Welcome to the API!"}

0 commit comments

Comments
 (0)