Das HookContext-Interface bietet ein zentrales Objekt, um Zugang zu verschiedenen Attributen und Paketen zu erhalten. Es wird als context in den Hooks des tibi-server genutzt und stellt wichtige Funktionalitäten zur Verfügung, die zur Manipulation der Daten und Abläufe in den HTTP-Methoden und Schritten der API benötigt werden.

Das HookContext-Interface setzt sich aus mehreren Schnittstellen zusammen, darunter GetHookData, GetHookGetOnlyData, PostHookData, JobData, request und mehrere third-party Pakete. Hierbei sind mit ausnahme von den request und den third-party-paketen attributen alle attribute direkt auf dem context Objekt vorhanden. Request ist eine funktion die ihre Objekte zurückgibt und ist somit rechenaufwendig. Daher ist es ratsam bei mehrfacher nutzung des request attributs, sich den Wert in einer variable zwischen zu speichern. Die Attribute auf den paketen werden über context.paketname.attribut aufgerufen.

## GetHookData

Das GetHookData-Interface enthält Attribute, die spezifisch für die Manipulation von GET-Anfragen in den Hooks sind:

-   `filter`: Ein Filter-Objekt, das die Anfragebedingungen für die zu abrufenden Dokumente enthält.
-   `selector`: Ein Selektor-Objekt, das festlegt, welche Felder in den zurückgegebenen Dokumenten enthalten sein sollten.
-   `offset`: Ein numerischer Wert, der den Startpunkt für die Rückgabe von Dokumenten festlegt.
-   `limit` Ein numerischer Wert, der die maximale Anzahl von Dokumenten festlegt, die zurückgegeben werden sollen.
-   `sort`: Ein String oder ein Array von Strings, der die Sortierreihenfolge der zurückgegebenen Dokumente bestimmt.
-   `pipelineMod`: Eine Funktion, die es ermöglicht, die MongoDB-Abfragepipeline zu modifizieren.

## PostHookData Interface

Das PostHookData-Interface enthält ein Attribut, das speziell für POST- und PUT-Hooks relevant ist:

`data`: Das Dokument oder die Daten, die gesendet wurden. Dies ist ein CollectionDocument-Objekt und wird in die Datenbank geschrieben. Will man den Datenbankeinträge im hook also modifizieren, so muss dieses Objekt modifiziert werden. Mann muss dieses Objekt idealerweise also einfach modifiziert in dem HookResponse data attribut abspeichern, dies wird nämlich zwischen allen Hooks immer ausgetauscht. Demzufolge ist das veränderte data Objekt dann auch so im nächsten Hook verfügbar.

## JobConfig und JobData Interfaces

Das JobConfig-Interface definiert die Konfiguration für einen Cron-Job, diese ist jene Konfig die im zugehörigen yaml definiert wurde:

-   `meta`: Ein Metadatenobjekt.
-   `cron`: Ein String, der die Cron-Job-Intervallspezifikation enthält.
-   `type`: Der Typ des Jobprogramms. Derzeit wird nur "javascript" unterstützt.
-   `file`: Der Pfad zur Datei des Jobprogramms.

Das JobData-Interface enthält ein job-Attribut, das ein JobConfig-Objekt ist und die Konfiguration des aktuellen Jobs repräsentiert.

## request

Die request Funktion liefert ein Objekt zurück, das Informationen über die HTTP-Anfrage enthält:

-   `method`: Die HTTP-Methode der Anfrage (GET, POST, PUT, DELETE etc.).
-   `remoteAddr`: Die remote IP-Adresse der Anfrage.
-   `clientIp()`: Funktion zum Abrufen der Client-IP-Adresse der Anfrage.
-   `host`: Der Host der Anfrage.
-   `url`: Die vole URL der Anfrage.
-   `path`: Der Pfad der Anfrage.
-   `param(p: string)`: Funktion zum Abrufen von URL-Parametern.
-   `query(q: string`: Funktion zum Abrufen von URL-Abfrageparametern.
-   `header(h: string)`: Funktion zum Abrufen von HTTP-Headern.
-   `body()`: Funktion zum Abrufen des HTTP-Body.
-   `bodyBytes()`: Funktion zum Abrufen des HTTP-Body als byte array. Wird z.B. für die Umwandlung von iso8859 zu utf8 genutzt.

## Pakete

Jedes der folgenden Attribute ist ein Paket, das spezifische Funktionen bereitstellt:

-   `db`: Stellt Funktionen zur Interaktion mit der Datenbank zur Verfügung (DbPackage).
-   `smtp`: Bietet Funktionen zum Senden von E-Mails (SmtpPackage).
-   `fs`: Bietet Funktionen zum Interagieren mit dem Dateisystem (FsPackage).
-   `tpl`: Stellt Funktionen zum Arbeiten mit Templates zur Verfügung (TplPackage).
-   `http`: Bietet Funktionen zum Senden von HTTP-Anfragen (HttpPackage).
-   `debug`: Stellt Funktionen zum Debuggen zur Verfügung (DebugPackage).
-   `response`: Bietet Funktionen zur Manipulation der HTTP-Antwort (ResponsePackage).
-   `user`: Bietet Funktionen zum Arbeiten mit Benutzern (UserPackage).
-   `bcrypt`: Stellt Funktionen zum Hashen und Überprüfen von Passwörtern zur Verfügung (BcryptPackage)`
-   `jwt`: Bietet Funktionen zum Arbeiten mit JSON Web Tokens (JwtPackage).
-   `charset`: Bietet Funktionen zur Arbeit mit Zeichensätzen (CharsetPackage).
-   `image`: Bietet Funktionen zur Arbeit mit Bildern (ImagePackage).
-   `xml`: Stellt Funktionen zum Arbeiten mit XML-Daten zur Verfügung (XmlPackage).
-   `cookie`: Bietet Funktionen zum Arbeiten mit Cookies (CookiePackage).
-   `pdf`: Bietet Funktionen zum Arbeiten mit PDF-Dokumenten (PdfPackage).
-   `crypt`: Bietet Funktionen für Kryptografie (CryptoPackage).
-   `json`: Bietet Funktionen zum Arbeiten mit JSON-Daten (JsonPackage).

Diese Pakete erweitern die Möglichkeiten des Context Objektes und ermöglichen es, eine Vielzahl von Aufgaben auszuführen. Für detaillierte Informationen zu jedem Paket, siehe die spezifische Dokumentation des jeweiligen Pakets.
