# Fit-Connect .NET SDK

For an implementation example take a look at the [DemoRunner](DemoRunner/Program.cs)

## **!! IN DEVELOPMENT NOT FOR PRODUCTION USE !!**

**Fit-Connect .NET SDK** is a .NET library for the Fit-Connect API.

Die Verwendung des SDKs ist in der [documentation (ger)](./Documentation/documentation.de-DE.md)
erklärt

## For information how to use the SDK and FitConnect visit:

* [SDK-Dokumentation](./documentation/documentation.de-DE.md)
* [FIT-Connect Dokumentation](https://docs.fitko.de/fit-connect/docs)
* [FIT-Connect Dokumentation](https://fit-connect.com/docs)

<!-- 
## Structure
For the structure look the [Structure documentation](structure.md) 
-->

# Allgemeines

## Environment

Das FitConnect SDK kann an die folgenden Umgebungen angeschlossen werden:

- Testing: ```FitConnectEnvironment.Testing```
- Staging: ```FitConnectEnvironment.Staging```
- Production: ```FitConnectEnvironment.Production```


[FIT Connect Umgebungen](https://docs.fitko.de/fit-connect/docs/getting-started/first-steps/#environments)

Hierfür muss der Client die Environment auswählen oder einen eigenen Environment-Parameter übergeben.

## Credentials

ClientId und ClientSecret sind die Grundlage, um einen Token vom OAuth-Server abfragen zu können.
Die beiden Werte sind im [Self-Service Portal der Testumgebung von FIT-Connect](https://portal.auth-testing.fit-connect.fitko.dev/clients) zu erstellen.

# Sender

```mermaid
flowchart LR
    start([GetSender])
    destination(WithDestination)
    service(WithServiceType)
    attachments(WithAttachments)
    data([WithData])
    
    start-->destination-->service-->attachments-->data
```

Das SDK verhindert auf Grund der FluentAPI, dass die Methoden in der falschen Reihe aufgerufen werden können.

## GetSender(FitConnectEnvironment.Testing, clientId, clientSecret, logger)

Hier werden die FIT Connect Environment ausgewählt und die Credentials übergeben.
Der Parameter ```logger``` ist optional und muss das Interface ```Microsoft.Extensions.Logging.ILogger``` implementieren.

## .WithDestination(destinationId)

Die Destination ID des Zustelldienstes muss an dieser Stelle übergeben werden.

_Noch nicht vollständig getestet!_<br>
Eine Möglichkeit, die Destination ID zu ermitteln, geht über die Methode ``FindDestinationId()`` des Senders.

## .WithServiceType("FIT Connect Demo", leikaKey)

Der Service Type muss an dieser Stelle übergeben werden.
Hierfür wird ein Leistungsschlüssel (LeiKa-Schlüssel) benötigt.
Leistungsschlüssel haben diese Form ```urn:de:fim:leika:leistung:99400048079000```

## .WithAttachments(new Attachment("Test.pdf", "Test Attachment"))

Die Anhänge zum Antrag werden mit ```.WithAttachments``` übergeben.
Diese Methode erwartet ein Array von Attachment Objekten die als ```params``` übergeben werden können.

Das Attachment kann mit den folgenden Parametern erstellt werden:

- Metadaten und byte[] content
- Dateiname und Beschreibung

Dazu werden zwei Konstruktoren bereitgestellt:

- ```Attachment(Api.Metadata.Attachment metadata, byte[] content)```
- ```Attachment(string fileName, string description,)```

## .WithData("{\"message\":\"Hello World\"}")

Die Fachdaten werden als JSON String übergeben.

## .Submit()

Das Abschicken der Submission erfolgt mit diesem Aufruf.

## Beispiel

```csharp
var submission = Client
    .GetSender(FitConnectEnvironment.Development, clientId, clientSecret, logger)
    .WithDestination(destinationId)
    .WithServiceType("FIT Connect Demo", leikaKey)
    .WithAttachments(new Attachment("Test.pdf", "Test Attachment"))
    .WithData("{\"message\":\"Hello World\"}")
    .Submit();
```

# Subscriber

Der Subscriber braucht zusätzliche Informationen, um die Submissions abrufen zu können.
Hier sind zusätzlich die Schlüssel zum Ver- und Entschlüsseln notwendig.

````mermaid
flowchart LR

    start([GetSubscriber])
    availableSub(GetAvailableSubmission)
    requestSub(RequestSubmission)
    subscriberWithSub([SubscriberWithSubmission])
    subscriberWithSub_([SubscriberWithSubmission])
    data(GetDataJson)
    attachments(GetAttachments)
    accept(AcceptSubmission)
    reject(RejectSubmission)
    forward(ForwardSumbission)
    finished{{Abgeschlossen}}
    rejected{{Zurueckgewiesen}}
    
    start-->availableSub-->requestSub-->subscriberWithSub
    
    subscriberWithSub_-->data-->attachments
    attachments-->accept-->finished
    attachments-->reject-->rejected
    attachments-->forward

        
````

## .GetSubscriber(...)

Hier werden die FIT Connect Environment ausgewählt, die Keys und die Credentials übergeben.
Der Parameter ```logger``` ist optional und muss das Interface ```Microsoft.Extensions.Logging.ILogger``` implementieren.

## .GetAvailableSubmissions()

Liefert eine Liste mit den verfügbaren Submissions zurück.

## .RequestSubmission(submissionId)

Hiermit wird die Submission abgerufen und im Subscriber gespeichert.
Der Rückgabewert der Funktion ist also _Subscriber mit einer Submission_

## .GetDataJson()

Liefert die Fachdaten als JSON String zurück.

## .GetAttachments()

Gibt eine Liste mit den Attachments der Submission zurück.
Die Attachments können so geprüft werden.

## .AcceptSubmission()

Akzepiert die Submission und löscht diese vom Server.

## .RejectSubmission()

Weißt die Submission zurück.

## .ForwardSubmission()

## Beispiel

```csharp
        var subscriber = Client.GetSubscriber(FitConnectEnvironment.Testing, clientId,
            clientSecret,
            privateKeyDecryption,
            privateKeySigning,
            publicKeyEncryption,
            publicKeySignatureVerification,
            logger);

        var submissions = subscriber.GetAvailableSubmissions();

        // Alle verfügbaren Submissions laden
        foreach (var submission in submissions) {
            var subscriberWithSubmission = subscriber.RequestSubmission(submission.SubmissionId);
            
            // Laden der Anhänge
            var attachments = subscriberWithSubmission
                .GetAttachments();

            // Ausgabe der Fachdaten auf der Konsole
            logger.LogInformation("Fachdaten: {Data}", subscriberWithSubmission.GetDataJson());
            
            // Submission akzeptieren und abschließen
            subscriberWithSubmission.AcceptSubmission();
        }
```

# Router

Die Client-Implementierung der Router API 

```csharp
Client.GetRouter(FitConnectEnvironment.Development, logger);
```

[glossary](https://docs.fitko.de/fit-connect/docs/glossary/)