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
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-17 20:05 -0700
1"""
2Catalog related APIs.
3"""
5import logging
6from http import HTTPStatus
7from typing import List
9from fastapi import APIRouter, Depends, HTTPException
10from sqlmodel import Session, select
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
18_logger = logging.getLogger(__name__)
19router = APIRouter()
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)))
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)
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 )
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)
69 return catalog
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
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