Merge pull request 'Fully working schemas and database, with api endpoints. two missing.' (#19) from Luis-Hebendanz-Luis-Hebendanz-georgs into main
All checks were successful
checks-impure / test (push) Successful in 30s
checks / test (push) Successful in 1m35s
assets1 / test (push) Successful in 25s

This commit was merged in pull request #19.
This commit is contained in:
2023-11-27 12:58:19 +01:00
4 changed files with 250 additions and 92 deletions

View File

@@ -4,26 +4,37 @@ from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import sql_crud, sql_db, sql_models
from ..schemas import Entity, EntityCreate
from ..schemas import (
Consumer,
ConsumerCreate,
Entity,
EntityCreate,
Producer,
ProducerCreate,
Repository,
RepositoryCreate,
)
from ..tags import Tags
router = APIRouter()
# @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.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("/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_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])
@@ -40,3 +51,61 @@ def get_entities(
) -> List[sql_models.Entity]:
entities = sql_crud.get_entities(db, skip=skip, limit=limit)
return entities
@router.post("/api/v1/create_consumer", response_model=Consumer, tags=[Tags.consumers])
def create_consumer(
consumer: ConsumerCreate, db: Session = Depends(sql_db.get_db)
) -> Consumer:
# todo checken ob schon da ...
return sql_crud.create_consumer(db=db, consumer=consumer)
@router.get(
"/api/v1/get_consumers", response_model=List[Consumer], tags=[Tags.consumers]
)
def get_consumers(
skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db)
) -> List[sql_models.Consumer]:
consumers = sql_crud.get_consumers(db, skip=skip, limit=limit)
return consumers
#########################
# #
# REPOSITORY #
# #
#########################
@router.post(
"/api/v1/add_to_repository", response_model=Repository, tags=[Tags.repositories]
)
def add_to_repository(
repository: RepositoryCreate, db: Session = Depends(sql_db.get_db)
) -> sql_models.Repository:
# todo checken ob schon da ...
return sql_crud.create_repository(db=db, repository=repository)
@router.get(
"/api/v1/get_repositories",
response_model=List[Repository],
tags=[Tags.repositories],
)
def get_repositories(
skip: int = 0, limit: int = 100, db: Session = Depends(sql_db.get_db)
) -> List[sql_models.Repository]:
repositories = sql_crud.get_repositories(db, skip=skip, limit=limit)
return repositories
@router.get(
"/api/v1/get_repository", response_model=List[Repository], tags=[Tags.repositories]
)
def get_repository(
entity_did: str,
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

View File

@@ -1,6 +1,8 @@
from datetime import datetime
from enum import Enum
from typing import List, Optional
from pydantic import BaseModel, Field
from pydantic import BaseModel
class Status(Enum):
@@ -14,6 +16,76 @@ class Machine(BaseModel):
status: Status
#########################
# #
# Producer #
# #
#########################
class ProducerBase(BaseModel):
uuid: str = "8e285c0c-4e40-430a-a477-26b3b81e30df"
service_name: str = "Carlo's Printing"
service_type: str = "3D Printing"
endpoint_url: str = "http://127.0.0.1:8000"
status: str = "unknown"
other: dict = {"test": "test"}
class ProducerCreate(ProducerBase):
entity_did: str = "did:sov:test:1234"
class Producer(ProducerCreate):
class Config:
orm_mode = True
#########################
# #
# Consumer #
# #
#########################
class ConsumerBase(BaseModel):
entity_did: str = "did:sov:test:1234"
producer_uuid: str = "8e285c0c-4e40-430a-a477-26b3b81e30df"
other: dict = {"test": "test"}
class ConsumerCreate(ConsumerBase):
pass
class Consumer(ConsumerCreate):
id: int
class Config:
orm_mode = True
#########################
# #
# REPOSITORY #
# #
#########################
class RepositoryBase(ProducerBase):
pass
class RepositoryCreate(RepositoryBase):
entity_did: str = "did:sov:test:1234"
class Repository(RepositoryCreate):
time_created: datetime
class Config:
orm_mode = True
#########################
# #
# Entity #
# #
#########################
class EntityBase(BaseModel):
did: str = "did:sov:test:1234"
name: str = "C1"
@@ -22,50 +94,14 @@ class EntityBase(BaseModel):
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
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 Entity(EntityCreate):
producers: List[Producer] = []
consumers: List[Consumer] = []
repository: Optional[Repository] = None
class Config:
orm_mode = True

View File

@@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from sqlalchemy.orm import Session
@@ -19,34 +19,69 @@ def get_entities(
return db.query(sql_models.Entity).offset(skip).limit(limit).all()
# 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_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 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_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_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_producer(
db: Session, producer: schemas.ProducerCreate
) -> sql_models.Producer:
db_producer = sql_models.Producer(**producer.dict())
db.add(db_producer)
db.commit()
db.refresh(db_producer)
return db_producer
# 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
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_repository(
db: Session, repository: schemas.RepositoryCreate
) -> sql_models.Repository:
db_repository = sql_models.Repository(**repository.dict())
db.add(db_repository)
db.commit()
db.refresh(db_repository)
return db_repository
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 get_repository_by_uuid(db: Session, uuid: str) -> Optional[sql_models.Repository]:
return (
db.query(sql_models.Repository)
.filter(sql_models.Repository.uuid == uuid)
.first()
)
def get_repository_by_did(
db: Session, did: str, skip: int = 0, limit: int = 100
) -> List[sql_models.Repository]:
return (
db.query(sql_models.Repository)
.filter(sql_models.Repository.entity_did == did)
.offset(skip)
.limit(limit)
.all()
)

View File

@@ -1,5 +1,16 @@
from sqlalchemy import JSON, Boolean, Column, DateTime, ForeignKey, Integer, String
from sqlalchemy import (
JSON,
Boolean,
Column,
DateTime,
ForeignKey,
Integer,
String,
Text,
UniqueConstraint,
)
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from .sql_db import Base
@@ -23,15 +34,15 @@ class Entity(Base):
## Relations ##
producers = relationship("Producer", back_populates="entity")
consumers = relationship("Consumer", back_populates="entity")
# repository = relationship("Repository", uselist=False, 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)
uuid = Column(Text(length=36), primary_key=True, index=True)
service_name = Column(String, index=True)
service_type = Column(String, index=True)
endpoint_url = Column(String, index=True)
status = Column(String, index=True)
@@ -49,7 +60,7 @@ class Producer(ProducerAbstract):
## Relations ##
# One entity can have many producers
entity = relationship("Entity", back_populates="producers")
entity_did = Column(Integer, ForeignKey("entities.did"))
entity_did = Column(String, ForeignKey("entities.did"))
# One producer has many consumers
consumers = relationship("Consumer", back_populates="producer")
@@ -61,22 +72,29 @@ class Consumer(Base):
## Queryable body ##
id = Column(Integer, primary_key=True, index=True)
## Non queryable body ##
other = Column(JSON)
## Relations ##
# one entity can have many consumers
entity = relationship("Entity", back_populates="consumers")
entity_did = Column(Integer, ForeignKey("entities.did"))
entity_did = Column(String, ForeignKey("entities.did"))
# one consumer has one producer
producer = relationship("Producer", back_populates="consumers")
producer_id = Column(Integer, ForeignKey("producers.id"))
producer_uuid = Column(String, ForeignKey("producers.uuid"))
__table_args__ = (UniqueConstraint("producer_uuid", "entity_did"),)
# class Repository(ProducerAbstract):
# __tablename__ = "repositories"
class Repository(ProducerAbstract):
__tablename__ = "repositories"
# # one repository has one entity
# entity = relationship("Entity", back_populates="repository")
# entity_did = Column(Integer, ForeignKey("entities.did"))
time_created = Column(DateTime(timezone=True), server_default=func.now())
# one repository has one entity
entity = relationship("Entity", back_populates="repository")
entity_did = Column(Integer, ForeignKey("entities.did"))
# TODO: Ask how this works exactly