add public prompts and copy endpoints

This commit is contained in:
CREDO23 2026-03-30 19:36:54 +02:00
parent f14f09cbe6
commit 24fd19a394

View file

@ -1,12 +1,14 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from app.db import Prompt, User, get_async_session from app.db import Prompt, User, get_async_session
from app.schemas.prompts import ( from app.schemas.prompts import (
PromptCreate, PromptCreate,
PromptRead, PromptRead,
PromptUpdate, PromptUpdate,
PublicPromptRead,
) )
from app.users import current_active_user from app.users import current_active_user
@ -92,3 +94,54 @@ async def delete_prompt(
await session.delete(prompt) await session.delete(prompt)
await session.commit() await session.commit()
return {"success": True} return {"success": True}
@router.get("/prompts/public", response_model=list[PublicPromptRead])
async def list_public_prompts(
session: AsyncSession = Depends(get_async_session),
user: User = Depends(current_active_user),
):
result = await session.execute(
select(Prompt)
.options(selectinload(Prompt.user))
.where(Prompt.is_public.is_(True))
.order_by(Prompt.created_at.desc())
)
prompts = result.scalars().all()
return [
PublicPromptRead(
**PromptRead.model_validate(p).model_dump(),
author_name=p.user.email if p.user else None,
)
for p in prompts
]
@router.post("/prompts/{prompt_id}/copy", response_model=PromptRead)
async def copy_public_prompt(
prompt_id: int,
session: AsyncSession = Depends(get_async_session),
user: User = Depends(current_active_user),
):
result = await session.execute(
select(Prompt).where(
Prompt.id == prompt_id,
Prompt.is_public.is_(True),
)
)
source = result.scalar_one_or_none()
if not source:
raise HTTPException(status_code=404, detail="Prompt not found")
copy = Prompt(
user_id=user.id,
name=source.name,
prompt=source.prompt,
mode=source.mode,
icon=source.icon,
is_public=False,
)
session.add(copy)
await session.commit()
await session.refresh(copy)
return copy