---
# System prepended metadata

title: Untitled

---

## Dokumentacja mikrousługi danych PatientData

--------------------------------------

##### Autorzy:

###### Maciej Włodarczyk

######  Marcin Dadura

-------------------------

### 1. Cel

Mikrousługa PatientData ma za zadanie dostarczyć interfejs REST, który może służyć do obsługi prostych zapytań dotyczących danych zgromadzonych w tej usłudze. Interfejs powinien być przejrzysty oraz nie ujawniać szczegółów implementacji.

###  2. Opis danych

Mikrousługa służy do obsługi danych dotyczących pacjentów. Dane przetrzymywane są w najlepszym do tego formacie XML.

Każda instancja pacjenta zawiera pola:

* `Id` - unikalny identyfikator pacjenta,
* `Name` - jest to imię i nazwisko pacjenta,
* `Sex` - płeć pacjenta, możliwa `male` lub `female`
* `Pesel` - PESEL pacjenta,
* `Conditions` - lista obiektów typu `Condition` przechowujących informacje o pojedyńczym schorzeniu.

Każda instancja schorzenia - `Condition` przechowuje:

* `Type` - typ schorzenia,
* `DiagnosisDate` - data zdiagnozowania choroby u pacjenta.

#### 2.1 Plik .xsd - formalny model danych

Plik definiujący bazę danych to `schema.xsd`. Zawierają się w nim wsyztskie informacje opisujące bazy danych, jej struktura oraz możliwe wartości przechowywane w pliku `database.xml`. Plik można odnaleźć w katalogu `PatientsData/Resources/schema.xsd`.

#### 2.2 Plik bazy danych - przykładowe dane

Cały plik można odnaleźć w katalogu `PatientsData/Resources/database.xml`. Stworzyliśmy również generator pliku `.xml`, który pozwala nam wygenerować dowolną ilość pacjentów w bazie danych.

Przykładowy zestaw danych jednego pacjenta w bazie danych w formacie pliku XML:

```
<?xml version="1.0" encoding="utf-8"?>
<Database xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<Patients>
        <Patient>
        	<Id>1</Id>
        	<Name>Honorata Bosek</Name>
        	<Sex>female</Sex>
        	<Pesel>86392074438</Pesel>
        	<Conditions>
        		<Condition>
        			<Type>5</Type>
        			<DiagnosisDate>2005-02-09T00:00:00</DiagnosisDate>
        		</Condition>
        	</Conditions>
        </Patient>
	</Patients>
</Database>
```

#### 2.3 UML

Poniżej znajduje się diagram UML bazy danych. Można na nim zaobserwować następujące elementy:

* `Patient` - obiekt pacjent zawierający w sobie odpowiednie atrybuty, dokładniej opisane w punkcie 1.
    * `Sex` - enum, element obiektu Patient, przyjmuje wartość `male` lub `female`
    * `Conditions` - lista schorzeń, element obiektu Patient
        * `Condition` - schorzenie, element obiektu Conditions

![](https://i.ibb.co/RgMk0GN/Patient-Data-Entity-Diagram-same-Dane.png)


### 3. Struktura projektu

* `PatientData`
    * `GenEntries` - w katalogu znajduje się generator przykładowych danych w pliku database.xml
    * `Infrastructure`
        * `Models`
            * `Condition.cs` - model do przetrzymywania schorzeń
            * `Database.cs` - model pomocniczy do czytania bazy danych w `xml`.
            * `Patient.cs` - model do przetrzymywania danych pacjenta
            * `Sex.cs` - model do przetrzymywania danych o płci.
        * `Repositories`
            * `IPatientRepository` - interfejs do repozytorium pacjentów
            * `PatientRepository` - repozytorium pacjentów odpowiedzialne za wszystkie operacje na bazie danych w XML.
    * `Properties` - katalog zawierający plik `JSON` z ustawieniami ładującymi projekt
    * `Resources` 
        * `database.xml` - plik zawierający baze danych
        * `schema.xsd` - plik zawierający schemat bazy danych
    * `Tests`
        * `PatientDataTests.bat` - skrypt testujący mikrousługę danych używający `curl`
    * `Web`
        * `Application`
            * `Dtos`
                * `ConditionDto.cs` - model do wysyłania danych o schorzeniach
                * `PatientDto.cs` - model do wysyłania danych o pacjentach
            * `Mapper`
                * `Mapper.cs` - klasa zawierająca statyczne metody do mappowania `dto` na `model`.
            * `Queries`
                * `PatientQueriesHandler.cs` - klasa zajmująca się obsługą zapytań dotyczących pacjentów - przekazuje ona zapytania do repozytorium.
                * `IPatientQueriesHandler.cs` - interfejs, który implementuje obsługę zapytań dla pacjentów.
        * `Controllers`
            * `PatientController.cs` - kontroler odpowiedzialny za obsługę `end-pointów` zdefiniowanych w usłudze - wywołuje on metody z `PatientQueriesHandler.cs`.
    * `appsettings.Development.json` - ustawienia aplikacji dla stanu `Development`
    * `appsettings.Production.json` - ustawienia aplikacji dla stanu `Production`
    * `Dockerfile` - plik umożliwiający konteneryzację
    * `PatientsData.csproj` - plik zawierający wszystkie info o projekcie, w tym używane pakiety
    * `PatientsData.sln` - plik opisujący rozwiązanie
    * `Program.cs` - znajduje się tutaj funkcja wejściowa do programu
    * `Startup.cs` - klasa zajmująca cię wstepną konfiguracją mikrousługi przy uruchomieniu


Zapytania obsługiwane są w następującym schemacie. Zapytanie przechwytuje `controller` i przekazuje je do `QueryHandlera`. Następnie zapytanie realizuje `PatientRepository` i zwraca wyniki w odwrotnej kolejności. `PatientRepository` działa bezpośrednio na danych. `QueryHandler` mapuje je na obiekty typu `Data Transfer Object` i zwraca je do `Controllera`, który wystawia dane na wyjście.
 


### 4. API

Usługa wystawia interfejs z którego można korzystać za pomocą HTTP REST.

Usługa wystawia następujące metody na punktach końcowych:

* metody `GET`:
    * `/patients` - zwraca listę wszyskich pacjentów dostępnych w repozytorium danych, nie przyjmuje argumentów
    * `/select-condition` - metoda zwracająca listę pacjentów z danymi schorzeniami, przyjmuje liczbę całkowitą, jako typ schorzenia
    * `/patient-id` - metoda zwracająca pacjenta o danym id, przyjmuje liczbę całkowitą jako ID pacjenta
    * `/patient-pesel` - metoda zwracająca pacjenta o danym peselu, przyjmuje stringa jako Pesel
* metoda `POST`:
    * `/add-patient` - wysyłając obiekt json metoda ta pozwala na dodanie pacjenta


Przykładowy obiekt `Patient` w pliku Json. W metodach `GET` dostajemy listę tych obiektów lub jeden obiekt, tak jak poniżej. Aby dodać pacjenta metodą `POST` musimy wysłać taki obiekt jak poniżej:
```
{
    "id": 1,
    "name": "Modest Tomaszek",
    "sex": "male",
    "pesel": "25206423085",
    "conditions": [
        {
            "type": 9,
            "diagnosisDate": "28.04.2011 00:00:00"
        }
    ]
}
```


### 5. Testy

Do mikrousługi zostały dostarczone również testy w postaci skryptu `curl`. Aplikacja przechodzi testy i spełnia swoją funkcjonalność. Testy można odnaleźc w `PatientsData/Tests/PatientDataTests.bat`.

