Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion backend/app/database/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ def db_delete_images_by_ids(image_ids: List[ImageId]) -> bool:


def db_toggle_image_favourite_status(image_id: str) -> bool:
conn = sqlite3.connect(DATABASE_PATH)
conn = _connect()
cursor = conn.cursor()
try:
cursor.execute("SELECT id FROM images WHERE id = ?", (image_id,))
Expand All @@ -456,6 +456,23 @@ def db_toggle_image_favourite_status(image_id: str) -> bool:
conn.close()


def db_get_image_favourite_status(image_id: str) -> Optional[bool]:
conn = _connect()
cursor = conn.cursor()

try:
cursor.execute("SELECT isFavourite FROM images WHERE id = ?", (image_id,))
result = cursor.fetchone()
if result is None:
return None
return bool(result[0])
except Exception as e:
logger.error(f"Error getting favourite status for image {image_id}: {e}")
return None
finally:
conn.close()


# ============================================================================
# MEMORIES FEATURE - Location and Time-based Queries
# ============================================================================
Expand Down
22 changes: 15 additions & 7 deletions backend/app/routes/images.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
from fastapi import APIRouter, HTTPException, Query, status
from typing import List, Optional
from app.database.images import db_get_all_images
from app.database.images import (
db_get_all_images,
db_get_image_favourite_status,
db_toggle_image_favourite_status,
)
from app.schemas.images import ErrorResponse
from app.utils.images import image_util_parse_metadata
from pydantic import BaseModel
from app.database.images import db_toggle_image_favourite_status
from app.logging.setup_logging import get_logger

# Initialize logger
Expand Down Expand Up @@ -104,16 +107,21 @@ def toggle_favourite(req: ToggleFavouriteRequest):
raise HTTPException(
status_code=404, detail="Image not found or failed to toggle"
)
# Fetch updated status to return
image = next(
(img for img in db_get_all_images() if img["id"] == image_id), None
)

is_favourite = db_get_image_favourite_status(image_id)
if is_favourite is None:
raise HTTPException(
status_code=404, detail="Image not found or failed to toggle"
)

return {
"success": True,
"image_id": image_id,
"isFavourite": image.get("isFavourite", False),
"isFavourite": is_favourite,
}

except HTTPException as e:
raise e
except Exception as e:
logger.error(f"error in /toggle-favourite route: {e}")
raise HTTPException(status_code=500, detail=f"Internal server error: {e}")
Expand Down
47 changes: 47 additions & 0 deletions backend/tests/test_images.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from fastapi import FastAPI
from fastapi.testclient import TestClient
from unittest.mock import patch

from app.routes.images import router as images_router


app = FastAPI()
app.include_router(images_router, prefix="/images")
client = TestClient(app)


class TestToggleFavourite:
@patch("app.routes.images.db_get_image_favourite_status")
@patch("app.routes.images.db_toggle_image_favourite_status")
def test_toggle_favourite_existing_image_success(
self,
mock_toggle_image_favourite_status,
mock_get_image_favourite_status,
):
mock_toggle_image_favourite_status.return_value = True
mock_get_image_favourite_status.return_value = True

response = client.post(
"/images/toggle-favourite", json={"image_id": "image-123"}
)

assert response.status_code == 200
assert response.json() == {
"success": True,
"image_id": "image-123",
"isFavourite": True,
}

@patch("app.routes.images.db_toggle_image_favourite_status")
def test_toggle_favourite_unknown_image_returns_404(
self,
mock_toggle_image_favourite_status,
):
mock_toggle_image_favourite_status.return_value = False

response = client.post(
"/images/toggle-favourite", json={"image_id": "unknown-image"}
)

assert response.status_code == 404
assert response.json()["detail"] == "Image not found or failed to toggle"