From 4c5152bbdb1e1b54e79baef7ab23da3096d20986 Mon Sep 17 00:00:00 2001 From: Backend IM Bot Date: Sun, 13 Apr 2025 22:44:36 +0000 Subject: [PATCH] feat: Updated endpoint endpoints/get-grocery2.get.py via AI --- ...20250413_224425_45e055c7_update_grocery.py | 27 ++++++++++++ endpoints/get-grocery2.get.py | 43 ++++++++++--------- helpers/grocery_helpers.py | 14 ++++-- models/grocery.py | 11 +++-- 4 files changed, 68 insertions(+), 27 deletions(-) create mode 100644 alembic/versions/20250413_224425_45e055c7_update_grocery.py diff --git a/alembic/versions/20250413_224425_45e055c7_update_grocery.py b/alembic/versions/20250413_224425_45e055c7_update_grocery.py new file mode 100644 index 0000000..29a0c12 --- /dev/null +++ b/alembic/versions/20250413_224425_45e055c7_update_grocery.py @@ -0,0 +1,27 @@ +"""create groceries table +Revision ID: 8f2b3d5c +Revises: 7d4e9f2a +Create Date: 2024-01-20 10:30:00.000000 +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '8f2b3d5c' +down_revision = '7d4e9f2a' +branch_labels = None +depends_on = None + +def upgrade(): + op.create_table( + 'groceries', + sa.Column('id', sa.String(36), primary_key=True), + sa.Column('name', sa.String(), nullable=False), + sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()), + sa.Column('updated_at', sa.DateTime(), server_default=sa.func.now()) + ) + op.create_index('ix_groceries_name', 'groceries', ['name']) + +def downgrade(): + op.drop_index('ix_groceries_name', table_name='groceries') + op.drop_table('groceries') \ No newline at end of file diff --git a/endpoints/get-grocery2.get.py b/endpoints/get-grocery2.get.py index 384aefc..3b00b1e 100644 --- a/endpoints/get-grocery2.get.py +++ b/endpoints/get-grocery2.get.py @@ -1,25 +1,28 @@ -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session +from typing import List from core.database import get_db -from typing import Optional -from uuid import UUID - -from helpers.grocery_helpers import get_grocery_by_name, normalize_grocery_name, validate_grocery_name +from schemas.grocery import GrocerySchema +from helpers.grocery_helpers import get_grocery_by_name, normalize_grocery_name router = APIRouter() -@router.get("/get-grocery2", response_model=Optional[UUID]) -async def get_grocery_id_by_name( - name: str, - db: Session = Depends(get_db) -): - if not validate_grocery_name(name): - raise HTTPException(status_code=400, detail="Invalid grocery name") - - normalized_name = normalize_grocery_name(name) - grocery = get_grocery_by_name(db, normalized_name) - - if not grocery: - raise HTTPException(status_code=404, detail="Grocery not found") - - return grocery.id \ No newline at end of file +@router.get("/get-grocery2", response_model=List[GrocerySchema]) +async def get_grocery2(name: str, db: Session = Depends(get_db)): + """ + Get grocery items by name after fixing the faulty migration + """ + try: + normalized_name = normalize_grocery_name(name) + grocery = get_grocery_by_name(db=db, name=normalized_name) + if not grocery: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Grocery not found" + ) + return [grocery] # Return as list for consistency with response_model + except ValueError as e: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=str(e) + ) \ No newline at end of file diff --git a/helpers/grocery_helpers.py b/helpers/grocery_helpers.py index 967e3f8..7f007cd 100644 --- a/helpers/grocery_helpers.py +++ b/helpers/grocery_helpers.py @@ -17,7 +17,8 @@ def create_grocery(db: Session, grocery_data: GroceryCreate) -> Optional[Grocery Optional[Grocery]: The newly created grocery object, or None if creation failed """ try: - db_grocery = Grocery(**grocery_data.dict()) + normalized_name = normalize_grocery_name(grocery_data.name) + db_grocery = Grocery(name=normalized_name) db.add(db_grocery) db.commit() db.refresh(db_grocery) @@ -28,7 +29,7 @@ def create_grocery(db: Session, grocery_data: GroceryCreate) -> Optional[Grocery def get_grocery_by_name(db: Session, name: str) -> Optional[Grocery]: """ - Retrieves a grocery item by its name. + Retrieves a grocery item by its name using the indexed name column. Args: db (Session): The database session @@ -37,7 +38,8 @@ def get_grocery_by_name(db: Session, name: str) -> Optional[Grocery]: Returns: Optional[Grocery]: The grocery object if found, otherwise None """ - return db.query(Grocery).filter(Grocery.name == name).first() + normalized_name = normalize_grocery_name(name) + return db.query(Grocery).filter(Grocery.name == normalized_name).first() def validate_grocery_name(name: str) -> bool: """ @@ -62,7 +64,8 @@ def validate_grocery_name(name: str) -> bool: def normalize_grocery_name(name: str) -> str: """ - Normalizes a grocery name for consistency in storage. + Normalizes a grocery name for consistency in storage and indexing. + Ensures consistent name format for the indexed name column. Args: name (str): The name to normalize @@ -70,6 +73,9 @@ def normalize_grocery_name(name: str) -> str: Returns: str: The normalized name """ + if not name: + raise ValueError("Grocery name cannot be empty") + # Remove extra whitespace and capitalize first letter normalized = " ".join(name.split()) return normalized.strip().capitalize() \ No newline at end of file diff --git a/models/grocery.py b/models/grocery.py index 780542d..492c2ce 100644 --- a/models/grocery.py +++ b/models/grocery.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, String, DateTime +from sqlalchemy import Column, String, DateTime, Index from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.sql import func from core.database import Base @@ -8,6 +8,11 @@ class Grocery(Base): __tablename__ = "groceries" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - name = Column(String, nullable=False, index=True) + name = Column(String, nullable=False) created_at = Column(DateTime, default=func.now()) - updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) \ No newline at end of file + updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) + + # Create a separate index for name to ensure proper indexing + __table_args__ = ( + Index('ix_groceries_name', 'name'), + ) \ No newline at end of file