@startuml space_templates

' This is a PlantUML class diagram.
' To generate a PNG diagram from this file follow these steps:
' $ wget -o plantuml.jar http://sourceforge.net/projects/plantuml/files/plantuml.jar/download
' $ java -jar plantuml.jar -verbose space_templates.puml

' 
hide empty members

package space_template <<Folder>> {
  class SpaceTemplate {
    +uuid.UUID ID
	+int Version
	+string Name
	+string Description

    +Validate() error
    +GetETagData() []interface{}
    +GetLastModified() time.Time
    +TableName() string
    +Equal(u convert.Equaler) bool
  }
  note right: This is what gets stored in the DB.\nYou can create, load, and list objects\n of this kind as usual.

  class ImportHelper<embeds SpaceTemplate> {
    []*workitem.WorkItemType WITs
    []*link.WorkItemLinkType WILTs
    []*workitem.WorkItemTypeGroup WITGs
    +Validate() error 
    +SetID(id uuid.UUID)
    +String() string
    +Equal(u convert.Equaler) bool
  }
  note top: The import helper holds all information from\nthe YAML space template definition we don't\nstore an import helper in the database. It is just\nan intermediate construct that isn't exposed.

  ImportHelper *-up- SpaceTemplate
}

package workitem <<Folder>> {
    class WorkItemType
    WorkItemType "n" o-- "1" SpaceTemplate

    class WorkItemTypeGroup {
        +uuid.UUID ID
        +uuid.UUID SpaceTemplateID
        +bucket TypeBucket
        +string Name
        +string Icon
        +int[] Position
        +uuid.UUID[] TypeList

        +TableName() string
        +Equal(u convert.Equaler) bool
        +GetETagData() []interface{}
        +GetLastModified() time.Time
    }
    WorkItemTypeGroup "n" o-- "1" SpaceTemplate
    class typeGroupMember {
        +uuid.UUID ID
        +uuid.UUID TypeGroupID
        +uuid.UUID WorkItemTypeID
        +int Position

        +TableName() string
    }
    note bottom: not exposed through API\nonly used to model DB storage
    WorkItemTypeGroup "1" - "n" WorkItemType
    (WorkItemTypeGroup, WorkItemType) .. typeGroupMember
    
    class Bucket <<stereotype>>
    note bottom: Allowed values are:\n"portfolio",\n"requirement", and\n"iteration"

    WorkItemTypeGroup o-- Bucket

    package workitem.link <<Folder>> {
        class WorkItemLinkType
        WorkItemLinkType "n" o-- "1" SpaceTemplate
        class WorkItemLinkCategory
        WorkItemLinkType o-- WorkItemLinkCategory
    }
}

package space <<Folder>> {
    class Space {
        +uuid.UUID SpaceTemplateID
    }
    Space "n" o-- "1" SpaceTemplate
}

'package convert <<Folder>> {
'    interface Equaler
'}
'SpaceTemplate -left-|> Equaler
'ImportHelper -left-|> Equaler

' Import helper embeds a space template



ImportHelper o--"n" WorkItemType
ImportHelper o--"n" WorkItemLinkType
ImportHelper o--"n" WorkItemTypeGroup

@enduml