Files

68 lines
2.2 KiB
Python
Raw Permalink Normal View History

"""Endpoints для портфолио фрилансера."""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from app.core.database import get_db
from app.core.security import get_current_user
from app.models.portfolio import PortfolioItem
from app.models.user import User
router = APIRouter(prefix="/api/portfolio", tags=["portfolio"])
@router.post("")
async def create_portfolio_item(data: dict, db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
"""Добавить работу в портфолио."""
item = PortfolioItem(
freelancer_id=user["id"],
title=data.get("title", ""),
description=data.get("description"),
image_url=data.get("image_url"),
live_url=data.get("live_url"),
technologies=data.get("technologies", []),
)
db.add(item)
await db.commit()
await db.refresh(item)
return {"id": str(item.id)}
@router.get("/user/{user_id}")
async def list_portfolio(user_id: str, db: AsyncSession = Depends(get_db)):
"""Список работ в портфолио пользователя."""
result = await db.execute(select(PortfolioItem).where(PortfolioItem.freelancer_id == user_id))
items = result.scalars().all()
return [
{
"id": str(i.id),
"title": i.title,
"description": i.description,
"image_url": i.image_url,
"live_url": i.live_url,
"technologies": i.technologies,
"created_at": str(i.created_at),
} for i in items
]
@router.delete("/{item_id}")
async def delete_portfolio_item(item_id: str, user: dict = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
"""Удалить работу из портфолио."""
result = await db.execute(select(PortfolioItem).where(PortfolioItem.id == item_id))
item = result.scalar_one_or_none()
if not item or item.freelancer_id != user["id"]:
raise HTTPException(status_code=403, detail="Нет доступа")
await db.delete(item)
await db.commit()
return {"status": "deleted"}