Skip to content

Commit

Permalink
Merge pull request #1553 from disassembler/sl/metadata-validation-opt…
Browse files Browse the repository at this point in the history
…ional

backend: allow using metadata directly from db-sync
  • Loading branch information
bosko-m authored Jul 12, 2024
2 parents 4aba061 + db6f11b commit 47573b7
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 22 deletions.
1 change: 1 addition & 0 deletions govtool/backend/example-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"cachedurationseconds": 20,
"sentrydsn": "https://username:[email protected]/id",
"sentryenv": "dev",
"metadatavalidationenabled": true,
"metadatavalidationhost": "localhost",
"metadatavalidationport": 3001,
"metadatavalidationmaxconcurrentrequests": 10
Expand Down
24 changes: 18 additions & 6 deletions govtool/backend/src/VVA/API.hs
Original file line number Diff line number Diff line change
Expand Up @@ -217,18 +217,30 @@ proposalToResponse Types.Proposal {..} Types.MetadataValidationResult{..} =
proposalResponseCreatedEpochNo = proposalCreatedEpochNo,
proposalResponseUrl = proposalUrl,
proposalResponseMetadataHash = HexText proposalDocHash,
proposalResponseTitle = Types.proposalMetadataTitle <$> metadata,
proposalResponseAbstract = Types.proposalMetadataAbstract <$> metadata,
proposalResponseMotivation = Types.proposalMetadataMotivation <$> metadata,
proposalResponseRationale = Types.proposalMetadataRationale <$> metadata,
proposalResponseTitle = getTitle proposalTitle metadata,
proposalResponseAbstract = getAbstract proposalAbstract metadata,
proposalResponseMotivation = getMotivation proposalMotivation metadata,
proposalResponseRationale = getRationale proposalRationale metadata,
proposalResponseMetadata = GovernanceActionMetadata <$> proposalMetadata,
proposalResponseReferences = maybe [] Types.proposalMetadataReferences metadata,
proposalResponseReferences = getReferences proposalReferences metadata,
proposalResponseYesVotes = proposalYesVotes,
proposalResponseNoVotes = proposalNoVotes,
proposalResponseAbstainVotes = proposalAbstainVotes,
proposalResponseMetadataStatus = metadataValidationResultStatus,
proposalResponseMetadataValid = metadataValidationResultValid
}
where
getTitle p Nothing = p
getTitle _ m = Types.proposalMetadataTitle <$> m
getAbstract p Nothing = p
getAbstract _ m = Types.proposalMetadataAbstract <$> m
getMotivation p Nothing = p
getMotivation _ m = Types.proposalMetadataMotivation <$> m
getRationale p Nothing = p
getRationale _ m = Types.proposalMetadataRationale <$> m
-- TODO: convert aeson references to [Text] from database
--getReferences p Nothing = p
getReferences _ m = maybe [] Types.proposalMetadataReferences m

voteToResponse :: Types.Vote -> VoteParams
voteToResponse Types.Vote {..} =
Expand Down Expand Up @@ -467,4 +479,4 @@ getDRepMetadataValidationResponse params = do
return $ MetadataValidationResponse
{ metadataValidationResponseValid = metadataValidationResultValid
, metadataValidationResponseStatus = metadataValidationResultStatus
}
}
13 changes: 13 additions & 0 deletions govtool/backend/src/VVA/Config.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ module VVA.Config
, getServerHost
, getServerPort
, vvaConfigToText
, getMetadataValidationEnabled
, getMetadataValidationHost
, getMetadataValidationPort
) where
Expand Down Expand Up @@ -82,6 +83,8 @@ data VVAConfigInternal
, vVAConfigInternalSentrydsn :: String
-- | Sentry environment
, vVAConfigInternalSentryEnv :: String
-- | Metadata validation service enabled
, vVAConfigInternalMetadataValidationEnabled :: Bool
-- | Metadata validation service host
, vVAConfigInternalMetadataValidationHost :: Text
-- | Metadata validation service port
Expand All @@ -100,6 +103,7 @@ instance DefaultConfig VVAConfigInternal where
vVaConfigInternalCacheDurationSeconds = 20,
vVAConfigInternalSentrydsn = "https://username:[email protected]/id",
vVAConfigInternalSentryEnv = "development",
vVAConfigInternalMetadataValidationEnabled = True,
vVAConfigInternalMetadataValidationHost = "localhost",
vVAConfigInternalMetadataValidationPort = 3001,
vVAConfigInternalMetadataValidationMaxConcurrentRequests = 10
Expand All @@ -120,6 +124,8 @@ data VVAConfig
, sentryDSN :: String
-- | Sentry environment
, sentryEnv :: String
-- | Metadata validation service enabled
, metadataValidationEnabled :: Bool
-- | Metadata validation service host
, metadataValidationHost :: Text
-- | Metadata validation service port
Expand Down Expand Up @@ -167,6 +173,7 @@ convertConfig VVAConfigInternal {..} =
cacheDurationSeconds = vVaConfigInternalCacheDurationSeconds,
sentryDSN = vVAConfigInternalSentrydsn,
sentryEnv = vVAConfigInternalSentryEnv,
metadataValidationEnabled = vVAConfigInternalMetadataValidationEnabled,
metadataValidationHost = vVAConfigInternalMetadataValidationHost,
metadataValidationPort = vVAConfigInternalMetadataValidationPort,
metadataValidationMaxConcurrentRequests = vVAConfigInternalMetadataValidationMaxConcurrentRequests
Expand Down Expand Up @@ -208,6 +215,12 @@ getServerHost ::
m Text
getServerHost = asks (serverHost . getter)

-- | Access MetadataValidationService enabled
getMetadataValidationEnabled ::
(Has VVAConfig r, MonadReader r m) =>
m Bool
getMetadataValidationEnabled = asks (metadataValidationEnabled . getter)

-- | Access MetadataValidationService host
getMetadataValidationHost ::
(Has VVAConfig r, MonadReader r m) =>
Expand Down
34 changes: 20 additions & 14 deletions govtool/backend/src/VVA/Metadata.hs
Original file line number Diff line number Diff line change
Expand Up @@ -38,22 +38,26 @@ validateMetadata
-> Maybe Text
-> m (Either Text Value)
validateMetadata url hash standard = do
metadataEnabled <- getMetadataValidationEnabled
metadataHost <- getMetadataValidationHost
metadataPort <- getMetadataValidationPort
manager <- asks getter
let requestBody = encode $ object (["url" .= unpack url, "hash" .= unpack hash] ++ maybe [] (\x -> ["standard" .= unpack x]) standard)
initialRequest <- liftIO $ parseRequest (unpack metadataHost <> ":" <> show metadataPort <> "/validate")
let request = initialRequest
{ method = "POST"
, requestBody = RequestBodyLBS requestBody
, requestHeaders = [("Content-Type", "application/json")]
}
response <- liftIO $ try $ httpLbs request manager
case response of
Left (e :: HttpException) -> return $ Left (pack $ show e)
Right r -> case decode $ responseBody r of
Nothing -> throwError $ InternalError "Failed to validate metadata"
Just x -> return $ Right x
case metadataEnabled of
True -> do
let requestBody = encode $ object (["url" .= unpack url, "hash" .= unpack hash] ++ maybe [] (\x -> ["standard" .= unpack x]) standard)
initialRequest <- liftIO $ parseRequest (unpack metadataHost <> ":" <> show metadataPort <> "/validate")
let request = initialRequest
{ method = "POST"
, requestBody = RequestBodyLBS requestBody
, requestHeaders = [("Content-Type", "application/json")]
}
response <- liftIO $ try $ httpLbs request manager
case response of
Left (e :: HttpException) -> return $ Left (pack $ show e)
Right r -> case decode $ responseBody r of
Nothing -> throwError $ InternalError "Failed to validate metadata"
Just x -> return $ Right x
False -> return $ Right ""

getProposalMetadataValidationResult ::
(Has ConnectionPool r, Has Manager r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m, MonadError AppError m) =>
Expand All @@ -67,6 +71,7 @@ getProposalMetadataValidationResult url hash = do
Right (Object r) -> case go r of
Nothing -> throwError $ InternalError "Failed to validate metadata"
Just x -> return x
Right "" -> return $ MetadataValidationResult True (Just "200") Nothing
where
go result = do
(Bool valid) <- lookup "valid" result
Expand Down Expand Up @@ -97,6 +102,7 @@ getDRepMetadataValidationResult url hash = do
Right (Object r) -> case go r of
Nothing -> throwError $ InternalError "Failed to validate metadata"
Just x -> return x
Right "" -> return $ MetadataValidationResult True (Just "200") Nothing
where
go result = do
(Bool valid) <- lookup "valid" result
Expand All @@ -110,4 +116,4 @@ getDRepMetadataValidationResult url hash = do
let email = (\(String s) -> s) <$> lookup "email" m
let references = (\(Array references') -> map (\(String x) -> x) $ toList references') <$> lookup "references" m
DRepMetadata <$> bio <*> dRepName <*> email <*> references
return $ MetadataValidationResult valid status proposalMetadata
return $ MetadataValidationResult valid status proposalMetadata
4 changes: 2 additions & 2 deletions govtool/backend/src/VVA/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,8 @@ data Proposal
, proposalUrl :: Text
, proposalDocHash :: Text
, proposalTitle :: Maybe Text
, proposalAbout :: Maybe Text
, proposalMotivaiton :: Maybe Text
, proposalAbstract :: Maybe Text
, proposalMotivation :: Maybe Text
, proposalRationale :: Maybe Text
, proposalMetadata :: Maybe Value
, proposalReferences :: Maybe Value
Expand Down

0 comments on commit 47573b7

Please sign in to comment.