Remove Yore.Repl and Yore.Index, only run indexer at 3 AM

This commit is contained in:
Paul Brinkmeier
2025-09-20 15:33:54 +02:00
parent 67127fd28d
commit 82d8ce63d8
6 changed files with 44 additions and 118 deletions
+18 -14
View File
@@ -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."