action.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from typing import Dict, List
  2. from fastapi import APIRouter, Depends
  3. from sqlalchemy.ext.asyncio import AsyncSession
  4. from sqlmodel import select
  5. from app.api.deps import get_async_session, get_token_id
  6. from app.libs.paginate import cursor_page, CommonPage
  7. from app.models.action import Action, ActionRead
  8. from app.models.token_relation import RelationType
  9. from app.providers.auth_provider import auth_policy
  10. from app.schemas.common import DeleteResponse, BaseSuccessDataResponse
  11. from app.schemas.tool.action import ActionBulkCreateRequest, ActionUpdateRequest, ActionRunRequest
  12. from app.services.tool.action import ActionService
  13. router = APIRouter()
  14. @router.get("", response_model=CommonPage[ActionRead])
  15. async def list_actions(*, session: AsyncSession = Depends(get_async_session), token_id=Depends(get_token_id)):
  16. """
  17. Returns a list of Actions.
  18. """
  19. statement = auth_policy.token_filter(
  20. select(Action), field=Action.id, relation_type=RelationType.Action, token_id=token_id
  21. )
  22. page = await cursor_page(statement, session)
  23. page.data = [ast.model_dump(by_alias=True) for ast in page.data]
  24. return page.model_dump(by_alias=True)
  25. @router.post("", response_model=List[ActionRead])
  26. async def create_actions(
  27. *, session: AsyncSession = Depends(get_async_session), body: ActionBulkCreateRequest, token_id=Depends(get_token_id)
  28. ):
  29. """
  30. Create an action with openapi schema.
  31. """
  32. actions = await ActionService.create_actions(session=session, body=body, token_id=token_id)
  33. actions = [item.model_dump(by_alias=True) for item in actions]
  34. return actions
  35. @router.get("/{action_id}", response_model=ActionRead)
  36. async def get_action(*, session: AsyncSession = Depends(get_async_session), action_id: str):
  37. """
  38. Retrieves an action.
  39. """
  40. action = await ActionService.get_action(session=session, action_id=action_id)
  41. return action.model_dump(by_alias=True)
  42. @router.post("/{action_id}", response_model=ActionRead)
  43. async def modify_action(
  44. *, session: AsyncSession = Depends(get_async_session), action_id: str, body: ActionUpdateRequest
  45. ):
  46. """
  47. Modifies an action.
  48. """
  49. action = await ActionService.modify_action(session=session, action_id=action_id, body=body)
  50. return action.model_dump(by_alias=True)
  51. @router.delete("/{action_id}", response_model=DeleteResponse)
  52. async def delete_action(*, session: AsyncSession = Depends(get_async_session), action_id: str) -> DeleteResponse:
  53. """
  54. Delete an action.
  55. """
  56. return await ActionService.delete_action(session=session, action_id=action_id)
  57. @router.post(
  58. "/{action_id}/run",
  59. response_model=BaseSuccessDataResponse,
  60. )
  61. async def api_run_action(*, session: AsyncSession = Depends(get_async_session), action_id: str, body: ActionRunRequest):
  62. response: Dict = await ActionService.run_action(
  63. session=session,
  64. action_id=action_id,
  65. parameters=body.parameters,
  66. headers=body.headers,
  67. )
  68. return BaseSuccessDataResponse(data=response)