Files
blackroad-operating-system/backend/app/routers/creator.py

86 lines
2.7 KiB
Python

"""Creator Studio routes"""
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from pydantic import BaseModel, Field
from app.auth import get_current_active_user
from app.database import get_db
from app.models.creator import CreativeProject
from app.models.user import User
router = APIRouter(prefix="/api/creator", tags=["Creator"])
class CreativeProjectPayload(BaseModel):
title: str
type: str = "mixed"
description: Optional[str] = None
links_to_assets: List[str] = Field(default_factory=list)
status: str = "idea"
revenue_streams: dict = Field(default_factory=dict)
notes: Optional[str] = None
class CreativeProjectResponse(CreativeProjectPayload):
id: int
class Config:
from_attributes = True
@router.get("/projects", response_model=List[CreativeProjectResponse])
async def list_projects(
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_active_user)
):
result = await db.execute(select(CreativeProject).order_by(CreativeProject.created_at.desc()))
return result.scalars().all()
@router.post("/projects", response_model=CreativeProjectResponse, status_code=status.HTTP_201_CREATED)
async def create_project(
payload: CreativeProjectPayload,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_active_user)
):
project = CreativeProject(**payload.model_dump())
db.add(project)
await db.commit()
await db.refresh(project)
return project
@router.get("/projects/{project_id}", response_model=CreativeProjectResponse)
async def get_project(
project_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_active_user)
):
result = await db.execute(select(CreativeProject).where(CreativeProject.id == project_id))
project = result.scalar_one_or_none()
if not project:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found")
return project
@router.put("/projects/{project_id}", response_model=CreativeProjectResponse)
async def update_project(
project_id: int,
payload: CreativeProjectPayload,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_active_user)
):
result = await db.execute(select(CreativeProject).where(CreativeProject.id == project_id))
project = result.scalar_one_or_none()
if not project:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found")
for field, value in payload.model_dump().items():
setattr(project, field, value)
await db.commit()
await db.refresh(project)
return project