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

50 statements  

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

1""" 

2Catalog related APIs. 

3""" 

4 

5import logging 

6from http import HTTPStatus 

7from typing import List 

8 

9from fastapi import APIRouter, Depends, HTTPException 

10from sqlmodel import Session, select 

11 

12from dj.api.engines import EngineInfo, get_engine 

13from dj.api.helpers import get_catalog 

14from dj.errors import DJException 

15from dj.models.catalog import Catalog, CatalogInfo 

16from dj.utils import get_session 

17 

18_logger = logging.getLogger(__name__) 

19router = APIRouter() 

20 

21 

22@router.get("/catalogs/", response_model=List[CatalogInfo]) 

23def list_catalogs(*, session: Session = Depends(get_session)) -> List[CatalogInfo]: 

24 """ 

25 List all available catalogs 

26 """ 

27 return list(session.exec(select(Catalog))) 

28 

29 

30@router.get("/catalogs/{name}/", response_model=CatalogInfo) 

31def get_a_catalog(name: str, *, session: Session = Depends(get_session)) -> CatalogInfo: 

32 """ 

33 Return a catalog by name 

34 """ 

35 return get_catalog(session, name) 

36 

37 

38@router.post("/catalogs/", response_model=CatalogInfo, status_code=201) 

39def add_a_catalog( 

40 data: CatalogInfo, 

41 *, 

42 session: Session = Depends(get_session), 

43) -> CatalogInfo: 

44 """ 

45 Add a Catalog 

46 """ 

47 try: 

48 get_catalog(session, data.name) 

49 except DJException: 

50 pass 

51 else: 

52 raise HTTPException( 

53 status_code=HTTPStatus.CONFLICT, 

54 detail=f"Catalog already exists: `{data.name}`", 

55 ) 

56 

57 catalog = Catalog.from_orm(data) 

58 catalog.engines.extend( 

59 list_new_engines( 

60 session=session, 

61 catalog=catalog, 

62 create_engines=data.engines, 

63 ), 

64 ) 

65 session.add(catalog) 

66 session.commit() 

67 session.refresh(catalog) 

68 

69 return catalog 

70 

71 

72@router.post("/catalogs/{name}/engines/", response_model=CatalogInfo, status_code=201) 

73def add_engines_to_a_catalog( 

74 name: str, 

75 data: List[EngineInfo], 

76 *, 

77 session: Session = Depends(get_session), 

78) -> CatalogInfo: 

79 """ 

80 Attach one or more engines to a catalog 

81 """ 

82 catalog = get_catalog(session, name) 

83 catalog.engines.extend( 

84 list_new_engines(session=session, catalog=catalog, create_engines=data), 

85 ) 

86 session.add(catalog) 

87 session.commit() 

88 session.refresh(catalog) 

89 return catalog 

90 

91 

92def list_new_engines( 

93 session: Session, 

94 catalog: Catalog, 

95 create_engines: List[EngineInfo], 

96) -> List[EngineInfo]: 

97 """ 

98 Filter to engines that are not already set on a catalog 

99 """ 

100 new_engines = [] 

101 for engine_ref in create_engines: 

102 already_set = False 

103 engine = get_engine(session, engine_ref.name, engine_ref.version) 

104 for set_engine in catalog.engines: 

105 if engine.name == set_engine.name and engine.version == set_engine.version: 

106 already_set = True 

107 if not already_set: 

108 new_engines.append(engine) 

109 return new_engines