from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from pydantic import BaseModel, Field from typing import List, Optional from datetime import datetime from ..database import get_db from .. import models from ..dependencies import get_current_user router = APIRouter() class SellCreate(BaseModel): btc_amount: float = Field(gt=0, le=21_000_000) price_eur: float = Field(gt=0, le=10_000_000) created_at: Optional[datetime] = None class SellUpdate(BaseModel): btc_amount: float = Field(gt=0, le=21_000_000) price_eur: float = Field(gt=0, le=10_000_000) created_at: datetime class SellOut(BaseModel): id: int btc_amount: float price_eur: float created_at: datetime class Config: from_attributes = True @router.get("/sells", response_model=List[SellOut]) def list_sells( db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user), ): return ( db.query(models.Sell) .filter(models.Sell.user_id == current_user.id) .order_by(models.Sell.created_at) .all() ) @router.post("/sells", response_model=SellOut, status_code=status.HTTP_201_CREATED) def add_sell( sell_in: SellCreate, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user), ): sell = models.Sell( btc_amount=sell_in.btc_amount, price_eur=sell_in.price_eur, created_at=sell_in.created_at or datetime.utcnow(), user_id=current_user.id, ) db.add(sell) db.commit() db.refresh(sell) return sell @router.put("/sells/{sell_id}", response_model=SellOut) def update_sell( sell_id: int, sell_in: SellUpdate, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user), ): sell = db.query(models.Sell).filter( models.Sell.id == sell_id, models.Sell.user_id == current_user.id, ).first() if not sell: raise HTTPException(status_code=404, detail="Sell not found") sell.btc_amount = sell_in.btc_amount sell.price_eur = sell_in.price_eur sell.created_at = sell_in.created_at db.commit() db.refresh(sell) return sell @router.delete("/sells/{sell_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_sell( sell_id: int, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user), ): sell = db.query(models.Sell).filter( models.Sell.id == sell_id, models.Sell.user_id == current_user.id, ).first() if not sell: raise HTTPException(status_code=404, detail="Sell not found") db.delete(sell) db.commit()