C2S: Implement Offer{ticket/MR} handler
This commit is contained in:
parent
a06003c361
commit
be569ab26d
1 changed files with 83 additions and 0 deletions
|
@ -67,6 +67,7 @@ import Vervis.Data.Actor
|
||||||
import Vervis.Data.Collab
|
import Vervis.Data.Collab
|
||||||
import Vervis.Data.Discussion
|
import Vervis.Data.Discussion
|
||||||
import Vervis.Data.Follow
|
import Vervis.Data.Follow
|
||||||
|
import Vervis.Data.Ticket
|
||||||
import Vervis.FedURI
|
import Vervis.FedURI
|
||||||
import Vervis.Fetch
|
import Vervis.Fetch
|
||||||
import Vervis.Foundation
|
import Vervis.Foundation
|
||||||
|
@ -782,6 +783,87 @@ clientInvite now personMeID (ClientMsg maybeCap localRecips remoteRecips fwdHost
|
||||||
fwdHosts inviteID action
|
fwdHosts inviteID action
|
||||||
return inviteID
|
return inviteID
|
||||||
|
|
||||||
|
-- Meaning: The human wants to open a ticket/MR/dependency
|
||||||
|
-- Behavior:
|
||||||
|
-- * Basics checks on the provided ticket/MR (dependency not allowed)
|
||||||
|
-- * Verify the Offer target is addressed in the Offer
|
||||||
|
-- * Insert Invite to my inbox
|
||||||
|
-- * Asynchrnously deliver to:
|
||||||
|
-- * Target tracker + followers
|
||||||
|
-- * My followers
|
||||||
|
clientOffer
|
||||||
|
:: UTCTime
|
||||||
|
-> PersonId
|
||||||
|
-> ClientMsg
|
||||||
|
-> AP.Offer URIMode
|
||||||
|
-> ActE OutboxItemId
|
||||||
|
clientOffer now personMeID (ClientMsg maybeCap localRecips remoteRecips fwdHosts action) (AP.Offer object uTarget) = do
|
||||||
|
|
||||||
|
-- Check input
|
||||||
|
ticket <-
|
||||||
|
case object of
|
||||||
|
AP.OfferTicket t -> pure t
|
||||||
|
_ -> throwE "Unsupported Offer.object type"
|
||||||
|
h <- asksEnv stageInstanceHost
|
||||||
|
WorkItemOffer {..} <- checkOfferTicket h ticket uTarget
|
||||||
|
unless (wioAuthor == Left personMeID) $
|
||||||
|
throwE "Offering a Ticket attributed to someone else"
|
||||||
|
|
||||||
|
-- Verify the tracker is addressed by the Offer
|
||||||
|
-- Verify it exists in DB if local
|
||||||
|
case wioRest of
|
||||||
|
TAM_Task deckID -> do
|
||||||
|
_ <- withDBExcept $ getE deckID "No such local deck"
|
||||||
|
verifyComponentAddressed localRecips $ ComponentDeck deckID
|
||||||
|
TAM_Merge loomID _ -> do
|
||||||
|
_ <- withDBExcept $ getE loomID "No such local loom"
|
||||||
|
verifyComponentAddressed localRecips $ ComponentLoom loomID
|
||||||
|
TAM_Remote u _ -> verifyRemoteAddressed remoteRecips u
|
||||||
|
|
||||||
|
(actorMeID, localRecipsFinal, offerID) <- withDBExcept $ do
|
||||||
|
|
||||||
|
-- Grab me from DB
|
||||||
|
(personMe, actorMe) <- lift $ do
|
||||||
|
p <- getJust personMeID
|
||||||
|
(p,) <$> getJust (personActor p)
|
||||||
|
|
||||||
|
-- Insert the Offer activity to my outbox
|
||||||
|
offerID <- lift $ insertEmptyOutboxItem' (actorOutbox actorMe) now
|
||||||
|
_luOffer <- lift $ updateOutboxItem' (LocalActorPerson personMeID) offerID action
|
||||||
|
|
||||||
|
-- Prepare local recipients for Invite delivery
|
||||||
|
sieve <- lift $ do
|
||||||
|
tracker <-
|
||||||
|
case wioRest of
|
||||||
|
TAM_Task deckID -> Left . Left <$> encodeKeyHashid deckID
|
||||||
|
TAM_Merge loomID _ -> Left . Right <$> encodeKeyHashid loomID
|
||||||
|
TAM_Remote u _ -> pure $ Right u
|
||||||
|
senderHash <- encodeKeyHashid personMeID
|
||||||
|
let sieveActors = catMaybes
|
||||||
|
[ case tracker of
|
||||||
|
Left (Left d) -> Just $ LocalActorDeck d
|
||||||
|
Left (Right l) -> Just $ LocalActorLoom l
|
||||||
|
Right _ -> Nothing
|
||||||
|
]
|
||||||
|
sieveStages = catMaybes
|
||||||
|
[ Just $ LocalStagePersonFollowers senderHash
|
||||||
|
, case tracker of
|
||||||
|
Left (Left d) -> Just $ LocalStageDeckFollowers d
|
||||||
|
Left (Right l) -> Just $ LocalStageLoomFollowers l
|
||||||
|
Right _ -> Nothing
|
||||||
|
]
|
||||||
|
return $ makeRecipientSet sieveActors sieveStages
|
||||||
|
return
|
||||||
|
( personActor personMe
|
||||||
|
, localRecipSieve sieve False localRecips
|
||||||
|
, offerID
|
||||||
|
)
|
||||||
|
|
||||||
|
lift $ sendActivity
|
||||||
|
(LocalActorPerson personMeID) actorMeID localRecipsFinal remoteRecips
|
||||||
|
fwdHosts offerID action
|
||||||
|
return offerID
|
||||||
|
|
||||||
-- Meaning: The human wants to remove someone A from a resource R
|
-- Meaning: The human wants to remove someone A from a resource R
|
||||||
-- Behavior:
|
-- Behavior:
|
||||||
-- * Some basic sanity checks
|
-- * Some basic sanity checks
|
||||||
|
@ -923,5 +1005,6 @@ clientBehavior now personID msg =
|
||||||
AP.AddActivity add -> clientAdd now personID msg add
|
AP.AddActivity add -> clientAdd now personID msg add
|
||||||
AP.CreateActivity create -> clientCreate now personID msg create
|
AP.CreateActivity create -> clientCreate now personID msg create
|
||||||
AP.InviteActivity invite -> clientInvite now personID msg invite
|
AP.InviteActivity invite -> clientInvite now personID msg invite
|
||||||
|
AP.OfferActivity offer -> clientOffer now personID msg offer
|
||||||
AP.RemoveActivity remove -> clientRemove now personID msg remove
|
AP.RemoveActivity remove -> clientRemove now personID msg remove
|
||||||
_ -> throwE "Unsupported activity type for C2S"
|
_ -> throwE "Unsupported activity type for C2S"
|
||||||
|
|
Loading…
Reference in a new issue