diff --git a/src/Roux/CookLog.hs b/src/Roux/CookLog.hs index 0aea938..b11d87c 100644 --- a/src/Roux/CookLog.hs +++ b/src/Roux/CookLog.hs @@ -106,13 +106,22 @@ insertEntry conn filename day mComment = do fromMaybe _ (Just x) = x -- | Fetch all entries for a given recipe, newest first. +-- Tries both the normalized key and with @.cook@ appended (for legacy entries). fetchEntries :: Connection -> Text -> IO [CookEntry] -fetchEntries conn filename = - SQL.query +fetchEntries conn filename = do + entries <- SQL.query conn "SELECT id, recipe_filename, cooked_date, comment, created_at \ \ FROM cook_log WHERE recipe_filename = ? ORDER BY cooked_date DESC, id DESC" (Only filename) + if null entries + then + SQL.query + conn + "SELECT id, recipe_filename, cooked_date, comment, created_at \ + \ FROM cook_log WHERE recipe_filename = ? ORDER BY cooked_date DESC, id DESC" + (Only (filename <> ".cook")) + else pure entries -- | Fetch all entries across all recipes, newest first. fetchAllEntries :: Connection -> IO [CookEntry] diff --git a/src/Roux/Server.hs b/src/Roux/Server.hs index bf7e12b..8e1e654 100644 --- a/src/Roux/Server.hs +++ b/src/Roux/Server.hs @@ -643,7 +643,7 @@ handleRequest state db request respond = do Nothing -> respond notFound -- Cook log JSON endpoint for a specific recipe ["cook-log", filename] -> do - entries <- CookLog.fetchEntries db filename + entries <- CookLog.fetchEntries db (normalizeRecipeKey filename) let body = A.encode entries respond $ Wai.responseLBS @@ -666,8 +666,14 @@ handleRequest state db request respond = do _ -> respond notFound -- | Handle POST /cook-log/{filename} +-- | Normalize a recipe filename to match the recipe index key: +-- lowercased, with @.cook@ extension stripped. +normalizeRecipeKey :: Text -> Text +normalizeRecipeKey = T.pack . map toLower . stripCookExt . T.unpack + handleCookLogPost :: SQL.Connection -> Text -> Wai.Application -handleCookLogPost db filename request respond = do +handleCookLogPost db rawFilename request respond = do + let filename = normalizeRecipeKey rawFilename body <- readRequestBody request let params = parseFormBody body dateStr = fromMaybe "" (lookup "cooked-date" params)