| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- """API routes for enricher templates management."""
- from typing import List
- from uuid import UUID
- from fastapi import APIRouter, Depends, HTTPException, Query, status
- from flowsint_core.core.models import Profile
- from flowsint_core.core.postgre_db import get_db
- from flowsint_core.core.services import (
- ConflictError,
- NotFoundError,
- ValidationError,
- create_enricher_template_service,
- create_template_generator_service,
- )
- from flowsint_core.core.template_enricher import TemplateEnricher
- from flowsint_core.core.vault import Vault
- from flowsint_core.templates.types import Template
- from sqlalchemy.orm import Session
- from flowsint_types.registry import get_type as get_type_from_registry, load_all_types
- from app.api.deps import get_current_user
- from app.api.schemas.enricher_template import (
- EnricherTemplateCreate,
- EnricherTemplateGenerateRequest,
- EnricherTemplateGenerateResponse,
- EnricherTemplateList,
- EnricherTemplateRead,
- EnricherTemplateTestRequest,
- EnricherTemplateTestResponse,
- EnricherTemplateUpdate,
- )
- router = APIRouter()
- @router.post(
- "", response_model=EnricherTemplateRead, status_code=status.HTTP_201_CREATED
- )
- def create_template(
- template: EnricherTemplateCreate,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """Create a new enricher template."""
- content = template.content
- name = content.get("name", template.name)
- description = content.get("description", template.description)
- category = content.get("category", template.category)
- version = float(content.get("version", template.version))
- service = create_enricher_template_service(db)
- try:
- return service.create_template(
- name=name,
- description=description,
- category=category,
- version=version,
- content=content,
- is_public=template.is_public,
- owner_id=current_user.id,
- )
- except ConflictError as e:
- raise HTTPException(status_code=400, detail=str(e))
- @router.get("", response_model=List[EnricherTemplateList])
- def list_templates(
- category: str = Query(None, description="Filter by category"),
- include_public: bool = Query(
- True, description="Include public templates from other users"
- ),
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """List enricher templates."""
- service = create_enricher_template_service(db)
- return service.list_templates(current_user.id, category, include_public)
- @router.post("/generate", response_model=EnricherTemplateGenerateResponse)
- async def generate_template(
- request: EnricherTemplateGenerateRequest,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """Generate an enricher template from a free-text description using AI."""
- load_all_types()
- input_schema = None
- output_schema = None
- if request.input_type:
- input_cls = get_type_from_registry(request.input_type, case_sensitive=True)
- if input_cls is None:
- raise HTTPException(
- status_code=422,
- detail=f"Unknown input type: '{request.input_type}'",
- )
- input_schema = input_cls.model_json_schema()
- if request.output_type:
- output_cls = get_type_from_registry(request.output_type, case_sensitive=True)
- if output_cls is None:
- raise HTTPException(
- status_code=422,
- detail=f"Unknown output type: '{request.output_type}'",
- )
- output_schema = output_cls.model_json_schema()
- service = create_template_generator_service(db)
- try:
- yaml_content = await service.generate(
- prompt=request.prompt,
- owner_id=current_user.id,
- input_type=request.input_type,
- input_schema=input_schema,
- output_type=request.output_type,
- output_schema=output_schema,
- )
- except ValidationError as e:
- raise HTTPException(status_code=422, detail=str(e))
- return EnricherTemplateGenerateResponse(yaml_content=yaml_content)
- @router.post("/{template_id}/test", response_model=EnricherTemplateTestResponse)
- async def test_template(
- template_id: UUID,
- test_request: EnricherTemplateTestRequest,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """Test an enricher template with a sample input value."""
- service = create_enricher_template_service(db)
- try:
- db_template = service.get_template(template_id, current_user.id)
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Template not found")
- try:
- content = db_template.content
- template = Template(**content)
- vault = Vault(db=db, owner_id=current_user.id)
- enricher = TemplateEnricher(
- sketch_id="123", scan_id="123", template=template, vault=vault
- )
- await enricher.async_init()
- pre = enricher.preprocess([test_request.input_value])
- results = await enricher.scan(pre)
- data = {"results": results, "raw_results": enricher.get_raw_response()}
- return EnricherTemplateTestResponse(
- success=True, data=data, status_code=200, url=template.request.url
- )
- except Exception as e:
- raise HTTPException(status_code=500, detail=f"An error occured : {e}")
- @router.get("/{template_id}", response_model=EnricherTemplateRead)
- def get_template(
- template_id: UUID,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """Get a specific enricher template by ID."""
- service = create_enricher_template_service(db)
- try:
- return service.get_template(template_id, current_user.id)
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Template not found")
- @router.put("/{template_id}", response_model=EnricherTemplateRead)
- def update_template(
- template_id: UUID,
- update_data: EnricherTemplateUpdate,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """Update an enricher template. Only the owner can update."""
- service = create_enricher_template_service(db)
- try:
- return service.update_template(
- template_id=template_id,
- owner_id=current_user.id,
- update_data=update_data.model_dump(exclude_unset=True),
- )
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Template not found")
- except ConflictError as e:
- raise HTTPException(status_code=400, detail=str(e))
- @router.delete("/{template_id}", status_code=status.HTTP_204_NO_CONTENT)
- def delete_template(
- template_id: UUID,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- """Delete an enricher template. Only the owner can delete."""
- service = create_enricher_template_service(db)
- try:
- service.delete_template(template_id, current_user.id)
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Template not found")
- return None
|