Eventually-decentralized project hosting and management platform

[[ 🗃 ^WvWbo vervis ]] :: [📥 Inbox] [📤 Outbox] [🐤 Followers] [🤝 Collaborators] [🛠 Changes]

Clone

HTTPS: darcs clone https://vervis.peers.community/repos/WvWbo

SSH: darcs clone USERNAME@vervis.peers.community:WvWbo

Tags

TODO

th /

models

-- This file is part of Vervis.
--
-- Written in 2016, 2018, 2019, 2020, 2022
-- 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/>.

-- ========================================================================= --
-- Remote Object
-- ========================================================================= --

Instance
    host Host

    UniqueInstance host

RemoteObject
    instance  InstanceId
    ident     LocalURI
    -- fetched   UTCTime  Maybe

    -- type      Text     Maybe
    -- followers LocalURI Maybe
    -- team      LocalURI Maybe

    UniqueRemoteObject instance ident

RemoteActivity
    ident    RemoteObjectId
    content  PersistJSONObject
    received UTCTime

    UniqueRemoteActivity ident

UnfetchedRemoteActor
    ident RemoteObjectId
    since UTCTime Maybe

    UniqueUnfetchedRemoteActor ident

RemoteActor
    ident      RemoteObjectId
    name       Text Maybe
    inbox      LocalURI
    followers  LocalURI       Maybe
    errorSince UTCTime        Maybe

    UniqueRemoteActor ident

RemoteCollection
    ident RemoteObjectId

    UniqueRemoteCollection ident

-- ========================================================================= --
-- Local Actor
-- ========================================================================= --

-------------------------------------------------------------------------------
-- Outbox
-------------------------------------------------------------------------------

Outbox

OutboxItem
    outbox    OutboxId
    activity  PersistJSONObject
    published UTCTime

-------------------------------------------------------------------------------
-- Inbox
-------------------------------------------------------------------------------

Inbox

InboxItem
    unread   Bool
    received UTCTime

InboxItemLocal
    inbox    InboxId
    activity OutboxItemId
    item     InboxItemId

    UniqueInboxItemLocal     inbox activity
    UniqueInboxItemLocalItem item

InboxItemRemote
    inbox    InboxId
    activity RemoteActivityId
    item     InboxItemId

    UniqueInboxItemRemote     inbox activity
    UniqueInboxItemRemoteItem item

-------------------------------------------------------------------------------
-- Followers
-------------------------------------------------------------------------------

FollowerSet

-------------------------------------------------------------------------------
-- Actors
-------------------------------------------------------------------------------

Actor
    name      Text
    desc      Text
    createdAt UTCTime
    inbox     InboxId
    outbox    OutboxId
    followers FollowerSetId

    UniqueActorInbox     inbox
    UniqueActorOutbox    outbox
    UniqueActorFollowers followers

SigKey
    actor    ActorId
    material ActorKey

    UniqueSigKey actor

Person
    username            Username
    login               Text
    passphraseHash      ByteString
    email               EmailAddress
    verified            Bool
    verifiedKey         Text
    verifiedKeyCreated  UTCTime
    resetPassKey        Text
    resetPassKeyCreated UTCTime
    actor               ActorId
--  reviewFollow        Bool

    UniquePersonUsername username
    UniquePersonLogin    login
    UniquePersonEmail    email
    UniquePersonActor    actor

-- ========================================================================= --
-- Delivery
-- ========================================================================= --

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
    signature   ByteString
    forwarder   ActorId
    running     Bool

    UniqueForwarding recipient activity

-- ========================================================================= --
-- ========================================================================= --

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

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

    UniqueVerifKey instance ident

VerifKeySharedUsage
    key  VerifKeyId
    user RemoteActorId

    UniqueVerifKeySharedUsage key user

--RemoteFollowRequest
--    actor  RemoteActorId
--    target PersonId
--
--    UniqueRemoteFollowRequest actor target
--

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

    UniqueFollowRemoteRequest person target
    UniqueFollowRemoteRequestActivity activity

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

    UniqueFollowRemote       actor target
    UniqueFollowRemoteFollow follow
    UniqueFollowRemoteAccept accept

--FollowRequest
--    person PersonId
--    target FollowerSetId
--
--    UniqueFollowRequest person target

Follow
    actor  ActorId
    target FollowerSetId
    public Bool
    follow OutboxItemId
    accept OutboxItemId

    UniqueFollow       actor target
    UniqueFollowFollow follow
    UniqueFollowAccept accept

RemoteFollow
    actor  RemoteActorId
    target FollowerSetId
    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
    actor ActorId

    UniqueGroupActor actor

GroupMember
    person PersonId
    group  GroupId
    role   GroupRole
    joined UTCTime

    UniqueGroupMember person group

-- I'm removing the 'sharer' field, so all roles are now public for everyone to
-- use! This is temporary, until I figure out a sane plan for federated roles
Role
    ident  RlIdent
    desc   Text

RoleInherit
    parent RoleId
    child  RoleId

    UniqueRoleInherit parent child

RoleAccess
    role RoleId
    op   ProjectOperation

    UniqueRoleAccess role op

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

Deck
    actor      ActorId
    workflow   WorkflowId
    nextTicket Int
    wiki       RepoId        Maybe
    collabUser RoleId        Maybe
    collabAnon RoleId        Maybe
    create     OutboxItemId

    UniqueDeckActor  actor
    UniqueDeckCreate create

Loom
    nextTicket Int
    actor      ActorId
    repo       RepoId
    create     OutboxItemId

    UniqueLoomActor  actor
    UniqueLoomRepo   repo
    UniqueLoomCreate create

Repo
    vcs        VersionControlSystem
    project    DeckId               Maybe
    mainBranch Text
    collabUser RoleId               Maybe
    collabAnon RoleId               Maybe
    actor      ActorId
    create     OutboxItemId
    loom       LoomId               Maybe

    UniqueRepoActor  actor
    UniqueRepoCreate create

-- I removed the 'sharer' field so Workflows don't specify who controls them
-- For now there's no way to create new ones, and what's already in the DB can
-- be publicly experimented with, until I make a plan for federated workflows
Workflow
    ident  WflIdent
    name   Text          Maybe
    desc   Text          Maybe
    scope  WorkflowScope

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

    UniqueWorkflowField workflow ident

WorkflowEnum
    workflow WorkflowId
    ident    EnmIdent
    name     Text
    desc     Text       Maybe

    UniqueWorkflowEnum workflow ident

WorkflowEnumCtor
    enum WorkflowEnumId
    name Text
    desc Text           Maybe

    UniqueWorkflowEnumCtor enum name

TicketParamText
    ticket TicketId
    field  WorkflowFieldId
    value  Text

    UniqueTicketParamText ticket field

TicketParamEnum
    ticket TicketId
    field  WorkflowFieldId
    value  WorkflowEnumCtorId

    UniqueTicketParamEnum ticket field value

TicketParamClass
    ticket TicketId
    field  WorkflowFieldId

    UniqueTicketParamClass ticket field

Ticket
    number      Int           Maybe
    created     UTCTime
    title       Text
    source      PandocMarkdown
    description HTML
    discuss     DiscussionId
    followers   FollowerSetId
    accept      OutboxItemId

    -- UniqueTicket project number
    UniqueTicketDiscuss   discuss
    UniqueTicketFollowers followers
    UniqueTicketAccept    accept

TicketAssignee
    ticket TicketId
    person PersonId

    UniqueTicketAssignee ticket person

TicketDeck
    ticket TicketId
    deck   DeckId

    UniqueTicketDeck ticket

TicketLoom
    ticket TicketId
    loom   LoomId
    branch Text     Maybe

    UniqueTicketLoom ticket

MergeOriginLocal
    ticket TicketLoomId
    repo   RepoId
    branch Text Maybe

    UniqueMergeOriginLocal ticket

MergeOriginRemote
    ticket TicketLoomId
    repo   RemoteActorId

    UniqueMergeOriginRemote ticket

MergeOriginRemoteBranch
    merge MergeOriginRemoteId
    ident LocalURI Maybe
    name  Text

    UniqueMergeOriginRemoteBranch merge

TicketAuthorLocal
    ticket TicketId
    author PersonId
    open   OutboxItemId

    UniqueTicketAuthorLocal     ticket
    UniqueTicketAuthorLocalOpen open

TicketAuthorRemote
    ticket TicketId
    author RemoteActorId
    open   RemoteActivityId

    UniqueTicketAuthorRemote     ticket
    UniqueTicketAuthorRemoteOpen open

Bundle
    ticket TicketLoomId
    auto   Bool

Patch
    bundle  BundleId
    created UTCTime
    type    PatchMediaType
    content Text

RemoteTicketDependency
    ident  RemoteObjectId
    child  TicketId
    accept RemoteActivityId

    UniqueRemoteTicketDependency       ident
    UniqueRemoteTicketDependencyAccept accept

LocalTicketDependency
    parent  TicketId
    created UTCTime
    accept  OutboxItemId

    UniqueLocalTicketDependencyAccept accept

TicketDependencyChildLocal
    dep   LocalTicketDependencyId
    child TicketId

    UniqueTicketDependencyChildLocal dep

TicketDependencyChildRemote
    dep   LocalTicketDependencyId
    child RemoteObjectId

    UniqueTicketDependencyChildRemote dep

TicketDependencyAuthorLocal
    dep    LocalTicketDependencyId
    author PersonId
    open   OutboxItemId

    UniqueTicketDependencyAuthorLocal     dep
    UniqueTicketDependencyAuthorLocalOpen open

TicketDependencyAuthorRemote
    dep    LocalTicketDependencyId
    author RemoteActorId
    open   RemoteActivityId

    UniqueTicketDependencyAuthorRemote     dep
    UniqueTicketDependencyAuthorRemoteOpen open

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

    UniqueTicketClaimRequest person ticket

TicketResolve
    ticket TicketId
    accept OutboxItemId

    UniqueTicketResolve ticket
    UniqueTicketResolveAccept accept

TicketResolveLocal
    ticket   TicketResolveId
    activity OutboxItemId

    UniqueTicketResolveLocal ticket
    UniqueTicketResolveLocalActivity activity

TicketResolveRemote
    ticket   TicketResolveId
    activity RemoteActivityId
    actor    RemoteActorId

    UniqueTicketResolveRemote ticket
    UniqueTicketResolveRemoteActivity activity

Discussion

RemoteDiscussion
    ident   RemoteObjectId
    discuss DiscussionId

    UniqueRemoteDiscussionIdent ident
    UniqueRemoteDiscussion      discuss

Message
    created UTCTime
    source  PandocMarkdown
    content HTML
    parent  MessageId    Maybe
    root    DiscussionId

LocalMessage
    author         ActorId
    rest           MessageId
    create         OutboxItemId
    unlinkedParent FedURI    Maybe

    UniqueLocalMessage rest
    UniqueLocalMessageCreate create

RemoteMessage
    author     RemoteActorId
    ident      RemoteObjectId
    rest       MessageId
    create     RemoteActivityId
    lostParent FedURI            Maybe

    UniqueRemoteMessageIdent  ident
    UniqueRemoteMessage       rest
    UniqueRemoteMessageCreate create


------------------------------------------------------------------------------
-- Collaborators
------------------------------------------------------------------------------

Collab

-------------------------------- Collab reason -------------------------------

CollabFulfillsLocalTopicCreation
    collab CollabId

    UniqueCollabFulfillsLocalTopicCreation collab

CollabFulfillsInvite
    collab CollabId

    UniqueCollabFulfillsInvite collab

CollabInviterLocal
    collab CollabFulfillsInviteId
    invite OutboxItemId

    UniqueCollabInviterLocal       collab
    UniqueCollabInviterLocalInvite invite

CollabInviterRemote
    collab CollabFulfillsInviteId
    actor  RemoteActorId
    invite RemoteActivityId

    UniqueCollabInviterRemote       collab
    UniqueCollabInviterRemoteInvite invite

CollabFulfillsJoin
    collab CollabId

    UniqueCollabFulfillsJoin collab

CollabApproverLocal
    collab CollabFulfillsJoinId
    accept OutboxItemId

    UniqueCollabApproverLocal       collab
    UniqueCollabApproverLocalAccept accept

CollabApproverRemote
    collab CollabFulfillsJoinId
    actor  RemoteActorId
    accept RemoteActivityId

    UniqueCollabApproverRemote       collab
    UniqueCollabApproverRemoteAccept accept

CollabRecipLocalJoin
    collab   CollabRecipLocalId
    fulfills CollabFulfillsJoinId
    join     OutboxItemId

    UniqueCollabRecipLocalJoinCollab   collab
    UniqueCollabRecipLocalJoinFulfills fulfills
    UniqueCollabRecipLocalJoinJoin     join

CollabRecipRemoteJoin
    collab   CollabRecipRemoteId
    fulfills CollabFulfillsJoinId
    join     RemoteActivityId

    UniqueCollabRecipRemoteJoinCollab   collab
    UniqueCollabRecipRemoteJoinFulfills fulfills
    UniqueCollabRecipRemoteJoinJoin     join

-------------------------------- Collab topic --------------------------------

-- Removed for now, until I figure out whether/how to federate custom roles
--CollabRoleLocal
--    collab CollabId
--    role   RoleId
--
--    UniqueCollabRoleLocal collab

CollabTopicRepo
    collab CollabId
    repo   RepoId

    UniqueCollabTopicRepo collab

CollabTopicDeck
    collab CollabId
    deck   DeckId

    UniqueCollabTopicDeck collab

CollabTopicLoom
    collab CollabId
    loom   LoomId

    UniqueCollabTopicLoom collab

CollabEnable
    collab CollabId
    grant  OutboxItemId

    UniqueCollabEnable      collab
    UniqueCollabEnableGrant grant

-------------------------------- Collab recipient ----------------------------

CollabRecipLocal
    collab CollabId
    person PersonId

    UniqueCollabRecipLocal collab

CollabRecipLocalAccept
    collab CollabRecipLocalId
    invite CollabFulfillsInviteId
    accept OutboxItemId

    UniqueCollabRecipLocalAcceptCollab collab
    UniqueCollabRecipLocalAcceptInvite invite
    UniqueCollabRecipLocalAcceptAccept accept

CollabRecipRemote
    collab CollabId
    actor  RemoteActorId

    UniqueCollabRecipRemote collab

CollabRecipRemoteAccept
    collab CollabRecipRemoteId
    invite CollabFulfillsInviteId
    accept RemoteActivityId

    UniqueCollabRecipRemoteAcceptCollab collab
    UniqueCollabRecipRemoteAcceptInvite invite
    UniqueCollabRecipRemoteAcceptAccept accept

------------------------------------------------------------------------------
------------------------------------------------------------------------------

--RepoRemoteCollab
--    repo   RepoId
--    collab RemoteActorId
--    role   RoleId        Maybe
--    cap    Text
--
--    UniqueRepoRemoteCollab    repo collab
--    UniqueRepoRemoteCollabCap cap
--
--ProjectRemoteCollab
--    project DeckId
--    collab  RemoteActorId
--    role    RoleId        Maybe
--    cap     Text
--
--    UniqueProjectRemoteCollab    project person
--    UniqueProjectRemoteCollabCap cap

[See repo JSON]