Clean up Swagger documentation, enhance properties

Breaking change: "version" property for leaderboard entry is a list of
integers now
This commit is contained in:
Filip Gralinski 2021-05-29 18:40:13 +02:00
parent 387ffae20d
commit 30c7727d6a
2 changed files with 68 additions and 18 deletions

View File

@ -520,14 +520,20 @@ gatherSHA1ForCollectionOfFiles files = do
contentss <- mapM readFile $ sort files contentss <- mapM readFile $ sort files
return $ CHS.finalize $ foldl' CHS.update CHS.init contentss return $ CHS.finalize $ foldl' CHS.update CHS.init contentss
anonymizedLabel :: Text
anonymizedLabel = "[anonymized]"
nameNotGivenLabel :: Text
nameNotGivenLabel = "[name not given]"
formatSubmitter :: User -> Text formatSubmitter :: User -> Text
formatSubmitter user = if userIsAnonymous user formatSubmitter user = if userIsAnonymous user
then then
"[anonymised]" anonymizedLabel
else else
case userName user of case userName user of
Just name -> name Just name -> name
Nothing -> "[name not given]" Nothing -> nameNotGivenLabel
fieldWithTooltip :: forall master msg msg1. (RenderMessage master msg, RenderMessage master msg1) => msg -> msg1 -> FieldSettings master fieldWithTooltip :: forall master msg msg1. (RenderMessage master msg, RenderMessage master msg1) => msg -> msg1 -> FieldSettings master
fieldWithTooltip name tooltip = (bfs name) { fsTooltip = Just $ SomeMessage tooltip } fieldWithTooltip name tooltip = (bfs name) { fsTooltip = Just $ SomeMessage tooltip }

View File

@ -75,7 +75,7 @@ instance ToJSON LeaderboardEntry where
[ "submitter" .= (formatSubmitter $ leaderboardUser entry) [ "submitter" .= (formatSubmitter $ leaderboardUser entry)
, "team" .= (teamIdent <$> entityVal <$> leaderboardTeam entry) , "team" .= (teamIdent <$> entityVal <$> leaderboardTeam entry)
, "when" .= (submissionStamp $ leaderboardBestSubmission entry) , "when" .= (submissionStamp $ leaderboardBestSubmission entry)
, "version" .= (formatVersion $ leaderboardVersion entry) , "version" .= leaderboardVersion entry
, "description" .= descriptionToBeShown (leaderboardBestSubmission entry) , "description" .= descriptionToBeShown (leaderboardBestSubmission entry)
(leaderboardBestVariant entry) (leaderboardBestVariant entry)
(leaderboardParams entry) (leaderboardParams entry)
@ -84,6 +84,8 @@ instance ToJSON LeaderboardEntry where
, "isPublic" .= (submissionIsPublic $ leaderboardBestSubmission entry) , "isPublic" .= (submissionIsPublic $ leaderboardBestSubmission entry)
, "isReevaluable" .= (leaderboardIsReevaluable entry) , "isReevaluable" .= (leaderboardIsReevaluable entry)
, "isVisible" .= (leaderboardIsVisible entry) , "isVisible" .= (leaderboardIsVisible entry)
, "id" .= (leaderboardBestSubmissionId entry)
, "variant" .= (leaderboardBestVariantId entry)
] ]
declareLeaderboardSwagger :: Declare (Definitions Schema) Swagger declareLeaderboardSwagger :: Declare (Definitions Schema) Swagger
@ -155,6 +157,44 @@ addJsonKey :: Text -> Value -> Value -> Value
addJsonKey key val (Object xs) = Object $ HMS.insert key val xs addJsonKey key val (Object xs) = Object $ HMS.insert key val xs
addJsonKey _ _ xs = xs addJsonKey _ _ xs = xs
-- Helper definitions for properties used in more than one place
isVisibleSchema :: Referenced Schema
isVisibleSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy Bool)
& description .~ Just "Whether the details of the submissions are visible (i.e. either the submission is public or the user has the right permissions)"
isPublicSchema :: Referenced Schema
isPublicSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy Bool)
& description .~ Just "Whether the submissions is public (i.e. whether its details are available to everyone)"
hashSchema :: Referenced Schema
hashSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy String)
& description .~ Just "Git SHA1 commit hash; could be used as an argument for queries (if the submission is visible)"
& example .~ Just "ec41f0e2636bfedbd765c9871c813f7c5b896c51"
versionSchema :: Referenced Schema
versionSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy [Int])
& description .~ Just "Challenge version under which the submission was done"
& example .~ Just (toJSON [2 :: Int, 0, 1])
submitterSchema :: Referenced Schema
submitterSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy String)
& description .~ Just ("Name of the submitter, might be a special value in square brackets, e.g. " <> anonymizedLabel <> " or " <> nameNotGivenLabel)
& example .~ Just "John Smith"
submissionIdSchema :: Referenced Schema
submissionIdSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy Int)
& description .~ Just "Internal database identifier of the submission"
& example .~ Just(toJSON (42 :: Int))
variantIdSchema :: Referenced Schema
variantIdSchema = Inline $ toSchema (DPR.Proxy :: DPR.Proxy Int)
& description .~ Just "Internal database identifier of the submission variant"
& example .~ Just (toJSON (53 :: Int))
instance ToJSON LeaderboardEntryView where instance ToJSON LeaderboardEntryView where
toJSON v = addJsonKey "evaluations" toJSON v = addJsonKey "evaluations"
(toJSON $ leaderboardEntryViewEvaluations v) (toJSON $ leaderboardEntryViewEvaluations v)
@ -163,23 +203,28 @@ instance ToJSON LeaderboardEntryView where
instance ToSchema LeaderboardEntryView where instance ToSchema LeaderboardEntryView where
declareNamedSchema _ = do declareNamedSchema _ = do
stringSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy String) stringSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy String)
intSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Int)
boolSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Bool) boolSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Bool)
evaluationsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [EvaluationView]) evaluationsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [EvaluationView])
return $ NamedSchema (Just "LeaderboardEntry") $ mempty return $ NamedSchema (Just "LeaderboardEntry") $ mempty
& type_ .~ SwaggerObject & type_ .~ SwaggerObject
& properties .~ & properties .~
fromList [ ("submitter", stringSchema) fromList [ ("submitter", submitterSchema)
, ("team", stringSchema) , ("team", stringSchema)
, ("when", stringSchema) , ("when", stringSchema)
, ("version", stringSchema) , ("version", versionSchema)
, ("description", stringSchema) , ("description", stringSchema)
, ("times", intSchema) , ("times", Inline $ toSchema (DPR.Proxy :: DPR.Proxy Int)
, ("hash", stringSchema) & description .~ Just "How many times a submission from the same user/of the same tag was submitted"
& minProperties .~ Just 1
& example .~ Just (toJSON (2:: Int)))
, ("hash", hashSchema)
, ("evaluations", evaluationsSchema) , ("evaluations", evaluationsSchema)
, ("isPublic", boolSchema) , ("isPublic", isPublicSchema)
, ("isReevaluable", boolSchema) , ("isReevaluable", boolSchema)
, ("isVisible", boolSchema) , ("isVisible", isVisibleSchema)
, ("id", submissionIdSchema)
, ("variantId", variantIdSchema)
] ]
& required .~ [ "submitter", "when", "version", "description", "times", "hash", "evaluations" ] & required .~ [ "submitter", "when", "version", "description", "times", "hash", "evaluations" ]
@ -1255,26 +1300,25 @@ instance ToSchema SubmissionView where
stringSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy String) stringSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy String)
boolSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Bool) boolSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Bool)
intSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Int) intSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy Int)
intsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [Int])
tagsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [TagView]) tagsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [TagView])
evalsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [EvaluationView]) evalsSchema <- declareSchemaRef (DPR.Proxy :: DPR.Proxy [EvaluationView])
return $ NamedSchema (Just "SubmissionView") $ mempty return $ NamedSchema (Just "SubmissionView") $ mempty
& type_ .~ SwaggerObject & type_ .~ SwaggerObject
& properties .~ & properties .~
fromList [ ("id", intSchema) fromList [ ("id", submissionIdSchema)
, ("variant", intSchema) , ("variant", variantIdSchema)
, ("rank", intSchema) , ("rank", intSchema)
, ("submitter", stringSchema) , ("submitter", submitterSchema)
, ("when", stringSchema) , ("when", stringSchema)
, ("version", intsSchema) , ("version", versionSchema)
, ("description", stringSchema) , ("description", stringSchema)
, ("tags", tagsSchema) , ("tags", tagsSchema)
, ("hash", stringSchema) , ("hash", hashSchema)
, ("evaluations", evalsSchema) , ("evaluations", evalsSchema)
, ("isOwner", boolSchema) , ("isOwner", boolSchema)
, ("isReevaluable", boolSchema) , ("isReevaluable", boolSchema)
, ("isVisible", boolSchema) , ("isVisible", isVisibleSchema)
, ("isPublic", boolSchema) , ("isPublic", isPublicSchema)
, ("team", stringSchema) , ("team", stringSchema)
] ]
& required .~ [ "id", "variant", "rank", "submitter", "when", "version", & required .~ [ "id", "variant", "rank", "submitter", "when", "version",