WEB / WEB-16.04
Service layer, business logic ve templates
Bir public note’un domain sonucu ile HTTP response’u farklı kararlardır. Controller, service, repository ve template arasındaki ownership’i takip et.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Published note
- Public note seç
Client public catalog için GET /service/tea request’ini hazırladı. Key seçimi yalnız read niyetidir; controller, service, repository ve renderer henüz bu request’i almamıştır.
- Duru / Client
- GET /service/tea hazır
- HTTP controller
- No request
- Service / domain
- Not called
- Repository
- No read
- Template renderer
- Not called
- Request ulaştı
Controller public GET request’ini aldı; bu arrival service/domain sonucunu henüz üretmez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/tea received
- Service / domain
- Not called
- Repository
- No read
- Template renderer
- Not called
- Use case çağrısı
Controller service’e key verir; aynı process function call’ı için network packet gösterilmez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/tea received
- Service / domain
- Query tea
- Repository
- No read
- Template renderer
- Not called
- Record oku
Repository benign fixture kaydını okur; bulunan kaydın availability kararını repository adı tek başına vermez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/tea received
- Service / domain
- Query tea
- Repository
- Found; published=true
- Template renderer
- Not called
- Rule sonucu
tea kaydı bulunmuş ve published=true koşulunu sağlamıştır. Service available sonucuyla yalnız title=Tea & Bread view model’ini hazırlar. Repository’nin tüm internal kaydı veya yeni bir write bu sunum kararına katılmaz.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/tea received
- Service / domain
- Available; title=Tea & Bread
- Repository
- Found; published=true
- Template renderer
- Not called
- Text render
Sabit h1 HTML text slot’u, title=Tea & Bread verisini <h1>Tea & Bread</h1> body’sine dönüştürür. Raw title değişmez; ampersand bu context’e uygun temsil edilir. Body hazırdır fakat client henüz almadı.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/tea received
- Service / domain
- Available; title=Tea & Bread
- Repository
- Found; published=true
- Template renderer
- <h1>Tea & Bread</h1> hazır
- HTTP mapping
Controller domain sonucunu seçilmiş HTTP policy’ye eşler; bu read-only işlem database commit’i değildir.
- Duru / Client
- Waiting response
- HTTP controller
- 200 HTML ready
- Service / domain
- Available; title=Tea & Bread
- Repository
- Found; published=true
- Template renderer
- <h1>Tea & Bread</h1> hazır
- Response ulaştı
Client 200 response ve <h1>Tea & Bread</h1> body’sini şimdi aldı. Bu varış, daha önceki service/renderer sonucundan ayrıdır. Browser parsing, DOM/piksel veya database commit sonucu bu adımda gösterilmez.
- Duru / Client
- 200 HTML received
- HTTP controller
- 200 HTML ready
- Service / domain
- Available; title=Tea & Bread
- Repository
- Found; published=true
- Template renderer
- <h1>Tea & Bread</h1> hazır
Draft note
- Public note seç
Client public catalog için GET /service/draft request’ini hazırladı. Key seçimi yalnız read niyetidir; controller, service, repository ve renderer henüz bu request’i almamıştır.
- Duru / Client
- GET /service/draft hazır
- HTTP controller
- No request
- Service / domain
- Not called
- Repository
- No read
- Template renderer
- Not called
- Request ulaştı
Controller public GET request’ini aldı; bu arrival service/domain sonucunu henüz üretmez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/draft received
- Service / domain
- Not called
- Repository
- No read
- Template renderer
- Not called
- Use case çağrısı
Controller service’e key verir; aynı process function call’ı için network packet gösterilmez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/draft received
- Service / domain
- Query draft
- Repository
- No read
- Template renderer
- Not called
- Record oku
Repository benign fixture kaydını okur; bulunan kaydın availability kararını repository adı tek başına vermez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/draft received
- Service / domain
- Query draft
- Repository
- Found; published=false
- Template renderer
- Not called
- Rule sonucu
draft kaydı bulunmuştur ama published=false olduğu için public availability koşulunu sağlamaz. Service unavailable döndürür; title view model’i ve renderer çağrısı oluşmaz.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/draft received
- Service / domain
- Unavailable
- Repository
- Found; published=false
- Template renderer
- Not called
- HTTP mapping
Controller unavailable sonucunu bu public read sözleşmesinde 404 ve Not available body’sine eşler. Draft ve absent aynı dış response’u alır; renderer çağrılmaz ve persistence write/commit yoktur.
- Duru / Client
- Waiting response
- HTTP controller
- 404 Not available ready
- Service / domain
- Unavailable
- Repository
- Found; published=false
- Template renderer
- Not called
- Response ulaştı
Client 404 Not available response’unu aldı. Bu dış sonuç tek başına draft kaydının mevcut olup unpublished olması ile absent key’inin bulunmamasını ayıramaz; iç neden için repository/domain kaydı gerekir.
- Duru / Client
- 404 Not available received
- HTTP controller
- 404 Not available ready
- Service / domain
- Unavailable
- Repository
- Found; published=false
- Template renderer
- Not called
Missing note
- Public note seç
Client public catalog için GET /service/absent request’ini hazırladı. Key seçimi yalnız read niyetidir; controller, service, repository ve renderer henüz bu request’i almamıştır.
- Duru / Client
- GET /service/absent hazır
- HTTP controller
- No request
- Service / domain
- Not called
- Repository
- No read
- Template renderer
- Not called
- Request ulaştı
Controller public GET request’ini aldı; bu arrival service/domain sonucunu henüz üretmez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/absent received
- Service / domain
- Not called
- Repository
- No read
- Template renderer
- Not called
- Use case çağrısı
Controller service’e key verir; aynı process function call’ı için network packet gösterilmez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/absent received
- Service / domain
- Query absent
- Repository
- No read
- Template renderer
- Not called
- Record oku
Repository benign fixture kaydını okur; bulunan kaydın availability kararını repository adı tek başına vermez.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/absent received
- Service / domain
- Query absent
- Repository
- No record
- Template renderer
- Not called
- Rule sonucu
absent key’i için repository kayıt bulamadı. Service unavailable döndürür; published kontrolü için var olmayan bir kayda değer atanmaz. Title view model’i ve renderer çağrısı oluşmaz.
- Duru / Client
- Waiting response
- HTTP controller
- GET /service/absent received
- Service / domain
- Unavailable
- Repository
- No record
- Template renderer
- Not called
- HTTP mapping
Controller unavailable sonucunu bu public read sözleşmesinde 404 ve Not available body’sine eşler. Draft ve absent aynı dış response’u alır; renderer çağrılmaz ve persistence write/commit yoktur.
- Duru / Client
- Waiting response
- HTTP controller
- 404 Not available ready
- Service / domain
- Unavailable
- Repository
- No record
- Template renderer
- Not called
- Response ulaştı
Client 404 Not available response’unu aldı. Bu dış sonuç tek başına draft kaydının mevcut olup unpublished olması ile absent key’inin bulunmamasını ayıramaz; iç neden için repository/domain kaydı gerekir.
- Duru / Client
- 404 Not available received
- HTTP controller
- 404 Not available ready
- Service / domain
- Unavailable
- Repository
- No record
- Template renderer
- Not called
ROLLER · STATE · VERİ AKIŞI
Controller sonucu taşır; domain kuralı seçer
Service layer bir use case’in akışını düzenler: uygun data access’i çağırır, domain kuralını uygulatır ve controller’ın tüketebileceği bir sonuç verir. Bu dersin public note kuralı published=true olan kaydın sunulmasıdır. Controller path’i note key’e eşler; repository kaydı okur; domain availability sonucunu belirler. Service ismi burada HTTP microservice veya ayrı process anlamına gelmez. Bütün bu işler seçilmiş örnekte aynı process’in function call’larıdır.
Business logic, uygulamanın neyi geçerli saydığını belirler; HTML tag’lerini seçmek veya response header yazmak aynı sorumluluk değildir. DDD gibi bir tasarımda application layer orchestration yapıp business rule’u domain’e bırakır. Daha küçük uygulamalar farklı bir düzen kullanabilir. Esas soru class adına bakmak değil, published kararının HTML ve JSON gibi farklı presentation girişlerinde aynı owner tarafından verilip verilmediğidir.
Atlas repository’de tea kaydı published=true, draft kaydı published=false olarak tanımlanır; absent key’i kayıt bulamaz. İlk sonuç view model’e dönüşür; diğer iki durum aynı 404 Not available response’una eşlenir. Bu status seçiminden hangi kaydın gerçekten var olduğu anlaşılamaz. Örnek bir kimlik doğrulama veya object authorization politikası değildir; public catalog availability rule’udur. Data access başarısı da kaydı sunma kararıyla aynı değildir.
Template data’yı bir interpreter context’ine yerleştirir
Template, uygulamanın seçtiği trusted çıktı yapısıdır; view model ise bu yapının tükettiği data’dır. Tea & Bread başlığını HTML text context’ine yerleştirdiğimizde üretilen body <h1>Tea & Bread</h1> olur. JSON representation içinde aynı başlık Tea & Bread string’i olarak kalabilir. Bir context’in encoding kararı diğerine körlemesine taşınmaz; HTML text, attribute, URL, JavaScript ve CSS farklı yorumlama kurallarına sahiptir.
Bu sabit benign başlık için ampersand dönüşümünü görmek tüm template engine’in güvenliğini kanıtlamaz. Üretimde engine’in auto-escaping kapsamını ve izin verilen output context’lerini bilmek gerekir. Template source ile variable değerini ayrı tutmak, çıktıda görülen string’in program olarak yeniden yorumlanmasını engelleyen tasarımın parçasıdır. Bu ders yalnız sabit HTML text slot’unu kullanır; dynamic template code veya başka executable context kurmaz.
Express res.render örneği template ile values’ın birleştirilmesini gösterir. Dokümandaki view engine cache underlying template’i tutar; her request’in hazır output’unu aynı body olarak döndürdüğü anlamına gelmez. Bizim küçük renderer da aynı sabit yapıya Tea & Bread veya Coffee data’sını koyduğunda farklı body üretir. Bu bir Express/Pug çalıştırması değildir. Service result’in hazır olması veya response.end çağrısı database transaction commit’i değildir; bu read-only örnekte persistence operation yoktur.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Draft rule
- Public catalog rule seçildi
Rule record exists AND published=true ister. Repository’nin record bulması, bu public presentation için tek başına availability kararı değildir.
- Catalog input/record
- Key=draft
- Service/render rule
- Service rule uygulanmadı
- Presentation boundary
- Renderer çağrılmadı
- Repository sonucu scope’uyla okundu
Draft row repositoryFound=true taşır. Bu store sonucu identity kabulü, publish yetkisi veya client’a teslim kararı olarak genişletilmez.
- Catalog input/record
- Repository found=true
- Service/render rule
- Published state okunmadı
- Presentation boundary
- Renderer çağrılmadı
- Published gate’i korunuyor
published=false olduğundan serviceOutcome=unavailable olur. HTML veya JSON adapter’ının repository record’unu bu rule dışında vermesi aynı contract’ı korumaz.
- Catalog input/record
- Record exists; unpublished
- Service/render rule
- Service unavailable
- Presentation boundary
- Renderer çağrılmadı
- Renderer dispatch durduruldu
rendererInvoked=false kalır. Mevcut draft için title view model’i hazırlanmış gibi davranılmaz; service sonucu presentation’ın girdisini sınırlar.
- Catalog input/record
- Record exists; unpublished
- Service/render rule
- Availability gate denied
- Presentation boundary
- No renderer dispatch
- HTTP mapping domain sonucundan ayrıldı
Status 404 ve body Not available bu ürünün unavailable mapping’idir. Bu status repository’de record yok sonucunu kanıtlamaz; absent row aynı response’u alır.
- Catalog input/record
- Known: draft exists
- Service/render rule
- Known: unavailable
- Presentation boundary
- Declared 404 Not available
- Presentation authority kendi owner’ında kaldı
Bu public rule identity policy değildir. Draft response’unun korunması bütün private access kontrollerinin doğrulandığı anlamına gelmez; bu örnekte write ve credential yoktur.
- Catalog input/record
- Public availability rule
- Service/render rule
- No publish bypass assumed
- Presentation boundary
- No broader authorization claim
HTML text
- Fixed template slot seçildi
Normal title Tea & Bread harmless veridir. Template’in sabit h1 text slot’u ile veri girdisi ayrı owner’larda tutulur.
- Catalog input/record
- Title: Tea & Bread
- Service/render rule
- HTML text slot
- Presentation boundary
- Output hazırlanmadı
- View model rule sonrasında alındı
Available normal row yalnız title view model’i taşır. Repository’nin bütün internal record’u template’e otomatik editable context olarak verilmez.
- Catalog input/record
- View model: title only
- Service/render rule
- Fixed HTML text slot
- Presentation boundary
- Output hazırlanmadı
- Text context encoding uygulandı
HTML body <h1>Tea & Bread</h1> olur. Ampersand data’sı HTML text context’inde temsil edilir; bu dönüşüm yeni template source üretmez.
- Catalog input/record
- Raw title unchanged
- Service/render rule
- Text encoder selected
- Presentation boundary
- Encoded h1 body
- Encoder farklı context’e taşınmadı
Bu HTML text encoder URL veya script context’i için evrensel kontrol değildir. Yeni context açılırsa uygun rule ve sink policy ayrıca seçilir.
- Catalog input/record
- Harmless title data
- Service/render rule
- HTML text scope only
- Presentation boundary
- No universal encoder claim
- Serialized body receipt sayılmadı
Prepared HTML body, client’ın response’u aldığı veya browser’ın parse ettiği an değildir. completion serviceResultIsClientArrival=false olarak kalır.
- Catalog input/record
- View model known
- Service/render rule
- HTML body prepared
- Presentation boundary
- Client arrival not proven
- Read-only output sınırı korundu
persistenceOperation=null ve commitProven=false’tur. Doğru text encoding, record mutation veya bütün template engine seçeneklerinin güvenliğini kanıtlamaz.
- Catalog input/record
- Known: selected text transformation
- Service/render rule
- Fixed data/source boundary
- Presentation boundary
- No commit or universal rendering claim
VARSAYIM · SINIR · KONTROL
Aynı rule’un farklı girişlerdeki ownership’i
İncelemenin ilk sorusu hangi controller’ın hangi service/domain sonucunu kullandığıdır. Public catalog’da HTML route published kararını service’den alırken JSON route yalnız repository kaydını serialize ederse aynı availability contract iki yerde farklı uygulanır. Bunun olası etkisi intended presentation sınırının bozulmasıdır; bir HTTP method veya framework adı bu farkı açıklamaz. Kontrol, ortak rule owner ve iki presentation’ın aynı domain sonucuna bağlı olduğunun gösterilmesidir.
draft için 404 görmek repository’nin boş olduğunu kanıtlamaz; service mevcut kaydı unavailable sayabilir. absent için de aynı response seçilmiştir. Bir dış gözlem bu iki iç nedeni ayıramıyorsa raporun bulgusu yalnız response contract’ıdır. Controller, service result ve repository observation birlikte görüldüğünde boundary daha netleşir. Bu örnekte saldırı veya yetki aşımı denenmez; izin verilmiş benign catalog state’leri okunur.
Output’u ve tamamlanmayı doğru yorumlamak
Tea & Bread’in encoded HTML body’si, seçilmiş text slot’u için doğru data transformation gösterir. Aynı dönüşümü bir URL veya script context’ine güvenlik kontrolü diye taşımak anlamı değiştirir. Sorun koşulu context ile encoder’ın uyuşmamasıdır; olası etki yanlış render veya data’nın beklenmeyen yorumlanmasıdır. Savunma context’i sabit tutmak, uygun engine/library kontrolü kullanmak ve raw-output tercihlerinin gerekçesini incelemektir.
Hazır view model, serialized body ve client tarafından alınan response ayrı aşamalardır. Bunlardan birinin başarılı olması persistence garantisi oluşturmaz. Bir write use case’i incelenirse commit sonucu, rollback sınırı ve response policy ayrıca gerekir; burada write yoktur. Renderer’ın iki başlıkta iki çıktı vermesi yalnız per-input transformation kanıtıdır; cache izolasyonu, browser parsing veya bütün template engine seçenekleri hakkında genelleme yapmayı haklı çıkarmaz.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
404 nedenleri
- Draft ve absent observation’ları seçildi
İki row da status=404 ve body Not available verir. İnceleme public response eşitliği ile internal availability nedenini ayrı tutar.
- Service/renderer observation
- Draft + absent rows
- Cause/input review
- Cause fields okunmadı
- Evidence conclusion
- External cause bilinmiyor
- Draft cause alanı okundu
Draft repositoryFound=true ve published=false’tur. Service unavailable sonucu known existing record’un public rule dışına çıkmasına dayanır.
- Service/renderer observation
- Draft exists; unpublished
- Cause/input review
- Draft: unavailable
- Evidence conclusion
- Response: 404 Not available
- Absent cause alanı okundu
Absent repositoryFound=false’tur. Aynı serviceOutcome için ikinci internal cause vardır; public body bunları dışarı ayırmak zorunda değildir.
- Service/renderer observation
- Absent record not found
- Cause/input review
- Absent: unavailable
- Evidence conclusion
- Response: 404 Not available
- Renderer withholding karşılaştırıldı
İki row’da rendererInvoked=false’tur. Gate sonucu ile renderer’a girilip girilmediği status’tan bağımsız karşılaştırılır.
- Service/renderer observation
- Two unavailable reasons
- Cause/input review
- No renderer in either row
- Evidence conclusion
- Public responses equal
- Yalnız external status ile neden verilmedi
Sadece 404 gözleyen bir consumer draft ile absent’ı bu contract’tan ayıramaz. İç ledger bu ayrımı sağlar; missing ledger’da cause UNKNOWN kalır.
- Service/renderer observation
- Public 404 observation only
- Cause/input review
- Internal fields required
- Evidence conclusion
- UNKNOWN from status alone
- Availability hükmü sınırlı kaldı
Sunulan ledger iki benign cause’u açıklar. 404’ten attack attribution, private authorization veya storage failure sonucu çıkarılmaz.
- Service/renderer observation
- Known: declared unavailable reasons
- Cause/input review
- Known: renderer withheld
- Evidence conclusion
- Other causes require separate evidence
Render input
- İki renderer sonucu seçildi
Normal title Tea & Bread ve secondRender title Coffee farklı veridir. sameTemplate=true aynı template’in farklı input almasını gösterir.
- Service/renderer observation
- Two title inputs
- Cause/input review
- Output okunmadı
- Evidence conclusion
- Browser evidence yok
- Normal HTML output okundu
Normal body <h1>Tea & Bread</h1> olarak verilmiştir. Bu çıktı fixed text slot encoding’ini gösterir, actual browser DOM’u değildir.
- Service/renderer observation
- Tea & Bread input
- Cause/input review
- Encoded Tea & Bread output
- Evidence conclusion
- Browser evidence yok
- Second output karşılaştırıldı
Coffee input’u <h1>Coffee</h1> body’si üretir; sameOutput=false’tur. Template cache’in varlığı bütün rendered body’lerin aynı olduğunu söylemez.
- Service/renderer observation
- Coffee input
- Cause/input review
- Same template; different output
- Evidence conclusion
- Browser evidence yok
- Transformation kanıtı context’te tutuldu
Bu iki body yalnız per-input transformation’ı açıklar. Cache izolasyonu, engine auto-escaping seçenekleri veya script/URL context’leri bu çıktıların scope’u dışındadır.
- Service/renderer observation
- Two fixed public inputs
- Cause/input review
- Selected HTML text context
- Evidence conclusion
- No universal engine claim
- Client knowledge evidence ayrıldı
Prepared string’den browser parse, DOM layout veya piksel görünümü türetilmez. Client receipt ve render observation’ları kendi kaynaklarından gerekir.
- Service/renderer observation
- Prepared body strings
- Cause/input review
- Known: transformation outputs
- Evidence conclusion
- UNKNOWN: client rendering
- Renderer hükmü genişletilmedi
sameTemplate=true ve sameOutput=false bu örnekte uyumludur. Database commit veya actual framework cache davranışı hakkında hüküm verilmez.
- Service/renderer observation
- Known: same template
- Cause/input review
- Known: different title outputs
- Evidence conclusion
- UNKNOWN: broader engine/runtime behavior
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Decision ledger’de sınırları ayrı kaydetmek
Artifact ledger tea için repositoryFound=true, published=true, serviceOutcome=available ve rendererInvoked=true tutar. draft için repositoryFound=true fakat serviceOutcome=unavailable ve rendererInvoked=false olur; absent kaydı bulunmaz. Bu alanlar uygulamanın gerçek log schema’sı değildir; dersin seçtiği observations’dır. Domain sonucundan status’a mapping’i bağımsız okumak hangi davranışın HTTP policy, hangisinin business rule olduğunu gösterir.
Kontrol eşitliği sadece status code karşılaştırması değildir. unavailable sonucu için renderer’a girilmediğini, available için yalnız title view model’inin kullanıldığını ve JSON/HTML adapter’larının aynı sonucu tükettiğini birlikte doğrula. Read-only repository çağrısı record’a eriştiğini anlatır; response hazırlanması client arrival’ını veya bir database commit’ini anlatmaz. Artifact bu son iki iddiayı ayrı ve olumsuz olarak işaretler.
Selector ve context kontrolünün sınırları
XPath count(/audit/decision[@outcome="unavailable" and @rendered="true"]) unavailable kararına rağmen renderer’a girilmiş authored observation’ları sayar. Normal fixture 0 verir; deliberately inconsistent positive fixture 1 verir. Normal draft’ın 404 olması beklenen benign sonuçtur. Event hiç yoksa count yine 0 olabilir; bu durumda rule uygulandı sonucu değil, insufficient evidence vardır. Selector yalnız bu kayıt sözleşmesini değerlendirir.
Encoding incelemesinde rawTitle ve htmlBody birlikte tutulur: Tea & Bread data’sı HTML text’te Tea & Bread olur. Başka context açılmadığı için bu kanıtın kapsamı dardır. Express view cache davranışı dokümana aittir; küçük renderer aynı function’ın farklı input’larda farklı body ürettiğini gösterir. Gerçek engine auto-escaping, framework middleware, browser DOM, database transaction ve production cache davranışı ayrıca kendi ortamında değerlendirilmelidir.
Business kararını adapter’dan bağımsız tut
Repository’nin bir kayıt bulması onu yayınlama izni değildir. Service, published koşulunu ve unavailable sonucunu açıkça hesaplar; JSON ve HTML adapter’ları bu ortak kararın çevresinden dolaşmaz. Renderer yalnız gereken title view model’ini alır, repository nesnesinin bütün alanlarını otomatik dışarı vermez. HTML text için uygun encoder veya engine’in doğrulanmış auto-escaping davranışı kullanılır; JSON serialization aynı HTML güvenlik kontrolü değildir.
tea için iki adapter’ın aynı available kararını tüketmesini, draft için renderer’ın çağrılmamasını doğrula. Tea & Bread başlığı HTML text’te Tea & Bread olarak taşınırken asıl title verisi değişmemelidir. Alanı ileride attribute veya başka bir context’e taşırsan aynı encoder’ı körlemesine kullanma. Service kararı ya da renderer çağrısı gözlenemiyorsa yalnız 404 veya düzgün görünen body üzerinden bu kontrolün uygulandığını söyleme.
ŞİMDİ VAKAYA UYGULA
Business rule ve text transformation hangi sonucu taşır?
Public catalog rule draft ile absent’ı unavailable sayar. Available title fixed text slot’a çevrilirken rendered string ve client receipt ayrı kalır.
Vakadaki input, server işleme ve response için karar sırasını çıkar. Parsed veya valid data ile completed operation aynı sonuç değildir; hangi owner’ın hangi koşulu değerlendirdiğini belirt.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Public note decision ve render ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"rule": {
"name": "public catalog availability",
"predicate": "record exists AND published=true",
"scope": "public read-only synthetic notes, no identity policy"
},
"normal": {
"key": "tea",
"repositoryFound": true,
"published": true,
"serviceOutcome": "available",
"rendererInvoked": true,
"viewModel": {
"title": "Tea & Bread"
},
"htmlBody": "<h1>Tea & Bread</h1>",
"status": 200
},
"draft": {
"key": "draft",
"repositoryFound": true,
"published": false,
"serviceOutcome": "unavailable",
"rendererInvoked": false,
"status": 404,
"body": "Not available"
},
"absent": {
"key": "absent",
"repositoryFound": false,
"serviceOutcome": "unavailable",
"rendererInvoked": false,
"status": 404,
"body": "Not available"
},
"secondRender": {
"title": "Coffee",
"htmlBody": "<h1>Coffee</h1>",
"sameTemplate": true,
"sameOutput": false
},
"completion": {
"persistenceOperation": null,
"commitProven": false,
"serviceResultIsClientArrival": false
},
"selector": {
"language": "XPath",
"xml": "<audit><decision outcome=\"unavailable\" rendered=\"false\"/></audit>",
"xpath": "count(/audit/decision[@outcome=\"unavailable\" and @rendered=\"true\"])",
"expected": 0,
"positiveFixtureXml": "<audit><decision outcome=\"unavailable\" rendered=\"true\"/></audit>",
"positiveExpected": 1,
"scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
"missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
}
}- serviceOutcome
- Repository result ile HTTP status arasındaki domain kararı.
- htmlBody
- Yalnız sabit HTML text context’inin encoded çıktısı.
- completion
- Result, arrival ve commit’i eşitlemeyen sınır.
Sabit benign notes, in-memory repository ve tiny renderer; Express/Pug, DB transaction veya browser DOM kaydı değildir.
İki yanlış kanı
Service layer her zaman uzak bir HTTP servistir.
Bu örnekte controller/service/repository/renderer aynı process’tedir; ayrı responsibility ayrı network hop gerektirmez.
Template cache varsa her request aynı hazır HTML’i alır.
Express view cache underlying template’i tutar; data ile üretilen output yeniden render edilir. Output cache ayrı bir karardır.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Repository draft row’u buldu, fakat published=false. Public service renderer’ı çağırır mı?
- Hayır. unavailable/404 ve rendererInvoked=false.
- Evet. Bulunan her row public template ile gösterilir.
Gerekçeli cevabı oku
Hayır. unavailable/404 ve rendererInvoked=false. — Kural hem kaydın var olmasını hem published olmasını ister. Bulunmuş draft, public kullanılabilirlik sağlamaz.
Tea & Bread neden HTML source içinde Tea & Bread olarak yazılır?
Dersten seçilen artifact alanları; öğretim örneği
- normal.viewModel
- {"title":"Tea & Bread"}
- normal.htmlBody
- <h1>Tea & Bread</h1>
- Template, başlığı başka bir business kaydına dönüştürür.
- Text-context encoding, ampersand karakterini koruyarak temsil eder.
Gerekçeli cevabı oku
Text-context encoding, ampersand karakterini koruyarak temsil eder. — ViewModel başlığı text olarak taşır. HTML source farklı byte’larla aynı görünür başlığı temsil eder.
Aynı template Coffee için farklı output üretiyor. Repository, service, template ve client arrival rollerini açıkla.
Gerekçeli cevabı oku
Repository kaydı getirir; service published koşulunu denetler ve viewModel’i oluşturur. Template bu veriden doğru HTML context’ine uygun output üretir. Farklı input farklı output verebilir. Service sonucunun oluşması client arrival değildir. Bu read-only örnekte persistenceOperation=null ve commitProven=false kalır.
□ Data access, business kuralı ve sunum rollerini ayırdım.
□ Template sonucunu delivery veya commit kanıtı saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- Microsoft Learn — Designing a DDD-oriented microserviceLayers in DDD microservices · The domain model layer · The application layer · The infrastructure layer
- Express — Using template enginesUsing template engines with Express · res.render and __express convention · View engine cache paragraph
- OWASP — Cross Site Scripting Prevention Cheat SheetOutput Encoding · Output Encoding for HTML Contexts · Output Encoding for HTML Attribute Contexts
- Node.js v24.13.0 — HTTP APIhttp.createServer([options][, requestListener]) · response.end([data[, encoding]][, callback]) · response.writableEnded · response.writableFinished
- RFC 9110 — HTTP Semantics3.1 Resources · 3.2 Representations · 8.3 Content-Type · 8.6 Content-Length · 9.2.1 Safe Methods · 9.2.2 Idempotent Methods · 9.3.1 GET · 9.3.2 HEAD · 12.5.1 Accept · 15.5.5 404 Not Found · 15.5.6 405 Method Not Allowed · 15.5.7 406 Not Acceptable