Remove Yore.Repl and Yore.Index, only run indexer at 3 AM
This commit is contained in:
+18
-14
@@ -10,14 +10,18 @@
|
||||
|
||||
module Main (main) where
|
||||
|
||||
import Control.Concurrent (forkIO)
|
||||
import Control.Monad (forM, forM_)
|
||||
import Control.Monad.IO.Class (liftIO)
|
||||
import Control.Monad.Trans.Except (ExceptT (..), catchE, runExceptT)
|
||||
import Data.Bifunctor (Bifunctor (..))
|
||||
import Data.Proxy (Proxy (..))
|
||||
import Data.Text (Text)
|
||||
import Data.Time (Day, addDays, toGregorian)
|
||||
import Data.Time (Day, LocalTime (..), TimeOfDay (..), ZonedTime (..), addDays, toGregorian)
|
||||
import GHC.Generics (Generic)
|
||||
import Network.HTTP.Media ((//), (/:))
|
||||
import Network.HTTP.Types (Status (..), mkStatus, status200)
|
||||
import Network.Wai (Application, Request (..), Response, responseFile, responseLBS)
|
||||
import Servant
|
||||
( Accept (..)
|
||||
, Capture
|
||||
@@ -48,25 +52,21 @@ import qualified Data.ByteString.Lazy as LBS
|
||||
import qualified Data.Text as Text
|
||||
import qualified Data.Text.Encoding as Encoding
|
||||
import qualified Database.PostgreSQL.Opium as Opium
|
||||
import Network.Wai (Application, Request (..), Response, responseFile, responseLBS)
|
||||
import qualified Network.Wai.Handler.Warp as Warp
|
||||
import qualified Text.Blaze.Html5 as H
|
||||
import qualified Text.Blaze.Html5.Attributes as A
|
||||
|
||||
import Envy (type (=@!), type (=@@), type (?))
|
||||
import Yore.DB (DB, DayFile (..))
|
||||
import Yore.Download (downloadInto)
|
||||
import Yore.Error (Error (..))
|
||||
import Yore.Schedule (schedule)
|
||||
import Yore.Scrape (Issue (..), getIssuesByDay)
|
||||
import Yore.Time (addYears, getCurrentDay, getSecondsUntilMidnight)
|
||||
|
||||
import Control.Concurrent (forkIO)
|
||||
import Control.Monad (forM, forM_)
|
||||
import Data.Bifunctor (Bifunctor (..))
|
||||
import qualified Envy
|
||||
import qualified Yore.DB as DB
|
||||
import Yore.Download (downloadInto)
|
||||
import qualified Yore.Log as Log
|
||||
import Yore.Scrape (Issue (..), getIssuesByDay)
|
||||
|
||||
newtype ConnectionString = ConnectionString String
|
||||
deriving (Show)
|
||||
@@ -109,7 +109,7 @@ main = do
|
||||
runServer cfg db
|
||||
|
||||
runIndexer :: Config -> DB -> IO ()
|
||||
runIndexer cfg db = schedule (const True) $ do
|
||||
runIndexer cfg db = schedule shouldRunAt $ do
|
||||
_ <-
|
||||
runExceptT $
|
||||
catchE
|
||||
@@ -121,6 +121,10 @@ runIndexer cfg db = schedule (const True) $ do
|
||||
)
|
||||
(Log.error . show)
|
||||
pure ()
|
||||
where
|
||||
shouldRunAt zt = case localTimeOfDay $ zonedTimeToLocalTime zt of
|
||||
TimeOfDay 3 0 _ -> True
|
||||
_ -> False
|
||||
|
||||
runServer :: Config -> DB -> IO ()
|
||||
runServer cfg db =
|
||||
@@ -198,13 +202,13 @@ server cfg db = rootR :<|> todayR :<|> apiTodayR
|
||||
|
||||
todayR issue = do
|
||||
dateThen <- ExceptT get100YearsAgo
|
||||
count <- DB.withConn db $ DB.lift . DB.getNumberOfIssues dateThen
|
||||
dayFile <- DB.withConn db $ DB.lift . DB.getDayFileByIssue dateThen issue
|
||||
count <- DB.withConn db $ DB.getNumberOfIssues dateThen
|
||||
dayFile <- DB.withConn db $ DB.getDayFileByIssue dateThen issue
|
||||
pure $ RootModel dateThen dayFile issue count
|
||||
|
||||
apiTodayR issue = handlerToRaw $ do
|
||||
dateThen <- ExceptT get100YearsAgo
|
||||
dayFile <- DB.withConn db $ DB.lift . DB.getDayFileByIssue dateThen issue
|
||||
dayFile <- DB.withConn db $ DB.getDayFileByIssue dateThen issue
|
||||
let fullPath = cfg.yoreDownloadDir </> dayFile.relative_path
|
||||
secondsUntilMidnight <- liftIO getSecondsUntilMidnight
|
||||
pure $
|
||||
@@ -267,7 +271,7 @@ indexDay :: Config -> Day -> Opium.Connection -> ExceptT Error IO ()
|
||||
indexDay cfg dayThen conn = do
|
||||
-- Transaction-level lock released automatically after transaction
|
||||
DB.lift $ Opium.execute_ "SELECT pg_advisory_xact_lock(42);" conn
|
||||
mbDi <- DB.lift $ DB.readDayIndex dayThen conn
|
||||
mbDi <- DB.readDayIndex dayThen conn
|
||||
case mbDi of
|
||||
Just _ ->
|
||||
Log.info $ printf "index for %s already exists." (show dayThen)
|
||||
@@ -279,7 +283,7 @@ indexDay cfg dayThen conn = do
|
||||
path <- liftIO $ downloadInto cfg.yoreDownloadDir issue.url
|
||||
pure (issue.label, path)
|
||||
Log.info "creating DB entries"
|
||||
dayIndex <- DB.lift $ DB.createDayIndex dayThen conn
|
||||
dayIndex <- DB.createDayIndex dayThen conn
|
||||
forM_ paths $ \(text, url) ->
|
||||
DB.lift $ DB.createDayFile dayIndex.day_index_id text url conn
|
||||
DB.createDayFile dayIndex.day_index_id text url conn
|
||||
Log.info "done."
|
||||
|
||||
Reference in New Issue
Block a user