mirror of
https://code.naskya.net/repos/ndqEd
synced 2025-01-10 21:46:47 +09:00
S2S: Support commenting on sharer-patch and repo-patch
This commit is contained in:
parent
cf946e0326
commit
3fb529325d
4 changed files with 221 additions and 20 deletions
|
@ -37,6 +37,7 @@ import Control.Monad.Trans.Reader
|
||||||
import Crypto.Hash
|
import Crypto.Hash
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Bifunctor
|
import Data.Bifunctor
|
||||||
|
import Data.Bitraversable
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString (ByteString)
|
||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Foldable
|
import Data.Foldable
|
||||||
|
@ -111,6 +112,7 @@ import Vervis.Model.Ident
|
||||||
import Vervis.Model.Ticket
|
import Vervis.Model.Ticket
|
||||||
import Vervis.RemoteActorStore
|
import Vervis.RemoteActorStore
|
||||||
import Vervis.Settings
|
import Vervis.Settings
|
||||||
|
import Vervis.Patch
|
||||||
import Vervis.Ticket
|
import Vervis.Ticket
|
||||||
|
|
||||||
verifyIsLoggedInUser
|
verifyIsLoggedInUser
|
||||||
|
@ -201,29 +203,44 @@ createNoteC (Entity pidUser personUser) sharerUser summary audience note = runEx
|
||||||
let actors =
|
let actors =
|
||||||
case mproject of
|
case mproject of
|
||||||
Nothing -> []
|
Nothing -> []
|
||||||
Just (shr, prj) -> [LocalActorProject shr prj]
|
Just (Left (shr, prj)) -> [LocalActorProject shr prj]
|
||||||
|
Just (Right (shr, rp)) -> [LocalActorRepo shr rp]
|
||||||
collections =
|
collections =
|
||||||
let project =
|
let project =
|
||||||
case mproject of
|
case mproject of
|
||||||
Nothing -> []
|
Nothing -> []
|
||||||
Just (shr, prj) ->
|
Just (Left (shr, prj)) ->
|
||||||
[ LocalPersonCollectionProjectTeam shr prj
|
[ LocalPersonCollectionProjectTeam shr prj
|
||||||
, LocalPersonCollectionProjectFollowers shr prj
|
, LocalPersonCollectionProjectFollowers shr prj
|
||||||
]
|
]
|
||||||
|
Just (Right (shr, rp)) ->
|
||||||
|
[ LocalPersonCollectionRepoTeam shr rp
|
||||||
|
, LocalPersonCollectionRepoFollowers shr rp
|
||||||
|
]
|
||||||
ticket =
|
ticket =
|
||||||
case context of
|
case context of
|
||||||
Left nc ->
|
Left nc ->
|
||||||
case nc of
|
case nc of
|
||||||
NoteContextSharerTicket shr talid ->
|
NoteContextSharerTicket shr talid False ->
|
||||||
let talkhid = hashTAL talid
|
let talkhid = hashTAL talid
|
||||||
in [ -- LocalPersonCollectionSharerTicketTeam shr talkhid
|
in [ -- LocalPersonCollectionSharerTicketTeam shr talkhid
|
||||||
LocalPersonCollectionSharerTicketFollowers shr talkhid
|
LocalPersonCollectionSharerTicketFollowers shr talkhid
|
||||||
]
|
]
|
||||||
|
NoteContextSharerTicket shr talid True ->
|
||||||
|
let talkhid = hashTAL talid
|
||||||
|
in [ -- LocalPersonCollectionSharerPatchTeam shr talkhid
|
||||||
|
LocalPersonCollectionSharerPatchFollowers shr talkhid
|
||||||
|
]
|
||||||
NoteContextProjectTicket shr prj ltid ->
|
NoteContextProjectTicket shr prj ltid ->
|
||||||
let ltkhid = hashLT ltid
|
let ltkhid = hashLT ltid
|
||||||
in [ -- LocalPersonCollectionProjectTicketTeam shr prj ltkhid
|
in [ -- LocalPersonCollectionProjectTicketTeam shr prj ltkhid
|
||||||
LocalPersonCollectionProjectTicketFollowers shr prj ltkhid
|
LocalPersonCollectionProjectTicketFollowers shr prj ltkhid
|
||||||
]
|
]
|
||||||
|
NoteContextRepoPatch shr rp ltid ->
|
||||||
|
let ltkhid = hashLT ltid
|
||||||
|
in [ -- LocalPersonCollectionRepoPatchTeam shr rp ltkhid
|
||||||
|
LocalPersonCollectionRepoPatchFollowers shr rp ltkhid
|
||||||
|
]
|
||||||
Right _ -> []
|
Right _ -> []
|
||||||
commenter = [LocalPersonCollectionSharerFollowers shrUser]
|
commenter = [LocalPersonCollectionSharerFollowers shrUser]
|
||||||
in project ++ ticket ++ commenter
|
in project ++ ticket ++ commenter
|
||||||
|
@ -251,15 +268,25 @@ createNoteC (Entity pidUser personUser) sharerUser summary audience note = runEx
|
||||||
parseTopic name route =
|
parseTopic name route =
|
||||||
case route of
|
case route of
|
||||||
SharerTicketR shr talkhid ->
|
SharerTicketR shr talkhid ->
|
||||||
NoteContextSharerTicket shr <$>
|
flip (NoteContextSharerTicket shr) False <$>
|
||||||
decodeKeyHashidE
|
decodeKeyHashidE
|
||||||
talkhid
|
talkhid
|
||||||
(name <> " sharer ticket invalid talkhid")
|
(name <> " sharer ticket invalid talkhid")
|
||||||
|
SharerPatchR shr talkhid ->
|
||||||
|
flip (NoteContextSharerTicket shr) True <$>
|
||||||
|
decodeKeyHashidE
|
||||||
|
talkhid
|
||||||
|
(name <> " sharer patch invalid talkhid")
|
||||||
ProjectTicketR shr prj ltkhid ->
|
ProjectTicketR shr prj ltkhid ->
|
||||||
NoteContextProjectTicket shr prj <$>
|
NoteContextProjectTicket shr prj <$>
|
||||||
decodeKeyHashidE
|
decodeKeyHashidE
|
||||||
ltkhid
|
ltkhid
|
||||||
(name <> " project ticket invalid ltkhid")
|
(name <> " project ticket invalid ltkhid")
|
||||||
|
RepoPatchR shr rp ltkhid ->
|
||||||
|
NoteContextRepoPatch shr rp <$>
|
||||||
|
decodeKeyHashidE
|
||||||
|
ltkhid
|
||||||
|
(name <> " repo patch invalid ltkhid")
|
||||||
_ -> throwE $ name <> " isn't a discussion topic route"
|
_ -> throwE $ name <> " isn't a discussion topic route"
|
||||||
parseNoteContext u@(ObjURI h lu) = do
|
parseNoteContext u@(ObjURI h lu) = do
|
||||||
hl <- hostIsLocal h
|
hl <- hostIsLocal h
|
||||||
|
@ -306,7 +333,7 @@ createNoteC (Entity pidUser personUser) sharerUser summary audience note = runEx
|
||||||
unless (any ((== h) . fst) remoteRecips) $
|
unless (any ((== h) . fst) remoteRecips) $
|
||||||
throwE
|
throwE
|
||||||
"Context is remote but no recipients of that host are listed"
|
"Context is remote but no recipients of that host are listed"
|
||||||
verifyContextRecip (Left (NoteContextSharerTicket shr _)) localRecips _ =
|
verifyContextRecip (Left (NoteContextSharerTicket shr _ _)) localRecips _ =
|
||||||
fromMaybeE
|
fromMaybeE
|
||||||
verify
|
verify
|
||||||
"Local context ticket's hosting sharer isn't listed as a recipient"
|
"Local context ticket's hosting sharer isn't listed as a recipient"
|
||||||
|
@ -323,6 +350,15 @@ createNoteC (Entity pidUser personUser) sharerUser summary audience note = runEx
|
||||||
sharerSet <- lookup shr localRecips
|
sharerSet <- lookup shr localRecips
|
||||||
projectSet <- lookup prj $ localRecipProjectRelated sharerSet
|
projectSet <- lookup prj $ localRecipProjectRelated sharerSet
|
||||||
guard $ localRecipProject $ localRecipProjectDirect projectSet
|
guard $ localRecipProject $ localRecipProjectDirect projectSet
|
||||||
|
verifyContextRecip (Left (NoteContextRepoPatch shr rp _)) localRecips _ =
|
||||||
|
fromMaybeE
|
||||||
|
verify
|
||||||
|
"Local context patch's hosting repo isn't listed as a recipient"
|
||||||
|
where
|
||||||
|
verify = do
|
||||||
|
sharerSet <- lookup shr localRecips
|
||||||
|
repoSet <- lookup rp $ localRecipRepoRelated sharerSet
|
||||||
|
guard $ localRecipRepo $ localRecipRepoDirect repoSet
|
||||||
insertEmptyOutboxItem obid now = do
|
insertEmptyOutboxItem obid now = do
|
||||||
h <- asksSite siteInstanceHost
|
h <- asksSite siteInstanceHost
|
||||||
insert OutboxItem
|
insert OutboxItem
|
||||||
|
@ -334,23 +370,41 @@ createNoteC (Entity pidUser personUser) sharerUser summary audience note = runEx
|
||||||
j <- getJust $ ticketProjectLocalProject tpl
|
j <- getJust $ ticketProjectLocalProject tpl
|
||||||
s <- getJust $ projectSharer j
|
s <- getJust $ projectSharer j
|
||||||
return (sharerIdent s, projectIdent j)
|
return (sharerIdent s, projectIdent j)
|
||||||
|
getRepo trl = do
|
||||||
|
r <- getJust $ ticketRepoLocalRepo trl
|
||||||
|
s <- getJust $ repoSharer r
|
||||||
|
return (sharerIdent s, repoIdent r)
|
||||||
getTopicAndParent (Left context) mparent = do
|
getTopicAndParent (Left context) mparent = do
|
||||||
(mproject, did) <-
|
(mproject, did) <-
|
||||||
case context of
|
case context of
|
||||||
NoteContextSharerTicket shr talid -> do
|
NoteContextSharerTicket shr talid False -> do
|
||||||
(_, Entity _ lt, _, project) <- do
|
(_, Entity _ lt, _, project) <- do
|
||||||
mticket <- lift $ getSharerTicket shr talid
|
mticket <- lift $ getSharerTicket shr talid
|
||||||
fromMaybeE mticket "Note context no such local sharer-hosted ticket"
|
fromMaybeE mticket "Note context no such local sharer-hosted ticket"
|
||||||
mproj <-
|
mproj <-
|
||||||
case project of
|
case project of
|
||||||
Left (_, Entity _ tpl) -> lift $ Just <$> getProject tpl
|
Left (_, Entity _ tpl) -> lift $ Just . Left <$> getProject tpl
|
||||||
|
Right _ -> return Nothing
|
||||||
|
return (mproj, localTicketDiscuss lt)
|
||||||
|
NoteContextSharerTicket shr talid True -> do
|
||||||
|
(_, Entity _ lt, _, repo, _) <- do
|
||||||
|
mticket <- lift $ getSharerPatch shr talid
|
||||||
|
fromMaybeE mticket "Note context no such local sharer-hosted patch"
|
||||||
|
mproj <-
|
||||||
|
case repo of
|
||||||
|
Left (_, Entity _ trl) -> lift $ Just . Right <$> getRepo trl
|
||||||
Right _ -> return Nothing
|
Right _ -> return Nothing
|
||||||
return (mproj, localTicketDiscuss lt)
|
return (mproj, localTicketDiscuss lt)
|
||||||
NoteContextProjectTicket shr prj ltid -> do
|
NoteContextProjectTicket shr prj ltid -> do
|
||||||
(_, _, _, Entity _ lt, _, _, _) <- do
|
(_, _, _, Entity _ lt, _, _, _) <- do
|
||||||
mticket <- lift $ getProjectTicket shr prj ltid
|
mticket <- lift $ getProjectTicket shr prj ltid
|
||||||
fromMaybeE mticket "Note context no such local project-hosted ticket"
|
fromMaybeE mticket "Note context no such local project-hosted ticket"
|
||||||
return (Just (shr, prj), localTicketDiscuss lt)
|
return (Just $ Left (shr, prj), localTicketDiscuss lt)
|
||||||
|
NoteContextRepoPatch shr rp ltid -> do
|
||||||
|
(_, _, _, Entity _ lt, _, _, _, _) <- do
|
||||||
|
mticket <- lift $ getRepoPatch shr rp ltid
|
||||||
|
fromMaybeE mticket "Note context no such local project-hosted ticket"
|
||||||
|
return (Just $ Right (shr, rp), localTicketDiscuss lt)
|
||||||
mmidParent <- for mparent $ \ parent ->
|
mmidParent <- for mparent $ \ parent ->
|
||||||
case parent of
|
case parent of
|
||||||
Left (shrParent, lmidParent) -> getLocalParentMessageId did shrParent lmidParent
|
Left (shrParent, lmidParent) -> getLocalParentMessageId did shrParent lmidParent
|
||||||
|
@ -377,9 +431,14 @@ createNoteC (Entity pidUser personUser) sharerUser summary audience note = runEx
|
||||||
rt <- MaybeT $ getValBy $ UniqueRemoteTicketDiscuss rdid
|
rt <- MaybeT $ getValBy $ UniqueRemoteTicketDiscuss rdid
|
||||||
tar <- lift $ getJust $ remoteTicketTicket rt
|
tar <- lift $ getJust $ remoteTicketTicket rt
|
||||||
let tclid = ticketAuthorRemoteTicket tar
|
let tclid = ticketAuthorRemoteTicket tar
|
||||||
tpl <-
|
txl <-
|
||||||
MaybeT $ getValBy $ UniqueTicketProjectLocal tclid
|
lift $
|
||||||
lift $ getProject tpl
|
requireEitherAlt
|
||||||
|
(getValBy $ UniqueTicketProjectLocal tclid)
|
||||||
|
(getValBy $ UniqueTicketRepoLocal tclid)
|
||||||
|
"No specific TCL"
|
||||||
|
"Both TPL and TRL"
|
||||||
|
lift $ bitraverse getProject getRepo txl
|
||||||
return (mproj, rd, False)
|
return (mproj, rd, False)
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
did <- insert Discussion
|
did <- insert Discussion
|
||||||
|
|
|
@ -130,8 +130,9 @@ import Vervis.Widget.Repo
|
||||||
import Vervis.Widget.Sharer
|
import Vervis.Widget.Sharer
|
||||||
|
|
||||||
data NoteContext
|
data NoteContext
|
||||||
= NoteContextSharerTicket ShrIdent TicketAuthorLocalId
|
= NoteContextSharerTicket ShrIdent TicketAuthorLocalId Bool
|
||||||
| NoteContextProjectTicket ShrIdent PrjIdent LocalTicketId
|
| NoteContextProjectTicket ShrIdent PrjIdent LocalTicketId
|
||||||
|
| NoteContextRepoPatch ShrIdent RpIdent LocalTicketId
|
||||||
deriving Eq
|
deriving Eq
|
||||||
|
|
||||||
hostIsLocal :: (MonadSite m, SiteEnv m ~ App) => Host -> m Bool
|
hostIsLocal :: (MonadSite m, SiteEnv m ~ App) => Host -> m Bool
|
||||||
|
@ -158,12 +159,18 @@ parseContext uContext = do
|
||||||
Just r -> return r
|
Just r -> return r
|
||||||
case route of
|
case route of
|
||||||
SharerTicketR shr talkhid ->
|
SharerTicketR shr talkhid ->
|
||||||
NoteContextSharerTicket shr <$>
|
flip (NoteContextSharerTicket shr) False <$>
|
||||||
|
decodeKeyHashidE talkhid "Note context invalid talkhid"
|
||||||
|
SharerPatchR shr talkhid ->
|
||||||
|
flip (NoteContextSharerTicket shr) True <$>
|
||||||
decodeKeyHashidE talkhid "Note context invalid talkhid"
|
decodeKeyHashidE talkhid "Note context invalid talkhid"
|
||||||
ProjectTicketR shr prj ltkhid ->
|
ProjectTicketR shr prj ltkhid ->
|
||||||
NoteContextProjectTicket shr prj <$>
|
NoteContextProjectTicket shr prj <$>
|
||||||
decodeKeyHashidE ltkhid "Note context invalid ltkhid"
|
decodeKeyHashidE ltkhid "Note context invalid ltkhid"
|
||||||
_ -> throwE "Local context isn't a ticket route"
|
RepoPatchR shr rp ltkhid ->
|
||||||
|
NoteContextRepoPatch shr rp <$>
|
||||||
|
decodeKeyHashidE ltkhid "Note context invalid ltkhid"
|
||||||
|
_ -> throwE "Local context isn't a ticket/patch route"
|
||||||
else return $ Right uContext
|
else return $ Right uContext
|
||||||
|
|
||||||
parseParent
|
parseParent
|
||||||
|
|
|
@ -336,6 +336,11 @@ handleRepoInbox now shrRecip rpRecip auth body = do
|
||||||
ActivityAuthLocal local -> throwE $ errorLocalForwarded local
|
ActivityAuthLocal local -> throwE $ errorLocalForwarded local
|
||||||
ActivityAuthRemote ra -> return ra
|
ActivityAuthRemote ra -> return ra
|
||||||
case activitySpecific $ actbActivity body of
|
case activitySpecific $ actbActivity body of
|
||||||
|
CreateActivity (Create obj mtarget) ->
|
||||||
|
case obj of
|
||||||
|
CreateNote note ->
|
||||||
|
repoCreateNoteF now shrRecip rpRecip remoteAuthor body note
|
||||||
|
_ -> error "Unsupported create object type for repos"
|
||||||
FollowActivity follow ->
|
FollowActivity follow ->
|
||||||
repoFollowF shrRecip rpRecip now remoteAuthor body follow
|
repoFollowF shrRecip rpRecip now remoteAuthor body follow
|
||||||
UndoActivity undo->
|
UndoActivity undo->
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
module Vervis.Federation.Discussion
|
module Vervis.Federation.Discussion
|
||||||
( sharerCreateNoteF
|
( sharerCreateNoteF
|
||||||
, projectCreateNoteF
|
, projectCreateNoteF
|
||||||
|
, repoCreateNoteF
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
|
@ -72,6 +73,7 @@ import Vervis.Model
|
||||||
import Vervis.Model.Ident
|
import Vervis.Model.Ident
|
||||||
import Vervis.Settings
|
import Vervis.Settings
|
||||||
import Vervis.Ticket
|
import Vervis.Ticket
|
||||||
|
import Vervis.Patch
|
||||||
|
|
||||||
-- | Check the note in the remote Create Note activity delivered to us.
|
-- | Check the note in the remote Create Note activity delivered to us.
|
||||||
checkNote
|
checkNote
|
||||||
|
@ -256,12 +258,21 @@ sharerCreateNoteF now shrRecip author body note = do
|
||||||
case mractid of
|
case mractid of
|
||||||
Nothing -> "I already have this activity in my inbox, doing nothing"
|
Nothing -> "I already have this activity in my inbox, doing nothing"
|
||||||
Just _ -> "Context is remote, so just inserting to my inbox"
|
Just _ -> "Context is remote, so just inserting to my inbox"
|
||||||
Left (NoteContextSharerTicket shr talid) -> do
|
Left (NoteContextSharerTicket shr talid patch) -> do
|
||||||
mremotesHttp <- runDBExcept $ do
|
mremotesHttp <- runDBExcept $ do
|
||||||
(sid, pid, ibid) <- lift getRecip404
|
(sid, pid, ibid) <- lift getRecip404
|
||||||
(Entity _ tal, Entity _ lt, _, _) <- do
|
(tal, lt, followers) <-
|
||||||
mticket <- lift $ getSharerTicket shr talid
|
if patch
|
||||||
fromMaybeE mticket "Context: No such sharer-ticket"
|
then do
|
||||||
|
(Entity _ tal, Entity _ lt, _, _, _) <- do
|
||||||
|
mticket <- lift $ getSharerPatch shr talid
|
||||||
|
fromMaybeE mticket "Context: No such sharer-patch"
|
||||||
|
return (tal, lt, LocalPersonCollectionSharerPatchFollowers)
|
||||||
|
else do
|
||||||
|
(Entity _ tal, Entity _ lt, _, _) <- do
|
||||||
|
mticket <- lift $ getSharerTicket shr talid
|
||||||
|
fromMaybeE mticket "Context: No such sharer-ticket"
|
||||||
|
return (tal, lt, LocalPersonCollectionSharerTicketFollowers)
|
||||||
if ticketAuthorLocalAuthor tal == pid
|
if ticketAuthorLocalAuthor tal == pid
|
||||||
then do
|
then do
|
||||||
mractid <- lift $ insertToInbox now author body ibid luCreate True
|
mractid <- lift $ insertToInbox now author body ibid luCreate True
|
||||||
|
@ -283,7 +294,7 @@ sharerCreateNoteF now shrRecip author body note = do
|
||||||
let sieve =
|
let sieve =
|
||||||
makeRecipientSet
|
makeRecipientSet
|
||||||
[]
|
[]
|
||||||
[ LocalPersonCollectionSharerTicketFollowers shrRecip talkhid
|
[ followers shrRecip talkhid
|
||||||
--, LocalPersonCollectionSharerTicketTeam shrRecip talkhid
|
--, LocalPersonCollectionSharerTicketTeam shrRecip talkhid
|
||||||
]
|
]
|
||||||
remoteRecips <- insertRemoteActivityToLocalInboxes False ractid $ localRecipSieve' sieve False False localRecips
|
remoteRecips <- insertRemoteActivityToLocalInboxes False ractid $ localRecipSieve' sieve False False localRecips
|
||||||
|
@ -315,6 +326,20 @@ sharerCreateNoteF now shrRecip author body note = do
|
||||||
case mractid of
|
case mractid of
|
||||||
Nothing -> "I already have this activity in my inbox, doing nothing"
|
Nothing -> "I already have this activity in my inbox, doing nothing"
|
||||||
Just _ -> "Context is a project-ticket, so just inserting to my inbox"
|
Just _ -> "Context is a project-ticket, so just inserting to my inbox"
|
||||||
|
Left (NoteContextRepoPatch shr rp ltid) -> runDBExcept $ do
|
||||||
|
personRecip <- lift $ do
|
||||||
|
sid <- getKeyBy404 $ UniqueSharer shrRecip
|
||||||
|
getValBy404 $ UniquePersonIdent sid
|
||||||
|
(_, _, _, Entity _ lt, _, _, _, _) <- do
|
||||||
|
mticket <- lift $ getRepoPatch shr rp ltid
|
||||||
|
fromMaybeE mticket "Context: No such repo-patch"
|
||||||
|
let did = localTicketDiscuss lt
|
||||||
|
_ <- traverse (getParent did) mparent
|
||||||
|
mractid <- lift $ insertToInbox now author body (personInbox personRecip) luCreate True
|
||||||
|
return $
|
||||||
|
case mractid of
|
||||||
|
Nothing -> "I already have this activity in my inbox, doing nothing"
|
||||||
|
Just _ -> "Context is a repo-patch, so just inserting to my inbox"
|
||||||
where
|
where
|
||||||
getRecip404 = do
|
getRecip404 = do
|
||||||
sid <- getKeyBy404 $ UniqueSharer shrRecip
|
sid <- getKeyBy404 $ UniqueSharer shrRecip
|
||||||
|
@ -361,7 +386,7 @@ projectCreateNoteF now shrRecip prjRecip author body note = do
|
||||||
msig <- checkForward $ LocalActorProject shrRecip prjRecip
|
msig <- checkForward $ LocalActorProject shrRecip prjRecip
|
||||||
case context of
|
case context of
|
||||||
Right _ -> return "Not using; context isn't local"
|
Right _ -> return "Not using; context isn't local"
|
||||||
Left (NoteContextSharerTicket shr talid) -> do
|
Left (NoteContextSharerTicket shr talid False) -> do
|
||||||
mremotesHttp <- runDBExcept $ do
|
mremotesHttp <- runDBExcept $ do
|
||||||
(jid, ibid) <- lift getProjectRecip404
|
(jid, ibid) <- lift getProjectRecip404
|
||||||
(_, _, _, project) <- do
|
(_, _, _, project) <- do
|
||||||
|
@ -396,6 +421,7 @@ projectCreateNoteF now shrRecip prjRecip author body note = do
|
||||||
Right (sig, remotesHttp) -> do
|
Right (sig, remotesHttp) -> do
|
||||||
forkWorker "projectCreateNoteF inbox forwarding by http" $ deliverRemoteHTTP_J now shrRecip prjRecip (actbBL body) sig remotesHttp
|
forkWorker "projectCreateNoteF inbox forwarding by http" $ deliverRemoteHTTP_J now shrRecip prjRecip (actbBL body) sig remotesHttp
|
||||||
return "Stored to inbox and did inbox forwarding"
|
return "Stored to inbox and did inbox forwarding"
|
||||||
|
Left (NoteContextSharerTicket _ _ True) -> return "Context is a sharer-patch, ignoring activity"
|
||||||
Left (NoteContextProjectTicket shr prj ltid) -> do
|
Left (NoteContextProjectTicket shr prj ltid) -> do
|
||||||
mremotesHttp <- runDBExcept $ do
|
mremotesHttp <- runDBExcept $ do
|
||||||
(jid, ibid) <- lift getProjectRecip404
|
(jid, ibid) <- lift getProjectRecip404
|
||||||
|
@ -436,8 +462,112 @@ projectCreateNoteF now shrRecip prjRecip author body note = do
|
||||||
Right (sig, remotesHttp) -> do
|
Right (sig, remotesHttp) -> do
|
||||||
forkWorker "projectCreateNoteF inbox forwarding by http" $ deliverRemoteHTTP_J now shrRecip prjRecip (actbBL body) sig remotesHttp
|
forkWorker "projectCreateNoteF inbox forwarding by http" $ deliverRemoteHTTP_J now shrRecip prjRecip (actbBL body) sig remotesHttp
|
||||||
return "Stored to inbox, cached comment, and did inbox forwarding"
|
return "Stored to inbox, cached comment, and did inbox forwarding"
|
||||||
|
Left (NoteContextRepoPatch _ _ _) -> return "Context is a repo-patch, ignoring activity"
|
||||||
where
|
where
|
||||||
getProjectRecip404 = do
|
getProjectRecip404 = do
|
||||||
sid <- getKeyBy404 $ UniqueSharer shrRecip
|
sid <- getKeyBy404 $ UniqueSharer shrRecip
|
||||||
Entity jid j <- getBy404 $ UniqueProject prjRecip sid
|
Entity jid j <- getBy404 $ UniqueProject prjRecip sid
|
||||||
return (jid, projectInbox j)
|
return (jid, projectInbox j)
|
||||||
|
|
||||||
|
repoCreateNoteF
|
||||||
|
:: UTCTime
|
||||||
|
-> ShrIdent
|
||||||
|
-> RpIdent
|
||||||
|
-> RemoteAuthor
|
||||||
|
-> ActivityBody
|
||||||
|
-> Note URIMode
|
||||||
|
-> ExceptT Text Handler Text
|
||||||
|
repoCreateNoteF now shrRecip rpRecip author body note = do
|
||||||
|
luCreate <-
|
||||||
|
fromMaybeE (activityId $ actbActivity body) "Create without 'id'"
|
||||||
|
(luNote, published, context, mparent, source, content) <- checkNote note
|
||||||
|
(localRecips, _remoteRecips) <- do
|
||||||
|
mrecips <- parseAudience $ activityAudience $ actbActivity body
|
||||||
|
fromMaybeE mrecips "Create Note with no recipients"
|
||||||
|
msig <- checkForward $ LocalActorRepo shrRecip rpRecip
|
||||||
|
case context of
|
||||||
|
Right _ -> return "Not using; context isn't local"
|
||||||
|
Left (NoteContextSharerTicket _ _ False) ->
|
||||||
|
return "Context is a sharer-ticket, ignoring activity"
|
||||||
|
Left (NoteContextSharerTicket shr talid True) -> do
|
||||||
|
mremotesHttp <- runDBExcept $ do
|
||||||
|
(rid, ibid) <- lift getRepoRecip404
|
||||||
|
(_, _, _, repo, _) <- do
|
||||||
|
mticket <- lift $ getSharerPatch shr talid
|
||||||
|
fromMaybeE mticket "Context: No such sharer-ticket"
|
||||||
|
case repo of
|
||||||
|
Left (_, Entity _ trl)
|
||||||
|
| ticketRepoLocalRepo trl == rid -> do
|
||||||
|
mractid <- lift $ insertToInbox now author body ibid luCreate False
|
||||||
|
case mractid of
|
||||||
|
Nothing -> return $ Left "Activity already in my inbox"
|
||||||
|
Just ractid ->
|
||||||
|
case msig of
|
||||||
|
Nothing ->
|
||||||
|
return $ Left
|
||||||
|
"Context is a sharer-patch, \
|
||||||
|
\but no inbox forwarding \
|
||||||
|
\header for me, so doing \
|
||||||
|
\nothing, just storing in inbox"
|
||||||
|
Just sig -> lift $ Right <$> do
|
||||||
|
let sieve =
|
||||||
|
makeRecipientSet
|
||||||
|
[]
|
||||||
|
[ LocalPersonCollectionRepoFollowers shrRecip rpRecip
|
||||||
|
, LocalPersonCollectionRepoTeam shrRecip rpRecip
|
||||||
|
]
|
||||||
|
remoteRecips <- insertRemoteActivityToLocalInboxes False ractid $ localRecipSieve' sieve False False localRecips
|
||||||
|
(sig,) <$> deliverRemoteDB_R (actbBL body) ractid rid sig remoteRecips
|
||||||
|
_ -> return $ Left "Context is a sharer-patch of another repo"
|
||||||
|
case mremotesHttp of
|
||||||
|
Left msg -> return msg
|
||||||
|
Right (sig, remotesHttp) -> do
|
||||||
|
forkWorker "repoCreateNoteF inbox forwarding by http" $ deliverRemoteHTTP_R now shrRecip rpRecip (actbBL body) sig remotesHttp
|
||||||
|
return "Stored to inbox and did inbox forwarding"
|
||||||
|
Left (NoteContextProjectTicket _ _ _) ->
|
||||||
|
return "Context is a project-ticket, ignoring activity"
|
||||||
|
Left (NoteContextRepoPatch shr rp ltid) -> do
|
||||||
|
mremotesHttp <- runDBExcept $ do
|
||||||
|
(rid, ibid) <- lift getRepoRecip404
|
||||||
|
(_, _, _, Entity _ lt, _, Entity _ trl, _, _) <- do
|
||||||
|
mticket <- lift $ getRepoPatch shr rp ltid
|
||||||
|
fromMaybeE mticket "Context: No such repo-patch"
|
||||||
|
if ticketRepoLocalRepo trl == rid
|
||||||
|
then do
|
||||||
|
mractid <- lift $ insertToInbox now author body ibid luCreate False
|
||||||
|
case mractid of
|
||||||
|
Nothing -> return $ Left "Activity already in my inbox"
|
||||||
|
Just ractid -> do
|
||||||
|
let did = localTicketDiscuss lt
|
||||||
|
meparent <- traverse (getParent did) mparent
|
||||||
|
mmid <- lift $ insertToDiscussion author luNote published source content did meparent ractid
|
||||||
|
case mmid of
|
||||||
|
Nothing -> return $ Left "I already have this comment, just storing in inbox"
|
||||||
|
Just mid -> lift $ do
|
||||||
|
updateOrphans author luNote did mid
|
||||||
|
case msig of
|
||||||
|
Nothing ->
|
||||||
|
return $ Left "Storing in inbox, caching comment, no inbox forwarding header"
|
||||||
|
Just sig -> Right <$> do
|
||||||
|
ltkhid <- encodeKeyHashid ltid
|
||||||
|
let sieve =
|
||||||
|
makeRecipientSet
|
||||||
|
[]
|
||||||
|
[ LocalPersonCollectionRepoFollowers shrRecip rpRecip
|
||||||
|
, LocalPersonCollectionRepoTeam shrRecip rpRecip
|
||||||
|
, LocalPersonCollectionRepoPatchFollowers shrRecip rpRecip ltkhid
|
||||||
|
--, LocalPersonCollectionProjectTicketTeam shrRecip prjRecip ltkhid
|
||||||
|
]
|
||||||
|
remoteRecips <- insertRemoteActivityToLocalInboxes False ractid $ localRecipSieve' sieve False False localRecips
|
||||||
|
(sig,) <$> deliverRemoteDB_R (actbBL body) ractid rid sig remoteRecips
|
||||||
|
else return $ Left "Context is a repo-patch of another repo"
|
||||||
|
case mremotesHttp of
|
||||||
|
Left msg -> return msg
|
||||||
|
Right (sig, remotesHttp) -> do
|
||||||
|
forkWorker "repoCreateNoteF inbox forwarding by http" $ deliverRemoteHTTP_R now shrRecip rpRecip (actbBL body) sig remotesHttp
|
||||||
|
return "Stored to inbox, cached comment, and did inbox forwarding"
|
||||||
|
where
|
||||||
|
getRepoRecip404 = do
|
||||||
|
sid <- getKeyBy404 $ UniqueSharer shrRecip
|
||||||
|
Entity rid r <- getBy404 $ UniqueRepo rpRecip sid
|
||||||
|
return (rid, repoInbox r)
|
||||||
|
|
Loading…
Reference in a new issue