2015-08-29 14:58:47 +02:00
|
|
|
module Handler.CreateChallenge where
|
|
|
|
|
|
|
|
import Import
|
|
|
|
import Yesod.Form.Bootstrap3 (BootstrapFormLayout (..), renderBootstrap3,
|
|
|
|
withSmallInput)
|
|
|
|
|
2015-08-29 18:24:01 +02:00
|
|
|
import Handler.Shared
|
2015-09-04 15:10:47 +02:00
|
|
|
import Handler.Extract
|
|
|
|
|
|
|
|
import System.Directory (doesFileExist)
|
|
|
|
import qualified Data.Text as T
|
2015-08-29 18:24:01 +02:00
|
|
|
|
2015-08-29 14:58:47 +02:00
|
|
|
getCreateChallengeR :: Handler Html
|
|
|
|
getCreateChallengeR = do
|
|
|
|
(formWidget, formEnctype) <- generateFormPost sampleForm
|
|
|
|
let submission = Nothing :: Maybe (FileInfo, Text)
|
|
|
|
handlerName = "getCreateChallengeR" :: Text
|
|
|
|
defaultLayout $ do
|
|
|
|
aDomId <- newIdent
|
|
|
|
setTitle "Welcome To Yesod!"
|
|
|
|
$(widgetFile "create-challenge")
|
|
|
|
|
2015-08-29 18:24:01 +02:00
|
|
|
postCreateChallengeR :: Handler TypedContent
|
2015-08-29 14:58:47 +02:00
|
|
|
postCreateChallengeR = do
|
|
|
|
((result, formWidget), formEnctype) <- runFormPost sampleForm
|
|
|
|
let handlerName = "postCreateChallengeR" :: Text
|
|
|
|
challengeData = case result of
|
|
|
|
FormSuccess res -> Just res
|
|
|
|
_ -> Nothing
|
2015-08-29 22:19:44 +02:00
|
|
|
Just (name, publicUrl, publicBranch, privateUrl, privateBranch) = challengeData
|
2015-08-29 14:58:47 +02:00
|
|
|
|
2015-09-04 06:47:49 +02:00
|
|
|
runViewProgress $ doCreateChallenge name publicUrl publicBranch privateUrl privateBranch
|
|
|
|
|
|
|
|
doCreateChallenge :: Text -> Text -> Text -> Text -> Text -> Channel -> Handler ()
|
|
|
|
doCreateChallenge name publicUrl publicBranch privateUrl privateBranch chan = do
|
|
|
|
maybePublicRepoId <- cloneRepo publicUrl publicBranch chan
|
|
|
|
case maybePublicRepoId of
|
|
|
|
Just publicRepoId -> do
|
|
|
|
maybePrivateRepoId <- cloneRepo privateUrl privateBranch chan
|
2015-09-04 10:16:12 +02:00
|
|
|
case maybePrivateRepoId of
|
|
|
|
Just privateRepoId -> addChallenge name publicRepoId privateRepoId chan
|
|
|
|
Nothing -> return ()
|
2015-09-04 06:47:49 +02:00
|
|
|
Nothing -> return ()
|
2015-08-29 14:58:47 +02:00
|
|
|
|
2015-09-04 10:16:12 +02:00
|
|
|
addChallenge :: Text -> (Key Repo) -> (Key Repo) -> Channel -> Handler ()
|
|
|
|
addChallenge name publicRepoId privateRepoId chan = do
|
|
|
|
msg chan "adding challenge..."
|
2015-09-04 15:10:47 +02:00
|
|
|
let publicRepoDir = getRepoDir publicRepoId
|
|
|
|
let readmeFilePath = publicRepoDir </> readmeFile
|
|
|
|
doesReadmeExist <- liftIO $ doesFileExist readmeFilePath
|
|
|
|
(title, description) <- if doesReadmeExist
|
|
|
|
then
|
|
|
|
liftIO $ extractTitleAndDescription readmeFilePath
|
|
|
|
else do
|
|
|
|
err chan "README was not found"
|
|
|
|
return (defaultTitle, defaultDescription)
|
2015-09-04 10:16:12 +02:00
|
|
|
time <- liftIO getCurrentTime
|
|
|
|
challengeId <- runDB $ insert $ Challenge {
|
|
|
|
challengePublicRepo=publicRepoId,
|
|
|
|
challengePrivateRepo=privateRepoId,
|
|
|
|
challengeName=name,
|
2015-09-04 15:10:47 +02:00
|
|
|
challengeTitle=(T.pack $ title),
|
|
|
|
challengeDescription=(T.pack $ description),
|
2015-09-04 10:16:12 +02:00
|
|
|
challengeStamp=time}
|
|
|
|
return ()
|
|
|
|
|
|
|
|
|
2015-08-29 14:58:47 +02:00
|
|
|
sampleForm :: Form (Text, Text, Text, Text, Text)
|
|
|
|
sampleForm = renderBootstrap3 BootstrapBasicForm $ (,,,,)
|
|
|
|
<$> areq textField (fieldSettingsLabel MsgName) Nothing
|
|
|
|
<*> areq textField (fieldSettingsLabel MsgPublicUrl) Nothing
|
|
|
|
<*> areq textField (fieldSettingsLabel MsgBranch) Nothing
|
|
|
|
<*> areq textField (fieldSettingsLabel MsgPrivateUrl) Nothing
|
|
|
|
<*> areq textField (fieldSettingsLabel MsgBranch) Nothing
|