S2S: Project: Add: Implement Add-based version of projectInvite
This commit is contained in:
parent
f864274ff0
commit
f6dda396dd
6 changed files with 220 additions and 28 deletions
|
@ -652,7 +652,7 @@ personInvite now recipPersonID (Verse authorIdMsig body) invite = do
|
||||||
manager <- asksEnv envHttpManager
|
manager <- asksEnv envHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ mluCollabs _mluComps mluMembers <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ mluCollabs _mluComps mluMembers _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
if mluCollabs == Just luColl || mluMembers == Just luColl
|
if mluCollabs == Just luColl || mluMembers == Just luColl
|
||||||
then Just . (role,) . Right <$> do
|
then Just . (role,) . Right <$> do
|
||||||
instanceID <-
|
instanceID <-
|
||||||
|
|
|
@ -266,7 +266,7 @@ clientAdd now personMeID (ClientMsg maybeCap localRecips remoteRecips fwdHosts a
|
||||||
manager <- asksEnv envHttpManager
|
manager <- asksEnv envHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luComps
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luComps
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ _ _ _ _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
|
|
||||||
instanceID <-
|
instanceID <-
|
||||||
lift $ withDB $ either entityKey id <$> insertBy' (Instance h)
|
lift $ withDB $ either entityKey id <$> insertBy' (Instance h)
|
||||||
|
@ -895,7 +895,7 @@ clientInvite now personMeID (ClientMsg maybeCap localRecips remoteRecips fwdHost
|
||||||
manager <- asksEnv envHttpManager
|
manager <- asksEnv envHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ mluCollabs mluComps mluMembers <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ mluCollabs mluComps mluMembers _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
unless (mluCollabs == Just luColl || mluComps == Just luColl || mluMembers == Just luColl) $
|
unless (mluCollabs == Just luColl || mluComps == Just luColl || mluMembers == Just luColl) $
|
||||||
throwE "Invite target isn't a collabs/components list"
|
throwE "Invite target isn't a collabs/components list"
|
||||||
|
|
||||||
|
@ -1044,7 +1044,7 @@ clientJoin now personMeID (ClientMsg maybeCap localRecips remoteRecips fwdHosts
|
||||||
manager <- asksEnv envHttpManager
|
manager <- asksEnv envHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ mluCollabs mluComps mluMembers <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ mluCollabs mluComps mluMembers _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
let isCollabs = mluCollabs == Just luColl || mluMembers == Just luColl
|
let isCollabs = mluCollabs == Just luColl || mluMembers == Just luColl
|
||||||
unless (isCollabs || mluComps == Just luColl) $
|
unless (isCollabs || mluComps == Just luColl) $
|
||||||
throwE "Join resource isn't a collabs/components list"
|
throwE "Join resource isn't a collabs/components list"
|
||||||
|
@ -1249,7 +1249,7 @@ clientRemove now personMeID (ClientMsg maybeCap localRecips remoteRecips fwdHost
|
||||||
manager <- asksEnv envHttpManager
|
manager <- asksEnv envHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ mluCollabs _ mluMembers <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ mluCollabs _ mluMembers _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
unless (mluCollabs == Just luColl || mluMembers == Just luColl) $
|
unless (mluCollabs == Just luColl || mluMembers == Just luColl) $
|
||||||
throwE "Remove origin isn't a collabs list"
|
throwE "Remove origin isn't a collabs list"
|
||||||
return $ ObjURI h lu
|
return $ ObjURI h lu
|
||||||
|
|
|
@ -1454,15 +1454,16 @@ checkExistingComponents projectID componentDB = do
|
||||||
-- Meaning: An actor is adding some object to some target
|
-- Meaning: An actor is adding some object to some target
|
||||||
-- Behavior:
|
-- Behavior:
|
||||||
-- * If the target is my components list:
|
-- * If the target is my components list:
|
||||||
-- * Verify the object is a component, find in DB/HTTP
|
-- * Verify sender is authorized by me to add components to me
|
||||||
-- * Verify it's not already an active component of mine
|
-- * Verify B isn't already an active component of mine
|
||||||
-- * Verify it's not already in a Add-Accept process waiting for project
|
-- * Verify B isn't already in a Add-Accept process waiting for
|
||||||
-- collab to accept too
|
-- project collab to accept too
|
||||||
-- * Verify it's not already in an Invite-Accept process waiting for
|
-- * Verify B isn't already in an Invite-Accept process waiting for
|
||||||
-- component (or its collaborator) to accept too
|
-- component (or its collaborator) to accept too
|
||||||
-- * Insert the Add to my inbox
|
-- * Insert the Add to my inbox
|
||||||
-- * Create a Component record in DB
|
-- * Create a Component record in DB
|
||||||
-- * Forward the Add to my followers
|
-- * Forward the Add to my followers
|
||||||
|
-- * Send Accept to sender, component+followers, my-followers
|
||||||
--
|
--
|
||||||
-- * If the target is my children list:
|
-- * If the target is my children list:
|
||||||
-- * Verify the object is a project, find in DB/HTTP
|
-- * Verify the object is a project, find in DB/HTTP
|
||||||
|
@ -1512,6 +1513,17 @@ checkExistingComponents projectID componentDB = do
|
||||||
-- * Create a Source/Dest record in DB
|
-- * Create a Source/Dest record in DB
|
||||||
-- * Forward the Add to my followers
|
-- * Forward the Add to my followers
|
||||||
--
|
--
|
||||||
|
-- * If I'm the object, being added to someone's projects list:
|
||||||
|
-- * Verify the object is a component, find in DB/HTTP
|
||||||
|
-- * Verify it's not already an active component of mine
|
||||||
|
-- * Verify it's not already in a them-Add-Accept process waiting for
|
||||||
|
-- project collab to accept too
|
||||||
|
-- * Verify it's not already in an us-Invite-Accept process waiting for
|
||||||
|
-- component (or its collaborator) to accept too
|
||||||
|
-- * Insert the Add to my inbox
|
||||||
|
-- * Create a Component record in DB
|
||||||
|
-- * Forward the Add to my followers
|
||||||
|
--
|
||||||
-- * Otherwise, error
|
-- * Otherwise, error
|
||||||
projectAdd
|
projectAdd
|
||||||
:: UTCTime
|
:: UTCTime
|
||||||
|
@ -1532,7 +1544,7 @@ projectAdd now projectID (Verse authorIdMsig body) add = do
|
||||||
(\ la -> fromMaybeE (resourceToComponent =<< actorToResource la) "Not a component")
|
(\ la -> fromMaybeE (resourceToComponent =<< actorToResource la) "Not a component")
|
||||||
pure
|
pure
|
||||||
object
|
object
|
||||||
addComponent comp
|
addComponentActive comp
|
||||||
(Left (ATProjectChildren j), _) | j == projectID ->
|
(Left (ATProjectChildren j), _) | j == projectID ->
|
||||||
addChildActive object
|
addChildActive object
|
||||||
(Left (ATProjectParents j), _) | j == projectID ->
|
(Left (ATProjectParents j), _) | j == projectID ->
|
||||||
|
@ -1543,25 +1555,182 @@ projectAdd now projectID (Verse authorIdMsig body) add = do
|
||||||
addChildPassive $ Left j
|
addChildPassive $ Left j
|
||||||
Left (ATProjectChildren j) | j /= projectID ->
|
Left (ATProjectChildren j) | j /= projectID ->
|
||||||
addParentPassive $ Left j
|
addParentPassive $ Left j
|
||||||
|
Left (ATRepoProjects r) ->
|
||||||
|
addComponentPassive $ Left $ ComponentRepo r
|
||||||
|
Left (ATDeckProjects d) ->
|
||||||
|
addComponentPassive $ Left $ ComponentDeck d
|
||||||
|
Left (ATLoomProjects l) ->
|
||||||
|
addComponentPassive $ Left $ ComponentLoom l
|
||||||
Right (ObjURI h luColl) -> do
|
Right (ObjURI h luColl) -> do
|
||||||
-- NOTE this is HTTP GET done synchronously in the activity
|
-- NOTE this is HTTP GET done synchronously in the activity
|
||||||
-- handler
|
-- handler
|
||||||
manager <- asksEnv envHttpManager
|
manager <- asksEnv envHttpManager
|
||||||
c <- AP.fetchAPID_T manager (AP.collectionId :: AP.Collection FedURI URIMode -> LocalURI) h luColl
|
c <- AP.fetchAPID_T manager (AP.collectionId :: AP.Collection FedURI URIMode -> LocalURI) h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext c) "No context"
|
lu <- fromMaybeE (AP.collectionContext c) "No context"
|
||||||
j <- AP.fetchAPID_T manager (AP.actorId . AP.actorLocal . AP.projectActor) h lu
|
rwc <- AP.fetchRWC_T manager h lu
|
||||||
case (luColl == AP.projectChildren j, luColl == AP.projectParents j) of
|
AP.Actor l d <-
|
||||||
(True, False) ->
|
case AP.rwcResource rwc of
|
||||||
addParentPassive $ Right $ ObjURI h lu
|
AP.ResourceActor a -> pure a
|
||||||
(False, True) ->
|
AP.ResourceChild _ _ -> throwE "Add.target remote ResourceChild"
|
||||||
addChildPassive $ Right $ ObjURI h lu
|
let typ = AP.actorType d
|
||||||
_ -> throwE "Weird collection situation"
|
if AP.actorTypeIsComponent typ && Just luColl == AP.rwcParentsOrProjects rwc
|
||||||
|
then addComponentPassive $ Right $ ObjURI h lu
|
||||||
|
else if typ == AP.ActorTypeProject && Just luColl == AP.rwcSubprojects rwc
|
||||||
|
then addParentPassive $ Right $ ObjURI h lu
|
||||||
|
else if typ == AP.ActorTypeProject && Just luColl == AP.rwcParentsOrProjects rwc
|
||||||
|
then addChildPassive $ Right $ ObjURI h lu
|
||||||
|
else throwE "Weird collection situation"
|
||||||
_ -> throwE "I'm being added somewhere irrelevant"
|
_ -> throwE "I'm being added somewhere irrelevant"
|
||||||
_ -> throwE "This Add isn't for me"
|
_ -> throwE "This Add isn't for me"
|
||||||
|
|
||||||
where
|
where
|
||||||
|
|
||||||
addComponent component = do
|
addComponentActive component = do
|
||||||
|
|
||||||
|
-- Check capability
|
||||||
|
capability <- do
|
||||||
|
|
||||||
|
-- Verify that a capability is provided
|
||||||
|
uCap <- do
|
||||||
|
let muCap = AP.activityCapability $ actbActivity body
|
||||||
|
fromMaybeE muCap "No capability provided"
|
||||||
|
|
||||||
|
-- Verify the capability URI is one of:
|
||||||
|
-- * Outbox item URI of a local actor, i.e. a local activity
|
||||||
|
-- * A remote URI
|
||||||
|
cap <- nameExceptT "Invite capability" $ parseActivityURI' uCap
|
||||||
|
|
||||||
|
-- Verify the capability is local
|
||||||
|
case cap of
|
||||||
|
Left (actorByKey, _, outboxItemID) ->
|
||||||
|
return (actorByKey, outboxItemID)
|
||||||
|
_ -> throwE "Capability is remote i.e. definitely not by me"
|
||||||
|
|
||||||
|
-- If target is local, find it in our DB
|
||||||
|
-- If target is remote, HTTP GET it, verify it's an actor, and store in
|
||||||
|
-- our DB (if it's already there, no need for HTTP)
|
||||||
|
--
|
||||||
|
-- NOTE: This is a blocking HTTP GET done right here in the Invite handler,
|
||||||
|
-- which is NOT a good idea. Ideally, it would be done async, and the
|
||||||
|
-- handler result (approve/disapprove the Invite) would be sent later in a
|
||||||
|
-- separate (e.g. Accept) activity. But for the PoC level, the current
|
||||||
|
-- situation will hopefully do.
|
||||||
|
invitedDB <-
|
||||||
|
bitraverse
|
||||||
|
(withDBExcept . flip getComponentE "Invitee not found in DB")
|
||||||
|
getRemoteActorFromURI
|
||||||
|
component
|
||||||
|
|
||||||
|
maybeNew <- withDBExcept $ do
|
||||||
|
|
||||||
|
-- Grab me from DB
|
||||||
|
resourceID <- lift $ projectResource <$> getJust projectID
|
||||||
|
Resource topicActorID <- lift $ getJust resourceID
|
||||||
|
topicActor <- lift $ getJust topicActorID
|
||||||
|
|
||||||
|
-- Verify the specified capability gives relevant access
|
||||||
|
verifyCapability'
|
||||||
|
capability authorIdMsig (LocalResourceProject projectID) AP.RoleAdmin
|
||||||
|
|
||||||
|
-- Find existing Component records I have for this component
|
||||||
|
-- Make sure none are enabled / in Add-Accept mode / in
|
||||||
|
-- Invite-Accept mode
|
||||||
|
checkExistingComponents projectID invitedDB
|
||||||
|
|
||||||
|
maybeInviteDB <- lift $ insertToInbox now authorIdMsig body (actorInbox topicActor) False
|
||||||
|
lift $ for maybeInviteDB $ \ (inboxItemID, inviteDB) -> do
|
||||||
|
|
||||||
|
-- Insert Collab or Component record to DB
|
||||||
|
acceptID <- insertEmptyOutboxItem' (actorOutbox topicActor) now
|
||||||
|
insertComponent invitedDB inviteDB acceptID
|
||||||
|
|
||||||
|
-- Prepare forwarding Invite to my followers
|
||||||
|
sieve <- do
|
||||||
|
projectHash <- encodeKeyHashid projectID
|
||||||
|
return $ makeRecipientSet [] [LocalStageProjectFollowers projectHash]
|
||||||
|
|
||||||
|
-- Prepare an Accept activity and insert to my outbox
|
||||||
|
accept@(actionAccept, _, _, _) <- prepareAccept invitedDB
|
||||||
|
_luAccept <- updateOutboxItem' (LocalActorProject projectID) acceptID actionAccept
|
||||||
|
|
||||||
|
return (topicActorID, sieve, acceptID, accept, inboxItemID)
|
||||||
|
|
||||||
|
case maybeNew of
|
||||||
|
Nothing -> done "I already have this activity in my inbox"
|
||||||
|
Just (projectActorID, sieve, acceptID, (actionAccept, localRecipsAccept, remoteRecipsAccept, fwdHostsAccept), inboxItemID) -> do
|
||||||
|
forwardActivity
|
||||||
|
authorIdMsig body (LocalActorProject projectID) projectActorID sieve
|
||||||
|
lift $ sendActivity
|
||||||
|
(LocalActorProject projectID) projectActorID localRecipsAccept
|
||||||
|
remoteRecipsAccept fwdHostsAccept acceptID actionAccept
|
||||||
|
doneDB inboxItemID "[Add-component-active] Recorded and forwarded the Add, sent an Accept"
|
||||||
|
|
||||||
|
where
|
||||||
|
|
||||||
|
getRemoteActorFromURI (ObjURI h lu) = do
|
||||||
|
instanceID <-
|
||||||
|
lift $ withDB $ either entityKey id <$> insertBy' (Instance h)
|
||||||
|
result <-
|
||||||
|
ExceptT $ first (T.pack . displayException) <$>
|
||||||
|
fetchRemoteActor' instanceID h lu
|
||||||
|
case result of
|
||||||
|
Left Nothing -> throwE "Target @id mismatch"
|
||||||
|
Left (Just err) -> throwE $ T.pack $ displayException err
|
||||||
|
Right Nothing -> throwE "Target isn't an actor"
|
||||||
|
Right (Just actor) -> return $ entityKey actor
|
||||||
|
|
||||||
|
insertComponent componentDB inviteDB acceptID = do
|
||||||
|
componentID <- insert $ Component projectID AP.RoleAdmin
|
||||||
|
originID <- insert $ ComponentOriginInvite componentID
|
||||||
|
case inviteDB of
|
||||||
|
Left (_, _, inviteID) ->
|
||||||
|
insert_ $ ComponentProjectGestureLocal componentID inviteID
|
||||||
|
Right (author, _, inviteID) ->
|
||||||
|
insert_ $ ComponentProjectGestureRemote componentID (remoteAuthorId author) inviteID
|
||||||
|
case componentDB of
|
||||||
|
Left l ->
|
||||||
|
insert_ $ ComponentLocal componentID (localComponentID l)
|
||||||
|
Right remoteActorID ->
|
||||||
|
insert_ $ ComponentRemote componentID remoteActorID
|
||||||
|
insert_ $ ComponentProjectAccept originID acceptID
|
||||||
|
|
||||||
|
prepareAccept invitedDB = do
|
||||||
|
encodeRouteHome <- getEncodeRouteHome
|
||||||
|
|
||||||
|
audInviter <- lift $ makeAudSenderOnly authorIdMsig
|
||||||
|
audInvited <-
|
||||||
|
case invitedDB of
|
||||||
|
Left componentByEnt -> do
|
||||||
|
componentByHash <- hashComponent $ bmap entityKey componentByEnt
|
||||||
|
let actor = resourceToActor $ componentResource componentByHash
|
||||||
|
return $ AudLocal [actor] [localActorFollowers actor]
|
||||||
|
Right remoteActorID -> do
|
||||||
|
ra <- getJust remoteActorID
|
||||||
|
ObjURI h lu <- getRemoteActorURI ra
|
||||||
|
return $ AudRemote h [lu] (maybeToList $ remoteActorFollowers ra)
|
||||||
|
audTopic <-
|
||||||
|
AudLocal [] . pure . LocalStageProjectFollowers <$>
|
||||||
|
encodeKeyHashid projectID
|
||||||
|
uInvite <- lift $ getActivityURI authorIdMsig
|
||||||
|
|
||||||
|
let (recipientSet, remoteActors, fwdHosts, audLocal, audRemote) =
|
||||||
|
collectAudience [audInviter, audInvited, audTopic]
|
||||||
|
|
||||||
|
recips = map encodeRouteHome audLocal ++ audRemote
|
||||||
|
action = AP.Action
|
||||||
|
{ AP.actionCapability = Nothing
|
||||||
|
, AP.actionSummary = Nothing
|
||||||
|
, AP.actionAudience = AP.Audience recips [] [] [] [] []
|
||||||
|
, AP.actionFulfills = [uInvite]
|
||||||
|
, AP.actionSpecific = AP.AcceptActivity AP.Accept
|
||||||
|
{ AP.acceptObject = uInvite
|
||||||
|
, AP.acceptResult = Nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (action, recipientSet, remoteActors, fwdHosts)
|
||||||
|
|
||||||
|
addComponentPassive component = do
|
||||||
|
|
||||||
-- If component is local, find it in our DB
|
-- If component is local, find it in our DB
|
||||||
-- If component is remote, HTTP GET it, verify it's an actor of a component
|
-- If component is remote, HTTP GET it, verify it's an actor of a component
|
||||||
|
|
|
@ -1151,7 +1151,7 @@ invite personID uRecipient uResourceCollabs role = do
|
||||||
manager <- asksSite appHttpManager
|
manager <- asksSite appHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ mluCollabs _ mluMembers <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ mluCollabs _ mluMembers _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
unless (mluCollabs == Just luColl || mluMembers == Just luColl) $
|
unless (mluCollabs == Just luColl || mluMembers == Just luColl) $
|
||||||
throwE "Invite target isn't a collabs list"
|
throwE "Invite target isn't a collabs list"
|
||||||
return $ ObjURI h lu
|
return $ ObjURI h lu
|
||||||
|
@ -1242,7 +1242,7 @@ add personID uRecipient uCollection role = do
|
||||||
manager <- asksSite appHttpManager
|
manager <- asksSite appHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote collection has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote collection has no 'context'"
|
||||||
AP.ResourceWithCollections _ _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ _ _ _ _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
return $ ObjURI h lu
|
return $ ObjURI h lu
|
||||||
)
|
)
|
||||||
target
|
target
|
||||||
|
@ -1328,7 +1328,7 @@ remove personID uRecipient uCollection = do
|
||||||
manager <- asksSite appHttpManager
|
manager <- asksSite appHttpManager
|
||||||
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
coll <- ExceptT $ liftIO $ first T.pack <$> AP.fetchAPID manager AP.collectionId h luColl
|
||||||
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
lu <- fromMaybeE (AP.collectionContext (coll :: AP.Collection FedURI URIMode)) "Remote topic collabs has no 'context'"
|
||||||
AP.ResourceWithCollections _ _mluCollabs _ _mluMembers <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ _mluCollabs _ _mluMembers _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
return $ ObjURI h lu
|
return $ ObjURI h lu
|
||||||
)
|
)
|
||||||
resource
|
resource
|
||||||
|
|
|
@ -624,7 +624,7 @@ postDeckAddProjectR deckHash = do
|
||||||
encodeRouteHome . renderLocalActor <$> hashLocalActor la
|
encodeRouteHome . renderLocalActor <$> hashLocalActor la
|
||||||
Right (ObjURI h lu) -> do
|
Right (ObjURI h lu) -> do
|
||||||
manager <- asksSite appHttpManager
|
manager <- asksSite appHttpManager
|
||||||
AP.ResourceWithCollections _ _ mluComponents _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
AP.ResourceWithCollections _ _ mluComponents _ _ _ _ <- ExceptT $ liftIO $ first (T.pack . show) <$> AP.fetchRWC manager h lu
|
||||||
luComponents <- fromMaybeE mluComponents "No components collection"
|
luComponents <- fromMaybeE mluComponents "No components collection"
|
||||||
return $ ObjURI h luComponents
|
return $ ObjURI h luComponents
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ module Web.ActivityPub
|
||||||
-- ActivityPub actor document including a public key, with a 'FromJSON'
|
-- ActivityPub actor document including a public key, with a 'FromJSON'
|
||||||
-- instance for fetching and a 'ToJSON' instance for publishing.
|
-- instance for fetching and a 'ToJSON' instance for publishing.
|
||||||
, ActorType (..)
|
, ActorType (..)
|
||||||
|
, actorTypeIsComponent
|
||||||
, parseActorType
|
, parseActorType
|
||||||
, renderActorType
|
, renderActorType
|
||||||
--, Algorithm (..)
|
--, Algorithm (..)
|
||||||
|
@ -132,6 +133,7 @@ module Web.ActivityPub
|
||||||
, fetchRecipient
|
, fetchRecipient
|
||||||
, fetchResource
|
, fetchResource
|
||||||
, fetchRWC
|
, fetchRWC
|
||||||
|
, fetchRWC_T
|
||||||
, keyListedByActor
|
, keyListedByActor
|
||||||
, fetchUnknownKey
|
, fetchUnknownKey
|
||||||
, fetchKnownPersonalKey
|
, fetchKnownPersonalKey
|
||||||
|
@ -390,6 +392,12 @@ data ActorType
|
||||||
| ActorTypeOther Text
|
| ActorTypeOther Text
|
||||||
deriving Eq
|
deriving Eq
|
||||||
|
|
||||||
|
actorTypeIsComponent = \case
|
||||||
|
ActorTypeRepo -> True
|
||||||
|
ActorTypeTicketTracker -> True
|
||||||
|
ActorTypePatchTracker -> True
|
||||||
|
_ -> False
|
||||||
|
|
||||||
parseActorType :: Text -> ActorType
|
parseActorType :: Text -> ActorType
|
||||||
parseActorType t
|
parseActorType t
|
||||||
| t == "Person" = ActorTypePerson
|
| t == "Person" = ActorTypePerson
|
||||||
|
@ -871,6 +879,9 @@ data ResourceWithCollections u = ResourceWithCollections
|
||||||
, rwcCollabs :: Maybe LocalURI
|
, rwcCollabs :: Maybe LocalURI
|
||||||
, rwcComponents :: Maybe LocalURI
|
, rwcComponents :: Maybe LocalURI
|
||||||
, rwcMembers :: Maybe LocalURI
|
, rwcMembers :: Maybe LocalURI
|
||||||
|
, rwcParentsOrProjects :: Maybe LocalURI
|
||||||
|
, rwcSubprojects :: Maybe LocalURI
|
||||||
|
, rwcSubteams :: Maybe LocalURI
|
||||||
}
|
}
|
||||||
|
|
||||||
instance ActivityPub ResourceWithCollections where
|
instance ActivityPub ResourceWithCollections where
|
||||||
|
@ -881,11 +892,17 @@ instance ActivityPub ResourceWithCollections where
|
||||||
<$> withAuthorityMaybeO h (o .:? "collaborators")
|
<$> withAuthorityMaybeO h (o .:? "collaborators")
|
||||||
<*> withAuthorityMaybeO h (o .:? "components")
|
<*> withAuthorityMaybeO h (o .:? "components")
|
||||||
<*> withAuthorityMaybeO h (o .:? "members")
|
<*> withAuthorityMaybeO h (o .:? "members")
|
||||||
toSeries h (ResourceWithCollections r collabs comps members)
|
<*> withAuthorityMaybeO h (o .:? "context")
|
||||||
|
<*> withAuthorityMaybeO h (o .:? "subprojects")
|
||||||
|
<*> withAuthorityMaybeO h (o .:? "subteams")
|
||||||
|
toSeries h (ResourceWithCollections r collabs comps members ctx subj subt)
|
||||||
= toSeries h r
|
= toSeries h r
|
||||||
<> "collaborators" .=? (ObjURI h <$> collabs)
|
<> "collaborators" .=? (ObjURI h <$> collabs)
|
||||||
<> "components" .=? (ObjURI h <$> comps)
|
<> "components" .=? (ObjURI h <$> comps)
|
||||||
<> "members" .=? (ObjURI h <$> members)
|
<> "members" .=? (ObjURI h <$> members)
|
||||||
|
<> "context" .=? (ObjURI h <$> ctx)
|
||||||
|
<> "subprojects" .=? (ObjURI h <$> subj)
|
||||||
|
<> "subteams" .=? (ObjURI h <$> subt)
|
||||||
|
|
||||||
data Project u = Project
|
data Project u = Project
|
||||||
{ projectActor :: Actor u
|
{ projectActor :: Actor u
|
||||||
|
@ -2699,6 +2716,12 @@ fetchRWC m = fetchAPID' m (getId . rwcResource)
|
||||||
getId (ResourceActor a) = actorId $ actorLocal a
|
getId (ResourceActor a) = actorId $ actorLocal a
|
||||||
getId (ResourceChild luId _) = luId
|
getId (ResourceChild luId _) = luId
|
||||||
|
|
||||||
|
fetchRWC_T :: (MonadIO m, UriMode u) => Manager -> Authority u -> LocalURI -> ExceptT Text m (ResourceWithCollections u)
|
||||||
|
fetchRWC_T m h lu = ExceptT $ liftIO $ first showError <$> fetchRWC m h lu
|
||||||
|
where
|
||||||
|
showError Nothing = "Object @id doesn't match the URI we fetched"
|
||||||
|
showError (Just e) = T.pack $ displayException e
|
||||||
|
|
||||||
fetchAPID :: (MonadIO m, UriMode u, ActivityPub a) => Manager -> (a u -> LocalURI) -> Authority u -> LocalURI -> m (Either String (a u))
|
fetchAPID :: (MonadIO m, UriMode u, ActivityPub a) => Manager -> (a u -> LocalURI) -> Authority u -> LocalURI -> m (Either String (a u))
|
||||||
fetchAPID m getId h lu = first showError <$> fetchAPID' m getId h lu
|
fetchAPID m getId h lu = first showError <$> fetchAPID' m getId h lu
|
||||||
where
|
where
|
||||||
|
|
Loading…
Reference in a new issue