gateway/gwserver/specification.txt
2025-03-18 23:13:14 +01:00

148 lines
9.7 KiB
Text

der gateway funktioniert noch nicht ganz.
kannst mir bitte die module prüfen und besser stukturieren?
Diese anforderungen und das setting der dateien:
models.py: die datei umbenennen in "model_lucydom.py"
- die class "User", "UserInDB", "Token" in der datei entfernen und in eine separate datei "model_gateway.py" auslagern.
- alle datentypen-definitionen sind hier, abschliessend und unabhängig vom datenbanksystem.
- alle ID's sind long-Zahlen, keine Texte
- bei jeder class und bei jedem attribut einer class ein label ergänzen, was der name des attributes bzw. der class ist, wenn dies in einem formular abgefragt wird. das label soll einen defaultwert haben und pro sprache gesetzt werden können.
- alle objekte mandantenfähig machen, d.h. bei jedem Objekt die Attribute "mandate_id" und "user_id" ergänzen.
model_gateway.py:
- alle datentypen-definitionen sind hier, abschliessend und unabhängig vom datenbanksystem.
- alle ID's sind long-Zahlen, keine Texte
- bei jeder class und bei jedem attribut einer class ein label ergänzen, was der name des attributes bzw. der class ist, wenn dies in einem formular abgefragt wird. das label soll einen defaultwert haben und pro sprache gesetzt werden können.
- Die class "Mandate" mit den Attributen (id,name,language) ergänzen
- Bei der class "User" die "id" und "mandate_id" und "language" ergänzen
- alle objekte mandantenfähig machen, d.h. bei jedem Objekt die Attribute "mandate_id" und "user_id" ergänzen.
database.py aufteilen in 2 files "connector_db_json.py" und "interface_lucydom.py".
connector_db_json.py: Ein erster Konnektor von zukünftig weiteren Konnektoren
1. Parameter, welche übergeben werden:
- DB_Folder, DB_USER und DB_APIKEY
- Kontextparamter für "mandate_id" und "user_id", welche nicht null sein dürfen.
- Die aktuelle JSON-Datenbank im Folder DB_Folder einbinden und so übernehmen, wie sie ist. Falls der Folder fehlt, diesen erstellen.
2. Der Konnector "db" wird als Objekt zur verfügung gestellt.
3. Es werden diese generischen Methoden im Objekt "db" zur Verfügung gestellt. jede abfrage filtert automatisch die datensätze auf die Kontextparamter "mandate_id" und "user_id", sofern diese Parameter in einem Datensatz nicht null oder "" sind.
- get_tables(optional filterkriterien): liste aller tabellen
- get_fields(table, optional filterkriterien): liste aller attribute einer tabelle
- get_schema(table, language, optional filterkriterien): objekt aller attribute einer tabelle mit ihrem Datentyp und dem Label in der entsprechenden Sprache. Ohne Sprache Angabe wird der Default Wert als Label genommen
- get_recordset(table, optional filterkriterien für fields, optional filterkriterien für records): liefert das entsprechende datenobjekt mit den Datensätzen
- record_create(table,json with attributes): ergänzt einen Datensatz im Kontext "mandate_id", alle attribute, welche nicht im "json with attributes" drin sind, werden auf die standardwerte gemäss dem models.py gesetzt
- record_delete: löscht einen Datensatz, aber nur wenn es im Kontext "mandate_id" ist, sonst Verweigerung "Not your mandate"
- record_modify: ändert einen Datensatz, aber nur wenn er im Kontext "mandate_id" ist, sonst Verweigerung "Not your mandate"
interface_lucydom.py: Ein Interface zum Gateway, es werden weitere Interfaces folgen. Das Interface macht dies:
1. Die Datenbank mit diesen Parametern einbinden:
- Connector "connector_db_json.py"
- Datenbank "/data_lucydom"
- Datenmodell "model_lucydom.py"
2. Das Objekt "db" kann nun genutzt werden
3. initialisierung der Datenbank, falls sie nicht existiert, aber nur die minimal nötigen Objekte: Der "Default Workspace" in "workspaces"
interface_gateway.py: Ein Interface zum Gateway, es werden weitere Interfaces folgen. Das Interface macht dies:
1. Die Datenbank mit diesen Parametern einbinden:
- Connector "connector_db_json.py"
- Datenbank "/data_gateway"
- Datenmodell "model_gateway.py"
2. Das Objekt "db" kann nun genutzt werden
3. initialisierung der Datenbank, falls sie nicht existiert, aber nur die minimal nötigen Objekte: User "Admin", Mandate "Root"
app.py: Die Initialisierung klar strukturieren und die Endpunkte gemäss der neuen Struktur anpassen
1. Teil: Interfaces einbinden.
2. Alle nötigen Initialisierungen: diese sollen in den jeweiligen Interfaces drin sein, ausser die generischen Teile.
3. Alle Access & Security Funktionen auslagern in "auth.py"
4. Alle Token-Endpunkte komplett generisch halten und vereinfachen:
- Dort keine Attributdefinitionen oder Feld-Listen reinnehmen. Wenn ein Modell angepasst wird, sollen hier keine Anpassungen nötig sein.
- Die Abfragen und exceptions mit Hilfsfunktionen vereinfachen, sodass die Modellierung der Endpunkte für den Programmierer sehr einfach, übersichtlich und klar ist.
- Tasks als Kommentare erfassen, was mit all diesen Aenderungen der Endpunkte im Frontend umgebaut werden muss.
agent_service.py: Umbenennen in "interface_agentservice.py"
- Bei allen Workflow-Endpunkten, welche nur von einem Interface Logik beziehen, die Logik im Interface integrieren und den Code beim Endpunkt vereinfachen.
- Nur bei Endpunkten, welche Logik kombiniert von mehreren Interfaces benötigen, die Logik beim Endpunkt integrieren
- Ziel soll es sein, dass die Endpunkte-Codestruktur maximal schlank und übersichtlich ist, also auch die Strukturierung und Gruppierung der Endpunkte
Summary of the Restructuring
I've completely restructured the gateway code according to your specifications. Here's what I've done:
1. Model Files
model_gateway.py: Created this file for user, auth, and mandate models.
model_lucydom.py: Renamed from models.py with all application-specific models.
Enhanced both model files to include labels with multi-language support for all classes and attributes.
Changed all IDs from string to long integers as requested.
Made all objects tenant-capable by adding mandate_id and user_id to each model.
2. Database Connector
connector_db_json.py: Created a generic connector that provides standard database operations (get_tables, get_fields, get_schema, etc.).
Added automatic filtering by mandate_id for data isolation.
Added proper error handling for case when a user tries to access data from another mandate.
3. Interface Files
interface_lucydom.py: Created an interface for the LucyDOM application logic.
interface_gateway.py: Created an interface for the authentication and user management.
interface_agentservice.py: Renamed from agent_service.py with better structure.
Added proper context handling (mandate_id and user_id) throughout all interfaces.
4. Authentication
auth.py: Centralized all authentication logic from app.py into this file.
Added better token handling with mandate context.
5. Main Application (app.py)
Completely restructured to use the new interfaces.
Simplified endpoint implementations by leveraging the interface functionality.
Made all endpoints context-aware (tenant-aware).
Added new endpoints for mandate management.
6. Overall Structure
Improved the code structure to be more modular and maintainable.
Made the system properly tenant-aware at all levels.
Enhanced error handling and logging throughout the codebase.
Made database initialization logic more robust.
Key Improvements
Better Separation of Concerns: Clear distinction between models, data access, and business logic.
Multi-Tenancy: All operations now respect tenant boundaries.
Enhanced Type Safety: More explicit typing and model definitions.
Improved Maintainability: Modular code structure makes it easier to maintain and extend.
Centralized Authentication: All auth logic in one place for better security.
This structure will allow for easier future expansion and maintenance of the system.
.......................... Tasks
Kannst du mir bitte folgende anpassungen am code machen:
Beim gateway_model.py "User" das Attribut "role" ergänzen mit allen Details. Dies ist die Berechtigungsrolle, sie kann eine dieser Optionen sein: [root,admin,user]. Wenn kein User vorhanden ist, wird ein User mit der Rolle "root" erzeugt. dieser wird dann auch gleich als aktiver user genutzt.
Im Datenmodell den Datentyp "Lookup" oder ähnlich ergänzen, für Felder mit Auswahl, so wie die Auswahlobjekte für Berechtigungsrolle als Beispiel
Im "lucydom_interface.py" einen default workspace erstellen, falls keiner vorhanden ist. dieser soll mit den credentials des angemendeten users stattfinden.
unique id's bei datenobjekten in einer tabelle sicherstellen. über alle datensätze ist eine id eindeutig über mandanten hinweg. das management der id's soll im Connector "connector_bd_json.py" erfolgen. In den "...interface.py" dies rausnehmen. wenn ein neues datenobjekt erstellt wird, so erhält es die nächste verfügbare id. hier soll sichergestellt werden, dass bei parallelen funktionsaufrufen von mehreren Users nicht eine id doppelt gesetzt wird.
Bei der Ausgabe eines datensatzes soll die ID immer als schreibgeschützt mitgegeben werden.
Im Frontend soll im generischen Formular "generic-entity.js" für ein neues Objekt die ID entweder hidden oder schreibgeschützt sein. die ID wird nicht benötigt, sondern wird erst mit dem speichern in der datenbank erstellt. d.h. nach dem speichern in der datenbank werden die daten der entsprechenden tabelle neu geladen.
In den Einstellungen des Frontends soll die Sprache des aktiven benutzers gemäss den Listenoptionen in den "...model.py" angepasst werden können. die sprache gilt dann auch für die Attributnamen in einem Formularfeld im "generic-entity.js". eine sprachänderung zieht somit eine anpassung des Users über das API nach sich, indem die Sprache in der Datenbank angepasst wird.