# app/api/v1/forms.py from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from typing import Optional from app.api import deps from app.schemas.form import FormCreate, FormUpdate, FormResponse, FormWithFieldsResponse from app.schemas.common import MessageResponse, PaginatedResponse from app.services.form_service import FormService router = APIRouter(prefix="/forms", tags=["forms"]) @router.post("/", response_model=FormResponse, status_code=status.HTTP_201_CREATED) async def create_form( form_data: FormCreate, db: Session = Depends(deps.get_db), current_user: Optional[dict] = Depends(deps.get_current_user) ): """Создать новую форму""" service = FormService(db) try: form = service.create_form(form_data, user_id=current_user.get("id") if current_user else None) return form except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.get("/", response_model=PaginatedResponse[FormResponse]) async def list_forms( page: int = Query(1, ge=1), per_page: int = Query(20, ge=1, le=100), active_only: bool = False, db: Session = Depends(deps.get_db) ): """Список форм с пагинацией""" service = FormService(db) result = service.get_forms_paginated( page=page, per_page=per_page, active_only=active_only ) return result @router.get("/{form_id}") async def get_form( form_id: int, db: Session = Depends(deps.get_db) ): """Получить форму по ID с полями""" service = FormService(db) form = service.get_form_with_fields(form_id) if not form: raise HTTPException(status_code=404, detail="Form not found") return form @router.put("/{form_id}", response_model=FormResponse) async def update_form( form_id: int, form_data: FormUpdate, db: Session = Depends(deps.get_db) ): """Обновить форму""" service = FormService(db) form = service.update_form(form_id, form_data) if not form: raise HTTPException(status_code=404, detail="Form not found") return form @router.delete("/{form_id}", response_model=MessageResponse) async def delete_form( form_id: int, db: Session = Depends(deps.get_db) ): """Удалить форму""" service = FormService(db) success = service.delete_form(form_id) if not success: raise HTTPException(status_code=404, detail="Form not found") return MessageResponse(message="Form deleted successfully") @router.post("/{form_id}/publish", response_model=FormResponse) async def publish_form( form_id: int, publish: bool = True, db: Session = Depends(deps.get_db) ): """Опубликовать или скрыть форму""" service = FormService(db) form = service.publish_form(form_id, publish) if not form: raise HTTPException(status_code=404, detail="Form not found") return form