forked from filipg/gonito
Add proper end-point for challenge images
Also, fix bug in Swagger documentation
This commit is contained in:
parent
3a276bbc9e
commit
0c9a21c40b
@ -217,7 +217,7 @@ instance Yesod App where
|
|||||||
isAuthorized (ResetPasswordR _) _ = return Authorized
|
isAuthorized (ResetPasswordR _) _ = return Authorized
|
||||||
isAuthorized (ToggleSubmissionTagR _) _ = regularAuthorization
|
isAuthorized (ToggleSubmissionTagR _) _ = regularAuthorization
|
||||||
|
|
||||||
isAuthorized (ChallengeImageR _) _ = regularAuthorization
|
isAuthorized (ChallengeImgR _) _ = regularAuthorization
|
||||||
|
|
||||||
isAuthorized (ApiTxtScoreR _) _ = return Authorized
|
isAuthorized (ApiTxtScoreR _) _ = return Authorized
|
||||||
|
|
||||||
|
@ -59,9 +59,9 @@ getListArchivedChallengesR :: Handler Html
|
|||||||
getListArchivedChallengesR = generalListChallenges [ChallengeArchived ==. Just True]
|
getListArchivedChallengesR = generalListChallenges [ChallengeArchived ==. Just True]
|
||||||
|
|
||||||
imageUrl :: Entity Challenge -> Maybe (Route App)
|
imageUrl :: Entity Challenge -> Maybe (Route App)
|
||||||
imageUrl (Entity challengeId challenge) =
|
imageUrl (Entity _ challenge) =
|
||||||
case challengeImage challenge of
|
case challengeImage challenge of
|
||||||
Just _ -> Just $ ChallengeImageR challengeId
|
Just _ -> Just $ ChallengeImgR $ challengeName challenge
|
||||||
Nothing -> Nothing
|
Nothing -> Nothing
|
||||||
|
|
||||||
instance ToJSON (Entity Challenge) where
|
instance ToJSON (Entity Challenge) where
|
||||||
@ -134,8 +134,7 @@ instance ToJSON (Entity Version) where
|
|||||||
instance ToSchema (Entity Version) where
|
instance ToSchema (Entity Version) where
|
||||||
declareNamedSchema _ = do
|
declareNamedSchema _ = do
|
||||||
stringSchema <- declareSchemaRef (Proxy :: Proxy String)
|
stringSchema <- declareSchemaRef (Proxy :: Proxy String)
|
||||||
booleanSchema <- declareSchemaRef (Proxy :: Proxy Bool)
|
return $ NamedSchema (Just "Version") $ mempty
|
||||||
return $ NamedSchema (Just "Challenge") $ mempty
|
|
||||||
& type_ .~ SwaggerObject
|
& type_ .~ SwaggerObject
|
||||||
& properties .~
|
& properties .~
|
||||||
fromList [ ("deadline", stringSchema)
|
fromList [ ("deadline", stringSchema)
|
||||||
@ -176,11 +175,36 @@ getVersionInfoJsonR versionHash = do
|
|||||||
return $ toJSON theVersion
|
return $ toJSON theVersion
|
||||||
|
|
||||||
|
|
||||||
getChallengeImageR :: ChallengeId -> Handler Html
|
getChallengeImgR :: Text -> Handler Html
|
||||||
getChallengeImageR challengeId = do
|
getChallengeImgR chName = do
|
||||||
challenge <- runDB $ get404 challengeId
|
(Entity _ challenge) <- runDB $ getBy404 $ UniqueName chName
|
||||||
case challengeImage challenge of
|
case challengeImage challenge of
|
||||||
Just image -> do
|
Just image -> do
|
||||||
addHeader "Content-Disposition" "attachment; filename=\"image.png\""
|
addHeader "Content-Disposition" "attachment; filename=\"image.png\""
|
||||||
sendResponse (typePng, toContent image)
|
sendResponse (typePng, toContent image)
|
||||||
Nothing -> sendResponseStatus status202 ()
|
Nothing -> sendResponseStatus status202 ()
|
||||||
|
|
||||||
|
|
||||||
|
declareChallengeImgSwagger :: Declare (Definitions Schema) Swagger
|
||||||
|
declareChallengeImgSwagger = do
|
||||||
|
-- param schemas
|
||||||
|
let challengeNameSchema = toParamSchema (Proxy :: Proxy String)
|
||||||
|
|
||||||
|
return $ mempty
|
||||||
|
& paths .~
|
||||||
|
[ ("/api/challenge-img/{challengeName}",
|
||||||
|
mempty & get ?~ (mempty
|
||||||
|
& parameters .~ [ Inline $ mempty
|
||||||
|
& name .~ "challengeName"
|
||||||
|
& required ?~ True
|
||||||
|
& schema .~ ParamOther (mempty
|
||||||
|
& in_ .~ ParamPath
|
||||||
|
& paramSchema .~ challengeNameSchema) ]
|
||||||
|
& produces ?~ MimeList ["image/png"]
|
||||||
|
& description ?~ "Return the main image for a challenge"))
|
||||||
|
]
|
||||||
|
|
||||||
|
challengeImgApi :: Swagger
|
||||||
|
challengeImgApi = spec & definitions .~ defs
|
||||||
|
where
|
||||||
|
(defs, spec) = runDeclare declareChallengeImgSwagger mempty
|
||||||
|
@ -29,6 +29,7 @@ apiDescription = generalApi
|
|||||||
<> versionInfoApi
|
<> versionInfoApi
|
||||||
<> listTagsApi
|
<> listTagsApi
|
||||||
<> myTeamsApi
|
<> myTeamsApi
|
||||||
|
<> challengeImgApi
|
||||||
|
|
||||||
generalApi :: Swagger
|
generalApi :: Swagger
|
||||||
generalApi = (mempty :: Swagger)
|
generalApi = (mempty :: Swagger)
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
/api/add-user AddUserR GET
|
/api/add-user AddUserR GET
|
||||||
/api/challenge-submission/#Text ChallengeSubmissionJsonR POST
|
/api/challenge-submission/#Text ChallengeSubmissionJsonR POST
|
||||||
/api/challenge-readme/#Text/markdown ChallengeReadmeInMarkdownR GET
|
/api/challenge-readme/#Text/markdown ChallengeReadmeInMarkdownR GET
|
||||||
/api/challenge-image/#ChallengeId ChallengeImageR GET
|
/api/challenge-img/#Text ChallengeImgR GET
|
||||||
/api/query/#Text QueryJsonR GET
|
/api/query/#Text QueryJsonR GET
|
||||||
/api/challenge-info/#Text ChallengeInfoJsonR GET
|
/api/challenge-info/#Text ChallengeInfoJsonR GET
|
||||||
/api/version-info/#Text VersionInfoJsonR GET
|
/api/version-info/#Text VersionInfoJsonR GET
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
$forall (Entity challengeId challenge) <- challenges
|
$forall (Entity _ challenge) <- challenges
|
||||||
<div class="panel panel-success">
|
<div class="panel panel-success">
|
||||||
<div class="panel-heading"><a .challenge-link href="@{ShowChallengeR (challengeName challenge)}">#{challengeTitle challenge}</a>
|
<div class="panel-heading"><a .challenge-link href="@{ShowChallengeR (challengeName challenge)}">#{challengeTitle challenge}</a>
|
||||||
$if challengeStarred challenge
|
$if challengeStarred challenge
|
||||||
\ <span class="glyphicon glyphicon-star-empty"></span>
|
\ <span class="glyphicon glyphicon-star-empty"></span>
|
||||||
$if isJust (challengeImage challenge)
|
$if isJust (challengeImage challenge)
|
||||||
<div class="panel-body" style="background-image:url(@{ChallengeImageR challengeId}); background-color:lightgrey; background-blend-mode:screen;background-size: 100%;">#{challengeDescription challenge}
|
<div class="panel-body" style="background-image:url(@{ChallengeImgR $ challengeName challenge}); background-color:lightgrey; background-blend-mode:screen;background-size: 100%;">#{challengeDescription challenge}
|
||||||
$else
|
$else
|
||||||
<div class="panel-body">#{challengeDescription challenge}
|
<div class="panel-body">#{challengeDescription challenge}
|
||||||
|
Loading…
Reference in New Issue
Block a user