# Basics
İş ve teknik altyapı ihtiyaçlarını karşılamak ve mümkün olan en küçük ve en verimli parçalar halinde geliştirme yaklaşımı hedeflenmiştir.
## Domain
* *Domain* kavramı birden fazla süreç tarafından kullanılan her türlü veri, akış ve servis kümesi için kullanılır.
* *Domain* direkt olarak gerçekten hayattan izdüşümle belirlenir. *Person Domain, Vahicle Domain, Document Domanin* gibi.
* Domain işleyişini gerçekleştirme için başka bir domain ile birlikte çalışabilir.
## Kayıt
* Tüm kayıtlar bir akış ile oluşturulur.
* Kaydın global bir tekil anahtarı olur.
* Kaydın tekil anahtarı aynı zamanda kaydı oluşturan akış için *correlation key* olarak kullanılır.
* Kayıt ile ilişkili aktif bir akış bulunuyorsa aktif akışın bilgisi bulunur.
* Kayıt ile ilgili geçmiş tüm akışlar ayrıca sorgulanabilir.
* Kayıt silimez, sadece silindi olarak işaretlenir.
* Her kaydın üstünde referans olarak tuttuğu başka bir kayıt bilgisi olabilir.
### Örnek Kayıt Şeması
```json
{
"id": "15802b18-cc2f-4b79-808f-e35b6023782c",
```
> **id** Kaydın tekil anahtarıdır.
```json
"active-process": {
"id": "15802b18-cc2f-4b79-808f-e35b6023782c",
"name": "create-dealer-contact",
"available-transitions": [
{
"name": "create-dealer-contact-approve",
"title": "Onayla",
"form": "process-generic-approve"
}
]
},
```
> **active-process** Kaydın üstünde bulunan aktif akış bilgisini içerir. Veriler akış izleme sistemi sorgulanarak elde edilir.
```json
"reference": {
"name": "PROCESS:retail-loan-vehicle",
"id": "e39d7d85-22a3-4f35-a5ac-01fffc229635"
},
```
> **reference** Kaydın üst akışı veya direkt ilişkli farklı bir kayıt bilgileri edilir. Eğer bir akış ise PROCESS ön eki ile, eğer referans bir başka direkt kayıt ise (örneğin "ENTITY:loan-account") ise ENTITY ön eki ile kayıt edilir. Varlığı zorunlu değildir.
```json
"status": "N",
```
> **status** Kaydın silinmesi durumunda aktiflik durumu pasife (R) çekilir. Kayıt asla silinmez. Aktif durum için "A", yeni bir kayıt ise ve akışı devam ediyorsa "N" verilir.
```json
"citizenship-number": 385559965653,
"name": {
"First": "Uğur",
"Last": "Karataş"
}
}
```
> Kayıt ile ilgili özel bilgiler.
### Örnek Kaydın İlişkisel Veritabanı Şeması
| Column Adı | Veri Tipi<sup>1</sup> | Ortak ? <sup>2</sup> | Açıklama |
| -------- | -------- | -------- |-------- |
| id | uuid | * |
| active-process | uuid | * | Eğer aktif bir iş akışı var ise onun anahtarı. Bu anahtar kullanarak aktif akış ile ilgili bilgilerle şema zenginleştirilerek dönülür. |
| referance.name | text | * | Eğer column ismi içinde (.) kullanılmaşsa şema oluşturulurken **path** verisine uygun şekilde verilerin gruplanacağını belirtir. |
| referance.id | text | * | |
| status | char | * | (**N**)ew,(**A**)ctive,(**R**)emoved. Sorgularda sıklıkla kullanılacağı ve indeksin parçası olacağı için özellikle tek karakter tercih edilmiştir. |
| citizenship-number | bigint | | |
| name.first | text | | |
| name.last | text | | |
**1** Veri tipleri için YugabyteDB baz alınmıştır.
**2** Tüm tablolarda bulunacak ortak alan olduğunu belirtir.
## Akış
* Akışlar görsel olarak tasarlanır.
* Akış ile iletişim asenkron olarak sağlanır
* Akışlar mesajlar ile başlatılır veya ilerletilir.
* Akışlar geri bilgi vermek için *callback worker* kullanır.
* *Callback Worker* verilen bir servis noktasına veya SignalR ile verilen bir hub noktasına geri dönnüş sağlar.
* Birden fazla sistem *CallBack* ile bilgilendirilebilir.
## Mesaj
* Her bir mesaj bir veri kümesi bekler.
* Veri kümesi teknoloji agnostik olarak tanımlanır.
* Veri kümesi içerisinde veri modeli kullanıcı arabirim zenginleştirmelerini (enum değerler, referans değer listeleri vs.) içerir.
* Veri kümesi içerisinde veri doğrulama, referans gibi kontrol bilgileride yer alır.
* Kontrol bilgileri hem kullanıcı arabiriminde hem de akış tarafında kullanılır.