feat(users/Profpatsch/whatcd-resolver): add chrome to artistPage

The settings could actually be improved with an htmx snippet, so that
we don’t have to load the whole page every time.

Change-Id: I472940533881ff24c0111188e7265c59665bc29d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/13213
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
Profpatsch 2025-03-07 11:57:08 +01:00
parent 0b881b6d23
commit 1c205394a1

View file

@ -136,9 +136,9 @@ htmlUi = do
mainHtml counterHtml uniqueRunId span mainHtml counterHtml uniqueRunId span
), ),
( "redacted-search", ( "redacted-search",
HtmlWithQueryArgs (singleQueryArgument "searchstr" Cat.id) $ HtmlWithQueryArgs (label @"searchstr" <$> singleQueryArgument "searchstr" Cat.id) $
\searchstr _span -> do \dat _span -> do
t <- redactedSearchAndInsert [("searchstr", searchstr)] t <- redactedSearchAndInsert [("searchstr", dat.queryArgs.searchstr)]
runTransaction $ do runTransaction $ do
res <- t res <- t
(table, settings) <- (table, settings) <-
@ -162,16 +162,16 @@ htmlUi = do
pure $ pure $
mainHtml' mainHtml'
( MainHtml ( MainHtml
{ pageTitle = [fmt|whatcd-resolver Search {searchstr & bytesToTextUtf8Lenient}|], { pageTitle = [fmt|whatcd-resolver Search {dat.queryArgs.searchstr & bytesToTextUtf8Lenient}|],
returnUrl = dat.returnUrl,
counterHtml = "", counterHtml = "",
mainContent = mainContent =
[hsx|<h1>Search results for <pre>{searchstr}</pre></h1>{table}|], [hsx|<h1>Search results for <pre>{dat.queryArgs.searchstr}</pre></h1>{table}|],
uniqueRunId, uniqueRunId,
searchFieldContent = searchstr & bytesToTextUtf8Lenient, searchFieldContent = dat.queryArgs.searchstr & bytesToTextUtf8Lenient,
settings settings
} }
) )
_span
), ),
( "snips/redacted/torrentDataJson", ( "snips/redacted/torrentDataJson",
Html $ \span -> do Html $ \span -> do
@ -249,8 +249,8 @@ htmlUi = do
& Parse.andParse uriToHttpClientRequest & Parse.andParse uriToHttpClientRequest
) )
) )
( \qry _span -> do ( \dat _span -> do
jsonld <- httpGetJsonLd (qry.target) jsonld <- httpGetJsonLd (dat.queryArgs.target)
pure $ renderJsonld jsonld pure $ renderJsonld jsonld
) )
), ),
@ -281,8 +281,8 @@ htmlUi = do
( label @"artistRedactedId" ( label @"artistRedactedId"
<$> (singleQueryArgument "redacted_id" (Field.utf8 >>> Field.decimalNatural)) <$> (singleQueryArgument "redacted_id" (Field.utf8 >>> Field.decimalNatural))
) )
$ \qry _span -> do $ \dat _span -> do
artistPage qry artistPage (T2 dat.queryArgs (label @"uniqueRunId" uniqueRunId))
), ),
( "artist/refresh", ( "artist/refresh",
HtmlOrRedirect $ HtmlOrRedirect $
@ -347,6 +347,7 @@ htmlUi = do
mainHtml' mainHtml'
( MainHtml ( MainHtml
{ pageTitle = "whatcd-resolver", { pageTitle = "whatcd-resolver",
returnUrl = "/",
counterHtml, counterHtml,
mainContent = bestTorrentsTable, mainContent = bestTorrentsTable,
uniqueRunId, uniqueRunId,
@ -354,10 +355,10 @@ htmlUi = do
searchFieldContent = "" searchFieldContent = ""
} }
) )
_span
data MainHtml = MainHtml data MainHtml = MainHtml
{ pageTitle :: Text, { pageTitle :: Text,
returnUrl :: ByteString,
counterHtml :: Html, counterHtml :: Html,
mainContent :: Html, mainContent :: Html,
searchFieldContent :: Text, searchFieldContent :: Text,
@ -365,16 +366,14 @@ data MainHtml = MainHtml
settings :: Settings settings :: Settings
} }
mainHtml' :: MainHtml -> Otel.Span -> Html mainHtml' :: MainHtml -> Html
mainHtml' dat _span = do mainHtml' dat = do
-- transmissionTorrentsTable <- lift @Transaction getTransmissionTorrentsTable -- transmissionTorrentsTable <- lift @Transaction getTransmissionTorrentsTable
let returnUrl = (label @"returnUrl" "/")
htmlPageChrome htmlPageChrome
dat.pageTitle dat.pageTitle
( [hsx| ( [hsx|
{dat.counterHtml} {dat.counterHtml}
{settingButtons returnUrl dat.settings} {settingButtons dat dat.settings}
|] |]
<> [hsx| <> [hsx|
<form action="redacted-search"> <form action="redacted-search">
@ -477,6 +476,7 @@ htmlPageChrome title body =
artistPage :: artistPage ::
( HasField "artistRedactedId" dat Natural, ( HasField "artistRedactedId" dat Natural,
HasField "uniqueRunId" dat Text,
MonadPostgres m, MonadPostgres m,
MonadOtel m, MonadOtel m,
MonadLogger m, MonadLogger m,
@ -496,16 +496,13 @@ artistPage dat = runTransaction $ do
let torrents = mkBestTorrentsTable (label @"groupByReleaseType" True) fresh let torrents = mkBestTorrentsTable (label @"groupByReleaseType" True) fresh
let returnUrl = let returnUrl =
label @"returnUrl" $ textToBytesUtf8 $
mkArtistLink (label @"artistId" (dat.artistRedactedId & fromIntegral @Natural @Int)) mkArtistLink (label @"artistId" (dat.artistRedactedId & fromIntegral @Natural @Int))
pure $ let pageTitle = case artistName of
htmlPageChrome Nothing -> "whatcd-resolver"
( case artistName of Just a -> [fmt|{a} - Artist Page - whatcd-resolver|]
Nothing -> "whatcd-resolver" let mainContent =
Just a -> [fmt|{a} - Artist Page - whatcd-resolver|] [hsx|
)
[hsx|
{settingButtons returnUrl settings}
<p>Artist ID: {dat.artistRedactedId}</p> <p>Artist ID: {dat.artistRedactedId}</p>
<div id="artist-torrents"> <div id="artist-torrents">
@ -523,16 +520,33 @@ artistPage dat = runTransaction $ do
<div class="htmx-indicator">Refreshing!</div> <div class="htmx-indicator">Refreshing!</div>
</form> </form>
|] |]
pure $
mainHtml'
( MainHtml
{ pageTitle,
returnUrl,
counterHtml = "",
mainContent,
uniqueRunId = dat.uniqueRunId,
searchFieldContent = "",
settings
}
)
type Handlers m = Map Text (HandlerResponse m) type Handlers m = Map Text (HandlerResponse m)
data QueryArgsDat a = QueryArgsDat
{ queryArgs :: a,
returnUrl :: ByteString
}
data HandlerResponse m where data HandlerResponse m where
-- | render html -- | render html
Html :: (Otel.Span -> m Html) -> HandlerResponse m Html :: (Otel.Span -> m Html) -> HandlerResponse m
-- | either render html or redirect to another page -- | either render html or redirect to another page
HtmlOrRedirect :: (Otel.Span -> m (E2 "respond" Html "redirectTo" ByteString)) -> HandlerResponse m HtmlOrRedirect :: (Otel.Span -> m (E2 "respond" Html "redirectTo" ByteString)) -> HandlerResponse m
-- | render html after parsing some query arguments -- | render html after parsing some query arguments
HtmlWithQueryArgs :: Parse Query a -> (a -> Otel.Span -> m Html) -> HandlerResponse m HtmlWithQueryArgs :: Parse Query a -> (QueryArgsDat a -> Otel.Span -> m Html) -> HandlerResponse m
-- | render html or reload the page via the Referer header if no htmx -- | render html or reload the page via the Referer header if no htmx
HtmlOrReferer :: (Otel.Span -> m Html) -> HandlerResponse m HtmlOrReferer :: (Otel.Span -> m Html) -> HandlerResponse m
-- | parse the request as POST submission, then redirect to the given endpoint -- | parse the request as POST submission, then redirect to the given endpoint
@ -596,7 +610,7 @@ runHandlers defaultHandler handlers req respond = withRunInIO $ \runInIO -> do
liftIO $ respond (Wai.responseLBS Http.methodNotAllowed405 [] "") liftIO $ respond (Wai.responseLBS Http.methodNotAllowed405 [] "")
let htmlWithQueryArgs parser act = let htmlWithQueryArgs parser act =
case req & Parse.runParse "Unable to find the right request query arguments" (lmap Wai.queryString parser) of case req & Parse.runParse "Unable to find the right request query arguments" (lmap Wai.queryString parser) of
Right a -> html (act a) Right queryArgs -> html (act $ QueryArgsDat {queryArgs, returnUrl = (req & Wai.rawPathInfo) <> (req & Wai.rawQueryString)})
Left err -> Left err ->
html html
( \span -> do ( \span -> do
@ -1140,7 +1154,7 @@ instance Semigroup Settings where
instance Monoid Settings where instance Monoid Settings where
mempty = Settings {useFreeleechTokens = False} mempty = Settings {useFreeleechTokens = False}
submitSettingForm :: (HasField "returnUrl" r Text, ToHtml a) => r -> a -> Html submitSettingForm :: (HasField "returnUrl" r ByteString, ToHtml a) => r -> a -> Html
submitSettingForm opts inputs = submitSettingForm opts inputs =
[hsx| [hsx|
<form <form
@ -1152,7 +1166,7 @@ submitSettingForm opts inputs =
</form> </form>
|] |]
settingButtons :: (HasField "returnUrl" opts Text) => opts -> Settings -> Html settingButtons :: (HasField "returnUrl" opts ByteString) => opts -> Settings -> Html
settingButtons opts s = settingButtons opts s =
if s.useFreeleechTokens if s.useFreeleechTokens
then then