mirror of
https://code.naskya.net/repos/ndqEd
synced 2025-03-20 15:14:54 +09:00
DB: Add Collab tables for recording Recip's and Topic's Accept activities
This commit is contained in:
parent
0bd7568ca5
commit
10645bf02b
6 changed files with 258 additions and 26 deletions
src/Vervis
|
@ -139,18 +139,15 @@ checkRepoAccess' mpid op repoID = do
|
|||
status <$> roleHasAccess role op
|
||||
where
|
||||
asCollab rid pid = do
|
||||
fmap (maybe Developer RoleID . E.unValue . snd) . listToMaybe <$> do
|
||||
E.select $ E.from $ \ (topic `E.InnerJoin` recip `E.LeftOuterJoin` role) -> do
|
||||
E.on $ E.just (topic E.^. CollabTopicLocalRepoCollab) E.==. role E.?. CollabRoleLocalCollab
|
||||
fmap (const Developer) . listToMaybe <$> do
|
||||
E.select $ E.from $ \ (topic `E.InnerJoin` recip `E.InnerJoin` accept) -> do
|
||||
E.on $ topic E.^. CollabTopicLocalRepoCollab E.==. accept E.^. CollabTopicAcceptCollab
|
||||
E.on $ topic E.^. CollabTopicLocalRepoCollab E.==. recip E.^. CollabRecipLocalCollab
|
||||
E.where_ $
|
||||
topic E.^. CollabTopicLocalRepoRepo E.==. E.val rid E.&&.
|
||||
recip E.^. CollabRecipLocalPerson E.==. E.val pid
|
||||
E.limit 1
|
||||
return
|
||||
( topic E.^. CollabTopicLocalRepoCollab
|
||||
, role E.?. CollabRoleLocalRole
|
||||
)
|
||||
return $ topic E.^. CollabTopicLocalRepoCollab
|
||||
asUser = fmap RoleID . repoCollabUser
|
||||
asAnon = fmap RoleID . repoCollabAnon
|
||||
|
||||
|
@ -176,18 +173,15 @@ checkRepoAccess mpid op repoHash = do
|
|||
status <$> roleHasAccess role op
|
||||
where
|
||||
asCollab rid pid = do
|
||||
fmap (maybe Developer RoleID . E.unValue . snd) . listToMaybe <$> do
|
||||
E.select $ E.from $ \ (topic `E.InnerJoin` recip `E.LeftOuterJoin` role) -> do
|
||||
E.on $ E.just (topic E.^. CollabTopicLocalRepoCollab) E.==. role E.?. CollabRoleLocalCollab
|
||||
fmap (const Developer) . listToMaybe <$> do
|
||||
E.select $ E.from $ \ (topic `E.InnerJoin` recip `E.InnerJoin` accept) -> do
|
||||
E.on $ topic E.^. CollabTopicLocalRepoCollab E.==. accept E.^. CollabTopicAcceptCollab
|
||||
E.on $ topic E.^. CollabTopicLocalRepoCollab E.==. recip E.^. CollabRecipLocalCollab
|
||||
E.where_ $
|
||||
topic E.^. CollabTopicLocalRepoRepo E.==. E.val rid E.&&.
|
||||
recip E.^. CollabRecipLocalPerson E.==. E.val pid
|
||||
E.limit 1
|
||||
return
|
||||
( topic E.^. CollabTopicLocalRepoCollab
|
||||
, role E.?. CollabRoleLocalRole
|
||||
)
|
||||
return $ topic E.^. CollabTopicLocalRepoCollab
|
||||
asUser = fmap RoleID . repoCollabUser
|
||||
asAnon = fmap RoleID . repoCollabAnon
|
||||
|
||||
|
@ -214,17 +208,14 @@ checkProjectAccess mpid op deckHash = do
|
|||
status <$> roleHasAccess role op
|
||||
where
|
||||
asCollab jid pid = do
|
||||
fmap (maybe Developer RoleID . E.unValue . snd) . listToMaybe <$> do
|
||||
E.select $ E.from $ \ (topic `E.InnerJoin` recip `E.LeftOuterJoin` role) -> do
|
||||
E.on $ E.just (topic E.^. CollabTopicLocalDeckCollab) E.==. role E.?. CollabRoleLocalCollab
|
||||
fmap (const Developer) . listToMaybe <$> do
|
||||
E.select $ E.from $ \ (topic `E.InnerJoin` recip `E.InnerJoin` accept) -> do
|
||||
E.on $ topic E.^. CollabTopicLocalDeckCollab E.==. accept E.^. CollabTopicAcceptCollab
|
||||
E.on $ topic E.^. CollabTopicLocalDeckCollab E.==. recip E.^. CollabRecipLocalCollab
|
||||
E.where_ $
|
||||
topic E.^. CollabTopicLocalDeckDeck E.==. E.val jid E.&&.
|
||||
recip E.^. CollabRecipLocalPerson E.==. E.val pid
|
||||
E.limit 1
|
||||
return
|
||||
( topic E.^. CollabTopicLocalDeckCollab
|
||||
, role E.?. CollabRoleLocalRole
|
||||
)
|
||||
return $ topic E.^. CollabTopicLocalDeckCollab
|
||||
asUser = fmap RoleID . deckCollabUser
|
||||
asAnon = fmap RoleID . deckCollabAnon
|
||||
|
|
|
@ -2343,6 +2343,95 @@ changes hLocal ctx =
|
|||
, removeField "Workflow" "sharer"
|
||||
-- 423
|
||||
, removeEntity "Sharer"
|
||||
-- 424
|
||||
, removeEntity "CollabRoleLocal"
|
||||
-- 425
|
||||
, addEntities model_425_collab_accept
|
||||
-- 426
|
||||
, unchecked $ lift $ do
|
||||
repos <- selectList [] [Asc CollabTopicLocalRepo426Id]
|
||||
for_ repos $ \ (Entity _ (CollabTopicLocalRepo426 collabID repoID)) -> do
|
||||
repo <- getJust repoID
|
||||
itemID <- do
|
||||
mgrant <- runMaybeT $ do
|
||||
CollabSenderLocal426 _ grantID <-
|
||||
MaybeT $ maybeRight <$>
|
||||
requireEitherAlt
|
||||
(getBy $ UniqueCollabSenderRemote426 collabID)
|
||||
(getValBy $ UniqueCollabSenderLocal426 collabID)
|
||||
"No CollabSender*"
|
||||
"Multiple CollabSender*"
|
||||
OutboxItem426 outboxID _ _ <- lift $ getJust $ grantID
|
||||
actorID <- do
|
||||
mactor <- lift $ getKeyBy $ UniqueActorOutbox426 outboxID
|
||||
case mactor of
|
||||
Just a -> return a
|
||||
Nothing -> error "Outbox with no actor"
|
||||
guard $ repo426Actor repo == actorID
|
||||
return grantID
|
||||
case mgrant of
|
||||
Just grantID -> return grantID
|
||||
Nothing -> do
|
||||
actor <- getJust $ repo426Actor repo
|
||||
let doc = persistJSONObjectFromDoc $ Doc hLocal emptyActivity
|
||||
insert $ OutboxItem426 (actor426Outbox actor) doc defaultTime
|
||||
insert_ $ CollabTopicAccept426 collabID itemID
|
||||
|
||||
decks <- selectList [] [Asc CollabTopicLocalDeck426Id]
|
||||
for_ decks $ \ (Entity _ (CollabTopicLocalDeck426 collabID deckID)) -> do
|
||||
deck <- getJust deckID
|
||||
itemID <- do
|
||||
mgrant <- runMaybeT $ do
|
||||
CollabSenderLocal426 _ grantID <-
|
||||
MaybeT $ maybeRight <$>
|
||||
requireEitherAlt
|
||||
(getBy $ UniqueCollabSenderRemote426 collabID)
|
||||
(getValBy $ UniqueCollabSenderLocal426 collabID)
|
||||
"No CollabSender*"
|
||||
"Multiple CollabSender*"
|
||||
OutboxItem426 outboxID _ _ <- lift $ getJust $ grantID
|
||||
actorID <- do
|
||||
mactor <- lift $ getKeyBy $ UniqueActorOutbox426 outboxID
|
||||
case mactor of
|
||||
Just a -> return a
|
||||
Nothing -> error "Outbox with no actor"
|
||||
guard $ deck426Actor deck == actorID
|
||||
return grantID
|
||||
case mgrant of
|
||||
Just grantID -> return grantID
|
||||
Nothing -> do
|
||||
actor <- getJust $ deck426Actor deck
|
||||
let doc = persistJSONObjectFromDoc $ Doc hLocal emptyActivity
|
||||
insert $ OutboxItem426 (actor426Outbox actor) doc defaultTime
|
||||
insert_ $ CollabTopicAccept426 collabID itemID
|
||||
|
||||
looms <- selectList [] [Asc CollabTopicLocalLoom426Id]
|
||||
for_ looms $ \ (Entity _ (CollabTopicLocalLoom426 collabID loomID)) -> do
|
||||
loom <- getJust loomID
|
||||
itemID <- do
|
||||
mgrant <- runMaybeT $ do
|
||||
CollabSenderLocal426 _ grantID <-
|
||||
MaybeT $ maybeRight <$>
|
||||
requireEitherAlt
|
||||
(getBy $ UniqueCollabSenderRemote426 collabID)
|
||||
(getValBy $ UniqueCollabSenderLocal426 collabID)
|
||||
"No CollabSender*"
|
||||
"Multiple CollabSender*"
|
||||
OutboxItem426 outboxID _ _ <- lift $ getJust $ grantID
|
||||
actorID <- do
|
||||
mactor <- lift $ getKeyBy $ UniqueActorOutbox426 outboxID
|
||||
case mactor of
|
||||
Just a -> return a
|
||||
Nothing -> error "Outbox with no actor"
|
||||
guard $ loom426Actor loom == actorID
|
||||
return grantID
|
||||
case mgrant of
|
||||
Just grantID -> return grantID
|
||||
Nothing -> do
|
||||
actor <- getJust $ loom426Actor loom
|
||||
let doc = persistJSONObjectFromDoc $ Doc hLocal emptyActivity
|
||||
insert $ OutboxItem426 (actor426Outbox actor) doc defaultTime
|
||||
insert_ $ CollabTopicAccept426 collabID itemID
|
||||
]
|
||||
|
||||
migrateDB
|
||||
|
|
|
@ -623,3 +623,9 @@ makeEntitiesMigration "414"
|
|||
|
||||
makeEntitiesMigration "418"
|
||||
$(modelFile "migrations/418_2022-08-06_follow_actor.model")
|
||||
|
||||
model_425_collab_accept :: [Entity SqlBackend]
|
||||
model_425_collab_accept = $(schema "425_2022-08-21_collab_accept")
|
||||
|
||||
makeEntitiesMigration "426"
|
||||
$(modelFile "migrations/426_2022-08-21_collab_accept_mig.model")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue