Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Published note

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. Text render

    Sabit h1 HTML text slot’u, title=Tea & Bread verisini <h1>Tea &amp; 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 &amp; Bread</h1> hazır
  7. 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 &amp; Bread</h1> hazır
  8. Response ulaştı

    Client 200 response ve <h1>Tea &amp; 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 &amp; Bread</h1> hazır

Draft note

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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 &amp; 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

  1. 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ı
  2. 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ı
  3. 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ı
  4. 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
  5. 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
  6. 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

  1. 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ı
  2. 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ı
  3. Text context encoding uygulandı

    HTML body <h1>Tea &amp; 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. Normal HTML output okundu

    Normal body <h1>Tea &amp; 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 &amp; Bread output
    Evidence conclusion
    Browser evidence yok
  3. 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
  4. 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
  5. 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
  6. 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 &amp; 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 &amp; 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 &amp; 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ı?

  1. Hayır. unavailable/404 ve rendererInvoked=false.
  2. 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 &amp; Bread olarak yazılır?

Dersten seçilen artifact alanları; öğretim örneği

normal.viewModel
{"title":"Tea & Bread"}
normal.htmlBody
<h1>Tea &amp; Bread</h1>
  1. Template, başlığı başka bir business kaydına dönüştürür.
  2. 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