---
# System prepended metadata

title: LH DDD

---

# LH DDD

```plantuml
!include <kubernetes/k8s-sprites-unlabeled-25pct>
package "Delivery Infrastructure - Kubernetes Cluster" {
  component "<$crd>\nAPISpec" as apispeccrd
  component "<$crd>\nAPIProxyPolicy" as policycrd
  component "<$crd>\nAPIProxy" as apiproxycrd
  component "<$crd>\nAPICatalogEntry" as apicatalogentrycrd
  component "<$pod>\nApigeeOperator" as operator
}

package "Apigee" {
    component APISpec
    component APIProxy
    package "portal" {
        component APICatalog
    }
}

apiproxycrd --> policycrd
apicatalogentrycrd --> apispeccrd
operator --> apiproxycrd
operator --> apispeccrd
operator --> apicatalogentrycrd

operator --> APISpec
operator --> APIProxy
operator --> APICatalog

actor Developer as dev
dev --> apiproxycrd
dev --> apispeccrd
dev --> apicatalogentrycrd

actor LighthouseDeveloper as lhdi
lhdi --> policycrd
```

```plantuml
storage Platform {
  object Container
  object "Kubernetes" as k8s
  object "Operator" as ao
  object "GitHub Repo" as repo
  object webhook
  rectangle publishAPI #lightblue {
  
  }
  
  k8s .. ao
  k8s .. Container
  repo .. webhook 
}

storage Apigee {
  object Proxy
  object APISpec
  object APICatalog
  object APICatalogEntry
  object portal
  
  portal .. APICatalog
  APICatalog .. APICatalogEntry
}

queue "Messaging Mechanism" as mm {

}

rectangle "APIPublished" as publishedout {
}

rectangle "APIPublished" as publishedin {
}



storage Backstage {
  object Techdocs
  object "Gateway Manager" as ApigeePlugin
}

webhook --> publishAPI
publishAPI --> publishedout
publishedout --> mm
mm --> publishedin
publishedin --> ao
```



```
The developer publishes an API to the public gateway 
  Given an API that is ready for publishing
  And a catalog entry definition for the API
  And a spec definition ffor the API
  And a proxy policy definition for the API
  When the developer publishes the API to the public gateway
  Then a proxy is created 
  And a spec is created
  And a catalog entry is created
```

- Mixing a bunch of stuff together. Usually you wouldn't mix the domain / aggregate diagrams with the command / domain events
- There's also a bunch of stuff here that doesn't have the right abstraction level. This also assumes that we'll use an event based architecture (messaging mechanism).
- Ultimately the code is the only artifact of the domain model which is why you want to use something like BDD or Cucumber that ties requirements to tests 
---
![](https://i.imgur.com/XDtEm6P.png)
- We're may not be building this so it might be confusing to try to map it to what we're doing
- The important concept here is that the domain model is distinct and verifiable on its own. It contains business logic. 
  - Right now it's not clear to me what the implementation looks like- is the domain model a set of microservices + the output adapter?
  - maybe a lot of the stuff I have listed as aggregates are actually application services so they exist outside of the domain model. "Kubernetes" is not really a semantic abstraction