Skip to content

Refactor/toggle-favourite endpoint to eliminate full-table query and improve query efficiency #1200

@Riddhi8077

Description

@Riddhi8077

Describe the feature

Overview

The current implementation of the /toggle-favourite endpoint retrieves all images from the database after updating the isFavourite flag, and then filters the target image in memory.

Although functionally correct, this introduces unnecessary database and processing overhead.


Current Implementation

After toggling the favourite status, the route executes:

image = next(
    (img for img in db_get_all_images() if img["id"] == image_id), None
)

db_get_all_images() performs:

  • Multiple JOIN operations
  • Metadata parsing
  • Tag grouping
  • Dataset sorting

This entire workflow runs even though only a single image record is required.


Why This Matters

This approach:

  • Scales linearly with total image count
  • Increases latency for a frequently used endpoint
  • Performs unnecessary joins and metadata parsing
  • Couples a single-record use case with a full-collection query

As image collections grow, this can negatively impact responsiveness.


Proposed Improvement

  1. Introduce a dedicated method:

    db_get_image_by_id(image_id: str)
  2. Query only the required record with necessary JOINs.

  3. Refactor /toggle-favourite to use this optimized method instead of calling db_get_all_images().


Expected Benefits

  • Reduced database load
  • Improved scalability
  • Cleaner endpoint behavior
  • Better separation of concerns

I would be happy to implement this improvement.

Record

  • I agree to follow this project's Code of Conduct
  • I want to work on this issue

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions