-- This file is part of Vervis.
--
-- Written in 2016, 2018, 2019 by fr33domlover <fr33domlover@riseup.net>.
--
-- ♡ Copying is an act of love. Please copy, reuse and share.
--
-- The author(s) have dedicated all copyright and related and neighboring
-- rights to this software to the public domain worldwide. This software is
-- distributed without any warranty.
--
-- You should have received a copy of the CC0 Public Domain Dedication along
-- with this software. If not, see
-- <http://creativecommons.org/publicdomain/zero/1.0/>.

-------------------------------------------------------------------------------
-- People
-------------------------------------------------------------------------------

Sharer
    ident   ShrIdent
    name    Text     Maybe
    created UTCTime

    UniqueSharer ident

Person
    ident               SharerId
    login               Text
    passphraseHash      ByteString
    email               EmailAddress
    verified            Bool
    verifiedKey         Text
    verifiedKeyCreated  UTCTime
    resetPassKey        Text
    resetPassKeyCreated UTCTime
    about               Text

    UniquePersonIdent ident
    UniquePersonLogin login
    UniquePersonEmail email

VerifKey
    ident    FedURI
    instance InstanceId
    expires  UTCTime Maybe
    public   PublicKey
    sharer   RemoteSharerId Maybe

    UniqueVerifKey ident

RemoteSharer
    ident    FedURI
    instance InstanceId
    inbox    FedURI

    UniqueRemoteSharer ident

Instance
    host Text

    UniqueInstance host

SshKey
    ident   KyIdent
    person  PersonId
    algo    ByteString
    content ByteString

    UniqueSshKey person ident

Group
    ident SharerId

    UniqueGroup ident

GroupMember
    person PersonId
    group  GroupId
    role   GroupRole
    joined UTCTime

    UniqueGroupMember person group

ProjectRole
    ident  RlIdent
    sharer SharerId
    desc   Text

    UniqueProjectRole sharer ident

ProjectRoleInherit
    parent ProjectRoleId
    child  ProjectRoleId

    UniqueProjectRoleInherit parent child

ProjectAccess
    role ProjectRoleId
    op   ProjectOperation

    UniqueProjectAccess role op

-------------------------------------------------------------------------------
-- Projects
-------------------------------------------------------------------------------

Project
    ident      PrjIdent
    sharer     SharerId
    name       Text          Maybe
    desc       Text          Maybe
    workflow   WorkflowId
    nextTicket Int
    wiki       RepoId        Maybe
    collabUser ProjectRoleId Maybe
    collabAnon ProjectRoleId Maybe

    UniqueProject ident sharer

Repo
    ident      RpIdent
    sharer     SharerId
    vcs        VersionControlSystem
    project    ProjectId            Maybe
    desc       Text                 Maybe
    mainBranch Text
    collabUser ProjectRoleId        Maybe
    collabAnon ProjectRoleId        Maybe

    UniqueRepo ident sharer

Workflow
    sharer SharerId
    ident  WflIdent
    name   Text          Maybe
    desc   Text          Maybe
    scope  WorkflowScope

    UniqueWorkflow sharer ident

WorkflowField
    workflow     WorkflowId
    ident        FldIdent
    name         Text
    desc         Text                Maybe
    type         WorkflowFieldType
    enm          WorkflowFieldEnumId Maybe
    required     Bool
    constant     Bool
    filterNew    Bool
    filterTodo   Bool
    filterClosed Bool

    UniqueWorkflowField workflow ident

WorkflowFieldEnum
    workflow WorkflowId
    ident    EnmIdent
    name     Text
    desc     Text       Maybe

    UniqueWorkflowFieldEnum workflow ident

WorkflowFieldEnumCtor
    enum WorkflowFieldEnumId
    name Text
    desc Text                Maybe

    UniqueWorkflowFieldEnumCtor enum name

TicketParamText
    ticket TicketId
    field  WorkflowFieldId
    value  Text

    UniqueTicketParamText ticket field

TicketParamEnum
    ticket TicketId
    field  WorkflowFieldId
    value  WorkflowFieldEnumCtorId

    UniqueTicketParamEnum ticket field value

Ticket
    project  ProjectId
    number   Int
    created  UTCTime
    creator  PersonId
    title    Text
    desc     Text -- Assume this is Pandoc Markdown
    assignee PersonId     Maybe
    status   TicketStatus
    closed   UTCTime
    closer   PersonId
    discuss  DiscussionId

    UniqueTicket project number

TicketDependency
    parent TicketId
    child  TicketId

    UniqueTicketDependency parent child

TicketClaimRequest
    person  PersonId
    ticket  TicketId
    message Text     -- Assume this is Pandoc Markdown
    created UTCTime

    UniqueTicketClaimRequest person ticket

Discussion
    nextMessage Int

Message
    author  PersonId
    created UTCTime
    content Text               -- Assume this is Pandoc Markdown
    parent  MessageId    Maybe
    root    DiscussionId
    number  Int

    UniqueMessage root number

RepoCollab
    repo   RepoId
    person PersonId
    role   ProjectRoleId Maybe

    UniqueRepoCollab repo person

ProjectCollab
    project ProjectId
    person  PersonId
    role    ProjectRoleId Maybe

    UniqueProjectCollab project person