(FEAT/DB): Implemented the DB migrations for RotW.

Created a table and a stored procedure to generate the values in the
table! This is my first implementation of an SP, which is very cool!
This commit is contained in:
Hayden Hargreaves 2025-07-26 20:10:48 -07:00
parent 4614b4ef37
commit 68b97cea21
3 changed files with 61 additions and 0 deletions

View File

@ -347,6 +347,12 @@ found in **OTHER** section.
- [ ] Read (Required, Default: F) boolean - [ ] Read (Required, Default: F) boolean
- [ ] Created (Required) date/time stamp - [ ] Created (Required) date/time stamp
- [x] RecipeOfTheWeek: Represents the recipe of the week.
- [x] ID (PK) Serial
- [x] RecipeId (FK: Recipe.Id, Required) Serial
- [x] Score (Required) float (Computed score)
- [x] Created (Required) date/time stamp (serves as the validity)
'**': Not sure implementation '**': Not sure implementation

View File

@ -0,0 +1,14 @@
-- Author: Hayden Hargreaves (hhargreaves2006@gmail.com)
-- Desc: Create the recipe of the week table.
-- Date: 07/26/2025
BEGIN;
CREATE TABLE IF NOT EXISTS RecipeOfTheWeek (
Id SERIAL PRIMARY KEY NOT NULL,
RecipeId INTEGER NOT NULL REFERENCES recipes(id),
Score NUMERIC(10, 4) NOT NULL,
Created TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMIT;

View File

@ -0,0 +1,41 @@
-- Author: Hayden Hargreaves (hhargreaves2006@gmail.com)
-- Desc: Create the recipe of the week stored procedure.
-- Date: 07/26/2025
CREATE OR REPLACE PROCEDURE calculate_recipe_of_the_week_procedure()
LANGUAGE plpgsql
AS $$
BEGIN
-- Insert the highest-scoring recipe from the last 7 days into daily_top_recipes
INSERT INTO RecipeOfTheWeek (RecipeId, Score, Created)
SELECT
e.Entity AS RecipeId,
(
-- Weights can be configured here
SUM(CASE WHEN e.Type = 'viewed' THEN 1 ELSE 0 END) * 0.20 +
SUM(CASE WHEN e.Type = 'made' THEN 1 ELSE 0 END) * 0.40 +
SUM(CASE WHEN e.Type = 'liked' THEN 1 ELSE 0 END) * 0.30 +
SUM(CASE WHEN e.Type = 'shared' THEN 1 ELSE 0 END) * 0.10
) AS Score,
NOW()
FROM
Engagements e
WHERE
e.Created >= NOW() - INTERVAL '7 days'
AND e.Entity IS NOT NULL
GROUP BY e.Entity
ORDER BY Score DESC
LIMIT 1;
RAISE NOTICE 'Successfully calculated and stored the top recipe for the day.';
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Handle cases where no engagements are found in the last 7 days
RAISE NOTICE 'No engagement data found for the last 7 days to calculate a top recipe.';
WHEN OTHERS THEN
-- Catch any other potential errors and re-raise them after logging
RAISE EXCEPTION 'An error occurred during top recipe calculation: %', SQLERRM;
END;
$$;