Zly vlk a API pro Krajský Energetický Managemant
Aplikace pracuje momentálně s daty z MariaDB a MinIO. V MariaDB jsou uložena data o jednotlivých neziskových organizacích Ústeckého kraje. Jako jsou:
- informace o areálech organizace
- IČO a adresy sídel
- informace o budovách organizace
- informace o odběrných místech organizace
- informace o měřidlech
- spotřeby komodit V MinIO jsou uloženy soubory organizace:
- fotodokumentace
- doklady
- smlouvy
Spuštění aplikace
Je třeba vytvořit vyplněný .env soubor na základě .env.example.
Aplikace se následně spouští pomocí poetry
poetry shell
poetry install
poetry run uvicorn app.main:app --reload
Autentizace a Autorizace
Pro autentizaci uživatele slouží Keycloak, který na základě přihlašovacích údajů vrátí token, který z FrontEndu chodí v každém dotazu na API. Autorizaci obstarává autorizační modul v API, který na základě ověřeného tokenu filtruje data, ke kterým má uživatel přístup.
API endpointy
API je momentálně rozdělena na sekce podle jednotlivých databází.
- dokumenty
- kem2
- subjekty
- uzivatele
- minio
Volání endpointu
Přístupový token musí být zahrnut v hlavičce každého požadavku na API jako Authorization: Bearer your-access-token.
curl -X 'GET' \
'http://127.0.0.1:8000/v1/subjekty/subjekty/1' \
-H 'accept: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0aUc2R0tYdmVmQmxBbncydWN2SnBoLVptMDFiSVZRSTZibFNER3FqZ0VvIn0.eyJleHAiOjE3MTkyNTgxODksImlhdCI6MTcxOTIyMjE4OSwianRpIjoiNDg1NGMzNmYtNGQzMi00NzAzLTk4MGItM2FmZmE1MWQxNzVjIiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguMjcuNTUvcmVhbG1zL1BvcnRhYm8iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOGFiN2U2YjctYzlkMy00ZDU4LThmODgtODNjNWIzNTU5OWY4IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibG9yYXdhbi1hcGkiLCJzZXNzaW9uX3N0YXRlIjoiZWMyNzI5MDgtNGY4OC00ZDU3LTkzMDAtMjA3NGVlOThiMzQ4IiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiYWRtaW5FbmVyZ28iLCJkZWZhdWx0LXJvbGVzLXBvcnRhYm8iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiJlYzI3MjkwOC00Zjg4LTRkNTctOTMwMC0yMDc0ZWU5OGIzNDgiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJpc3R1cHlfa2xpbWFwcCI6WyJ7XCJJQ09cIjogXCJnYWxlcmllLXJvdWRuaWNlXCIsIFwiUEVSTUlTU0lPTlNcIjogW10sIFwiVVJMXCI6W1wiKlwiXX0iLCJ7XCJJQ09cIjogXCIwMDM2MDY0M1wiLCBcIlBFUk1JU1NJT05TXCI6IFtcImVkaXRvclwiXSwgXCJVUkxcIjpcIipcIn0iLCJ7XCJJQ09cIjogXCIwOTY1ODM1MVwiLCBcIlBFUk1JU1NJT05TXCI6IFtdLCBcIlVSTFwiOltcIipcIl19Il0sInByZWZlcnJlZF91c2VybmFtZSI6Im1hcmVrLnRyZW1lbCIsImVtYWlsIjoibWFyZWsudHJlbWVsQHBvcnRhYm8uY3oifQ.rQqoOoOuw41bdSlS3NwYxT6xJ7E_hKOlo6zsG9Efa_KR47VNcrE4KFrf4FWhOK-RR3G28H9gM8CnuKIoSbC2lCDCT3IsVVppsKFoE_swKDZwTDNA16JkSL0h_4AAykRe1II2dGsEVeJQEXLHbLWsOicS7vOspNTAdqbkANrjI_rToaJu9E1ssbnwjuM-SvS4yfVIldkXk8GXZ4ovUHZtgeghOLAMuDfRd01RwkJPWF7h61xO43RnR0BVJzabIrUtqY7A7h7Ek46misXDOhlXlq9bIy3yFpAuCtdRNAdb2sxMyoeXvvOpuEXG_xbz7L6CvzwjV993PJ_aq6167y36_w'
Použité knihovny
- python = "^3.12"
- fastapi = "^0.111.0"
- sqlalchemy = "^2.0.31"
- pymysql = "^1.1.1"
- ruff = "^0.4.10"
- toml = "^0.10.2"
- pydantic-settings = "^2.3.4"
- cachetools = "^5.3.3"
- requests = "^2.32.3"
- pyjwt = "^2.8.0"
- cryptography = "^42.0.8"
- fastapi-pagination = "^0.12.26"
- minio = "^7.2.7"
Práva v aplikaci
Autorizační modul v API se skládá z několika tabulek: uzivatel, pristupy, opravneni a role.
- Tabulka uzivatel obsahuje základní informace o uživateli jako jméno, příjmení a emeail a také unikátní identifikátor z Keycloaku (SUB)
- Tabulka opravneni obsahuje stromovou strukturu oprávnění. Sloupce tabulky jsou: id_opravneni, odbor, organizace, areal, objekt, om, meridlo
- id_opravneni: primární klíč tabulky
- odbor: id odboru na které má uživatel právo - pokud má uživatel přístup na celý odbor, víc se v tabulce nevyplňuje
- organizace: id organizace na kterou má uživatel právo - pokud má uživatel právo na celou organizaci, odbor a ostatní sloupečky se nevyplňují
- areal: Uživatel může mít přístup na jeden z areálů organizace a všechny budovy, odběrná místa a měřidla v něm. Pro takový přístup je nutné vyplnit sloupec organizace a areal
- objekt: Sloupec udává přístup k určitému objektu/budově. TODO Je otázka, jak bude vyplňovat předchozí sloupec areál. Budova nemusí být přiřazena v žádném areálu, tudíž sloupec areal zůstane prázdný, ale pokud je budova zařazena do areálu, nevyplnění tohoto sloupce znamená, že se uživatel na budovu proklikne pouze přes záložku Budovy na frontendu, nikoli přes areál ve kterém je budova zařazena
- om: Sloupec udává odběrné místo, na které má uživatel přístup. TODO Stejně jako u objektu nastává otázka, zda vyplňovat předchozí sloupce.
- meridlo: Sloupec udává, k jakému měřidlu má uživatel přístup. V databázi se měřidlem může myslet vozidlo ve vozovém parku. Vozový park se tváří jako OM. Pro přístup na jedno měřidlo je třeba vyplnit sloupec *om pod které měřidlo spadá.
- Tabulka role obsahuje číselník rolí se sloupci, editor a create_user, které udávají, zda uživatel může editovat záznamy a vytvářet další uživatele. Aktuální seznam rolí: management, technický pracovník, admin ecuk, vedoucí odboru
- Tabulka pristupy je relační tabulka, která propojuje tabulky uzivatel, opravneni a role. Dále obsahuje sloupce active a created, které udávají, jestli je daný záznam aktivní a kdy byl vytvořen.
Příklad práv
-
technický pracovník, má přístup k jednomu areálu v organizaci tabulka opravneni
id_opravneni odbor organizace areal objekt om meridlo 1 NULL 1 1 NULL NULL NULL obdobně pro ostatní sloupce dle popisu výše
-
management organizace
id_opravneni odbor organizace areal objekt om meridlo 1 NULL 1 NULL NULL NULL NULL -
vedoucí odboru
id_opravneni odbor organizace areal objekt om meridlo 1 1 NULL NULL NULL NULL NULL -
ECUK admin
- zde si nejsem moc jistý, napadly mě 2 varianty, jak zapisovat takového uživtale TODO
- Př 1: \ tabulka opravneni
id_opravneni odbor organizace areal objekt om meridlo 1 id_odbor pro ECUK NULL NULL NULL NULL NULL tabulka pristupy
id_pristup id_uzivatel id_opravneni active created id_role 1 1 1 1 2024-08-15 12:02:29.000 id_role pro admin ECUK - Př 2:
tabulka pristupy
id_pristup id_uzivatel id_opravneni active created id_role 1 1 NULL 1 2024-08-15 12:02:29.000 id_role pro admin ECUK
Potřebná dokumentace - TODO
Ke každému projektu je zapotřebí vytvořit dokumentaci:
- Komunikační matice
- High level Design
- Popis jak danou aplikaci spustit
Bez této dokumentace se aplikace nedostane ani na testovací server! Pokud nevíte jak dané věci vytvořit, tak se poraďte se svým nadřízeným.