Kullanıcı Tipleri
Kullanıcıların özel alanlarını JSON şemasıyla tanımlayın.
Kullanıcı tipi, bir kullanıcı türünün şemasıdır. O tipteki kullanıcıların standart alanların ötesinde sahip olduğu alanları, tipleri ve doğrulama kurallarıyla birlikte tanımlar. Her kullanıcı oluşturma ve güncelleme, kullanıcının tipinin şemasına göre doğrulanır.
Kullanıcı tipleriyle, hiç kod değiştirmeden:
- özel alanlar ekleyebilir (telefon numarası, doğum tarihi, adres listesi, sadakat seviyesi…),
- alanları zorunlu, benzersiz ya da bir değer kümesiyle sınırlı yapabilir,
- bir tip hiyerarşisi kurabilir (Customer ve Employee'nin ikisi de Person'dan türer),
- bir back office'in şemadan form üretmesini sağlayabilirsiniz.
Kalıtım#
Kullanıcı tipleri baseType üzerinden birbirinden türer. Her zincir, tüm kullanıcıların standart alanlarını tanımlayan yerleşik base-user tipinde biter:
| Alan | Tip | Kurallar |
|---|---|---|
firstname | string | zorunlu |
lastname | string | |
username | string | zorunlu, membership başına benzersiz |
email_address | email | zorunlu, membership başına benzersiz |
role | string | zorunlu |
permissions | string array'i | benzersiz öğeler |
forbidden | string array'i | benzersiz öğeler |
user_type | string | zorunlu |
source_provider | string | salt okunur |
connected_accounts | nesne array'i | salt okunur |
is_active | boolean | salt okunur |
membership_id | string | salt okunur |
sys | object | sunucu tarafından yönetilir |
base-user abstract'tır: hiçbir kullanıcının tipi olamaz, her zaman kendi tiplerinizi oluşturursunuz. Veritabanında saklanmaz ve liste endpoint'i onu döndürmez, ama GET /user-types/all ve GET /user-types/base-user onu içerir.
base-user (abstract)
└── person (abstract) + phone, birth_date
├── customer + loyalty_tier, addresses
└── employee (sealed) + department, employee_noBir tip, atalarının tüm alanlarına ek olarak kendi alanlarına sahiptir.
| Bayrak | Anlamı |
|---|---|
isAbstract | Hiçbir kullanıcı bu tipte olamaz; yalnızca diğer tiplere temel olur. |
isSealed | Başka hiçbir tip bu tipten türeyemez. |
Bir tip hem abstract hem sealed olamaz ve bir zincir kendi üzerine dönemez.
Kullanıcı tipi nesnesi#
{
"_id": "66f1c0d2a4b5c6d7e8f90130",
"name": "Customer",
"slug": "customer",
"description": "People who buy from us",
"baseType": "person",
"isAbstract": false,
"isSealed": false,
"allowAdditionalProperties": false,
"properties": {
"loyalty_tier": {
"type": "enum",
"displayName": "Loyalty Tier",
"items": [
{ "displayName": "Bronze", "value": "bronze" },
{ "displayName": "Silver", "value": "silver" },
{ "displayName": "Gold", "value": "gold" }
],
"defaultValue": "bronze"
},
"customer_no": {
"type": "string",
"isRequired": true,
"isUnique": true,
"regexPattern": "^C[0-9]{8}$"
},
"addresses": {
"type": "array",
"maxCount": 5,
"itemSchema": {
"type": "object",
"properties": {
"label": { "type": "string", "isRequired": true },
"city": { "type": "string", "isRequired": true },
"location": { "type": "location" }
}
}
}
},
"membership_id": "66f1c0d2a4b5c6d7e8f90123",
"sys": { "created_at": "2026-01-01T12:00:00Z", "created_by": "admin" }
}| Alan | Zorunlu | Açıklama |
|---|---|---|
name | evet | Görünen ad. Base User ayrılmıştır. |
slug | hayır | Verilmezse addan türetilir. base-user ayrılmıştır. Kullanıcılar tiplerine bu slug ile başvurur. |
description | hayır | |
baseType | hayır | Temel tipin slug'ı ya da adı; slug olarak saklanır. Verilmezse base-user. |
isAbstract, isSealed | hayır | Bkz. Kalıtım. Varsayılan false. |
allowAdditionalProperties | hayır | true olduğunda kullanıcılar şemanın tanımlamadığı alanlara sahip olabilir. Varsayılan false: tanımlanmamış alanlar reddedilir. |
properties | evet | Bu tipin tanımladığı alanlar; alan adlarını anahtar olarak kullanan bir nesne. Miras alınan alanlar tekrarlanmaz. |
Alanlar#
properties'in her girdisi bir alanı tanımlar. Anahtar, alanın kullanıcılarda görünen adıdır.
Ortak seçenekler#
| Seçenek | Tip | Açıklama |
|---|---|---|
type | string | Alan tipi (aşağıya bakın). Zorunlu. |
displayName | string | Formlar için okunabilir ad. |
description | string | Formlar için yardım metni. |
isRequired | boolean | Alanın bir değeri olmalıdır. String'lerde yalnızca boşluktan oluşan değerler boş sayılır. |
defaultValue | any | Oluşturmada alan verilmediğinde kullanılan değer. |
isUnique | boolean | İki kullanıcı aynı değeri paylaşamaz (bkz. Benzersiz alanlar). string, integer, float, boolean, enum ve string tabanlı tiplerde kullanılabilir. |
isVirtual | boolean | Türetilmiş bir tipin alanı yeniden tanımlamasına izin verir (bkz. Miras alınan alanları yeniden tanımlama). |
isHidden, isReadonly | boolean | Kullanıcı arayüzleri için ipuçları. Zorunlu olan gizli bir alanın bir defaultValue'su olmalıdır. |
appearance | string | Kullanıcı arayüzleri için ipucu (alanın nasıl gösterileceği). |
isSearchable, searchWeight | boolean, number | Arama arayüzleri için ipuçları. |
isHidden, isReadonly, appearance, isSearchable ve searchWeight, back office gibi kullanıcı arayüzleri için saklanır ve döndürülür; API bunları kendi alanlarınızda uygulamaz.Alan tipleri#
Temel tipler
| Tip | Değer | Seçenekler |
|---|---|---|
string | metin | minLength, maxLength, regexPattern (değer eşleşmelidir), restrictRegexPattern (değer eşleşmemelidir), formatPattern, caseInsensitive |
integer | tam sayı | minimum, maximum (dahil), exclusiveMinimum, exclusiveMaximum, multipleOf |
float | sayı | minimum, maximum, exclusiveMinimum, exclusiveMaximum |
boolean | true / false | |
enum | items'tan biri | items (zorunlu, benzersiz, { "displayName", "value" }), isMultiple (değer, öğe değerlerinden oluşan bir array'dir) |
const | sabit bir değer | value, valueType |
object | iç içe nesne | properties (tipin properties'iyle aynı biçimde), allowAdditionalProperties |
array | liste | itemSchema (öğeler için bir alan tanımı), minCount, maxCount, uniqueItems, uniqueBy (nesne öğeleri arasında benzersiz olması gereken alan adları) |
Biçimli tipler
| Tip | Değer | Seçenekler |
|---|---|---|
email | bir e-posta adresi | string seçenekleri |
uri | mutlak bir URI | string seçenekleri |
hostname | bir host adı | string seçenekleri |
color | bir renk kodu, ör. #1E90FF | string seçenekleri |
date | yyyy-MM-dd | minValue, maxValue |
datetime | ISO 8601 tarih ve saat, ör. 2026-01-01T12:00:00Z | minValue, maxValue |
longtext | çok satırlı metin | string seçenekleri |
richtext | HTML metin | minWordCount, maxWordCount |
code | kaynak kod | string seçenekleri |
json | herhangi bir JSON değeri | |
tags | string array'i | minCount, maxCount, minLength, maxLength (her etiketin) |
location | { "latitude": 41.01, "longitude": 28.97 } | |
image, video | medya tanımlayıcıları | boyut ve ölçü kuralları (maxSize, minWidth, maxWidth…) |
reference | başka kullanıcılara bir referans | referenceType (single, multiple ya da collection), contentType (referans verilen kullanıcıların ait olması ya da türemesi gereken kullanıcı tipinin slug'ı; base-user her kullanıcıyı kabul eder) |
Tarih ve saat değerleri UTC olarak saklanır. Offset içermeyen bir datetime UTC olarak okunur.
Örnekler#
Bir telefon numarası:
"phone": {
"type": "string",
"displayName": "Phone",
"maxLength": 20,
"regexPattern": "^\\+?[0-9 ()-]{7,20}$"
}Son yüzyıl içinde olması gereken bir doğum tarihi:
"birth_date": {
"type": "date",
"minValue": "1926-01-01"
}Bir kümeden seçilen ilgi alanları listesi:
"interests": {
"type": "enum",
"isMultiple": true,
"items": [
{ "displayName": "Sports", "value": "sports" },
{ "displayName": "Music", "value": "music" },
{ "displayName": "Travel", "value": "travel" }
]
}Bir çalışanın yöneticisi; o da bir çalışan olmalıdır:
"manager": {
"type": "reference",
"referenceType": "single",
"contentType": "employee"
}Benzersiz alanlar#
Bir alan isUnique olarak işaretlendiğinde ErtisAuth onun için bir MongoDB unique index'i oluşturur:
- Benzersizlik, alanı benzersiz tanımlayan tipin ve ondan türeyen tiplerin kullanıcıları arasında, membership içinde kontrol edilir.
- Boş değerler sayılmaz: birçok kullanıcı benzersiz bir alanı boş bırakabilir.
usernameveemail_addressmembership içinde benzersizdir.
Bir alanı benzersiz olarak işaretlediğinizde bazı kullanıcılar zaten aynı değeri paylaşıyorsa, kullanıcı tipi değişikliği tekrarlanan değeri belirten 409 UniqueFieldHasDuplicates hatasıyla reddedilir. Önce tekrarları temizleyin.
Tekrarlanan bir değerle yapılan kullanıcı yazma isteği, bir alan hatasıyla 400 ValidationException döner (bkz. Kullanıcılar).
Array öğelerinin içindeki benzersiz alanlar bir index'le değil, uygulama tarafından kontrol edilir.
Miras alınan alanları yeniden tanımlama#
Bir tip, temel tiplerinden birinin zaten tanımladığı bir alanı tanımlayamaz (400 SchemaValidationException, "field is already exist in base type"). İstisnası, türetilmiş tipte isVirtual: true ile tanımlanan bir alandır: type'ı miras alınanla aynı olduğu sürece kabul edilir (aksi halde 400 SchemaValidationException, "The field type cannot be overwritten on virtual fields").
Endpoint'ler#
Tüm route'lar /memberships/{membershipId} altındadır.
| Metot | Route | Açıklama | Yetki |
|---|---|---|---|
GET | /user-types/{id} | Kullanıcı tipi getirme (id ya da slug) | user-types.read.{id} |
GET | /user-types | Saklanan kullanıcı tiplerini listeleme | user-types.read |
GET | /user-types/all | base-user dahil tüm kullanıcı tipleri, sayfalamasız | user-types.read |
GET | /user-types/relations/{id} | Her alanı tanımlayan tip | user-types.read.{id} |
POST | /user-types/_query | Kullanıcı tiplerini sorgulama | user-types.read |
POST | /user-types | Kullanıcı tipi oluşturma | user-types.create |
PUT | /user-types/{id} | Kullanıcı tipi güncelleme | user-types.update.{id} |
DELETE | /user-types/{id} | Kullanıcı tipi silme | user-types.delete.{id} |
Kullanıcı tipi getirme#
GET /memberships/{membershipId}/user-types/{id}Tipi, temel tiplerinden miras aldığı alanlarla birlikte döner.
Alan ilişkileri#
GET /memberships/{membershipId}/user-types/relations/customerBir tipin alanlarını, base-user'a kadar, onları tanımlayan tipe göre gruplar. Her seviye için bir bölüm içeren formlar oluşturmak için kullanışlıdır:
{
"base-user": [ "firstname", "lastname", "username", "email_address", "role", "…" ],
"person": [ "phone", "birth_date" ],
"customer": [ "loyalty_tier", "customer_no", "addresses" ]
}Kullanıcı tipi oluşturma#
curl -X POST https://auth.example.com/memberships/<membership_id>/user-types \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Employee",
"baseType": "person",
"isSealed": true,
"properties": {
"department": { "type": "string", "isRequired": true },
"employee_no": { "type": "integer", "isUnique": true, "minimum": 1 }
}
}'Yanıt 201 Created: kullanıcı tipi.
| Hata | Ne zaman |
|---|---|
400 UserTypeNameRequired | name eksik |
400 InheritedTypeNotFound | baseType yok |
400 InheritedTypeIsSealed | baseType sealed |
400 UserTypeCannotBeBothAbstractAndSealed | İki bayrak da işaretli |
400 UserTypeInheritanceCycle | Zincir bu tipe geri dönüyor |
400 SchemaValidationException, 400 FieldValidationException | Bir alan tanımı geçersiz ya da bir alan zaten bir temel tip tarafından tanımlanmış |
409 ReservedUserTypeName, 409 ReservedUserTypeSlug | Base User / base-user |
409 UserTypeAlreadyExists | Slug kullanımda |
409 UniqueFieldHasDuplicates | Benzersiz bir alanın mevcut kullanıcılar arasında tekrarlanan değerleri var |
Kullanıcı tipi güncelleme#
PUT /memberships/{membershipId}/user-types/{id}Gövde, oluşturma isteğiyle aynı alanlara sahiptir ve tipi tamamen değiştirir: yalnızca değişenleri değil, tipin kendi properties'inin tamamını gönderin.
- Mevcut kullanıcılar yeniden yazılmaz. Varsayılan değeri olmayan yeni bir zorunlu alan, mevcut kullanıcılar bir değer alana kadar onların sonraki güncellemelerinin başarısız olmasına yol açar; bu yüzden yeni zorunlu alanlara bir
defaultValueverin ya da önce onları doldurun. - Kullanımdaki bir tipin slug'ı (kullanıcılar ya da türetilmiş tipler tarafından) değişemez: kullanıcılar tiplerine slug ile başvurduğu için yeni slug yok sayılır.
- Hiçbir değişiklik içermeyen bir güncelleme
409 IdenticalDocumentErrordöner.
Kullanıcı tipi silme#
DELETE /memberships/{membershipId}/user-types/{id}Yanıt 204 No Content. Hâlâ kullanıcıları ya da türetilmiş tipleri olan bir tip silinemez: 400 UserTypeCanNotBeDelete.
Olaylar#
UserTypeCreated, UserTypeUpdated ve UserTypeDeleted. Bkz. Olaylar.
Dokümantasyonda bir hata mı buldunuz? Issue açın