Skip to the content.

Feature FRQ

My feature + submitted files for FRQ requierments

Summary of Code/examples

Category Explanation & Code Example
List/Other Collection Type Uses a list of dictionaries (items) to store gift data with tags.
Procedure Type & Return Type search_items() filters matching items and returns JSON data.
Parameters Takes a query string (q) as input to filter results.
Algorithm Uses sequencing (extract query, search, return results), selection (match query to item names), and iteration (loop through items).
Procedure Call Triggered by oninput="searchItems()" in the search bar.
Instructions for Output Displays matching items or an error message dynamically.

List/collection type

Uses a list of dictionaries to store item data, including names, links, and associated tags.

// example items pulled from list is api/search.py
items = [
   {"name": "Teddy Bear", "link": "/holiday_frontend/holiday/toys", "tags": {"all": 1, "teddy": 0, "bear": 0, "toys": 0}},
   {"name": "Lego Set", "link": "/holiday_frontend/holiday/toys", "tags": {"all": 1, "lego": 0, "set": 0, "toys": 0}}
]

type: ditionary

purpose: store items, links, tags

Use: fetches from dictionary in frontend to link to pages, and fetches tags in model to add points when interacted with


Procedure Type & Return Type

Key procedure searchItems(), queries the item list and returns a JSON list of matching items.

// get function pulled from api/search.py (gets the query from searchbar and returns the name, link, and tags)
@search_api.route("", methods=["GET"])
@token_required()
def search_items():
    query = request.args.get("q", "").lower()
    if not query:
        return jsonify([])

    results = [
        {"name": item["name"], "link": item["link"], "tags": item["tags"]}
        for item in items if query in item["name"].lower()
    ]
    return jsonify(results), 200

Procedure Type: Filters items based on search query

Return Type: JSON list of matching items


Algorithm (Sequencing, Selection, Iteration)

Sequencing: extracting the query, earching for matches, returning results.

Selection: The function checks if the query matches any item names.

// query if the item name exsists in the dictionary (selection)
if query in item["name"].lower():

–> If true, the item is added to the results list, If false, it is skipped.

Iteration: Loops through the item, finds matching results, builds the list of related data

// itterating/applying results based on query from selection
results = [
    {"name": item["name"], "link": item["link"], "tags": item["tags"]}
    for item in items if query in item["name"].lower()
]

Call to the Procedure

In frontend (index.md), the searchItems() function is triggered when a user types into the search bar.

// when inputing into searchbar function calls
<input 
  type="text" 
  id="searchInput" 
  placeholder="🔍 Search for an item or tag..." 
  oninput="searchItems()"
/>

Event-Driven Execution: Every time a user types (oninput), the search function is called (SearchItems())


Instructions for Output Based on Input

The search function outputs a list of matching items or an error message (depending on whether or not paramaters are met)

// input into search bar (when user toby logged in)
{    "name": "Teddy Bear"}
// output for related input 
{
    "message": "Tags for 'Teddy Bear' updated successfully!",
    "tags": {
        "all": 2,
        "bear": 1,
        "teddy": 1,
        "toys": 1
    }
}
// output if input is not found
{
    "error": "Item not found!"
}
//In the frontend, results are displayed dynamically (on the index page):

const resultsDiv = document.getElementById('results');
resultsDiv.innerHTML = ''; // Clear previous results

if (items.length > 0) {
    items.forEach(item => {
        const resultDiv = document.createElement('div');
        resultDiv.className = 'result';
        resultDiv.textContent = item.name;
        resultDiv.onclick = async () => {
            await incrementTags(item.name);
            window.location.href = item.link;
        };
        resultsDiv.appendChild(resultDiv);
    });
} else {
    resultsDiv.textContent = 'No results found.';
}

If items exist, they are displayed as clickable elements.

If no matches, “No results found.” is shown.