diff --git a/govtool/backend/example-config.json b/govtool/backend/example-config.json index d406c8727..dd99856ae 100644 --- a/govtool/backend/example-config.json +++ b/govtool/backend/example-config.json @@ -11,6 +11,7 @@ "cachedurationseconds": 20, "sentrydsn": "https://username:password@senty.host/id", "sentryenv": "dev", + "metadatavalidationenabled": true, "metadatavalidationhost": "localhost", "metadatavalidationport": 3001, "metadatavalidationmaxconcurrentrequests": 10 diff --git a/govtool/backend/src/VVA/API.hs b/govtool/backend/src/VVA/API.hs index f5e29cc63..2e47129e1 100644 --- a/govtool/backend/src/VVA/API.hs +++ b/govtool/backend/src/VVA/API.hs @@ -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 {..} = @@ -467,4 +479,4 @@ getDRepMetadataValidationResponse params = do return $ MetadataValidationResponse { metadataValidationResponseValid = metadataValidationResultValid , metadataValidationResponseStatus = metadataValidationResultStatus - } \ No newline at end of file + } diff --git a/govtool/backend/src/VVA/Config.hs b/govtool/backend/src/VVA/Config.hs index 557e1b319..4d82ae354 100644 --- a/govtool/backend/src/VVA/Config.hs +++ b/govtool/backend/src/VVA/Config.hs @@ -24,6 +24,7 @@ module VVA.Config , getServerHost , getServerPort , vvaConfigToText + , getMetadataValidationEnabled , getMetadataValidationHost , getMetadataValidationPort ) where @@ -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 @@ -100,6 +103,7 @@ instance DefaultConfig VVAConfigInternal where vVaConfigInternalCacheDurationSeconds = 20, vVAConfigInternalSentrydsn = "https://username:password@senty.host/id", vVAConfigInternalSentryEnv = "development", + vVAConfigInternalMetadataValidationEnabled = True, vVAConfigInternalMetadataValidationHost = "localhost", vVAConfigInternalMetadataValidationPort = 3001, vVAConfigInternalMetadataValidationMaxConcurrentRequests = 10 @@ -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 @@ -167,6 +173,7 @@ convertConfig VVAConfigInternal {..} = cacheDurationSeconds = vVaConfigInternalCacheDurationSeconds, sentryDSN = vVAConfigInternalSentrydsn, sentryEnv = vVAConfigInternalSentryEnv, + metadataValidationEnabled = vVAConfigInternalMetadataValidationEnabled, metadataValidationHost = vVAConfigInternalMetadataValidationHost, metadataValidationPort = vVAConfigInternalMetadataValidationPort, metadataValidationMaxConcurrentRequests = vVAConfigInternalMetadataValidationMaxConcurrentRequests @@ -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) => diff --git a/govtool/backend/src/VVA/Metadata.hs b/govtool/backend/src/VVA/Metadata.hs index f3cf05e74..2aa46d684 100644 --- a/govtool/backend/src/VVA/Metadata.hs +++ b/govtool/backend/src/VVA/Metadata.hs @@ -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) => @@ -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 @@ -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 @@ -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 \ No newline at end of file + return $ MetadataValidationResult valid status proposalMetadata diff --git a/govtool/backend/src/VVA/Types.hs b/govtool/backend/src/VVA/Types.hs index 701bdda87..aa6b1079a 100644 --- a/govtool/backend/src/VVA/Types.hs +++ b/govtool/backend/src/VVA/Types.hs @@ -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