Ana içeriğe geç

Schema Tanımı

Schema, bir ekranın veri sözleşmesini tanımlar. Hangi alanlar var, hangi tiplerde, hangi validasyonlarla, hangi kaynaklardan besleniyor — bunların hepsi schema'dadır.

Schema yazmak Backend ekibinin sorumluluğundadır. Ancak bir UI tasarımcısının schema'yı okuyup anlayabilmesi, doğru view oluşturmanın ön koşuludur. Bu sayfa size schema'yı okuma becerisini kazandırır.


schema.json Anatomisi

schema.json (kök yapı)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:amorphie:res:schema:customer:registration-form",
"title": "Müşteri Kayıt Formu",
"description": "...",
"type": "object",
"required": ["firstName", "lastName", "city"],
"properties": {
"firstName": { ... },
"city": { ... }
}
}
AlanAçıklama
$idSchema'nın benzersiz URN adresi — view'da dataSchema değeri olarak kullanılır
titleSchema'nın görünen adı
typeHer zaman "object" — form verisi bir nesne olarak taşınır
requiredZorunlu alan adlarının listesi
propertiesHer bir alan tanımı

Her Alan Tanımının Yapısı

"firstName": {
"type": "string",
"minLength": 2,
"maxLength": 50,
"x-labels": { "tr": "Ad", "en": "First Name", "ar": "الاسم الأول" },
"x-errorMessages": {
"required": { "tr": "Ad alanı zorunludur", "en": "First name is required" },
"minLength": { "tr": "Ad en az 2 karakter olmalıdır", "en": "First name must be at least 2 characters" }
}
}

Standart JSON Schema Özellikleri

ÖzellikDeğerAçıklama
typestring, number, integer, boolean, object, arrayVeri tipi
minLengthsayıMinimum karakter sayısı (string)
maxLengthsayıMaksimum karakter sayısı (string)
minimumsayıMinimum değer (number/integer)
maximumsayıMaksimum değer (number/integer)
patternregexRegex pattern doğrulaması
formatstringÖnceden tanımlı format (aşağıya bkz.)
enumdiziİzin verilen değerler listesi
constdeğerSabit değer (ör. checkbox için true)
defaultdeğerVarsayılan değer

format değerleri: email, uri, url, date, date-time, time, phone, iban


x-* Uzantıları

Pseudo UI, standart JSON Schema üzerine x- önekli uzantılar ekler. Bunlar label, LOV kaynağı, koşullu görünürlük gibi UI'ya özgü bilgileri taşır.


x-labels — Çok Dilli Alan Etiketi

Alanın ekranda görünen etiketini tanımlar. Renderer aktif dile göre doğru etiketi seçer.

"x-labels": {
"tr": "Ad",
"en": "First Name",
"ar": "الاسم الأول"
}
ipucu

x-labels yoksa Renderer alan adını (ör. firstName) label olarak kullanır. Backend'den bu değerin mutlaka gelmesini bekleyin.


x-errorMessages — Hata Mesajları

Her validasyon kuralı için çok dilli hata mesajları tanımlar.

"x-errorMessages": {
"required": { "tr": "Ad alanı zorunludur", "en": "First name is required" },
"minLength": { "tr": "Ad en az 2 karakter olmalıdır", "en": "First name must be at least 2 characters" },
"pattern": { "tr": "Geçersiz format", "en": "Invalid format" },
"format": { "tr": "Geçerli bir e-posta giriniz", "en": "Enter a valid email" }
}

Desteklenen anahtar isimleri: required, minLength, maxLength, minimum, maximum, pattern, format, enum, const


x-enum — Enum Değerlerinin Etiketleri

enum alanlarının her değeri için görüntülenecek çok dilli metinleri tanımlar. Dropdown ve RadioGroup bu değerleri kullanır.

"customerType": {
"type": "string",
"enum": ["individual", "corporate"],
"x-enum": {
"individual": { "tr": "Bireysel", "en": "Individual", "ar": "فردي" },
"corporate": { "tr": "Kurumsal", "en": "Corporate", "ar": "شركات" }
}
}

x-lov — Dropdown Kaynağı (List of Values)

Bir dropdown veya seçim bileşeninin liste verilerini nereden çekeceğini tanımlar.

"city": {
"type": "string",
"x-lov": {
"source": "urn:amorphie:func:domain:shared:get-cities",
"valueField": "$.response.data.code",
"displayField": "$.response.data.name"
}
}
AlanAçıklama
sourceVeri kaynağının URN adresi
valueFieldAPI yanıtında value'nun JSONPath adresi
displayFieldAPI yanıtında görüntülenecek metnin JSONPath adresi
filterDinamik filtre parametreleri (cascade LOV için)

Filtreyle — cascade LOV örneği:

"district": {
"type": "string",
"x-lov": {
"source": "urn:amorphie:func:domain:shared:get-districts",
"valueField": "$.response.data.code",
"displayField": "$.response.data.name",
"filter": [
{ "param": "cityCode", "value": "$form.city", "required": true }
]
}
}

"required": truecity değeri boşken API çağrısı yapılmaz; district dropdown'ı devre dışı kalır.

Daha fazla bilgi için bkz. Data Akışı → Cascade LOV.


x-lookup — Tekil Kayıt Zenginleştirme

LOV birden çok satır döndürürken, x-lookup seçilen bir değere göre tek bir nesne döndürür. Seçilen şubenin adres ve iletişim bilgileri gibi detayları çekmek için kullanılır.

"branchDetail": {
"type": "object",
"x-lookup": {
"source": "urn:amorphie:func:domain:shared:get-branch-detail",
"resultField": "$.response.data",
"filter": [
{ "param": "branchCode", "value": "$instance.selectedBranchCode", "required": true }
]
}
}

View'da bu alanı aktifleştirmek için kök seviyeye "lookups": ["branchDetail"] eklenir. Veriyi kullanmak için $lookup.branchDetail.address gibi bir ifade kullanılır.

Daha fazla bilgi için bkz. Data Akışı → Lookup.


x-conditional — Koşullu Görünürlük ve Etkinlik

Bir alanın başka bir alana göre gösterilmesini, gizlenmesini, etkinleştirilmesini veya devre dışı bırakılmasını sağlar.

"tckn": {
"type": "string",
"x-conditional": {
"showIf": {
"field": "customerType",
"operator": "equals",
"value": "individual"
}
}
}

Kullanılabilir kural tipleri:

TipAçıklama
showIfKoşul sağlanırsa göster
hideIfKoşul sağlanırsa gizle
enableIfKoşul sağlanırsa etkinleştir
disableIfKoşul sağlanırsa devre dışı bırak

Koşul operatörleri:

OperatörAçıklamaÖrnek Değer
equalsEşit"individual"
notEqualsEşit değil"corporate"
inListede var["a", "b"]
notInListede yok["x", "y"]
isEmptyBoş
isNotEmptyDolu
containsİçeriyor"istanbul"
greaterThanBüyüktür18
lessThanKüçüktür65

Bileşik koşullar:

"x-conditional": {
"showIf": {
"allOf": [
{ "field": "customerType", "operator": "equals", "value": "individual" },
{ "field": "consentKVKK", "operator": "equals", "value": true }
]
}
}
AnahtarMantık
allOfAND — tüm koşullar sağlanmalı
anyOfOR — en az bir koşul sağlanmalı
notNOT — koşul sağlanmamalı

x-binding — Alt Bileşen Bağlama

Yalnızca alt bileşen (nested component) schema'larında kullanılır. Üst bileşenden gelmesi beklenen alanları işaretler.

"cityCode": {
"type": "string",
"x-binding": "required"
}
DeğerAçıklama
"required"Üst bileşen bu değeri mutlaka bind ile sağlamalı
"optional"Üst bileşen bu değeri sağlayabilir, sağlamazsa da çalışır

x-encryption — Şifreleme (Bilgi Amaçlı)

Tasarımcı bu alanı değiştirmez; ancak ekranda göreceğiniz bazı alanlarda şifreleme tipi belirtilmiş olabilir.

"tckn": {
"x-encryption": { "type": "persisted" }
}
DeğerAnlam
"persisted"Veritabanında şifreli saklanır
"transport"Sadece iletim sırasında şifrelenir

x-validation — Özel Validasyon (Bilgi Amaçlı)

Backend ekibi tarafından tanımlanır. Delegate aracılığıyla özel doğrulama kuralı çalıştırır.

"email": {
"x-validation": {
"rule": "validateEmailDomain",
"parameters": { "blockedDomains": ["tempmail.com"] },
"errorMessages": { "tr": "Geçici e-postalar kabul edilmez" }
}
}

Koşullu Zorunlu Alanlar — allOf

Schema'da bazı alanlar yalnızca belirli koşulda zorunlu hale gelir. Bu JSON Schema'nın if/then yapısıyla sağlanır:

"allOf": [
{
"if": {
"properties": { "customerType": { "const": "individual" } },
"required": ["customerType"]
},
"then": { "required": ["tckn", "birthDate"] }
},
{
"if": {
"properties": { "customerType": { "const": "corporate" } },
"required": ["customerType"]
},
"then": { "required": ["taxNumber", "companyName"] }
}
]

Bireysel müşteri seçildiğinde tckn ve birthDate zorunlu; kurumsal seçildiğinde taxNumber ve companyName zorunlu hale gelir.


Sonraki Konular