From 3bcd223b328d2337e11e78408f890d5b09c1cb29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20=C4=8Capek?= Date: Sun, 11 Aug 2024 13:22:44 +0200 Subject: [PATCH] Create simple public version of API. (WIP) --- .envrc | 10 +++++++ rhinventory/api/asset/endpoints.py | 42 ++++++++++++++------------- rhinventory/api/asset/schemas.py | 9 ++++++ rhinventory/service/asset/__init__.py | 0 rhinventory/service/asset/services.py | 27 +++++++++++++++++ 5 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 .envrc create mode 100644 rhinventory/service/asset/__init__.py create mode 100644 rhinventory/service/asset/services.py diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..f022c15 --- /dev/null +++ b/.envrc @@ -0,0 +1,10 @@ +# ! WARNING: When changing DATABASE_URL, also change it in alembic.ini +DATABASE_URL=postgresql://root:root@localhost:5432/rhinventory +SECRET_KEY=abcabc +FLASK_DEBUG=True +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= +GITHUB_REDIRECT_URI= + +FILE_STORE_LOCAL="files" +MULTIPROCESSING_ENABLED=True diff --git a/rhinventory/api/asset/endpoints.py b/rhinventory/api/asset/endpoints.py index ec3d712..7ef7fdb 100644 --- a/rhinventory/api/asset/endpoints.py +++ b/rhinventory/api/asset/endpoints.py @@ -1,34 +1,36 @@ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session -from rhinventory.api.asset.schemas import AssetSchema +from rhinventory.api.asset.schemas import AssetSchema, AssetListOutputSchema from rhinventory.api.database import get_db from rhinventory.models.asset import Asset +from rhinventory.service.asset.services import AssetService router = APIRouter() -@router.get(path="/{asset_id}") +@router.get("/get/{asset_id}") def get_asset(asset_id: int, db: Session = Depends(get_db)): asset = db.query(Asset).get(asset_id) if not asset: return {"error": "Asset not found"} - return { - 'id': asset.id, - 'category': asset.category.name, - 'name': asset.name - } - -@router.get("/list") -def list_assets(): - return [ - AssetSchema( - id=1, - name="Sample asset 1" - ), - AssetSchema( - id=2, - name="Sample asset 2" - ) - ] \ No newline at end of file + # TODO: Hide private + + return AssetSchema.model_validate(asset, from_attributes=True) + + +@router.get("/list-public", response_model=AssetListOutputSchema) +def list_assets(limit: int = 20, offset: int = 0, db: Session = Depends(get_db)): + """ + List all public items. + + Has two parameters: + * limit: How many items to return. + * offset: Offset in database query. + """ + assets = AssetService.list_all(db, limit, offset, private=False) + + return AssetListOutputSchema( + assets=[AssetSchema.model_validate(asset, from_attributes=True) for asset in assets], + ) diff --git a/rhinventory/api/asset/schemas.py b/rhinventory/api/asset/schemas.py index c84b037..7264b2c 100644 --- a/rhinventory/api/asset/schemas.py +++ b/rhinventory/api/asset/schemas.py @@ -1,6 +1,15 @@ +from typing import List + from pydantic import BaseModel class AssetSchema(BaseModel): id: int name: str + model: str | None + note: str | None + serial: str | None + + +class AssetListOutputSchema(BaseModel): + assets: List[AssetSchema] diff --git a/rhinventory/service/asset/__init__.py b/rhinventory/service/asset/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rhinventory/service/asset/services.py b/rhinventory/service/asset/services.py new file mode 100644 index 0000000..d09c8ec --- /dev/null +++ b/rhinventory/service/asset/services.py @@ -0,0 +1,27 @@ +from sqlalchemy import select +from sqlalchemy.orm import Session + +from rhinventory.api.asset.schemas import AssetSchema +from rhinventory.models.asset import Asset +from rhinventory.models.enums import HIDDEN_PRIVACIES, PUBLIC_PRIVACIES + + +class AssetService: + @staticmethod + def list_all(db_session: Session, limit: int = 100, offset: int = 0, private=False): + """ + List all Assets. + + :param limit: How much assets to return (defaut 100). + :param offset: With what offset (defaults to 0). + :param private: If True, shows even private items (defaults to False). + :return: List of Asset objects. + """ + + assets = db_session.execute( + select(Asset) + .where(Asset.privacy.in_(PUBLIC_PRIVACIES if not private else PUBLIC_PRIVACIES + HIDDEN_PRIVACIES)) + .limit(limit).offset(offset) + ) + + return [asset[0] for asset in assets.fetchall()]