From 0ad48e0de641a7fa26c5d1d760aa92a76d50ddea Mon Sep 17 00:00:00 2001 From: Georg-Stahn Date: Mon, 20 Nov 2023 17:39:21 +0100 Subject: [PATCH 01/10] push first sql setup try --- .../clan-cli/clan_cli/webui/routers/health.py | 6 ++- pkgs/clan-cli/clan_cli/webui/sql_db.py | 0 pkgs/clan-cli/clan_cli/webui/sql_models.py | 25 +++++++++++ pkgs/clan-cli/clan_cli/webui/sql_schemas.py | 41 +++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 pkgs/clan-cli/clan_cli/webui/sql_db.py create mode 100644 pkgs/clan-cli/clan_cli/webui/sql_models.py create mode 100644 pkgs/clan-cli/clan_cli/webui/sql_schemas.py diff --git a/pkgs/clan-cli/clan_cli/webui/routers/health.py b/pkgs/clan-cli/clan_cli/webui/routers/health.py index 24967e5..2deed84 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/health.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/health.py @@ -1,8 +1,10 @@ from fastapi import APIRouter +from ..api_outputs import Machine, Status router = APIRouter() @router.get("/health", include_in_schema=True) -async def health() -> str: - return "OK" +async def health() -> Machine: #str: + return Machine(name="test", status=Status.ONLINE) +# return "OK" diff --git a/pkgs/clan-cli/clan_cli/webui/sql_db.py b/pkgs/clan-cli/clan_cli/webui/sql_db.py new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/clan-cli/clan_cli/webui/sql_models.py b/pkgs/clan-cli/clan_cli/webui/sql_models.py new file mode 100644 index 0000000..82ff6a5 --- /dev/null +++ b/pkgs/clan-cli/clan_cli/webui/sql_models.py @@ -0,0 +1,25 @@ +from sqlalchemy import Boolean, Column, ForeignKey, Integer, String +from sqlalchemy.orm import relationship +from .sql_db import Base + +class Repository(Base): + __tablename__ = "repositories" + + id = Column(Integer, primary_key=True, index=True) + service_name = Column(String, unique=True, index=True) + service_type = Column(String, unique=True, index=True) + end_point = Column(String, unique=True, index=True) + producer = Column(String) + producer_did = Column(String) + network = Column(String) + +class Producer(Base): + __tablename__ = "producers" + + id = Column(Integer, primary_key=True, index=True) + service_name = Column(String, unique=True, index=True) + service_type = Column(String, unique=True, index=True) + end_point = Column(String, unique=True, index=True) + usage = Column(String) # TODO enum? + status = Column(String) + action = Column(String) diff --git a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py new file mode 100644 index 0000000..d0fa20f --- /dev/null +++ b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py @@ -0,0 +1,41 @@ +from pydantic import BaseModel + + +class ProducerBase(BaseModel): + title: str + description: str | None = None + + +class ProducerCreate(ProducerBase): + service_name: str + service_type: str + end_point: str + usage_str: str + status: str + action: str + + +class Producer(ProducerBase): + id: int + + class Config: + orm_mode = True + + +class RepositoryBase(BaseModel): + service_name: str + + +class RepositoryCreate(RepositoryBase): + service_type: str + end_point: str + producer_did: str + network: str + + +class Repository(RepositoryBase): + id: int + Producers: list[Producer] = [] + + class Config: + orm_mode = True From 115b758828f5ac1914450c33326fa2703cfc2ecc Mon Sep 17 00:00:00 2001 From: Georg-Stahn Date: Mon, 20 Nov 2023 17:51:12 +0100 Subject: [PATCH 02/10] add sql db --- pkgs/clan-cli/clan_cli/webui/sql_db.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkgs/clan-cli/clan_cli/webui/sql_db.py b/pkgs/clan-cli/clan_cli/webui/sql_db.py index e69de29..4acf1eb 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_db.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_db.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +URL = "sqlite:///./sql_app.db" + +engine = create_engine( + URL, connect_args={"check_same_thread":False} +) +SessionLocal = sessionmaker(autocommit=False, autoflush=Flase, bind=engine) + +Base = declarative_base() \ No newline at end of file From 16d0907da84d4bffcd92c6e246cc0aa8ca050e34 Mon Sep 17 00:00:00 2001 From: Georg-Stahn Date: Mon, 20 Nov 2023 22:45:31 +0100 Subject: [PATCH 03/10] first running test get and post :) --- .gitignore | 1 + pkgs/clan-cli/clan_cli/webui/app.py | 17 +++++- .../clan-cli/clan_cli/webui/routers/health.py | 2 +- .../clan_cli/webui/routers/sql_connect.py | 15 +++++ pkgs/clan-cli/clan_cli/webui/sql_crud.py | 24 ++++++++ pkgs/clan-cli/clan_cli/webui/sql_db.py | 12 +++- pkgs/clan-cli/clan_cli/webui/sql_models.py | 31 +++++------ pkgs/clan-cli/clan_cli/webui/sql_schemas.py | 55 ++++++++----------- 8 files changed, 103 insertions(+), 54 deletions(-) create mode 100644 pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py create mode 100644 pkgs/clan-cli/clan_cli/webui/sql_crud.py diff --git a/.gitignore b/.gitignore index c899ee7..72b259b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ __pycache__ .coverage .mypy_cache .pytest_cache +pkgs.pyproj .reports .ruff_cache htmlcov diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index f33bbf1..4d425f1 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -10,7 +10,14 @@ from fastapi.staticfiles import StaticFiles from ..errors import ClanError from .assets import asset_path from .error_handlers import clan_error_handler -from .routers import health, root, socket_manager2 +from .routers import health, root, sql_connect, socket_manager2 # sql router hinzufügen + +#import for sql +from fastapi import Depends, FastAPI, HTTPException +from sqlalchemy.orm import Session +from . import sql_crud, sql_models, sql_schemas +from .sql_db import SessionLocal, engine + origins = [ "http://localhost:3000", @@ -27,7 +34,11 @@ async def lifespan(app: FastAPI) -> Any: def setup_app() -> FastAPI: - app = FastAPI(lifespan=lifespan) + # bind sql engine + sql_models.Base.metadata.drop_all(engine) + sql_models.Base.metadata.create_all(bind=engine) + + app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=origins, @@ -37,6 +48,8 @@ def setup_app() -> FastAPI: ) app.include_router(health.router) + #sql methodes + app.include_router(sql_connect.router) app.include_router(socket_manager2.router) diff --git a/pkgs/clan-cli/clan_cli/webui/routers/health.py b/pkgs/clan-cli/clan_cli/webui/routers/health.py index 2deed84..3714c36 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/health.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/health.py @@ -7,4 +7,4 @@ router = APIRouter() @router.get("/health", include_in_schema=True) async def health() -> Machine: #str: return Machine(name="test", status=Status.ONLINE) -# return "OK" +# return "OK" \ No newline at end of file diff --git a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py new file mode 100644 index 0000000..f61ab91 --- /dev/null +++ b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py @@ -0,0 +1,15 @@ +from fastapi import APIRouter, Request, Depends +from sqlalchemy.orm import Session +from .. import sql_crud, sql_models, sql_schemas, sql_db + +router = APIRouter() + +@router.get("/get_producers", response_model=list[sql_schemas.Producer]) +def get_producers(skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db)): + producers = sql_crud.get_producers(db, skip=skip, limit=limit) + return producers + +@router.post("/create_producers", response_model=sql_schemas.Producer) +def create_producers(producer: sql_schemas.ProducerCreate, db: Session = Depends(sql_db.get_db)): + #todo checken ob schon da ... + return sql_crud.create_producer(db=db, producer=producer) \ No newline at end of file diff --git a/pkgs/clan-cli/clan_cli/webui/sql_crud.py b/pkgs/clan-cli/clan_cli/webui/sql_crud.py new file mode 100644 index 0000000..c8ff904 --- /dev/null +++ b/pkgs/clan-cli/clan_cli/webui/sql_crud.py @@ -0,0 +1,24 @@ +from sqlalchemy.orm import Session +from . import sql_models, sql_schemas + +def get_producers(db: Session, skip: int = 0, limit: int = 100): + return db.query(sql_models.Producer).offset(skip).limit(limit).all() + +def create_producer(db: Session, producer: sql_schemas.ProducerCreate): + jsonblob_init = {"test_repo":"jsonblob_create"} + db_producer = sql_models.Producer(jsonblob=jsonblob_init) + db.add(db_producer) + db.commit() + db.refresh(db_producer) + return db_producer + + +def get_repositories(db: Session, skip: int = 0, limit: int = 100): + return db.query(sql_models.Repository).offset(skip).limit(limit).all() + +def create_repository(db: Session, repository: sql_schemas.RepositoryCreate, producers_id: int): + db_repository = sql_models.Repository(**repository.dict(), prod_id=producers_id) + db.add(db_repository) + db.commit() + db.refresh(db_repository) + return db_repository \ No newline at end of file diff --git a/pkgs/clan-cli/clan_cli/webui/sql_db.py b/pkgs/clan-cli/clan_cli/webui/sql_db.py index 4acf1eb..cc59363 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_db.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_db.py @@ -7,6 +7,14 @@ URL = "sqlite:///./sql_app.db" engine = create_engine( URL, connect_args={"check_same_thread":False} ) -SessionLocal = sessionmaker(autocommit=False, autoflush=Flase, bind=engine) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) -Base = declarative_base() \ No newline at end of file +Base = declarative_base() + +# Dependency to start a clean thread of the db +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() \ No newline at end of file diff --git a/pkgs/clan-cli/clan_cli/webui/sql_models.py b/pkgs/clan-cli/clan_cli/webui/sql_models.py index 82ff6a5..d8d7cea 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_models.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_models.py @@ -1,25 +1,20 @@ -from sqlalchemy import Boolean, Column, ForeignKey, Integer, String +from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, JSON from sqlalchemy.orm import relationship from .sql_db import Base -class Repository(Base): - __tablename__ = "repositories" - - id = Column(Integer, primary_key=True, index=True) - service_name = Column(String, unique=True, index=True) - service_type = Column(String, unique=True, index=True) - end_point = Column(String, unique=True, index=True) - producer = Column(String) - producer_did = Column(String) - network = Column(String) - class Producer(Base): __tablename__ = "producers" id = Column(Integer, primary_key=True, index=True) - service_name = Column(String, unique=True, index=True) - service_type = Column(String, unique=True, index=True) - end_point = Column(String, unique=True, index=True) - usage = Column(String) # TODO enum? - status = Column(String) - action = Column(String) + jsonblob = Column(JSON) + + repos = relationship("Repository", back_populates="producer") + +class Repository(Base): + __tablename__ = "repositories" + + id = Column(Integer, primary_key=True, index=True) + jsonblob = Column(JSON) + prod_id = Column(Integer, ForeignKey("producers.id")) + + producer = relationship("Producer", back_populates="repos") \ No newline at end of file diff --git a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py index d0fa20f..1fcd4c3 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py @@ -1,41 +1,34 @@ -from pydantic import BaseModel +from pydantic import BaseModel, Field - -class ProducerBase(BaseModel): +class RepositoryBase(BaseModel): title: str description: str | None = None - -class ProducerCreate(ProducerBase): - service_name: str - service_type: str - end_point: str - usage_str: str - status: str - action: str - - -class Producer(ProducerBase): - id: int - - class Config: - orm_mode = True - - -class RepositoryBase(BaseModel): - service_name: str - - class RepositoryCreate(RepositoryBase): - service_type: str - end_point: str - producer_did: str - network: str - + pass class Repository(RepositoryBase): id: int - Producers: list[Producer] = [] - + prod_id: str + class Config: + orm_mode = True + + +class ProducerBase(BaseModel): + id: int + +class ProducerCreate(ProducerBase): + jsonblob: int = Field( + 42, + title='The Json', + description='this is the value of json', + gt=30, + lt=50, + list=[1,2,"3"], + ) + +class Producer(ProducerBase): + id: int + repos: list[Repository] = [] class Config: orm_mode = True From 21a4adf83cc4dd5a19ea6c1617d0b53c3f423c36 Mon Sep 17 00:00:00 2001 From: Georg-Stahn Date: Sun, 26 Nov 2023 13:00:31 +0100 Subject: [PATCH 04/10] last changes to db --- pkgs/clan-cli/clan_cli/webui/sql_app.db | Bin 0 -> 20480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pkgs/clan-cli/clan_cli/webui/sql_app.db diff --git a/pkgs/clan-cli/clan_cli/webui/sql_app.db b/pkgs/clan-cli/clan_cli/webui/sql_app.db new file mode 100644 index 0000000000000000000000000000000000000000..382350b21428fe4ac0daedc1e08532fd7f155e42 GIT binary patch literal 20480 zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCU|?rpU|?lH02T%Y1`vjcFv1vkXm$p@ zyq&xtjeNok{N4QKe8qgic+`(djfTKz2#kinXb6mkz-S1JhQMeDjE2By2#kinXb8|R z1malO#0^y$OEdFQQY$hm;)_xX@{2P|@{2N4i{mp>kh!eRL9UJ=t_q%hF0K&@m}(XL z{S=VZD`;e$GB&xEBqrsgBFiJQS)gWzI6C>bqM5?QnVF*C=@;Va?i!@v z=O3cr7wY4qqrki;BTIxHN;9*u=Hv88cyF1ecG`Oo6kR zp+10z4qOK0B7Z+LQ;Qkd#pUH08%@E%0#^%XFhPxj1PEMML4)|vK=(SACa7=D%s-KV z|2F?N{)zNUWTQ5XhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinhzKDj70u_RTgR+)(yMT|r!;$mQ6VCMh8!2gH;8~=w99rB}| z9}R)g5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fngH@tjvsz%*-H?iHVt+lM^)m z&mb^tyf^BR(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!3g|Apn~HAMO8R s37Ao#(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7)Bug0F;W+@c;k- literal 0 HcmV?d00001 From 01df76de10a950cd210c43e3b5721b5b66c34955 Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Mon, 20 Nov 2023 19:45:47 +0100 Subject: [PATCH 05/10] Added broadcaster dependency --- .../clan_cli/webui/routers/socket_manager.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py diff --git a/pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py b/pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py new file mode 100644 index 0000000..cdfa46e --- /dev/null +++ b/pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py @@ -0,0 +1,79 @@ +from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from fastapi.responses import HTMLResponse +from fastapi import APIRouter, Response + +router = APIRouter() + +html = """ + + + + Chat + + +

WebSocket Chat

+

Your ID:

+
+ + +
+
    +
+ + + +""" + +class ConnectionManager: + def __init__(self) -> None: + self.active_connections: list[WebSocket] = [] + + async def connect(self, websocket: WebSocket) -> None: + await websocket.accept() + self.active_connections.append(websocket) + + def disconnect(self, websocket: WebSocket) -> None: + self.active_connections.remove(websocket) + + async def send_personal_message(self, message: str, websocket: WebSocket) -> None: + await websocket.send_text(message) + + async def broadcast(self, message: str) -> None: + for connection in self.active_connections: + await connection.send_text(message) + + +manager = ConnectionManager() + +@router.get("/ws_example") +async def get() -> HTMLResponse: + return HTMLResponse(html) + +@router.websocket("/ws/{client_id}") +async def websocket_endpoint(websocket: WebSocket, client_id: int) -> None: + await manager.connect(websocket) + try: + while True: + data = await websocket.receive_text() + await manager.send_personal_message(f"You wrote: {data}", websocket) + await manager.broadcast(f"Client #{client_id} says: {data}") + except WebSocketDisconnect: + manager.disconnect(websocket) + await manager.broadcast(f"Client #{client_id} left the chat") \ No newline at end of file From 2b76da2b6d841cafc6fb289a54963d43791925fc Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Mon, 20 Nov 2023 22:58:01 +0100 Subject: [PATCH 06/10] Working broadcasting library --- pkgs/clan-cli/clan_cli/webui/app.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index 4d425f1..0167e2b 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -6,6 +6,8 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.routing import APIRoute from fastapi.staticfiles import StaticFiles +from contextlib import asynccontextmanager +from typing import Any from ..errors import ClanError from .assets import asset_path @@ -37,8 +39,8 @@ def setup_app() -> FastAPI: # bind sql engine sql_models.Base.metadata.drop_all(engine) sql_models.Base.metadata.create_all(bind=engine) - - app = FastAPI() + + app = FastAPI(lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=origins, From 9580c9591ee2e8df39a68a23de60886cb68bb99e Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Sun, 26 Nov 2023 12:47:16 +0100 Subject: [PATCH 07/10] nix fmt --- pkgs/clan-cli/clan_cli/webui/app.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index 0167e2b..0d463bf 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -6,8 +6,6 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.routing import APIRoute from fastapi.staticfiles import StaticFiles -from contextlib import asynccontextmanager -from typing import Any from ..errors import ClanError from .assets import asset_path From 530b397592f86f83b7165e20313c609092b5a871 Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Sun, 26 Nov 2023 13:12:14 +0100 Subject: [PATCH 08/10] nix fmt --- .gitignore | 1 + pkgs/clan-cli/clan_cli/webui/app.py | 12 ++++-------- pkgs/clan-cli/clan_cli/webui/routers/health.py | 3 ++- pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py | 5 +++-- pkgs/clan-cli/clan_cli/webui/sql_crud.py | 2 ++ pkgs/clan-cli/clan_cli/webui/sql_db.py | 2 +- pkgs/clan-cli/clan_cli/webui/sql_models.py | 2 +- pkgs/clan-cli/clan_cli/webui/sql_schemas.py | 1 + 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 72b259b..04d7fce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .direnv +sql_app.db .coverage.* **/qubeclan **/testdir diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index 0d463bf..5a32a31 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -2,22 +2,18 @@ import logging from contextlib import asynccontextmanager from typing import Any +#import for sql from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.routing import APIRoute from fastapi.staticfiles import StaticFiles from ..errors import ClanError +from . import sql_models from .assets import asset_path from .error_handlers import clan_error_handler -from .routers import health, root, sql_connect, socket_manager2 # sql router hinzufügen - -#import for sql -from fastapi import Depends, FastAPI, HTTPException -from sqlalchemy.orm import Session -from . import sql_crud, sql_models, sql_schemas -from .sql_db import SessionLocal, engine - +from .routers import health, root, socket_manager2, sql_connect # sql router hinzufügen +from .sql_db import engine origins = [ "http://localhost:3000", diff --git a/pkgs/clan-cli/clan_cli/webui/routers/health.py b/pkgs/clan-cli/clan_cli/webui/routers/health.py index 3714c36..8332b5b 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/health.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/health.py @@ -1,4 +1,5 @@ from fastapi import APIRouter + from ..api_outputs import Machine, Status router = APIRouter() @@ -7,4 +8,4 @@ router = APIRouter() @router.get("/health", include_in_schema=True) async def health() -> Machine: #str: return Machine(name="test", status=Status.ONLINE) -# return "OK" \ No newline at end of file +# return "OK" 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 f61ab91..eee564f 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py @@ -1,6 +1,7 @@ -from fastapi import APIRouter, Request, Depends +from fastapi import APIRouter, Depends from sqlalchemy.orm import Session -from .. import sql_crud, sql_models, sql_schemas, sql_db + +from .. import sql_crud, sql_db, sql_schemas router = APIRouter() diff --git a/pkgs/clan-cli/clan_cli/webui/sql_crud.py b/pkgs/clan-cli/clan_cli/webui/sql_crud.py index c8ff904..8371b8f 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_crud.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_crud.py @@ -1,6 +1,8 @@ from sqlalchemy.orm import Session + from . import sql_models, sql_schemas + def get_producers(db: Session, skip: int = 0, limit: int = 100): return db.query(sql_models.Producer).offset(skip).limit(limit).all() diff --git a/pkgs/clan-cli/clan_cli/webui/sql_db.py b/pkgs/clan-cli/clan_cli/webui/sql_db.py index cc59363..1c8d62b 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_db.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_db.py @@ -17,4 +17,4 @@ def get_db(): try: yield db finally: - db.close() \ No newline at end of file + db.close() diff --git a/pkgs/clan-cli/clan_cli/webui/sql_models.py b/pkgs/clan-cli/clan_cli/webui/sql_models.py index d8d7cea..0cdb873 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_models.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_models.py @@ -17,4 +17,4 @@ class Repository(Base): jsonblob = Column(JSON) prod_id = Column(Integer, ForeignKey("producers.id")) - producer = relationship("Producer", back_populates="repos") \ No newline at end of file + producer = relationship("Producer", back_populates="repos") diff --git a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py index 1fcd4c3..25ba889 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py @@ -1,5 +1,6 @@ from pydantic import BaseModel, Field + class RepositoryBase(BaseModel): title: str description: str | None = None From 80ccaa83d3beed44e41285e6abaeda1ce1d8506c Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Sun, 26 Nov 2023 13:41:42 +0100 Subject: [PATCH 09/10] fixed incorrect typing issues --- pkgs/clan-cli/clan_cli/webui/api_outputs.py | 42 ++++++++++++++++++- pkgs/clan-cli/clan_cli/webui/app.py | 4 +- .../clan-cli/clan_cli/webui/routers/health.py | 6 ++- .../clan_cli/webui/routers/sql_connect.py | 23 ++++++---- pkgs/clan-cli/clan_cli/webui/sql_crud.py | 26 ++++++++---- pkgs/clan-cli/clan_cli/webui/sql_db.py | 11 ++--- pkgs/clan-cli/clan_cli/webui/sql_models.py | 5 ++- pkgs/clan-cli/clan_cli/webui/sql_schemas.py | 35 ---------------- 8 files changed, 92 insertions(+), 60 deletions(-) delete mode 100644 pkgs/clan-cli/clan_cli/webui/sql_schemas.py diff --git a/pkgs/clan-cli/clan_cli/webui/api_outputs.py b/pkgs/clan-cli/clan_cli/webui/api_outputs.py index 3082b2a..f0f2632 100644 --- a/pkgs/clan-cli/clan_cli/webui/api_outputs.py +++ b/pkgs/clan-cli/clan_cli/webui/api_outputs.py @@ -1,6 +1,6 @@ from enum import Enum -from pydantic import BaseModel +from pydantic import BaseModel, Field class Status(Enum): @@ -12,3 +12,43 @@ class Status(Enum): class Machine(BaseModel): name: str status: Status + + +class RepositoryBase(BaseModel): + title: str + description: str | None = None + + +class RepositoryCreate(RepositoryBase): + pass + + +class Repository(RepositoryBase): + id: int + prod_id: str + + class Config: + orm_mode = True + + +class ProducerBase(BaseModel): + id: int + + +class ProducerCreate(ProducerBase): + jsonblob: int = Field( + 42, + title="The Json", + description="this is the value of json", + gt=30, + lt=50, + list=[1, 2, "3"], + ) + + +class Producer(ProducerBase): + id: int + repos: list[Repository] = [] + + class Config: + orm_mode = True diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index 5a32a31..de13526 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -2,7 +2,7 @@ import logging from contextlib import asynccontextmanager from typing import Any -#import for sql +# import for sql from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.routing import APIRoute @@ -44,7 +44,7 @@ def setup_app() -> FastAPI: ) app.include_router(health.router) - #sql methodes + # sql methodes app.include_router(sql_connect.router) app.include_router(socket_manager2.router) diff --git a/pkgs/clan-cli/clan_cli/webui/routers/health.py b/pkgs/clan-cli/clan_cli/webui/routers/health.py index 8332b5b..b74b71b 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/health.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/health.py @@ -6,6 +6,8 @@ router = APIRouter() @router.get("/health", include_in_schema=True) -async def health() -> Machine: #str: - return Machine(name="test", status=Status.ONLINE) +async def health() -> Machine: # str: + return Machine(name="test", status=Status.ONLINE) + + # return "OK" 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 eee564f..72307de 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py @@ -1,16 +1,25 @@ +from typing import List + from fastapi import APIRouter, Depends from sqlalchemy.orm import Session -from .. import sql_crud, sql_db, sql_schemas +from .. import sql_crud, sql_db, sql_models +from ..api_outputs import Producer, ProducerCreate router = APIRouter() -@router.get("/get_producers", response_model=list[sql_schemas.Producer]) -def get_producers(skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db)): + +@router.get("/get_producers", response_model=List[Producer]) +def get_producers( + skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) +) -> List[sql_models.Producer]: producers = sql_crud.get_producers(db, skip=skip, limit=limit) return producers -@router.post("/create_producers", response_model=sql_schemas.Producer) -def create_producers(producer: sql_schemas.ProducerCreate, db: Session = Depends(sql_db.get_db)): - #todo checken ob schon da ... - return sql_crud.create_producer(db=db, producer=producer) \ No newline at end of file + +@router.post("/create_producers", response_model=Producer) +def create_producers( + producer: ProducerCreate, db: Session = Depends(sql_db.get_db) +) -> Producer: + # todo checken ob schon da ... + return sql_crud.create_producer(db=db, producer=producer) diff --git a/pkgs/clan-cli/clan_cli/webui/sql_crud.py b/pkgs/clan-cli/clan_cli/webui/sql_crud.py index 8371b8f..0c66d52 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_crud.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_crud.py @@ -1,13 +1,20 @@ +from typing import List + from sqlalchemy.orm import Session -from . import sql_models, sql_schemas +from . import api_outputs, sql_models -def get_producers(db: Session, skip: int = 0, limit: int = 100): +def get_producers( + db: Session, skip: int = 0, limit: int = 100 +) -> List[sql_models.Producer]: return db.query(sql_models.Producer).offset(skip).limit(limit).all() -def create_producer(db: Session, producer: sql_schemas.ProducerCreate): - jsonblob_init = {"test_repo":"jsonblob_create"} + +def create_producer( + db: Session, producer: api_outputs.ProducerCreate +) -> sql_models.Producer: + jsonblob_init = {"test_repo": "jsonblob_create"} db_producer = sql_models.Producer(jsonblob=jsonblob_init) db.add(db_producer) db.commit() @@ -15,12 +22,17 @@ def create_producer(db: Session, producer: sql_schemas.ProducerCreate): return db_producer -def get_repositories(db: Session, skip: int = 0, limit: int = 100): +def get_repositories( + db: Session, skip: int = 0, limit: int = 100 +) -> List[sql_models.Repository]: return db.query(sql_models.Repository).offset(skip).limit(limit).all() -def create_repository(db: Session, repository: sql_schemas.RepositoryCreate, producers_id: int): + +def create_repository( + db: Session, repository: api_outputs.RepositoryCreate, producers_id: int +) -> sql_models.Repository: db_repository = sql_models.Repository(**repository.dict(), prod_id=producers_id) db.add(db_repository) db.commit() db.refresh(db_repository) - return db_repository \ No newline at end of file + return db_repository diff --git a/pkgs/clan-cli/clan_cli/webui/sql_db.py b/pkgs/clan-cli/clan_cli/webui/sql_db.py index 1c8d62b..eb3f767 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_db.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_db.py @@ -1,18 +1,19 @@ +from typing import Generator + from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm import Session, sessionmaker URL = "sqlite:///./sql_app.db" -engine = create_engine( - URL, connect_args={"check_same_thread":False} -) +engine = create_engine(URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() + # Dependency to start a clean thread of the db -def get_db(): +def get_db() -> Generator[Session, None, None]: db = SessionLocal() try: yield db diff --git a/pkgs/clan-cli/clan_cli/webui/sql_models.py b/pkgs/clan-cli/clan_cli/webui/sql_models.py index 0cdb873..f357238 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_models.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_models.py @@ -1,7 +1,9 @@ -from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, JSON +from sqlalchemy import JSON, Column, ForeignKey, Integer from sqlalchemy.orm import relationship + from .sql_db import Base + class Producer(Base): __tablename__ = "producers" @@ -10,6 +12,7 @@ class Producer(Base): repos = relationship("Repository", back_populates="producer") + class Repository(Base): __tablename__ = "repositories" diff --git a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py b/pkgs/clan-cli/clan_cli/webui/sql_schemas.py deleted file mode 100644 index 25ba889..0000000 --- a/pkgs/clan-cli/clan_cli/webui/sql_schemas.py +++ /dev/null @@ -1,35 +0,0 @@ -from pydantic import BaseModel, Field - - -class RepositoryBase(BaseModel): - title: str - description: str | None = None - -class RepositoryCreate(RepositoryBase): - pass - -class Repository(RepositoryBase): - id: int - prod_id: str - class Config: - orm_mode = True - - -class ProducerBase(BaseModel): - id: int - -class ProducerCreate(ProducerBase): - jsonblob: int = Field( - 42, - title='The Json', - description='this is the value of json', - gt=30, - lt=50, - list=[1,2,"3"], - ) - -class Producer(ProducerBase): - id: int - repos: list[Repository] = [] - class Config: - orm_mode = True From d1a3a5381a7e776f01728366cea8876db5461615 Mon Sep 17 00:00:00 2001 From: Luis-Hebendanz Date: Sun, 26 Nov 2023 20:54:57 +0100 Subject: [PATCH 10/10] Added create_entity --- pkgs/clan-cli/clan_cli/webui/app.py | 4 + .../clan-cli/clan_cli/webui/routers/health.py | 2 +- .../clan_cli/webui/routers/socket_manager.py | 79 ----------------- .../clan_cli/webui/routers/sql_connect.py | 41 ++++++--- .../webui/{api_outputs.py => schemas.py} | 17 ++++ pkgs/clan-cli/clan_cli/webui/sql_crud.py | 66 ++++++++------ pkgs/clan-cli/clan_cli/webui/sql_models.py | 87 ++++++++++++++++--- pkgs/clan-cli/clan_cli/webui/tags.py | 32 +++++++ 8 files changed, 200 insertions(+), 128 deletions(-) delete mode 100644 pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py rename pkgs/clan-cli/clan_cli/webui/{api_outputs.py => schemas.py} (74%) create mode 100644 pkgs/clan-cli/clan_cli/webui/tags.py diff --git a/pkgs/clan-cli/clan_cli/webui/app.py b/pkgs/clan-cli/clan_cli/webui/app.py index de13526..8397d16 100644 --- a/pkgs/clan-cli/clan_cli/webui/app.py +++ b/pkgs/clan-cli/clan_cli/webui/app.py @@ -14,6 +14,7 @@ from .assets import asset_path from .error_handlers import clan_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 origins = [ "http://localhost:3000", @@ -55,6 +56,9 @@ def setup_app() -> FastAPI: app.mount("/static", StaticFiles(directory=asset_path()), name="static") + # Add tag descriptions to the OpenAPI schema + app.openapi_tags = tags_metadata + for route in app.routes: if isinstance(route, APIRoute): route.operation_id = route.name # in this case, 'read_items' diff --git a/pkgs/clan-cli/clan_cli/webui/routers/health.py b/pkgs/clan-cli/clan_cli/webui/routers/health.py index b74b71b..ab0edb4 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/health.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/health.py @@ -1,6 +1,6 @@ from fastapi import APIRouter -from ..api_outputs import Machine, Status +from ..schemas import Machine, Status router = APIRouter() diff --git a/pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py b/pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py deleted file mode 100644 index cdfa46e..0000000 --- a/pkgs/clan-cli/clan_cli/webui/routers/socket_manager.py +++ /dev/null @@ -1,79 +0,0 @@ -from fastapi import FastAPI, WebSocket, WebSocketDisconnect -from fastapi.responses import HTMLResponse -from fastapi import APIRouter, Response - -router = APIRouter() - -html = """ - - - - Chat - - -

WebSocket Chat

-

Your ID:

-
- - -
-
    -
- - - -""" - -class ConnectionManager: - def __init__(self) -> None: - self.active_connections: list[WebSocket] = [] - - async def connect(self, websocket: WebSocket) -> None: - await websocket.accept() - self.active_connections.append(websocket) - - def disconnect(self, websocket: WebSocket) -> None: - self.active_connections.remove(websocket) - - async def send_personal_message(self, message: str, websocket: WebSocket) -> None: - await websocket.send_text(message) - - async def broadcast(self, message: str) -> None: - for connection in self.active_connections: - await connection.send_text(message) - - -manager = ConnectionManager() - -@router.get("/ws_example") -async def get() -> HTMLResponse: - return HTMLResponse(html) - -@router.websocket("/ws/{client_id}") -async def websocket_endpoint(websocket: WebSocket, client_id: int) -> None: - await manager.connect(websocket) - try: - while True: - data = await websocket.receive_text() - await manager.send_personal_message(f"You wrote: {data}", websocket) - await manager.broadcast(f"Client #{client_id} says: {data}") - except WebSocketDisconnect: - manager.disconnect(websocket) - await manager.broadcast(f"Client #{client_id} left the chat") \ No newline at end of file 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 72307de..46263e5 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/sql_connect.py @@ -4,22 +4,39 @@ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from .. import sql_crud, sql_db, sql_models -from ..api_outputs import Producer, ProducerCreate +from ..schemas import Entity, EntityCreate +from ..tags import Tags router = APIRouter() -@router.get("/get_producers", response_model=List[Producer]) -def get_producers( - skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) -) -> List[sql_models.Producer]: - producers = sql_crud.get_producers(db, skip=skip, limit=limit) - return producers +# @router.get("/api/v1/get_producers", response_model=List[Producer], tags=[Tags.producers]) +# def get_producers( +# skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db) +# ) -> List[sql_models.Producer]: +# producers = sql_crud.get_producers(db, skip=skip, limit=limit) +# return producers -@router.post("/create_producers", response_model=Producer) -def create_producers( - producer: ProducerCreate, db: Session = Depends(sql_db.get_db) -) -> 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.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_producer(db=db, producer=producer) + 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 diff --git a/pkgs/clan-cli/clan_cli/webui/api_outputs.py b/pkgs/clan-cli/clan_cli/webui/schemas.py similarity index 74% rename from pkgs/clan-cli/clan_cli/webui/api_outputs.py rename to pkgs/clan-cli/clan_cli/webui/schemas.py index f0f2632..cb118f2 100644 --- a/pkgs/clan-cli/clan_cli/webui/api_outputs.py +++ b/pkgs/clan-cli/clan_cli/webui/schemas.py @@ -14,6 +14,23 @@ class Machine(BaseModel): status: Status +class EntityBase(BaseModel): + did: str = "did:sov:test:1234" + name: str = "C1" + ip: str = "127.0.0.1" + attached: bool = False + other: dict = {"test": "test"} + + +class Entity(EntityBase): + class Config: + orm_mode = True + + +class EntityCreate(EntityBase): + pass + + class RepositoryBase(BaseModel): title: str description: str | None = None diff --git a/pkgs/clan-cli/clan_cli/webui/sql_crud.py b/pkgs/clan-cli/clan_cli/webui/sql_crud.py index 0c66d52..c3d5a61 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_crud.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_crud.py @@ -2,37 +2,51 @@ from typing import List from sqlalchemy.orm import Session -from . import api_outputs, sql_models +from . import schemas, sql_models -def get_producers( - db: Session, skip: int = 0, limit: int = 100 -) -> List[sql_models.Producer]: - return db.query(sql_models.Producer).offset(skip).limit(limit).all() - - -def create_producer( - db: Session, producer: api_outputs.ProducerCreate -) -> sql_models.Producer: - jsonblob_init = {"test_repo": "jsonblob_create"} - db_producer = sql_models.Producer(jsonblob=jsonblob_init) - db.add(db_producer) +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_producer) - return db_producer + db.refresh(db_entity) + return db_entity -def get_repositories( +def get_entities( db: Session, skip: int = 0, limit: int = 100 -) -> List[sql_models.Repository]: - return db.query(sql_models.Repository).offset(skip).limit(limit).all() +) -> List[sql_models.Entity]: + return db.query(sql_models.Entity).offset(skip).limit(limit).all() -def create_repository( - db: Session, repository: api_outputs.RepositoryCreate, producers_id: int -) -> sql_models.Repository: - db_repository = sql_models.Repository(**repository.dict(), prod_id=producers_id) - db.add(db_repository) - db.commit() - db.refresh(db_repository) - return db_repository +# def get_producers( +# db: Session, skip: int = 0, limit: int = 100 +# ) -> List[sql_models.Producer]: +# return db.query(sql_models.Producer).offset(skip).limit(limit).all() + + +# def create_producer( +# db: Session, producer: schemas.ProducerCreate +# ) -> sql_models.Producer: +# jsonblob_init = {"test_repo": "jsonblob_create"} +# db_producer = sql_models.Producer(jsonblob=jsonblob_init) +# db.add(db_producer) +# db.commit() +# db.refresh(db_producer) +# return db_producer + + +# def get_repositories( +# db: Session, skip: int = 0, limit: int = 100 +# ) -> List[sql_models.Repository]: +# return db.query(sql_models.Repository).offset(skip).limit(limit).all() + + +# def create_repository( +# db: Session, repository: schemas.RepositoryCreate, producers_id: int +# ) -> sql_models.Repository: +# db_repository = sql_models.Repository(**repository.dict(), prod_id=producers_id) +# db.add(db_repository) +# db.commit() +# db.refresh(db_repository) +# return db_repository diff --git a/pkgs/clan-cli/clan_cli/webui/sql_models.py b/pkgs/clan-cli/clan_cli/webui/sql_models.py index f357238..d9cf59f 100644 --- a/pkgs/clan-cli/clan_cli/webui/sql_models.py +++ b/pkgs/clan-cli/clan_cli/webui/sql_models.py @@ -1,23 +1,90 @@ -from sqlalchemy import JSON, Column, ForeignKey, Integer +from sqlalchemy import JSON, Boolean, Column, DateTime, ForeignKey, Integer, String from sqlalchemy.orm import relationship from .sql_db import Base +# Relationsship example +# https://dev.to/freddiemazzilli/flask-sqlalchemy-relationships-exploring-relationship-associations-igo -class Producer(Base): + +class Entity(Base): + __tablename__ = "entities" + + ## Queryable body ## + did = Column(String, primary_key=True, index=True) + name = Column(String, index=True) + ip = Column(String, index=True) + attached = Column(Boolean, index=True) + + ## Non queryable body ## + # In here we deposit: Network, Roles, Visible, etc. + other = Column(JSON) + + ## Relations ## + producers = relationship("Producer", back_populates="entity") + consumers = relationship("Consumer", back_populates="entity") + # repository = relationship("Repository", uselist=False, back_populates="entity") + + +class ProducerAbstract(Base): + __abstract__ = True + + # Queryable body + id = Column(Integer, primary_key=True, index=True) + service_name = Column(String, unique=True, index=True) + service_type = Column(String, index=True) + endpoint_url = Column(String, index=True) + status = Column(String, index=True) + + ## Non queryable body ## + # In here we deposit: Action + other = Column(JSON) + + +class Producer(ProducerAbstract): __tablename__ = "producers" + # Usage is the consumers column + + ## Relations ## + # One entity can have many producers + entity = relationship("Entity", back_populates="producers") + entity_did = Column(Integer, ForeignKey("entities.did")) + + # One producer has many consumers + consumers = relationship("Consumer", back_populates="producer") + + +class Consumer(Base): + __tablename__ = "consumers" + + ## Queryable body ## id = Column(Integer, primary_key=True, index=True) - jsonblob = Column(JSON) - repos = relationship("Repository", back_populates="producer") + ## Relations ## + # one entity can have many consumers + entity = relationship("Entity", back_populates="consumers") + entity_did = Column(Integer, ForeignKey("entities.did")) + + # one consumer has one producer + producer = relationship("Producer", back_populates="consumers") + producer_id = Column(Integer, ForeignKey("producers.id")) -class Repository(Base): - __tablename__ = "repositories" +# class Repository(ProducerAbstract): +# __tablename__ = "repositories" - id = Column(Integer, primary_key=True, index=True) - jsonblob = Column(JSON) - prod_id = Column(Integer, ForeignKey("producers.id")) +# # one repository has one entity +# entity = relationship("Entity", back_populates="repository") +# entity_did = Column(Integer, ForeignKey("entities.did")) - producer = relationship("Producer", back_populates="repos") + +# TODO: Ask how this works exactly +class Resolution(Base): + __tablename__ = "resolutions" + + id = Column(Integer, primary_key=True) + requester_name = Column(String, index=True) + requester_did = Column(String, index=True) + resolved_did = Column(String, index=True) + timestamp = Column(DateTime, index=True) diff --git a/pkgs/clan-cli/clan_cli/webui/tags.py b/pkgs/clan-cli/clan_cli/webui/tags.py new file mode 100644 index 0000000..78f7968 --- /dev/null +++ b/pkgs/clan-cli/clan_cli/webui/tags.py @@ -0,0 +1,32 @@ +from enum import Enum +from typing import Any, Dict, List + + +class Tags(Enum): + producers = "producers" + consumers = "consumers" + entities = "entities" + repositories = "repositories" + + def __str__(self) -> str: + return self.value + + +tags_metadata: List[Dict[str, Any]] = [ + { + "name": str(Tags.producers), + "description": "Operations on a producer.", + }, + { + "name": str(Tags.consumers), + "description": "Operations on a consumer.", + }, + { + "name": str(Tags.entities), + "description": "Operations on an entity.", + }, + { + "name": str(Tags.repositories), + "description": "Operations on a repository.", + }, +]