from fastapi import FastAPI, HTTPException, Depends, Query from pydantic import BaseModel, Field, EmailStr from typing import Optional from datetime import datetime app = FastAPI(title="User API", version="1.0.0") # --- Models --- class UserCreate(BaseModel): name: str = Field(..., min_length=2, max_length=100) email: EmailStr password: str = Field(..., min_length=8) class UserUpdate(BaseModel): name: Optional[str] = Field(None, min_length=2, max_length=100) email: Optional[EmailStr] = None class UserResponse(BaseModel): id: int name: str email: str created_at: datetime class Config: from_attributes = True # --- In-memory DB (demo) --- users_db: dict[int, dict] = {} next_id = 1 # --- Endpoints --- @app.post("/api/users", response_model=UserResponse, status_code=201) def create_user(user: UserCreate): global next_id # Email benzersizlik kontrolu for u in users_db.values(): if u["email"] == user.email: raise HTTPException(status_code=409, detail="Email zaten kayitli") new_user = { "id": next_id, "name": user.name, "email": user.email, "password": user.password, # Production'da hash'le! "created_at": datetime.now() } users_db[next_id] = new_user next_id += 1 return new_user @app.get("/api/users", response_model=list[UserResponse]) def list_users(skip: int = Query(0, ge=0), limit: int = Query(20, ge=1, le=100)): all_users = list(users_db.values()) return all_users[skip:skip + limit] @app.get("/api/users/{user_id}", response_model=UserResponse) def get_user(user_id: int): if user_id not in users_db: raise HTTPException(status_code=404, detail="Kullanici bulunamadi") return users_db[user_id] @app.put("/api/users/{user_id}", response_model=UserResponse) def update_user(user_id: int, user: UserUpdate): if user_id not in users_db: raise HTTPException(status_code=404, detail="Kullanici bulunamadi") if user.name is not None: users_db[user_id]["name"] = user.name if user.email is not None: users_db[user_id]["email"] = user.email return users_db[user_id] @app.delete("/api/users/{user_id}", status_code=204) def delete_user(user_id: int): if user_id not in users_db: raise HTTPException(status_code=404, detail="Kullanici bulunamadi") del users_db[user_id]