> For the complete documentation index, see [llms.txt](https://docs.ecommerce.seb.ee/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ecommerce.seb.ee/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/arhitektuur-ja-laiendatavus.md).

# Arhitektuur ja laiendatavus

Mõistke SDK ports-and-adapters-arhitektuuri ja integreerige kohandatud taristuadapterid.

API Client SDK on üles ehitatud kui **kuusnurkne (portide ja adapterite) arhitektuur**. Iga infrastruktuurikomponent, millest SDK sõltub — HTTP-klient, webhooki kuulaja, JWE-krüpteerija, JSON-serialiseerija, logija — asub väikese liidese taga (üks *port*) SDK rakendussüdamikule kuuluvas kihis. Komplektis olevad teostused (*adapterid*) on vaikevalikud, mitte nõuded: saate igaühe neist asendada omaenda teostusega.

See leht selgitab, kuidas SDK on üles ehitatud, miks see on just sellise ülesehitusega ja mida see ülesehitus võimaldab teha. Adapteri tegeliku asendamise süntaksi kohta igas keeles vaadake [SDK adapterite ülekirjutamine](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/sdk-adapterite-asendamine.md).

## SDK ülesehitus

<figure><img src="https://1157570179-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuBDtfypkI85zidcVwaDj%2Fuploads%2Fo0GePge2xT9Uws9IktvT%2Fegw-sdk-architecture-diagram.svg?alt=media&#x26;token=eb2cfd82-863c-4f86-922a-a0cb1e8aa5d7" alt="EGW SDK - ports &#x26; adapters architecture"><figcaption><p>EGW SDK – portide ja adapterite arhitektuur</p></figcaption></figure>

Kolm kihti, üks sõltuvuse suund:

* **Rakendussüdamik** — `EgwClienti` fassaad, üks API klass iga domeeni kohta ning päringu- ja vastuse DTO-d. Sõltub ainult portidest.
* **Portid** — viis väikest liidest, mille kaudu südamik välismaailmaga suhtleb. Need on SDK ainus kokkulepe infrastruktuuriga.
* **Adapterid** — portide konkreetsed teostused, mis kasutavad levinud teeke.  **alglaadimis** kiht (klienditehas koos teenusepakkuja mehhanismiga) otsustab loomise ajal, milline adapter täidab iga pordi.

## Viis porti

| Port                | Eesmärk                                                            |
| ------------------- | ------------------------------------------------------------------ |
| API klient          | Väljuvad HTTP-kutsed, OAuth-märgi käsitlemine                      |
| API server          | Sissetulevate webhookide kuulaja                                   |
| Andmete krüpteerija | Kaardiandmete JWE-krüpteerimine                                    |
| Serialiseerija      | DTO-de JSON-(des)serialiseerimine                                  |
| Logija              | Diagnostiline logimine (valikuline; vaikeväärtusena ei tee midagi) |

Portid on tahtlikult kitsad — API kliendi port sisaldab kahte meetodit (`perform`, `performWithoutAuth`), krüpteerijal on üks (`encrypt`). Ühe teostamine on ühe pärastlõuna töö, mitte projekt.

Iga pordiga kaasneb selle platvormi levinud teegil põhinev vaikeadapter. Vaadake oma keele jaoks liidese nimesid ja adapterit, mis täidab iga pordi:

<details>

<summary>Java</summary>

| Port                | Liides           | Vaikeadapter                            |
| ------------------- | ---------------- | --------------------------------------- |
| API klient          | `ApiClient`      | `JavaNetHttpClient` (`java.net.http`)   |
| API server          | `ApiServer`      | `ComSunNetHttpServer`                   |
| Andmete krüpteerija | `DataEncrypter`  | `NimbusDataEncrypter` (Nimbus JOSE+JWT) |
| Serialiseerija      | `Serialiseerija` | `JacksonSerializer` (Jackson)           |
| Logija              | `EgwLogger`      | `NoOpEgwLogger`                         |

</details>

<details>

<summary>PHP</summary>

| Port                | Liides                   | Vaikeadapter                                      |
| ------------------- | ------------------------ | ------------------------------------------------- |
| API klient          | `ApiClientInterface`     | `GuzzleHttpClient` (Guzzle 7)                     |
| API server          | `ApiServerInterface`     | `ReactPhpHttpServer` (ReactPHP)                   |
| Andmete krüpteerija | `DataEncrypterInterface` | `WebTokenDataEncrypter` (`web-token/jwt-library`) |
| Serialiseerija      | `SerializerInterface`    | `NativeJsonSerializer` (natiivne `json_*`)        |
| Logija              | `EgwLoggerInterface`     | `NoOpEgwLogger`                                   |

</details>

<details>

<summary>C#</summary>

| Port                | Liides           | Vaikeadapter                          |
| ------------------- | ---------------- | ------------------------------------- |
| API klient          | `IApiClient`     | `HttpApiClient` (`HttpClient`)        |
| API server          | `IApiServer`     | `HttpListenerApiServer`               |
| Andmete krüpteerija | `IDataEncrypter` | `JoseDataEncrypter` (`jose-jwt`)      |
| Serialiseerija      | `ISerializer`    | `JsonSerializer` (`System.Text.Json`) |
| Logija              | `IEgwLogger`     | `NoOpEgwLogger`                       |

</details>

<details>

<summary>Node.js / TypeScript</summary>

| Port                | Liides           | Vaikeadapter                               |
| ------------------- | ---------------- | ------------------------------------------ |
| API klient          | `ApiClient`      | `AxiosApiClient` (axios)                   |
| API server          | `ApiServer`      | `HttpServerApiServer` (`node:http`)        |
| Andmete krüpteerija | `DataEncrypter`  | `JoseDataEncrypter` (`jose`)               |
| Serialiseerija      | `Serialiseerija` | `JsonSerializer` (`JSON` + DTO-kaardistus) |
| Logija              | `EgwLogger`      | `NoopEgwLogger`                            |

</details>

## Miks see ülesehitus

Makse-SDK paikneb *teie* tehnoloogiapinnas, mitte vastupidi. Teie backendil on juba HTTP-klient koos häälestatud ajalõppude, puhverserverite ja interceptoritega; logimisraamistik korrelatsiooni-ID-dega; testiraamistik, mis ei tohi avada päris võrgupesasid. Monoliitne SDK, mis on oma valikud kõvasti sisse kodeerinud, sunnib teid käitama kahte eksemplari kõigest.

Kuusnurkne ülesehitus pöörab selle ümber. Rakendussüdamik — `EgwClienti` fassaad, domeeni API klassid (`payments()`, `refunds()`, `tokens()`, sessiooni API-d, `notifications()`) ning genereeritud DTO-d — sisaldab makseloogikat ega tea midagi Guzzle'ist, Jacksonist ega axiosest. Kõik kolmanda osapoole sõltuvused on piiritletud adapterikihiga. Mida see praktikas annab:

* **Natiivne tehnoloogiapinu integratsioon.** Suunake SDK HTTP-liiklus läbi omaenda kliendi, nii et teie olemasolevad ajalõpu-, puhverserveri-, TLS-i- ja instrumenteerimispoliitikad kehtivad ka maksekutsete kohta.
* **Jälgitavus teie tingimustel.** Ühendage oma logimisraamistik (SLF4J, PSR-3, Serilog, pino) SDK logijapordiga. Vaikeväärtus on tegevusetu logija — SDK vaikib, kuni annate talle sihtkoha.
* **Testitavus.** Iga porti saab asendada stubiga. Saate ühiktestis kasutada täielikku fassaadi ja genereeritud DTO-sid võltsitud API-kliendi ja läbipääsva krüpteerijaga, ilma võrgu või mock-serverita.
* **Ei mingit teegilukustust.** Kui komplektis olev sõltuvus satub teie platvormiga konflikti (Jacksoni versioonikonflikt, Guzzle'i suurem uuendus), teostate pordi eelistatud teegiga ja loobute komplektis olevast adapterist — südamikku see ei mõjuta.

## Keelteülene järjepidevus

Kõik neli SDK-d katavad samu API-toiminguid ja järgivad sama arhitektuuri, sama portide komplekti, samu tehasekontseptsioone ning peegeldatud testikomplekte. Keeliti muutuvad ainult nimetamiskonventsioon ja SPI-kasutusviis. Kui integreerite SDK kahte tehnoloogiapinu — või migreerute ühest teise — kandub mõttemudel tervikuna üle; erineb vaid ülekirjutamise süntaks.

## Adapteri asendamine

Iga keel lubab teil iga pordi jaoks pakkuda oma teostust kolme hoova kaudu: andke tehasele valmis eksemplar, registreerige pakkuja SDK teenusepakkuja liidese (SPI) mehhanismi kaudu või laiendage klienditehast. Eeliskorra reeglite ja keelepõhiste näidete kohta vaadake [SDK adapterite ülekirjutamine](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/sdk-adapterite-asendamine.md).

## Seotud lehed

* [SDK adapterite ülekirjutamine](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/sdk-adapterite-asendamine.md) — kuidas asendada sisseehitatud adapterit keele kaupa
* [Ülevaade](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/ulevaade.md) — keelte maatriks, paketid, alfaolek
* [Vigade käsitlemine](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/vigade-kasitlemine.md) — `ECommException` hierarhia, milles teie adapterid osalevad
* [Turvamehhanismid](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/turvamehhanismid.md) — mida adapter peab järgima (märgikäsitlus, JWE, logide maskeerimine)
* Keelepõhised kiirkäivitused: [Java](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/kiirstardid/java.md) · [PHP](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/kiirstardid/php.md) · [C#](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/kiirstardid/c-.net.md) · [Node.js](/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/kiirstardid/node.js-typescript.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ecommerce.seb.ee/seb-docs-draft/seb-docs-public-et/integratsioon/api-kliendi-sdk/juhendid/arhitektuur-ja-laiendatavus.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
