From efebe6171e92d413928bec9c40990dbccf1bbee5 Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Mon, 27 Nov 2023 14:01:42 +0100 Subject: [PATCH] Added all other missing API endpoints. --- pkgs/clan-cli/clan_cli/webui/app.py | 4 +- .../clan-cli/clan_cli/webui/error_handlers.py | 15 +++ .../clan_cli/webui/routers/sql_connect.py | 104 ++++++++++++----- pkgs/clan-cli/clan_cli/webui/sql_crud.py | 109 +++++++++++++----- 4 files changed, 176 insertions(+), 56 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index 8397d16..9e5ffd8 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -7,11 +7,12 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.routing import APIRoute from fastapi.staticfiles import StaticFiles +from sqlalchemy.exc import SQLAlchemyError from ..errors import ClanError from . import sql_models from .assets import asset_path -from .error_handlers import clan_error_handler +from .error_handlers import clan_error_handler, sql_error_handler from .routers import health, root, socket_manager2, sql_connect # sql router hinzufügen from .sql_db import engine from .tags import tags_metadata @@ -53,6 +54,7 @@ def setup_app() -> FastAPI: # Needs to be last in register. Because of wildcard route app.include_router(root.router) app.add_exception_handler(ClanError, clan_error_handler) # type: ignore + app.add_exception_handler(SQLAlchemyError, sql_error_handler) # type: ignore app.mount("/static", StaticFiles(directory=asset_path()), name="static") diff --git a/pkgs/clan-cli/clan_cli/webui/error_handlers.py b/pkgs/clan-cli/clan_cli/webui/error_handlers.py index c7f226d..341bb2e 100644 --- a/pkgs/clan-cli/clan_cli/webui/error_handlers.py +++ b/pkgs/clan-cli/clan_cli/webui/error_handlers.py @@ -3,12 +3,27 @@ import logging from fastapi import Request, status from fastapi.encoders import jsonable_encoder from fastapi.responses import JSONResponse +from sqlalchemy.exc import SQLAlchemyError from ..errors import ClanError log = logging.getLogger(__name__) +def sql_error_handler(request: Request, exc: SQLAlchemyError) -> JSONResponse: + log.exception(exc) + detail = [ + { + "loc": [], + "msg": exc._message(), + } + ] + return JSONResponse( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + content=jsonable_encoder(dict(detail=detail)), + ) + + def clan_error_handler(request: Request, exc: ClanError) -> JSONResponse: log.error("ClanError: %s", exc) detail = [ diff --git a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py index db209c7..284f8b9 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from fastapi import APIRouter, Depends from sqlalchemy.orm import Session @@ -19,6 +19,19 @@ from ..tags import Tags router = APIRouter() +######################### +# # +# Producer # +# # +######################### +@router.post("/api/v1/create_producer", response_model=Producer, tags=[Tags.producers]) +def create_producer( + producer: ProducerCreate, db: Session = Depends(sql_db.get_db) +) -> Producer: + # todo checken ob schon da ... + return sql_crud.create_producer(db=db, producer=producer) + + @router.get( "/api/v1/get_producers", response_model=List[Producer], tags=[Tags.producers] ) @@ -29,30 +42,24 @@ def get_producers( return producers -@router.post("/api/v1/create_producer", response_model=Producer, tags=[Tags.producers]) -def create_producer( - producer: ProducerCreate, db: Session = Depends(sql_db.get_db) -) -> Producer: - # todo checken ob schon da ... - return sql_crud.create_producer(db=db, producer=producer) - - -@router.post("/api/v1/create_entity", response_model=Entity, tags=[Tags.entities]) -def create_entity( - entity: EntityCreate, db: Session = Depends(sql_db.get_db) -) -> EntityCreate: - # todo checken ob schon da ... - return sql_crud.create_entity(db, entity) - - -@router.get("/api/v1/get_entities", response_model=List[Entity], tags=[Tags.entities]) -def get_entities( - skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) -) -> List[sql_models.Entity]: - entities = sql_crud.get_entities(db, skip=skip, limit=limit) - return entities +@router.get( + "/api/v1/get_producer", response_model=List[Producer], tags=[Tags.producers] +) +def get_producer( + entity_did: str = "did:sov:test:1234", + skip: int = 0, + limit: int = 100, + db: Session = Depends(sql_db.get_db), +) -> List[sql_models.Producer]: + producer = sql_crud.get_producers_by_entity_did(db, entity_did=entity_did) + return producer +######################### +# # +# Consumer # +# # +######################### @router.post("/api/v1/create_consumer", response_model=Consumer, tags=[Tags.consumers]) def create_consumer( consumer: ConsumerCreate, db: Session = Depends(sql_db.get_db) @@ -71,15 +78,28 @@ def get_consumers( return consumers +@router.get( + "/api/v1/get_consumer", response_model=List[Consumer], tags=[Tags.consumers] +) +def get_consumer( + entity_did: str = "did:sov:test:1234", + skip: int = 0, + limit: int = 100, + db: Session = Depends(sql_db.get_db), +) -> List[sql_models.Consumer]: + consumer = sql_crud.get_consumers_by_entity_did(db, entity_did=entity_did) + return consumer + + ######################### # # # REPOSITORY # # # ######################### @router.post( - "/api/v1/add_to_repository", response_model=Repository, tags=[Tags.repositories] + "/api/v1/create_repository", response_model=Repository, tags=[Tags.repositories] ) -def add_to_repository( +def create_repository( repository: RepositoryCreate, db: Session = Depends(sql_db.get_db) ) -> sql_models.Repository: # todo checken ob schon da ... @@ -102,10 +122,42 @@ def get_repositories( "/api/v1/get_repository", response_model=List[Repository], tags=[Tags.repositories] ) def get_repository( - entity_did: str, + entity_did: str = "did:sov:test:1234", skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db), ) -> List[sql_models.Repository]: repository = sql_crud.get_repository_by_did(db, did=entity_did) return repository + + +######################### +# # +# Entity # +# # +######################### +@router.post("/api/v1/create_entity", response_model=Entity, tags=[Tags.entities]) +def create_entity( + entity: EntityCreate, db: Session = Depends(sql_db.get_db) +) -> EntityCreate: + # todo checken ob schon da ... + return sql_crud.create_entity(db, entity) + + +@router.get("/api/v1/get_entities", response_model=List[Entity], tags=[Tags.entities]) +def get_entities( + skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) +) -> List[sql_models.Entity]: + entities = sql_crud.get_entities(db, skip=skip, limit=limit) + return entities + + +@router.get("/api/v1/get_entity", response_model=Optional[Entity], tags=[Tags.entities]) +def get_entity( + entity_did: str = "did:sov:test:1234", + skip: int = 0, + limit: int = 100, + db: Session = Depends(sql_db.get_db), +) -> Optional[sql_models.Entity]: + entity = sql_crud.get_entity_by_did(db, did=entity_did) + return entity diff --git a/pkgs/clan-cli/clan_cli/webui/sql_crud.py b/pkgs/clan-cli/clan_cli/webui/sql_crud.py index 369813d..f25690c 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_crud.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_crud.py @@ -4,35 +4,11 @@ from sqlalchemy.orm import Session from . import schemas, sql_models - -def create_entity(db: Session, entity: schemas.EntityCreate) -> sql_models.Entity: - db_entity = sql_models.Entity(**entity.dict()) - db.add(db_entity) - db.commit() - db.refresh(db_entity) - return db_entity - - -def get_entities( - db: Session, skip: int = 0, limit: int = 100 -) -> List[sql_models.Entity]: - return db.query(sql_models.Entity).offset(skip).limit(limit).all() - - -def create_consumer( - db: Session, consumer: schemas.ConsumerCreate -) -> sql_models.Consumer: - db_consumer = sql_models.Consumer(**consumer.dict()) - db.add(db_consumer) - db.commit() - db.refresh(db_consumer) - return db_consumer - - -def get_consumers( - db: Session, skip: int = 0, limit: int = 100 -) -> List[sql_models.Consumer]: - return db.query(sql_models.Consumer).offset(skip).limit(limit).all() +######################### +# # +# Producer # +# # +######################### def create_producer( @@ -51,6 +27,58 @@ def get_producers( return db.query(sql_models.Producer).offset(skip).limit(limit).all() +def get_producers_by_entity_did( + db: Session, entity_did: str, skip: int = 0, limit: int = 100 +) -> List[sql_models.Producer]: + return ( + db.query(sql_models.Producer) + .filter(sql_models.Producer.entity_did == entity_did) + .offset(skip) + .limit(limit) + .all() + ) + + +######################### +# # +# Consumer # +# # +######################### + + +def create_consumer( + db: Session, consumer: schemas.ConsumerCreate +) -> sql_models.Consumer: + db_consumer = sql_models.Consumer(**consumer.dict()) + db.add(db_consumer) + db.commit() + db.refresh(db_consumer) + return db_consumer + + +def get_consumers( + db: Session, skip: int = 0, limit: int = 100 +) -> List[sql_models.Consumer]: + return db.query(sql_models.Consumer).offset(skip).limit(limit).all() + + +def get_consumers_by_entity_did( + db: Session, entity_did: str, skip: int = 0, limit: int = 100 +) -> List[sql_models.Consumer]: + return ( + db.query(sql_models.Consumer) + .filter(sql_models.Consumer.entity_did == entity_did) + .offset(skip) + .limit(limit) + .all() + ) + + +######################### +# # +# REPOSITORY # +# # +######################### def create_repository( db: Session, repository: schemas.RepositoryCreate ) -> sql_models.Repository: @@ -85,3 +113,26 @@ def get_repository_by_did( .limit(limit) .all() ) + + +######################### +# # +# Entity # +# # +######################### +def create_entity(db: Session, entity: schemas.EntityCreate) -> sql_models.Entity: + db_entity = sql_models.Entity(**entity.dict()) + db.add(db_entity) + db.commit() + db.refresh(db_entity) + return db_entity + + +def get_entities( + db: Session, skip: int = 0, limit: int = 100 +) -> List[sql_models.Entity]: + return db.query(sql_models.Entity).offset(skip).limit(limit).all() + + +def get_entity_by_did(db: Session, did: str) -> Optional[sql_models.Entity]: + return db.query(sql_models.Entity).filter(sql_models.Entity.did == did).first()