# Workflow
Uygulama içerisinde var olan entityler için iş akış desteğinin sunulması desteğini verir.
İş akışları iki tip olarak değerlendirilir.
1. Kayıtların üzerinde bulunan **State** alanında saklanan ve uzun soluklu (*long running*) statü takibinin yapıldığı *Finite State Machine* olarak çalışan kayıt durum akışıdır.
2. Durumlar(State Transition) arası geçiş anında ve *Atomic* olarak çalışan akışlardır.
:::info
Tam bağımsız bir mikro servis uygulama olarak tasarlanıp hizmete alınacaktır.
:::
## Tanımlar
İş akışlarını kullanmak için öncelikle kullanılacak entity için iş akış tanımı yapılır.
Tanım kaydın alabileceği state değerlerini ve geçiş aksiyonları ile ilgili temel bilgileri içerir.
### State
State tanımı içerisinde sadece aşama bilgisi ve açıklaması yer alır.
### Transition
Transition içeriside aşamalar arası geçiş bilgisi, ilişkili iş akışı ve form bilgisi yer alır.
* **workflow** Atomik olarak tasarlanmış stateless çalışan bir akıştır. **Zeebe** üzerinde geliştirilmiş akışlar çağrılır. Zorunlu bir alan değilde. Eğer tanımlı bir iş akışı yok ise sadece statü değişimi gerçekletirilir.
* **workflow-form** işe akışı çağrılmadan önce elde edilmesi gereken veriler için input şemasını tanımlar. Tüketiciler için form bilgisini sağlar. Entegre olan uygulamalar form bilgisini dikkate alır. Opsiyoneldir. Alına veriler işlenmeden iş akışına gönderilir.
> Form bilgisi json olarak tutulması değerlendirilmeli. Yapının bağımlılını düşürecektir.
```json
{
"id": "750533c6-d1e1-4d96-9019-d22894b3dcba",
"domain": "idm",
"entity": "scope",
"states": [
{
"name": "New",
"description": "Just created"
},
{
"name": "Active",
"description": "Ready to use"
},
{
"name": "Suspended",
"description": "Suspended"
},
{
"name": "Passive",
"description": "Record is not available to operations"
}
],
"transations": [
{
"name": "Create",
"source-state": "#Start",
"target-state": "New"
},
{
"name": "Activate",
"source-state": "New",
"target-state": "Active",
"workflow": "activate-assosiation",
"workflow-form": "activate-assosiation-form"
},
{
"name": "Fraud Risk",
"source-state": "Active",
"target-state": "Suspended",
"workflow": "suspend-assosiation-fraud",
"workflow-form": "fraud-suspension-assosiation-form"
},
{
"name": "Suspend",
"source-state": "Active",
"target-state": "Suspended",
"workflow": "suspend-assosiation"
}
]
}
```
## Kayıtlar
### Ana Kayıtlar
Sistem üzerinde sadece ilgili kayıtların ana anahtarı üzerinden statü bilgisi tutulur.
| Domain* | Entity* | Id* | State |
| ------- | ----------- | ----------- | ------ |
| idm | scope | 750533c6... | Active |
* **Domian** hangi proje, model üzerinde çalışılıyorsa onunla ilgili bilgiyi tutar.
* **Entity** ilgili domain içeresindeki veri kümesi, tablo bilgisini tutar.
* **Id** direkt olarak kaydın ana anahtarıdır.
* **Statü** kaydın bulunduğu aşamadır.
> Performans açısından kayıtlar domain veya entity bazında ayrı reporlarda saklanması değerlendirlebilir.
### İz Kayıtları
| Tran Id* | Domain | Entity | Id | From | To | Transition | Result | Info | Executed At | Duration | Entity Data | Form Data |
| ------------ | ------ | ----------- | ----------- | ---- | -------- | ---------- | ------- | ---- | ------------------------ | -------- | ----------- | --------- |
| 5678866c6... | idm | scope | 750533c6... | New | Activate | Activate | Success | {} | 2022-09-20T16:20:15.811Z | 752 | {...} | {...} |
> İz kayıtları Transactionın başlaması, tamamlanması olarak ayrı ayrı bir state server üzerine fire-forget iletilir.
> Transaction tamamlandığında ise bağımız bir worker tarafından denormalize tek satırlık bir log kaydına dönüştürülerek kayıt altına alınır.
## Servisler
### Definition
#### GET /workflow/definition?keyword=domain-or-and-entity
**Workflow** kayıtlarını döner. Sayfalama ve free text arama özellikler sağlar.
#### POST /workflow/definition
Worflow domain ve entity adına göre varolan bir **Workflow** kaydını günceller veya yenisini oluşturur.
```json
{
"id": "750533c6-d1e1-4d96-9019-d22894b3dcba",
"transition": "Activate",
"entity-data": {
"domain": "idm",
"entity": "association",
"tags": [
"idm-workflow"
],
"states": [],
"transations": []
},
"form-data": {
"param1": "idm ui",
"param2": "385455854584"
}
}
```
> Post methodu aynı zamanda kendi alt yapısını kullanarak iş akışı ile statü güncellemesi ve kayıt oluşumunu gerçekleştirir.
#### GET /workflow/definition/{id}
İstenen **Workflow** ile ilgili detaylı kayıt bilgilerini döner.
### Data
#### POST /workflow/data
Bir kaydın statüsünü güncellemek ve var ise iş akışını tetiklemek için kullanılır.
##### Request Body
Jenerik bir methot olduğu için kaydı ayrıştırıcı parametelerin tümü girilmelidir.
* **Domian** hangi proje, model üzerinde çalışılıyorsa onunla ilgili bilgi geçilir.
* **Entity** ilgili domain içeresindeki tablo bilgisini geçilir.
* **Id** kaydın ana anahtarıdır. Yok ise yaratılır, var ise güncellenir. Yaratılma ve güncelleme eylemlerinde ilgili entity için tanımlanmış akış kuralları dikkate alınır.
* **transition** kayıt üzerinde hangi aksiyonun alınacağı bilgisidir. Tanımlı iş akış kuralları dikkate alınır.
```json
{
"domain": "idm",
"entity": "association",
"id": "750533c6-d1e1-4d96-9019-d22894b3dcba",
"transition": "Activate",
"entity-data": {},
"form-data": {}
}
```
##### Response Body
Sonuç başarılı ise kaydın yeni statüsü döner.
```json
{
"state": "Active"
}
```
Sonuç başarılı değilse ilgili hata kodu ile hata bilgisi dönüşü yapar.
```json
{
"code": "Transition is not available",
"title": "Requested transition is not available in defined worfklow definiton."
}
```
#### GET /workflow/data/{domain}/{entity}/{id}
Kaydın statü bilgisi dahil temel bilgilerini getirir.
#### GET /workflow/data/{domain}/{entity}/{id}/history
Kayıt ile ilişkili oluşmuş iş akış hareketlerini getirir. Servis **paging** desteği sağlar.