@startuml
class Platform {
  + String platformKey
  + String name
  + String groupId
  + String artifactId
  + Map<String,Object> metadata
  + boolean isDefault
}

enum Platform$Type {
  + C
  + M
}

class PlatformStream {
  + String streamKey
  - String streamKeySortable
  + String name
  + boolean unlisted
  + boolean pinned
  + Map<String,Object> metadata
}

class PlatformRelease {
  + String version
  - String versionSortable
  + String quarkusCoreVersion
  + boolean pinned
  + boolean unlisted
  + String upstreamQuarkusCoreVersion
  + String bom
  + List<String> memberBoms
  + Map<String,Object> metadata
}

class PlatformExtension {
  + Map<String,Object> metadata
}

class PlatformReleaseCategory {
  + Map<String,Object> metadata
}

class Extension {
  + String groupId
  + String artifactId
  + String name
  + String description
}

class ExtensionRelease {
  + String version
  - String versionSortable
  - String quarkusCoreVersionSortable
  + Map<String,Object> metadata
  + String quarkusCore
}

class Category {
  + String categoryKey
  + String name
  + String description
  + Map<String,Object> metadata
}

class ExtensionReleaseCompatibility {
  + String quarkusCoreVersion
  + boolean compatible
}

note left of PlatformRelease::memberBoms
  Stored as a JSON array
end note

note right of Platform$Type
  C = Core
  M = Member
end note

Category o-- PlatformReleaseCategory

Platform                -   Platform$Type
Platform                *-- PlatformStream
PlatformStream          *-- PlatformRelease
PlatformRelease         *-- PlatformExtension
PlatformRelease         *-- PlatformReleaseCategory

Extension        *-- ExtensionRelease
ExtensionRelease o-- PlatformExtension
ExtensionRelease <-- ExtensionReleaseCompatibility
@enduml
