Add bulk spot upload script

This commit is contained in:
2026-05-23 17:21:00 +08:00
parent f1ce992d69
commit be09bf6f0a
3 changed files with 403 additions and 1 deletions
+31 -1
View File
@@ -7,7 +7,7 @@ from app.core.deps import get_current_active_user, get_db
from app.models.spot import Spot
from app.models.tag import SpotTag, Tag
from app.models.user import User
from app.schemas.tag import TagOut
from app.schemas.tag import TagCreate, TagOut
router = APIRouter()
@@ -16,6 +16,14 @@ class TagAttach(BaseModel):
tag_id: int
def _assert_admin_role(user: User) -> None:
if user.role not in ("admin", "moderator"):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Admin permission required",
)
@router.get("/tags", response_model=list[TagOut])
async def list_tags(
sort: str = Query(default="hot", regex="^(hot|name)$"),
@@ -31,6 +39,28 @@ async def list_tags(
return result.scalars().all()
@router.post("/tags", response_model=TagOut, status_code=status.HTTP_201_CREATED)
async def create_tag(
payload: TagCreate,
current_user: User = Depends(get_current_active_user),
db: AsyncSession = Depends(get_db),
):
_assert_admin_role(current_user)
name = payload.name.strip()
if not name:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Tag name is required")
existing = await db.execute(select(Tag).where(Tag.name == name))
if existing.scalar_one_or_none():
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Tag already exists")
tag = Tag(name=name, category=payload.category, is_active=True)
db.add(tag)
await db.commit()
await db.refresh(tag)
return tag
@router.post("/spots/{spot_id}/tags", status_code=status.HTTP_201_CREATED)
async def add_tag_to_spot(
spot_id: int,