ErtisAuth

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:

AlanTipKurallar
firstnamestringzorunlu
lastnamestring
usernamestringzorunlu, membership başına benzersiz
email_addressemailzorunlu, membership başına benzersiz
rolestringzorunlu
permissionsstring array'ibenzersiz öğeler
forbiddenstring array'ibenzersiz öğeler
user_typestringzorunlu
source_providerstringsalt okunur
connected_accountsnesne array'isalt okunur
is_activebooleansalt okunur
membership_idstringsalt okunur
sysobjectsunucu 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.

hierarchy
base-user (abstract)
└── person (abstract)       + phone, birth_date
    ├── customer            + loyalty_tier, addresses
    └── employee (sealed)   + department, employee_no

Bir tip, atalarının tüm alanlarına ek olarak kendi alanlarına sahiptir.

BayrakAnlamı
isAbstractHiçbir kullanıcı bu tipte olamaz; yalnızca diğer tiplere temel olur.
isSealedBaş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#

json
{
	"_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" }
}
AlanZorunluAçıklama
nameevetGörünen ad. Base User ayrılmıştır.
slughayırVerilmezse addan türetilir. base-user ayrılmıştır. Kullanıcılar tiplerine bu slug ile başvurur.
descriptionhayır
baseTypehayırTemel tipin slug'ı ya da adı; slug olarak saklanır. Verilmezse base-user.
isAbstract, isSealedhayırBkz. Kalıtım. Varsayılan false.
allowAdditionalPropertieshayırtrue olduğunda kullanıcılar şemanın tanımlamadığı alanlara sahip olabilir. Varsayılan false: tanımlanmamış alanlar reddedilir.
propertiesevetBu 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çenekTipAçıklama
typestringAlan tipi (aşağıya bakın). Zorunlu.
displayNamestringFormlar için okunabilir ad.
descriptionstringFormlar için yardım metni.
isRequiredbooleanAlanın bir değeri olmalıdır. String'lerde yalnızca boşluktan oluşan değerler boş sayılır.
defaultValueanyOluşturmada alan verilmediğinde kullanılan değer.
isUniquebooleanİki kullanıcı aynı değeri paylaşamaz (bkz. Benzersiz alanlar). string, integer, float, boolean, enum ve string tabanlı tiplerde kullanılabilir.
isVirtualbooleanTüretilmiş bir tipin alanı yeniden tanımlamasına izin verir (bkz. Miras alınan alanları yeniden tanımlama).
isHidden, isReadonlybooleanKullanıcı arayüzleri için ipuçları. Zorunlu olan gizli bir alanın bir defaultValue'su olmalıdır.
appearancestringKullanıcı arayüzleri için ipucu (alanın nasıl gösterileceği).
isSearchable, searchWeightboolean, numberArama arayüzleri için ipuçları.
Not: 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

TipDeğerSeçenekler
stringmetinminLength, maxLength, regexPattern (değer eşleşmelidir), restrictRegexPattern (değer eşleşmemelidir), formatPattern, caseInsensitive
integertam sayıminimum, maximum (dahil), exclusiveMinimum, exclusiveMaximum, multipleOf
floatsayıminimum, maximum, exclusiveMinimum, exclusiveMaximum
booleantrue / false
enumitems'tan biriitems (zorunlu, benzersiz, { "displayName", "value" }), isMultiple (değer, öğe değerlerinden oluşan bir array'dir)
constsabit bir değervalue, valueType
objectiç içe nesneproperties (tipin properties'iyle aynı biçimde), allowAdditionalProperties
arraylisteitemSchema (öğeler için bir alan tanımı), minCount, maxCount, uniqueItems, uniqueBy (nesne öğeleri arasında benzersiz olması gereken alan adları)

Biçimli tipler

TipDeğerSeçenekler
emailbir e-posta adresistring seçenekleri
urimutlak bir URIstring seçenekleri
hostnamebir host adıstring seçenekleri
colorbir renk kodu, ör. #1E90FFstring seçenekleri
dateyyyy-MM-ddminValue, maxValue
datetimeISO 8601 tarih ve saat, ör. 2026-01-01T12:00:00ZminValue, maxValue
longtextçok satırlı metinstring seçenekleri
richtextHTML metinminWordCount, maxWordCount
codekaynak kodstring seçenekleri
jsonherhangi bir JSON değeri
tagsstring array'iminCount, maxCount, minLength, maxLength (her etiketin)
location{ "latitude": 41.01, "longitude": 28.97 }
image, videomedya tanımlayıcılarıboyut ve ölçü kuralları (maxSize, minWidth, maxWidth…)
referencebaşka kullanıcılara bir referansreferenceType (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ı:

json
"phone": {
	"type": "string",
	"displayName": "Phone",
	"maxLength": 20,
	"regexPattern": "^\\+?[0-9 ()-]{7,20}$"
}

Son yüzyıl içinde olması gereken bir doğum tarihi:

json
"birth_date": {
	"type": "date",
	"minValue": "1926-01-01"
}

Bir kümeden seçilen ilgi alanları listesi:

json
"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:

json
"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.
  • username ve email_address membership 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.

MetotRouteAçıklamaYetki
GET/user-types/{id}Kullanıcı tipi getirme (id ya da slug)user-types.read.{id}
GET/user-typesSaklanan kullanıcı tiplerini listelemeuser-types.read
GET/user-types/allbase-user dahil tüm kullanıcı tipleri, sayfalamasızuser-types.read
GET/user-types/relations/{id}Her alanı tanımlayan tipuser-types.read.{id}
POST/user-types/_queryKullanıcı tiplerini sorgulamauser-types.read
POST/user-typesKullanıcı tipi oluşturmauser-types.create
PUT/user-types/{id}Kullanıcı tipi güncellemeuser-types.update.{id}
DELETE/user-types/{id}Kullanıcı tipi silmeuser-types.delete.{id}

Kullanıcı tipi getirme#

http
GET /memberships/{membershipId}/user-types/{id}

Tipi, temel tiplerinden miras aldığı alanlarla birlikte döner.

Alan ilişkileri#

http
GET /memberships/{membershipId}/user-types/relations/customer

Bir 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:

json
{
	"base-user": [ "firstname", "lastname", "username", "email_address", "role", "…" ],
	"person": [ "phone", "birth_date" ],
	"customer": [ "loyalty_tier", "customer_no", "addresses" ]
}

Kullanıcı tipi oluşturma#

shell
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.

HataNe zaman
400 UserTypeNameRequiredname eksik
400 InheritedTypeNotFoundbaseType yok
400 InheritedTypeIsSealedbaseType sealed
400 UserTypeCannotBeBothAbstractAndSealedİki bayrak da işaretli
400 UserTypeInheritanceCycleZincir bu tipe geri dönüyor
400 SchemaValidationException, 400 FieldValidationExceptionBir alan tanımı geçersiz ya da bir alan zaten bir temel tip tarafından tanımlanmış
409 ReservedUserTypeName, 409 ReservedUserTypeSlugBase User / base-user
409 UserTypeAlreadyExistsSlug kullanımda
409 UniqueFieldHasDuplicatesBenzersiz bir alanın mevcut kullanıcılar arasında tekrarlanan değerleri var

Kullanıcı tipi güncelleme#

http
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 defaultValue verin 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 IdenticalDocumentError döner.

Kullanıcı tipi silme#

http
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