Clean up the code a little bit

This commit is contained in:
towards-a-new-leftypol 2023-10-06 12:45:16 -04:00
parent 5d63d23c79
commit ce76a22e3d
2 changed files with 59 additions and 46 deletions

View File

@ -11,6 +11,7 @@ import qualified Data.ByteString.Lazy as B
import System.Console.CmdArgs import System.Console.CmdArgs
import System.Directory (listDirectory, doesFileExist) import System.Directory (listDirectory, doesFileExist)
import System.FilePath ((</>)) import System.FilePath ((</>))
import Data.List (find)
import JSONParsing import JSONParsing
import Types import Types
@ -36,22 +37,28 @@ listCatalogDirectories settings = do
doesFileExist catalogPath doesFileExist catalogPath
ensureSiteExists :: JSONSettings -> IO () ensureSiteExists :: JSONSettings -> IO (Int)
ensureSiteExists settings = do ensureSiteExists settings = do
sitesResult <- Client.getAllSites settings sitesResult <- Client.getAllSites settings
case sitesResult of case sitesResult of
Right siteList -> Right siteList ->
if any (\site -> Client.name site == site_name settings) siteList case find (\site -> Client.name site == site_name settings) siteList of
then putStrLn $ site_name settings ++ " already exists!" Just site -> do
else do putStrLn $ site_name settings ++ " already exists!"
return $ Client.site_id site
Nothing -> do
putStrLn "leftychan.net does not exist. Creating..." putStrLn "leftychan.net does not exist. Creating..."
postResult <- Client.postSite settings postResult <- Client.postSite settings
case postResult of case postResult of
Right _ -> putStrLn $ "Successfully created " ++ site_name settings ++ "." Right site -> do
putStrLn $ "Successfully created " ++ site_name settings ++ ". " ++ show site
return $ Client.site_id site
Left err -> do Left err -> do
putStrLn $ "Failed to create leftychan.net. Error: " ++ show err putStrLn $ "Failed to create leftychan.net. Error: " ++ show err
exitFailure exitFailure
Left err -> do Left err -> do
putStrLn $ "Error fetching sites: " ++ show err putStrLn $ "Error fetching sites: " ++ show err
exitFailure exitFailure
@ -61,9 +68,9 @@ processBackupDirectory :: JSONSettings -> IO ()
processBackupDirectory settings = do processBackupDirectory settings = do
putStrLn "JSON successfully read!" putStrLn "JSON successfully read!"
print settings -- print the decoded JSON settings print settings -- print the decoded JSON settings
ensureSiteExists settings site_id_ <- ensureSiteExists settings
dirs <- listCatalogDirectories settings dirs <- listCatalogDirectories settings
_ <- Client.getWebsiteBoards settings _ <- Client.getSiteBoards settings site_id_
putStrLn "Boards fetched!" putStrLn "Boards fetched!"
mapM_ putStrLn dirs mapM_ putStrLn dirs
mapM_ processDir dirs mapM_ processDir dirs

View File

@ -4,7 +4,7 @@
module DataClient module DataClient
( HttpError(..) ( HttpError(..)
, get , get
, getWebsiteBoards , getSiteBoards
, getAllSites , getAllSites
, postSite , postSite
, post , post
@ -13,6 +13,7 @@ module DataClient
import Network.HTTP.Simple import Network.HTTP.Simple
import qualified Data.ByteString.Lazy as LBS import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Lazy.Char8 as LC8
import Network.HTTP.Types.Status (statusCode) import Network.HTTP.Types.Status (statusCode)
import Control.Exception.Safe (tryAny, SomeException) import Control.Exception.Safe (tryAny, SomeException)
import qualified Data.ByteString.Char8 as C8 import qualified Data.ByteString.Char8 as C8
@ -47,18 +48,32 @@ get settings path = do
handleHttp (httpLBS req) handleHttp (httpLBS req)
post :: T.JSONSettings -> String -> LBS.ByteString -> IO (Either HttpError LBS.ByteString) post
post settings path payload = do :: T.JSONSettings
-> String
-> LBS.ByteString
-> Bool
-> IO (Either HttpError LBS.ByteString)
post settings path payload return_repr = do
let requestUrl = T.postgrest_url settings ++ path let requestUrl = T.postgrest_url settings ++ path
initReq <- parseRequest requestUrl initReq <- parseRequest requestUrl
let req = setRequestMethod "POST" let req = setRequestMethod "POST"
. setRequestHeader "Authorization" [C8.pack $ "Bearer " ++ T.jwt settings] . setRequestHeader "Authorization" [ jwt_header ]
. setRequestHeader "Content-Type" [ "application/json" ] . setRequestHeader "Content-Type" [ "application/json" ]
. setRequestBodyLBS payload . setRequestBodyLBS payload
. prefer
$ initReq $ initReq
putStrLn $ "posting to " ++ requestUrl putStrLn $ "posting to " ++ requestUrl
handleHttp (httpLBS req) handleHttp (httpLBS req)
where
jwt_header = C8.pack $ "Bearer " ++ T.jwt settings
prefer =
if return_repr
then setRequestHeader "Prefer" [ "return=representation" ]
else id
handleHttp :: IO (Response LBS.ByteString) -> IO (Either HttpError LBS.ByteString) handleHttp :: IO (Response LBS.ByteString) -> IO (Either HttpError LBS.ByteString)
handleHttp action = do handleHttp action = do
@ -72,38 +87,29 @@ handleHttp action = do
Left e -> return $ Left $ HttpException e Left e -> return $ Left $ HttpException e
getWebsiteBoards :: T.JSONSettings -> IO (Either HttpError [ String ]) getSiteBoards :: T.JSONSettings -> Int -> IO (Either HttpError [ String ])
getWebsiteBoards settings = do getSiteBoards settings site_id_ = get settings path >>= return . eitherDecodeResponse
response <- get settings path where
path = "/boards?select=name&boards.site_id=eq." ++ show site_id_
case response of
Right body -> do postSite :: T.JSONSettings -> IO (Either HttpError SiteResponse)
print body postSite settings =
undefined post settings "/sites" payload True >>= return . eitherDecodeResponse
Left err -> do
print err
return $ Left err
where where
path = "/boards?select=name,board_id,sites(site_id)&sites.name=eq." payload = encode $
++ (T.site_name settings) object [ "name" .= T.site_name settings
, "url" .= T.site_url settings
]
postSite :: T.JSONSettings -> IO (Either HttpError LBS.ByteString)
postSite settings = do
let payload = encode $ object ["name" .= T.site_name settings, "url" .= T.site_url settings]
post settings "/sites" payload
getAllSites :: T.JSONSettings -> IO (Either HttpError [SiteResponse]) getAllSites :: T.JSONSettings -> IO (Either HttpError [SiteResponse])
getAllSites settings = do getAllSites settings = get settings "/sites" >>= return . eitherDecodeResponse
response <- get settings "/sites"
case response of
Right x -> do
putStrLn "getAllSites response:"
print x
return $ case eitherDecode x :: Either String [SiteResponse] of eitherDecodeResponse :: (FromJSON a) => Either HttpError LBS.ByteString -> Either HttpError a
Right sites -> Right sites eitherDecodeResponse (Left err) = Left err
Left _ -> Left $ StatusCodeError 500 "Failed to decode JSON" eitherDecodeResponse (Right bs) =
Left err -> return $ Left err case eitherDecode bs of
Right val -> Right val
Left err -> Left $ StatusCodeError 500 $ LC8.pack $ "Failed to decode JSON: " ++ err