mirror of
https://code.naskya.net/repos/ndqEd
synced 2025-01-10 21:56:46 +09:00
Verify TUP existence (when relevant) in all project-hosted ticket routes
This commit is contained in:
parent
bf4a0e4c95
commit
8f3ac50963
1 changed files with 60 additions and 197 deletions
|
@ -103,7 +103,7 @@ import Database.Persist.Sql.Graph.TransitiveReduction (trrFix)
|
||||||
import Data.Aeson.Encode.Pretty.ToEncoding
|
import Data.Aeson.Encode.Pretty.ToEncoding
|
||||||
import Data.MediaType
|
import Data.MediaType
|
||||||
import Network.FedURI
|
import Network.FedURI
|
||||||
import Web.ActivityPub hiding (Ticket (..), TicketDependency)
|
import Web.ActivityPub hiding (Ticket (..), Project, TicketDependency)
|
||||||
import Yesod.ActivityPub
|
import Yesod.ActivityPub
|
||||||
import Yesod.Auth.Unverified
|
import Yesod.Auth.Unverified
|
||||||
import Yesod.FedURI
|
import Yesod.FedURI
|
||||||
|
@ -266,6 +266,31 @@ getTicketNewR shr prj = do
|
||||||
((_result, widget), enctype) <- runFormPost $ newTicketForm wid
|
((_result, widget), enctype) <- runFormPost $ newTicketForm wid
|
||||||
defaultLayout $(widgetFile "ticket/new")
|
defaultLayout $(widgetFile "ticket/new")
|
||||||
|
|
||||||
|
getProjectTicket :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> AppDB (Entity Sharer, Entity Project, Entity Ticket, Entity LocalTicket, Entity TicketProjectLocal, Either (Entity TicketAuthorLocal) (Entity TicketAuthorRemote))
|
||||||
|
getProjectTicket shr prj ltkhid = do
|
||||||
|
es@(Entity sid _) <- getBy404 $ UniqueSharer shr
|
||||||
|
ej@(Entity jid _) <- getBy404 $ UniqueProject prj sid
|
||||||
|
ltid <- decodeKeyHashid404 ltkhid
|
||||||
|
lt <- get404 ltid
|
||||||
|
let tid = localTicketTicket lt
|
||||||
|
t <- get404 tid
|
||||||
|
etpl@(Entity tplid tpl) <- getBy404 $ UniqueTicketProjectLocal tid
|
||||||
|
unless (ticketProjectLocalProject tpl == jid) notFound
|
||||||
|
author <-
|
||||||
|
requireEitherAlt
|
||||||
|
(do mtal <- getBy $ UniqueTicketAuthorLocal ltid
|
||||||
|
for mtal $ \ tal@(Entity talid _) -> do
|
||||||
|
tupid1 <- getKeyBy404 $ UniqueTicketUnderProjectProject tplid
|
||||||
|
tupid2 <- getKeyBy404 $ UniqueTicketUnderProjectAuthor talid
|
||||||
|
unless (tupid1 == tupid2) $
|
||||||
|
error "TAL and TPL used by different TUPs!"
|
||||||
|
return tal
|
||||||
|
)
|
||||||
|
(getBy $ UniqueTicketAuthorRemote tplid)
|
||||||
|
"Ticket doesn't have author"
|
||||||
|
"Ticket has both local and remote author"
|
||||||
|
return (es, ej, Entity tid t, Entity ltid lt, etpl, author)
|
||||||
|
|
||||||
getTicketR :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler TypedContent
|
getTicketR :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler TypedContent
|
||||||
getTicketR shar proj ltkhid = do
|
getTicketR shar proj ltkhid = do
|
||||||
mpid <- maybeAuthId
|
mpid <- maybeAuthId
|
||||||
|
@ -273,43 +298,28 @@ getTicketR shar proj ltkhid = do
|
||||||
author, massignee, mcloser, ticket, lticket, tparams, eparams, cparams,
|
author, massignee, mcloser, ticket, lticket, tparams, eparams, cparams,
|
||||||
deps, rdeps) <-
|
deps, rdeps) <-
|
||||||
runDB $ do
|
runDB $ do
|
||||||
(jid, wshr, wid, wfl) <- do
|
(Entity sid sharer, Entity jid project, Entity tid ticket, Entity _ lticket, _etpl, author) <- getProjectTicket shar proj ltkhid
|
||||||
Entity s sharer <- getBy404 $ UniqueSharer shar
|
(wshr, wid, wfl) <- do
|
||||||
Entity p project <- getBy404 $ UniqueProject proj s
|
|
||||||
w <- get404 $ projectWorkflow project
|
w <- get404 $ projectWorkflow project
|
||||||
wsharer <-
|
wsharer <-
|
||||||
if workflowSharer w == s
|
if workflowSharer w == sid
|
||||||
then return sharer
|
then return sharer
|
||||||
else get404 $ workflowSharer w
|
else get404 $ workflowSharer w
|
||||||
return
|
return
|
||||||
( p
|
( sharerIdent wsharer
|
||||||
, sharerIdent wsharer
|
|
||||||
, projectWorkflow project
|
, projectWorkflow project
|
||||||
, workflowIdent w
|
, workflowIdent w
|
||||||
)
|
)
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
author' <-
|
||||||
lticket <- get404 ltid
|
case author of
|
||||||
let tid = localTicketTicket lticket
|
Left (Entity _ tal) -> Left <$> do
|
||||||
Entity tplid tpl <- getBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
author <-
|
|
||||||
requireEitherAlt
|
|
||||||
(do mtal <- getValBy $ UniqueTicketAuthorLocal ltid
|
|
||||||
for mtal $ \ tal -> do
|
|
||||||
_ <- getBy404 $ UniqueTicketUnderProjectProject tplid
|
|
||||||
p <- getJust $ ticketAuthorLocalAuthor tal
|
p <- getJust $ ticketAuthorLocalAuthor tal
|
||||||
getJust $ personIdent p
|
getJust $ personIdent p
|
||||||
)
|
Right (Entity _ tar) -> Right <$> do
|
||||||
(do mtar <- getValBy $ UniqueTicketAuthorRemote tplid
|
|
||||||
for mtar $ \ tar -> do
|
|
||||||
ra <- getJust $ ticketAuthorRemoteAuthor tar
|
ra <- getJust $ ticketAuthorRemoteAuthor tar
|
||||||
ro <- getJust $ remoteActorIdent ra
|
ro <- getJust $ remoteActorIdent ra
|
||||||
i <- getJust $ remoteObjectInstance ro
|
i <- getJust $ remoteObjectInstance ro
|
||||||
return (i, ro, ra)
|
return (i, ro, ra)
|
||||||
)
|
|
||||||
"Ticket doesn't have author"
|
|
||||||
"Ticket has both local and remote author"
|
|
||||||
ticket <- get404 tid
|
|
||||||
massignee <- for (ticketAssignee ticket) $ \ apid -> do
|
massignee <- for (ticketAssignee ticket) $ \ apid -> do
|
||||||
person <- get404 apid
|
person <- get404 apid
|
||||||
sharer <- get404 $ personIdent person
|
sharer <- get404 $ personIdent person
|
||||||
|
@ -341,7 +351,7 @@ getTicketR shar proj ltkhid = do
|
||||||
return (lt E.^. LocalTicketId, t)
|
return (lt E.^. LocalTicketId, t)
|
||||||
return
|
return
|
||||||
( wshr, wfl
|
( wshr, wfl
|
||||||
, author, massignee, mcloser, ticket, lticket
|
, author', massignee, mcloser, ticket, lticket
|
||||||
, tparams, eparams, cparams
|
, tparams, eparams, cparams
|
||||||
, deps, rdeps
|
, deps, rdeps
|
||||||
)
|
)
|
||||||
|
@ -418,14 +428,7 @@ getTicketR shar proj ltkhid = do
|
||||||
putTicketR :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
putTicketR :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
putTicketR shr prj ltkhid = do
|
putTicketR shr prj ltkhid = do
|
||||||
(tid, ticket, wid) <- runDB $ do
|
(tid, ticket, wid) <- runDB $ do
|
||||||
Entity sid _sharer <- getBy404 $ UniqueSharer shr
|
(_es, Entity _ project, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity pid project <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == pid) notFound
|
|
||||||
return (tid, ticket, projectWorkflow project)
|
return (tid, ticket, projectWorkflow project)
|
||||||
((result, widget), enctype) <-
|
((result, widget), enctype) <-
|
||||||
runFormPost $ editTicketContentForm tid ticket wid
|
runFormPost $ editTicketContentForm tid ticket wid
|
||||||
|
@ -499,14 +502,7 @@ postTicketR shr prj ltkhid = do
|
||||||
getTicketEditR :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
getTicketEditR :: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
getTicketEditR shr prj ltkhid = do
|
getTicketEditR shr prj ltkhid = do
|
||||||
(tid, ticket, wid) <- runDB $ do
|
(tid, ticket, wid) <- runDB $ do
|
||||||
Entity sid _sharer <- getBy404 $ UniqueSharer shr
|
(_es, Entity _ project, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity pid project <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == pid) notFound
|
|
||||||
return (tid, ticket, projectWorkflow project)
|
return (tid, ticket, projectWorkflow project)
|
||||||
((_result, widget), enctype) <-
|
((_result, widget), enctype) <-
|
||||||
runFormPost $ editTicketContentForm tid ticket wid
|
runFormPost $ editTicketContentForm tid ticket wid
|
||||||
|
@ -516,16 +512,7 @@ postTicketAcceptR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
postTicketAcceptR shr prj ltkhid = do
|
postTicketAcceptR shr prj ltkhid = do
|
||||||
succ <- runDB $ do
|
succ <- runDB $ do
|
||||||
Entity tid ticket <- do
|
(_es, _ej, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity p _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == p) notFound
|
|
||||||
return $ Entity tid ticket
|
|
||||||
case ticketStatus ticket of
|
case ticketStatus ticket of
|
||||||
TSNew -> do
|
TSNew -> do
|
||||||
update tid [TicketStatus =. TSTodo]
|
update tid [TicketStatus =. TSTodo]
|
||||||
|
@ -543,16 +530,7 @@ postTicketCloseR shr prj ltkhid = do
|
||||||
pid <- requireAuthId
|
pid <- requireAuthId
|
||||||
now <- liftIO getCurrentTime
|
now <- liftIO getCurrentTime
|
||||||
succ <- runDB $ do
|
succ <- runDB $ do
|
||||||
Entity tid ticket <- do
|
(_es, _ej, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity p _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == p) notFound
|
|
||||||
return $ Entity tid ticket
|
|
||||||
case ticketStatus ticket of
|
case ticketStatus ticket of
|
||||||
TSClosed -> return False
|
TSClosed -> return False
|
||||||
_ -> do
|
_ -> do
|
||||||
|
@ -575,16 +553,7 @@ postTicketOpenR shr prj ltkhid = do
|
||||||
pid <- requireAuthId
|
pid <- requireAuthId
|
||||||
now <- liftIO getCurrentTime
|
now <- liftIO getCurrentTime
|
||||||
succ <- runDB $ do
|
succ <- runDB $ do
|
||||||
Entity tid ticket <- do
|
(_es, _ej, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity p _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == p) notFound
|
|
||||||
return $ Entity tid ticket
|
|
||||||
case ticketStatus ticket of
|
case ticketStatus ticket of
|
||||||
TSClosed -> do
|
TSClosed -> do
|
||||||
update tid
|
update tid
|
||||||
|
@ -604,16 +573,7 @@ postTicketClaimR
|
||||||
postTicketClaimR shr prj ltkhid = do
|
postTicketClaimR shr prj ltkhid = do
|
||||||
pid <- requireAuthId
|
pid <- requireAuthId
|
||||||
mmsg <- runDB $ do
|
mmsg <- runDB $ do
|
||||||
Entity tid ticket <- do
|
(_es, _ej, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity p _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == p) notFound
|
|
||||||
return $ Entity tid ticket
|
|
||||||
case (ticketStatus ticket, ticketAssignee ticket) of
|
case (ticketStatus ticket, ticketAssignee ticket) of
|
||||||
(TSNew, _) ->
|
(TSNew, _) ->
|
||||||
return $
|
return $
|
||||||
|
@ -635,16 +595,7 @@ postTicketUnclaimR
|
||||||
postTicketUnclaimR shr prj ltkhid = do
|
postTicketUnclaimR shr prj ltkhid = do
|
||||||
pid <- requireAuthId
|
pid <- requireAuthId
|
||||||
mmsg <- runDB $ do
|
mmsg <- runDB $ do
|
||||||
Entity tid ticket <- do
|
(_es, _ej, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity p _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == p) notFound
|
|
||||||
return $ Entity tid ticket
|
|
||||||
case ((== pid) <$> ticketAssignee ticket, ticketStatus ticket) of
|
case ((== pid) <$> ticketAssignee ticket, ticketStatus ticket) of
|
||||||
(Nothing, _) ->
|
(Nothing, _) ->
|
||||||
return $ Just "The ticket is already unassigned."
|
return $ Just "The ticket is already unassigned."
|
||||||
|
@ -668,16 +619,7 @@ getTicketAssignR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
getTicketAssignR shr prj ltkhid = do
|
getTicketAssignR shr prj ltkhid = do
|
||||||
vpid <- requireAuthId
|
vpid <- requireAuthId
|
||||||
(jid, Entity tid ticket) <- runDB $ do
|
(_es, Entity jid _, Entity tid ticket, _elt, _etpl, _author) <- runDB $ getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity j _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == j) notFound
|
|
||||||
return (j, Entity tid ticket)
|
|
||||||
let msg t = do
|
let msg t = do
|
||||||
setMessage t
|
setMessage t
|
||||||
redirect $ TicketR shr prj ltkhid
|
redirect $ TicketR shr prj ltkhid
|
||||||
|
@ -694,16 +636,7 @@ postTicketAssignR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
postTicketAssignR shr prj ltkhid = do
|
postTicketAssignR shr prj ltkhid = do
|
||||||
vpid <- requireAuthId
|
vpid <- requireAuthId
|
||||||
(jid, Entity tid ticket) <- runDB $ do
|
(_es, Entity jid _, Entity tid ticket, _elt, _etpl, _author) <- runDB $ getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity j _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == j) notFound
|
|
||||||
return (j, Entity tid ticket)
|
|
||||||
let msg t = do
|
let msg t = do
|
||||||
setMessage t
|
setMessage t
|
||||||
redirect $ TicketR shr prj ltkhid
|
redirect $ TicketR shr prj ltkhid
|
||||||
|
@ -735,16 +668,7 @@ postTicketUnassignR
|
||||||
postTicketUnassignR shr prj ltkhid = do
|
postTicketUnassignR shr prj ltkhid = do
|
||||||
pid <- requireAuthId
|
pid <- requireAuthId
|
||||||
mmsg <- runDB $ do
|
mmsg <- runDB $ do
|
||||||
Entity tid ticket <- do
|
(_es, _ej, Entity tid ticket, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity p _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
ticket <- getJust tid
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == p) notFound
|
|
||||||
return $ Entity tid ticket
|
|
||||||
case ((== pid) <$> ticketAssignee ticket, ticketStatus ticket) of
|
case ((== pid) <$> ticketAssignee ticket, ticketStatus ticket) of
|
||||||
(Nothing, _) ->
|
(Nothing, _) ->
|
||||||
return $ Just "The ticket is already unassigned."
|
return $ Just "The ticket is already unassigned."
|
||||||
|
@ -823,13 +747,7 @@ getClaimRequestsTicketR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
getClaimRequestsTicketR shr prj ltkhid = do
|
getClaimRequestsTicketR shr prj ltkhid = do
|
||||||
rqs <- runDB $ do
|
rqs <- runDB $ do
|
||||||
Entity sid _ <- getBy404 $ UniqueSharer shr
|
(_es, _ej, Entity tid _, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity jid _ <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
E.select $ E.from $ \ (tcr `E.InnerJoin` person `E.InnerJoin` sharer) -> do
|
E.select $ E.from $ \ (tcr `E.InnerJoin` person `E.InnerJoin` sharer) -> do
|
||||||
E.on $ person E.^. PersonIdent E.==. sharer E.^. SharerId
|
E.on $ person E.^. PersonIdent E.==. sharer E.^. SharerId
|
||||||
E.on $ tcr E.^. TicketClaimRequestPerson E.==. person E.^. PersonId
|
E.on $ tcr E.^. TicketClaimRequestPerson E.==. person E.^. PersonId
|
||||||
|
@ -853,15 +771,7 @@ postClaimRequestsTicketR shr prj ltkhid = do
|
||||||
now <- liftIO getCurrentTime
|
now <- liftIO getCurrentTime
|
||||||
pid <- requireAuthId
|
pid <- requireAuthId
|
||||||
runDB $ do
|
runDB $ do
|
||||||
tid <- do
|
(_es, _ej, Entity tid _, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity s _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity j _ <- getBy404 $ UniqueProject prj s
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == j) notFound
|
|
||||||
return tid
|
|
||||||
let cr = TicketClaimRequest
|
let cr = TicketClaimRequest
|
||||||
{ ticketClaimRequestPerson = pid
|
{ ticketClaimRequestPerson = pid
|
||||||
, ticketClaimRequestTicket = tid
|
, ticketClaimRequestTicket = tid
|
||||||
|
@ -881,13 +791,7 @@ postClaimRequestsTicketR shr prj ltkhid = do
|
||||||
selectDiscussionId
|
selectDiscussionId
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> AppDB DiscussionId
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> AppDB DiscussionId
|
||||||
selectDiscussionId shr prj ltkhid = do
|
selectDiscussionId shr prj ltkhid = do
|
||||||
Entity sid _sharer <- getBy404 $ UniqueSharer shr
|
(_es, _ej, _et, Entity _ lticket, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity jid _project <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
return $ localTicketDiscuss lticket
|
return $ localTicketDiscuss lticket
|
||||||
|
|
||||||
getTicketDiscussionR
|
getTicketDiscussionR
|
||||||
|
@ -974,13 +878,7 @@ getTicketDeps forward shr prj ltkhid = do
|
||||||
if forward then TicketDependencyParent else TicketDependencyChild
|
if forward then TicketDependencyParent else TicketDependencyChild
|
||||||
to' =
|
to' =
|
||||||
if forward then TicketDependencyChild else TicketDependencyParent
|
if forward then TicketDependencyChild else TicketDependencyParent
|
||||||
Entity sid _ <- getBy404 $ UniqueSharer shr
|
(_es, _ej, Entity tid _, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
Entity jid _ <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
fmap (map toRow) $ E.select $ E.from $
|
fmap (map toRow) $ E.select $ E.from $
|
||||||
\ ( td
|
\ ( td
|
||||||
`E.InnerJoin` t
|
`E.InnerJoin` t
|
||||||
|
@ -1050,15 +948,7 @@ getTicketDepsR = getTicketDeps True
|
||||||
postTicketDepsR
|
postTicketDepsR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
postTicketDepsR shr prj ltkhid = do
|
postTicketDepsR shr prj ltkhid = do
|
||||||
(jid, tid) <- runDB $ do
|
(_es, Entity jid _, Entity tid _, _elt, _etpl, _author) <- runDB $ getProjectTicket shr prj ltkhid
|
||||||
Entity sid _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity jid _ <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
return (jid, tid)
|
|
||||||
((result, widget), enctype) <- runFormPost $ ticketDepForm jid tid
|
((result, widget), enctype) <- runFormPost $ ticketDepForm jid tid
|
||||||
case result of
|
case result of
|
||||||
FormSuccess ctid -> do
|
FormSuccess ctid -> do
|
||||||
|
@ -1086,15 +976,7 @@ postTicketDepsR shr prj ltkhid = do
|
||||||
getTicketDepNewR
|
getTicketDepNewR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler Html
|
||||||
getTicketDepNewR shr prj ltkhid = do
|
getTicketDepNewR shr prj ltkhid = do
|
||||||
(jid, tid) <- runDB $ do
|
(_es, Entity jid _, Entity tid _, _elt, _etpl, _author) <- runDB $ getProjectTicket shr prj ltkhid
|
||||||
Entity sid _ <- getBy404 $ UniqueSharer shr
|
|
||||||
Entity jid _ <- getBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lticket <- get404 ltid
|
|
||||||
let tid = localTicketTicket lticket
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
return (jid, tid)
|
|
||||||
((_result, widget), enctype) <- runFormPost $ ticketDepForm jid tid
|
((_result, widget), enctype) <- runFormPost $ ticketDepForm jid tid
|
||||||
defaultLayout $(widgetFile "ticket/dep/new")
|
defaultLayout $(widgetFile "ticket/dep/new")
|
||||||
|
|
||||||
|
@ -1110,14 +992,7 @@ deleteTicketDepOldR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> KeyHashid LocalTicket -> Handler Html
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> KeyHashid LocalTicket -> Handler Html
|
||||||
deleteTicketDepOldR shr prj pnum cnum = do
|
deleteTicketDepOldR shr prj pnum cnum = do
|
||||||
runDB $ do
|
runDB $ do
|
||||||
Entity sid _ <- getBy404 $ UniqueSharer shr
|
(_es, Entity jid _, Entity ptid _, _elt, _etpl, _author) <- getProjectTicket shr prj pnum
|
||||||
Entity jid _ <- getBy404 $ UniqueProject prj sid
|
|
||||||
|
|
||||||
pltid <- decodeKeyHashid404 pnum
|
|
||||||
plt <- get404 pltid
|
|
||||||
let ptid = localTicketTicket plt
|
|
||||||
ptpl <- getValBy404 $ UniqueTicketProjectLocal ptid
|
|
||||||
unless (ticketProjectLocalProject ptpl == jid) notFound
|
|
||||||
|
|
||||||
cltid <- decodeKeyHashid404 cnum
|
cltid <- decodeKeyHashid404 cnum
|
||||||
clt <- get404 cltid
|
clt <- get404 cltid
|
||||||
|
@ -1194,26 +1069,14 @@ getTicketParticipantsR shr prj ltkhid = getFollowersCollection here getFsid
|
||||||
where
|
where
|
||||||
here = TicketParticipantsR shr prj ltkhid
|
here = TicketParticipantsR shr prj ltkhid
|
||||||
getFsid = do
|
getFsid = do
|
||||||
sid <- getKeyBy404 $ UniqueSharer shr
|
(_es, _ej, _et, Entity _ lt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
jid <- getKeyBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lt <- get404 ltid
|
|
||||||
let tid = localTicketTicket lt
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
return $ localTicketFollowers lt
|
return $ localTicketFollowers lt
|
||||||
|
|
||||||
getTicketTeamR
|
getTicketTeamR
|
||||||
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler TypedContent
|
:: ShrIdent -> PrjIdent -> KeyHashid LocalTicket -> Handler TypedContent
|
||||||
getTicketTeamR shr prj ltkhid = do
|
getTicketTeamR shr prj ltkhid = do
|
||||||
memberShrs <- runDB $ do
|
memberShrs <- runDB $ do
|
||||||
sid <- getKeyBy404 $ UniqueSharer shr
|
(Entity sid _, _ej, _et, _elt, _etpl, _author) <- getProjectTicket shr prj ltkhid
|
||||||
jid <- getKeyBy404 $ UniqueProject prj sid
|
|
||||||
ltid <- decodeKeyHashid404 ltkhid
|
|
||||||
lt <- get404 ltid
|
|
||||||
let tid = localTicketTicket lt
|
|
||||||
tpl <- getValBy404 $ UniqueTicketProjectLocal tid
|
|
||||||
unless (ticketProjectLocalProject tpl == jid) notFound
|
|
||||||
id_ <-
|
id_ <-
|
||||||
requireEitherAlt
|
requireEitherAlt
|
||||||
(getKeyBy $ UniquePersonIdent sid)
|
(getKeyBy $ UniquePersonIdent sid)
|
||||||
|
|
Loading…
Reference in a new issue