-- 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
    inbox               InboxId
    outbox              OutboxId
    followers           FollowerSetId

    UniquePersonIdent ident
    UniquePersonLogin login
    UniquePersonEmail email
    UniquePersonInbox inbox
    UniquePersonOutbox outbox
    UniquePersonFollowers followers

Outbox

OutboxItem
    outbox    OutboxId
    activity  PersistJSONObject
    published UTCTime

Inbox

InboxItem
    unread Bool

InboxItemLocal
    inbox    InboxId
    activity OutboxItemId
    item     InboxItemId

    UniqueInboxItemLocal inbox activity
    UniqueInboxItemLocalItem item

RemoteActivity
    instance InstanceId
    ident    LocalURI
    content  PersistJSONObject
    received UTCTime

    UniqueRemoteActivity instance ident

InboxItemRemote
    inbox    InboxId
    activity RemoteActivityId
    item     InboxItemId

    UniqueInboxItemRemote inbox activity
    UniqueInboxItemRemoteItem item

UnlinkedDelivery
    recipient  UnfetchedRemoteActorId
    activity   OutboxItemId
    forwarding Bool
    running    Bool

    UniqueUnlinkedDelivery recipient activity

Delivery
    recipient  RemoteActorId
    activity   OutboxItemId
    forwarding Bool
    running    Bool

    UniqueDelivery recipient activity

Forwarding
    recipient   RemoteActorId
    activity    RemoteActivityId
    activityRaw ByteString
    sender      ProjectId
    signature   ByteString
    running     Bool

    UniqueForwarding recipient activity

VerifKey
    ident    LocalRefURI
    instance InstanceId
    expires  UTCTime Maybe
    public   PublicVerifKey
    sharer   RemoteActorId Maybe

    UniqueVerifKey instance ident

VerifKeySharedUsage
    key  VerifKeyId
    user RemoteActorId

    UniqueVerifKeySharedUsage key user

UnfetchedRemoteActor
    instance InstanceId
    ident    LocalURI
    since    UTCTime Maybe

    UniqueUnfetchedRemoteActor instance ident

RemoteActor
    ident      LocalURI
    instance   InstanceId
    name       Text Maybe
    inbox      LocalURI
    errorSince UTCTime Maybe

    UniqueRemoteActor instance ident

Instance
    host Host

    UniqueInstance host

RemoteCollection
    instance   InstanceId
    ident      LocalURI

    UniqueRemoteCollection instance ident

FollowRemoteRequest
    person   PersonId
    target   FedURI
    recip    FedURI Maybe
    public   Bool
    activity OutboxItemId

    UniqueFollowRemoteRequest person target
    UniqueFollowRemoteRequestActivity activity

FollowRemote
    person PersonId
    recip  RemoteActorId -- actor managing the followed object
    target FedURI        -- the followed object
    public Bool
    follow OutboxItemId
    accept RemoteActivityId

    UniqueFollowRemote person target
    UniqueFollowRemoteFollow follow
    UniqueFollowRemoteAccept accept

FollowerSet

Follow
    person PersonId
    target FollowerSetId
    manual Bool
    public Bool
    follow OutboxItemId
    accept OutboxItemId

    UniqueFollow person target
    UniqueFollowFollow follow
    UniqueFollowAccept accept

RemoteFollow
    actor  RemoteActorId
    target FollowerSetId
    manual Bool
    public Bool
    follow RemoteActivityId
    accept OutboxItemId

    UniqueRemoteFollow actor target
    UniqueRemoteFollowFollow follow
    UniqueRemoteFollowAccept accept

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

Role
    ident  RlIdent
    sharer SharerId
    desc   Text

    UniqueRole sharer ident

RoleInherit
    parent RoleId
    child  RoleId

    UniqueRoleInherit parent child

RoleAccess
    role RoleId
    op   ProjectOperation

    UniqueRoleAccess role op

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

Project
    ident      PrjIdent
    sharer     SharerId
    name       Text          Maybe
    desc       Text          Maybe
    workflow   WorkflowId
    nextTicket Int
    wiki       RepoId        Maybe
    collabUser RoleId        Maybe
    collabAnon RoleId        Maybe
    inbox      InboxId
    outbox     OutboxId
    followers  FollowerSetId

    UniqueProject ident sharer
    UniqueProjectInbox inbox
    UniqueProjectOutbox outbox
    UniqueProjectFollowers followers

Repo
    ident      RpIdent
    sharer     SharerId
    vcs        VersionControlSystem
    project    ProjectId            Maybe
    desc       Text                 Maybe
    mainBranch Text
    collabUser RoleId               Maybe
    collabAnon RoleId               Maybe
    inbox      InboxId
    outbox     OutboxId
    followers  FollowerSetId

    UniqueRepo ident sharer
    UniqueRepoInbox inbox
    UniqueRepoOutbox outbox
    UniqueRepoFollowers followers

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
    title       Text                -- HTML
    source      Text                -- Pandoc Markdown
    description Text                -- HTML
    assignee    PersonId      Maybe
    status      TicketStatus
    closed      UTCTime
    closer      PersonId      Maybe
    discuss     DiscussionId
    followers   FollowerSetId
    accept      OutboxItemId

    UniqueTicket project number
    UniqueTicketDiscussion discuss
    UniqueTicketFollowers followers
    UniqueTicketAccept accept

TicketAuthorLocal
    ticket TicketId
    author PersonId
    offer  OutboxItemId

    UniqueTicketAuthorLocal ticket
    UniqueTicketAuthorLocalOffer offer

TicketAuthorRemote
    ticket TicketId
    author RemoteActorId
    offer  RemoteActivityId

    UniqueTicketAuthorRemote ticket
    UniqueTicketAuthorRemoteOffer offer

TicketDependency
    parent  TicketId
    child   TicketId
    author  PersonId
    summary Text -- HTML
    created UTCTime

    UniqueTicketDependency parent child

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

    UniqueTicketClaimRequest person ticket

Discussion

RemoteDiscussion
    instance InstanceId
    ident    LocalURI
    discuss  DiscussionId

    UniqueRemoteDiscussionIdent instance ident
    UniqueRemoteDiscussion discuss

Message
    created UTCTime
    source  Text               -- Pandoc Markdown
    content Text               -- HTML
    parent  MessageId    Maybe
    root    DiscussionId

LocalMessage
    author         PersonId
    rest           MessageId
    create         OutboxItemId
    unlinkedParent FedURI    Maybe

    UniqueLocalMessage rest
    UniqueLocalMessageCreate create

RemoteMessage
    author     RemoteActorId
    instance   InstanceId
    ident      LocalURI
    rest       MessageId
    create     RemoteActivityId
    lostParent FedURI            Maybe

    UniqueRemoteMessageIdent instance ident
    UniqueRemoteMessage rest
    UniqueRemoteMessageCreate create

RepoCollab
    repo   RepoId
    person PersonId
    role   RoleId   Maybe

    UniqueRepoCollab repo person

ProjectCollab
    project ProjectId
    person  PersonId
    role    RoleId    Maybe

    UniqueProjectCollab project person