Untitled

 avatar
unknown
plain_text
a year ago
2.7 kB
16
Indexable
# app/main.py
from datetime import timedelta

from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.ext.asyncio import AsyncSession

from app import crud, database, schemas, auth
from app.database import get_session
from app.settings import settings

app = FastAPI(title="Dijital Patoloji Backend")

# ✅ CORS (frontend hem localhost hem 127.0.0.1’den gelebilir)
origins = [o.strip() for o in settings.FRONTEND_ORIGINS.split(",")]
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.on_event("startup")
async def on_startup():
    await database.init_db()

# -------------------------
# Kullanıcı oluşturma (Register) — sadece query param
# -------------------------
@app.post("/users/", response_model=schemas.UserRead, status_code=status.HTTP_201_CREATED)
async def create_user(
    username: str,
    password: str,
    email: str | None = None,
    db: AsyncSession = Depends(get_session),
):
    # Aynı kullanıcı var mı?
    db_user = await crud.get_user_by_username(db, username)
    if db_user:
        raise HTTPException(status_code=400, detail="Kullanıcı zaten mevcut")

    return await crud.create_user(
        db,
        username=username,
        password=password,
        email=email,
    )

# -------------------------
# Giriş (Login) — username veya email ile
# -------------------------
@app.post("/login", response_model=schemas.Token)
async def login(body: schemas.LoginRequest, db: AsyncSession = Depends(get_session)):
    # Önce kullanıcı adına göre ara
    user = await crud.get_user_by_username(db, body.username)
    # Bulunamadıysa ve '@' içeriyorsa e-postaya göre dene
    if not user and "@" in body.username:
        user = await crud.get_user_by_email(db, body.username)

    if not user or not auth.verify_password(body.password, user.hashed_password):
        raise HTTPException(status_code=401, detail="Kullanıcı adı veya şifre hatalı")

    token = auth.create_access_token(
        {"sub": user.username},
        timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES),
    )
    return {"access_token": token, "token_type": "bearer"}

# -------------------------
# Korumalı örnek endpoint
# -------------------------
@app.get("/me", response_model=schemas.UserRead)
async def me(current_user=Depends(auth.get_current_user)):
    return {
        "id": current_user.id,
        "username": current_user.username,
        "email": current_user.email,
    }
Editor is loading...
Leave a Comment