Coverage for dj/api/namespaces.py: 100%

25 statements  

« prev     ^ index     » next       coverage.py v7.2.3, created at 2023-04-17 20:05 -0700

1""" 

2Node namespace related APIs. 

3""" 

4import logging 

5from typing import List 

6 

7from fastapi import APIRouter, Depends 

8from fastapi.responses import JSONResponse 

9from sqlalchemy.orm import joinedload 

10from sqlmodel import Session, select 

11 

12from dj.api.helpers import get_node_namespace 

13from dj.models.node import Node, NodeNamespace, NodeOutput 

14from dj.utils import get_session 

15 

16_logger = logging.getLogger(__name__) 

17router = APIRouter() 

18 

19 

20@router.post("/namespaces/{namespace}/", status_code=201) 

21def create_a_node_namespace( 

22 namespace: str, 

23 session: Session = Depends(get_session), 

24) -> JSONResponse: 

25 """ 

26 Create a node namespace 

27 """ 

28 if get_node_namespace( 

29 session=session, 

30 namespace=namespace, 

31 raise_if_not_exists=False, 

32 ): # pragma: no cover 

33 return JSONResponse( 

34 status_code=409, 

35 content={ 

36 "message": (f"Node namespace `{namespace}` already exists"), 

37 }, 

38 ) 

39 node_namespace = NodeNamespace(namespace=namespace) 

40 session.add(node_namespace) 

41 session.commit() 

42 return JSONResponse( 

43 status_code=201, 

44 content={ 

45 "message": (f"Node namespace `{namespace}` has been successfully created"), 

46 }, 

47 ) 

48 

49 

50@router.get( 

51 "/namespaces/", 

52 response_model=List[NodeNamespace], 

53 status_code=200, 

54) 

55def list_node_namespaces( 

56 session: Session = Depends(get_session), 

57) -> List[NodeNamespace]: 

58 """ 

59 List node namespaces 

60 """ 

61 namespaces = session.exec(select(NodeNamespace)).all() 

62 return namespaces 

63 

64 

65@router.get( 

66 "/namespaces/{namespace}/", 

67 response_model=List[NodeOutput], 

68 status_code=200, 

69) 

70def list_nodes_in_namespace( 

71 namespace: str, 

72 session: Session = Depends(get_session), 

73) -> List[NodeOutput]: 

74 """ 

75 List nodes in namespace 

76 """ 

77 nodes = ( 

78 session.exec( 

79 select(Node) 

80 .options(joinedload(Node.current)) 

81 .where( 

82 Node.namespace.like( # type: ignore # pylint: disable=no-member 

83 f"{namespace}%", 

84 ), 

85 ), 

86 ) 

87 .unique() 

88 .all() 

89 ) 

90 return nodes # type: ignore