This commit is contained in:
2026-04-09 19:28:41 +03:00
commit 9fa723bb4c
43 changed files with 2804 additions and 0 deletions

91
app/api/v1/forms.py Normal file
View File

@@ -0,0 +1,91 @@
# 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