@@ -17,25 +17,34 @@ import Data.Aeson.Types (Parser, parseMaybe)
1717import Data.ByteString (ByteString )
1818import Data.FileEmbed (embedFile )
1919import Data.Foldable (fold )
20- import Data.Has (Has )
21- import qualified Data.Map as Map
22- import Data.Maybe (fromMaybe )
20+ import Data.Has (Has , getter )
21+ import qualified Data.Map as Map
22+ import Data.Maybe (fromMaybe , isJust )
2323import Data.Monoid (Sum (.. ), getSum )
2424import Data.Scientific
2525import Data.String (fromString )
2626import Data.Text (Text , pack , unpack )
27- import qualified Data.Text.Encoding as Text
28- import qualified Data.Text.IO as Text
27+ import qualified Data.Text.Encoding as Text
28+ import qualified Data.Text.IO as Text
2929import Data.Time
3030
31- import qualified Database.PostgreSQL.Simple as SQL
32- import qualified Database.PostgreSQL.Simple.Types as PG
31+ import qualified Database.PostgreSQL.Simple as SQL
32+ import qualified Database.PostgreSQL.Simple.Types as PG
3333import Database.PostgreSQL.Simple.ToField (ToField (.. ))
3434import Database.PostgreSQL.Simple.ToRow (ToRow (.. ))
3535
36+ import GHC.IO.Unsafe (unsafePerformIO )
37+
3638import VVA.Config
3739import VVA.Pool (ConnectionPool , withPool )
38- import VVA.Types (AppError (.. ), Proposal (.. ))
40+ import VVA.Types (AppError (.. ), Proposal (.. ), EnactedProposalDetails (.. ))
41+
42+ query1 :: (SQL. ToRow q , SQL. FromRow r ) => SQL. Connection -> SQL. Query -> q -> IO (Maybe r )
43+ query1 conn q params = do
44+ results <- SQL. query conn q params
45+ case results of
46+ [x] -> return (Just x)
47+ _ -> return Nothing
3948
4049sqlFrom :: ByteString -> SQL. Query
4150sqlFrom bs = fromString $ unpack $ Text. decodeUtf8 bs
@@ -84,4 +93,36 @@ getProposals mSearchTerms = withPool $ \conn -> do
8493 Left (e :: SomeException ) -> do
8594 putStrLn $ " Error fetching proposals: " <> show e
8695 return []
87- Right rows -> return rows
96+ Right rows -> return rows
97+
98+ latestEnactedProposalSql :: SQL. Query
99+ latestEnactedProposalSql =
100+ let rawSql = sqlFrom $ (embedFile " sql/get-previous-enacted-governance-action-proposal-details.sql" )
101+ in unsafePerformIO $ do
102+ putStrLn $ " [DEBUG] SQL query content: " ++ show rawSql
103+ return rawSql
104+
105+ getPreviousEnactedProposal ::
106+ (Has ConnectionPool r , Has VVAConfig r , MonadReader r m , MonadIO m , MonadFail m , MonadError AppError m ) =>
107+ Text ->
108+ m (Maybe EnactedProposalDetails )
109+ getPreviousEnactedProposal proposalType = withPool $ \ conn -> do
110+ let query = latestEnactedProposalSql
111+ let params = [proposalType]
112+
113+ result <- liftIO $ try $ do
114+ rows <- SQL. query conn query params :: IO [EnactedProposalDetails ]
115+ case rows of
116+ [x] -> return (Just x)
117+ _ -> return Nothing
118+
119+ case result of
120+ Left err -> do
121+ throwError $ CriticalError $ " Database error: " <> pack (show (err :: SomeException ))
122+ Right proposal -> do
123+ case proposal of
124+ Just details -> do
125+ liftIO $ putStrLn $ " [DEBUG] Previous enacted proposal details: " ++ show details
126+ Nothing ->
127+ liftIO $ putStrLn " [DEBUG] No previous enacted proposal found"
128+ return proposal
0 commit comments