1
0
Fork 0
mirror of https://code.sup39.dev/repos/Wqawg synced 2024-12-27 18:24:51 +09:00

UI for publishing a Remove

This commit is contained in:
Pere Lev 2023-06-17 00:39:02 +03:00
parent 9673887479
commit 58518811e3
No known key found for this signature in database
GPG key ID: 5252C5C863E5E57D
5 changed files with 131 additions and 0 deletions

View file

@ -38,6 +38,7 @@ module Vervis.Client
, createLoom , createLoom
, createRepo , createRepo
, invite , invite
, remove
) )
where where
@ -1028,3 +1029,84 @@ invite personID uRecipient uResource = do
audience = [audResource, audRecipient, audAuthor] audience = [audResource, audRecipient, audAuthor]
return (Nothing, audience, activity) return (Nothing, audience, activity)
remove
:: PersonId
-> FedURI
-> FedURI
-> ExceptT Text Handler (Maybe HTML, [Aud URIMode], AP.Remove URIMode)
remove personID uRecipient uResource = do
theater <- asksSite appTheater
env <- asksSite appEnv
let activity = AP.Remove uRecipient uResource
(resource, recipient) <-
runActE $ parseRemove (Left $ LocalActorPerson personID) activity
-- If resource is remote, we need to get it from DB/HTTP to determine its
-- managing actor & followers collection
resourceDB <-
bitraverse
hashGrantResource
(\ u@(ObjURI h lu) -> do
instanceID <-
lift $ runDB $ either entityKey id <$> insertBy' (Instance h)
result <-
ExceptT $ first (T.pack . show) <$>
runAct (fetchRemoteResource instanceID h lu)
case result of
Left (Entity _ actor) ->
return (actor, u)
Right (_objectID, luManager, (Entity _ actor)) ->
return (actor, ObjURI h luManager)
)
resource
-- If target is remote, get it via HTTP/DB to determine its followers
-- collection
recipientDB <-
bitraverse
(runActE . hashGrantRecip)
(\ u@(ObjURI h lu) -> do
instanceID <-
lift $ runDB $ either entityKey id <$> insertBy' (Instance h)
result <-
ExceptT $ first (T.pack . displayException) <$>
fetchRemoteActor instanceID h lu
case result of
Left Nothing -> throwE "Recipient @id mismatch"
Left (Just err) -> throwE $ T.pack $ displayException err
Right Nothing -> throwE "Recipient isn't an actor"
Right (Just actor) -> return (entityVal actor, u)
)
recipient
senderHash <- encodeKeyHashid personID
let audResource =
case resourceDB of
Left (GrantResourceRepo r) ->
AudLocal [LocalActorRepo r] [LocalStageRepoFollowers r]
Left (GrantResourceDeck d) ->
AudLocal [LocalActorDeck d] [LocalStageDeckFollowers d]
Left (GrantResourceLoom l) ->
AudLocal [LocalActorLoom l] [LocalStageLoomFollowers l]
Right (remoteActor, ObjURI h lu) ->
AudRemote h
[lu]
(maybeToList $ remoteActorFollowers remoteActor)
audRecipient =
case recipientDB of
Left (GrantRecipPerson p) ->
AudLocal [] [LocalStagePersonFollowers p]
Right (remoteActor, ObjURI h lu) ->
AudRemote h
[lu]
(maybeToList $ remoteActorFollowers remoteActor)
audAuthor =
AudLocal [] [LocalStagePersonFollowers senderHash]
audience = [audResource, audRecipient, audAuthor]
return (Nothing, audience, activity)

View file

@ -849,6 +849,7 @@ instance YesodBreadcrumbs App where
PublishOfferMergeR -> ("Open MR", Just HomeR) PublishOfferMergeR -> ("Open MR", Just HomeR)
PublishMergeR -> ("Apply MR", Just HomeR) PublishMergeR -> ("Apply MR", Just HomeR)
PublishInviteR -> ("Invite someone to a resource", Just HomeR) PublishInviteR -> ("Invite someone to a resource", Just HomeR)
PublishRemoveR -> ("Remove someone from a resource", Just HomeR)
PersonR p -> ("Person ~" <> keyHashidText p, Just HomeR) PersonR p -> ("Person ~" <> keyHashidText p, Just HomeR)
PersonInboxR p -> ("Inbox", Just $ PersonR p) PersonInboxR p -> ("Inbox", Just $ PersonR p)

View file

@ -38,6 +38,9 @@ module Vervis.Handler.Client
, getPublishInviteR , getPublishInviteR
, postPublishInviteR , postPublishInviteR
, getPublishRemoveR
, postPublishRemoveR
) )
where where
@ -1200,3 +1203,44 @@ postPublishInviteR = do
Right _ -> do Right _ -> do
setMessage "Invite activity sent" setMessage "Invite activity sent"
redirect HomeR redirect HomeR
removeForm = renderDivs $ (,,)
<$> areq fedUriField "(URI) Whom to remove" Nothing
<*> areq fedUriField "(URI) From which resource" Nothing
<*> areq capField "(URI) Grant activity to use for authorization" Nothing
getPublishRemoveR :: Handler Html
getPublishRemoveR = do
((_, widget), enctype) <- runFormPost removeForm
defaultLayout
[whamlet|
<h1>Remove someone from a resource
<form method=POST action=@{PublishRemoveR} enctype=#{enctype}>
^{widget}
<input type=submit>
|]
postPublishRemoveR :: Handler ()
postPublishRemoveR = do
federation <- getsYesod $ appFederation . appSettings
unless federation badMethod
(uRecipient, uResource, (uCap, cap)) <-
runFormPostRedirect PublishRemoveR removeForm
(ep@(Entity pid _), a) <- getSender
senderHash <- encodeKeyHashid pid
result <- runExceptT $ do
(maybeSummary, audience, rmv) <- remove pid uRecipient uResource
(localRecips, remoteRecips, fwdHosts, action) <-
makeServerInput (Just uCap) maybeSummary audience (AP.RemoveActivity rmv)
handleViaActor pid (Just cap) localRecips remoteRecips fwdHosts action
case result of
Left err -> do
setMessage $ toHtml err
redirect PublishRemoveR
Right _ -> do
setMessage "Remove activity sent"
redirect HomeR

View file

@ -45,6 +45,9 @@ $# Comment on a ticket or merge request
<li> <li>
<a href=@{PublishInviteR}> <a href=@{PublishInviteR}>
Invite someone to a resource Invite someone to a resource
<li>
<a href=@{PublishRemoveR}>
Remove someone from a resource
<h2>Your teams <h2>Your teams

View file

@ -133,6 +133,7 @@
/publish/offer-merge PublishOfferMergeR GET POST /publish/offer-merge PublishOfferMergeR GET POST
/publish/merge PublishMergeR GET POST /publish/merge PublishMergeR GET POST
/publish/invite PublishInviteR GET POST /publish/invite PublishInviteR GET POST
/publish/remove PublishRemoveR GET POST
---- Person ------------------------------------------------------------------ ---- Person ------------------------------------------------------------------