Potion/spec/TechnicalSpecification.md
Hayden Hargreaves 6ec6f4d1c7 (UI/STYLE): Completed* the home page.
Of course, its not 100% done, it will always be a WIP. But for now,
moving on. Specs are up to date as well.
2025-06-03 20:37:20 -07:00

9.8 KiB

Technical Specifications

Application specifications.

Devices & Responsiveness

This application is a web app, however, it is built following a "mobile-first" pattern. Which means the desktop interface is lacking and will be designed after the completion of the mobile web interface.

Page Requirements

This section outlines the specific technical requirements for the application. It is broken down by page.

Home

Home page will server as the landing page where users can search recipes, filter their search, as well as view lists of recently made recipes, recently viewed and trending recipes lists.

UI Requirements
  • Welcome Banner

    • Video display with large text overhead
    • Sub text below the video with a "Call to Action"
    • Interactive banner that can be hidden with a "Got it!" or "X"
  • Message & Pills Banner

    • Message with text like "Craving Something Specific?"
    • Pill buttons below which allow for a direct search for meal type
  • Search bar

    • Ability to search for recipes, meals, and tags
  • Filter drop down

    • Filter by meal - E_Meal enum type
    • Filter by time requirements - 15min, 30min, 1hr, 1.5hr, +1.5hr
    • Filter by difficulty - 1 to 5 stars
    • Filter by serving size - 1 to 16
  • Recipe of The Week

    • Single recipe display of the best performing recipe, with spotlight effect
    • Display recipe details in depth - Title, duration, image*, meal category, simplified description
    • Make now button to allow easy access to meal directions
  • Recently Viewed List

    • Scrolling list of the most recent 5-10 recipes viewed
    • Display recipe details - Title, duration, image*, meal category, and a heart to like the recipe
  • Make Again List

    • Scrolling list of the most recent 5-10 recipes made
    • Display recipe details - Title, duration, image*, meal category, and a heart to like the recipe
  • Create Recipe CTA (call-to-action)

    • Large CTA banner with text prompting users to create a recipe
    • Button to take the user to the create page

'*': Not sure yet, still under consideration

API Requirements
  • Message & Pills Banner

    • Search all recipes of a specific meal type
  • Search bar

    • Text search on titles based on search query
    • Text search on tags based on search query
    • Text search on meal based on search query
  • Filter drop down

    • Update search to only contain meals from selected filter
    • Update search to only contain means that meet the time requirement of the selected filter
    • Update search to only contain meals that meet the difficulty level of the selected filter
    • Update search to only contain meals that meet the serving size of the selected filter
  • Recipe of The Week

    • Fetch the most performing recipe of the last 7 days and all of the required meta data
      • Most views (W: 0.1)
      • Most makes (W: 0.5)
      • Most likes (W: 0.3)
      • Most reviews (W: 0.4)
      • Highest avg rating (W: 0.2/star, 0.0 - 1.0)
    • Direct a user to the recipes display page
    • Telemetry data to collect clicks for each recipe
  • Recently Viewed List

    • Fetch a list of recently viewed meals and all required meta data
    • Like a post and store it in user's liked posts list
    • Direct a user to the recipes display page
    • Telemetry data to collect clicks for each recipe
  • Make Again List

    • Fetch a list of recently viewed meals and all required meta data
    • Like a post and store it in user's liked posts list
    • Direct a user to the recipes display page
    • Telemetry data to collect clicks for each recipe

'**': Not sure implementation

Favorites

Create

Shopping List

Profile

Database Requirements

This section outlines the specific technical requirements for the database store for this application. It will describe the required tables, fields, and other expectations.

Table ID Choice

Typically, I like to use UUID's for ID's. However, after some research I have concluded that for this application, the use of the SERIAL or BIGSERIAL type will work sufficiently. Security is not a huge concern with this application since no major data will be stored, however, measures will still be in place (of course).

One of the biggest reasons I choose UUID's is their obscurity which provides some basic security against specific attack styles (enumeration attacks, etc.), however, I do not anticipate that being a large concern, so the simplicity of using an integer will surpass the small, niche benefits of using UUID's.

Tables

Below is a breakdown of the required tables and their respective fields. The fields will also have a list of attributes which are to be implemented at the database level. JSONB data fields will also have a small example object. A more in-depth data structure can be found in OTHER section.

  • Recipe: Represents a single recipe.

    • ID (PK) BigSerial
    • Title (Unique, Required) string(128)
    • Description (Required) text
    • Instructions (Required) string(1024)[]
    • Serves (Required) int(0..16)
    • Difficulty (Required) int(1..5)
    • Duration (Required) JSONB({ "total": int, "prep": int, "cook": int })
    • Category (Required) E_Meal (defined in the enums section)
    • Ingredients (Required) JSONB({ "item_a": [{ "name": string, "quantity": string }], "item_b": ... })
    • UserId (FK: User.Id) BigSerial
    • Modified () date/time stamp
    • Created (Required) date/time stamp
  • User: Represents a single user.

    • ID (PK) BigSerial
    • Name (Required) string(64)
    • Email (Unique, Required) string(128)
    • Password (Required) string(128) stored as hash**
    • Created (Required) date/time stamp
  • Engagement: Represents a single engagement from a single user.

    • ID (PK) BigSerial
    • Message () text (Used to store any relevant notes, if needed)
    • Entity (BigSerial) BigSerial (Used to relate an entity, if needed)
    • UserId (FK: User.Id, Required) BigSerial
    • Created (Required) date/time stamp
  • Like: Many-to-many table to represent a list of recipes liked by a user.

    • ID (PK) Composite key**
    • UserId (FK: User.Id, Required) BigSerial
    • RecipeId (FK: Recipe.Id, Required) BigSerial
    • Created (Required) date/time stamp
  • Tag: Represents a single tag that can be had by many recipes.

    • ID (PK) BigSerial
    • Name (Unique, Required) string(32)
    • Created (Required) date/time stamp
  • RecipeTag: Many-to-many table to represent a list of tags on a recipe.

    • ID (PK) BigSerial
    • RecipeId (FK: Recipe.Id, Required) BigSerial
    • TagId (FK: Tag.Id, Required) BigSerial
    • Created (Required) date/time stamp
  • List: Represents a single users shopping list.

    • ID (PK) BigSerial
    • UserId (FK: User.Id, Required) BigSerial
    • Content (Required) JSONB([ { "name": string, "quantity": string }, ... ])
    • Created (Required) date/time stamp
  • Image: Represents a single image used by a single recipe.

    • ID (PK) BigSerial
    • RecipeId (FK: Recipe.Id, Required) BigSerial
    • Alt (Required) string(128) (alt text for accessibility, same as recipe title)
    • Url (Required) text
    • Created (Required) date/time stamp
  • Review: Represents a single review on a recipe from a single author.

    • ID (PK) BigSerial
    • Comment (Required) text
    • Rating () int(0..5) (Optional b/c nested replies don't need a rating)
    • ReviewId (FK: Review.Id) BigSerial (This is used for nested replies)
    • RecipeId (FK: Recipe.Id, Required) BigSerial
    • UserId (FK: User.Id, Required) BigSerial
    • Created (Required) date/time stamp
  • Notification: Represents a single user notification.

    • ID (PK) BigSerial
    • UserId (FK: User.Id, Required) BigSerial
    • Type (Required) E_Notification
    • Message (Required) text
    • Entity (BigSerial) BigSerial (Used to relate an entity, if needed)
    • Read (Required, Default: F) boolean
    • Created (Required) date/time stamp

'**': Not sure implementation

Enums and Types

Below is a breakdown of the required enumerated types that should be stored in the database. Various tables will reference these types.

  • E_Meal: Type to represent the type of meal of a recipe.

    • breakfast: string
    • lunch: string
    • dinner: string
    • desert: string
    • snack: string
    • side: string
    • other: string
  • E_Notification: Type to represent a type of user notification.

    • comment: string
    • like: string
    • system: string
  • E_Engagement: Type to represent a type of user engagement.

    • made: string
    • liked: string
    • viewed: string
    • shared: string
    • reviewed: string
    • rated: string