feat: Updated endpoint endpoints/get-grocery2.get.py via AI

This commit is contained in:
Backend IM Bot 2025-04-13 22:44:36 +00:00
parent 2b1f1b4c2b
commit 4c5152bbdb
4 changed files with 68 additions and 27 deletions

View File

@ -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')

View File

@ -1,25 +1,28 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import List
from core.database import get_db from core.database import get_db
from typing import Optional from schemas.grocery import GrocerySchema
from uuid import UUID from helpers.grocery_helpers import get_grocery_by_name, normalize_grocery_name
from helpers.grocery_helpers import get_grocery_by_name, normalize_grocery_name, validate_grocery_name
router = APIRouter() router = APIRouter()
@router.get("/get-grocery2", response_model=Optional[UUID]) @router.get("/get-grocery2", response_model=List[GrocerySchema])
async def get_grocery_id_by_name( async def get_grocery2(name: str, db: Session = Depends(get_db)):
name: str, """
db: Session = Depends(get_db) Get grocery items by name after fixing the faulty migration
): """
if not validate_grocery_name(name): try:
raise HTTPException(status_code=400, detail="Invalid grocery name") normalized_name = normalize_grocery_name(name)
grocery = get_grocery_by_name(db=db, name=normalized_name)
normalized_name = normalize_grocery_name(name) if not grocery:
grocery = get_grocery_by_name(db, normalized_name) raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
if not grocery: detail="Grocery not found"
raise HTTPException(status_code=404, detail="Grocery not found") )
return [grocery] # Return as list for consistency with response_model
return grocery.id except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e)
)

View File

@ -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 Optional[Grocery]: The newly created grocery object, or None if creation failed
""" """
try: 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.add(db_grocery)
db.commit() db.commit()
db.refresh(db_grocery) 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]: 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: Args:
db (Session): The database session db (Session): The database session
@ -37,7 +38,8 @@ def get_grocery_by_name(db: Session, name: str) -> Optional[Grocery]:
Returns: Returns:
Optional[Grocery]: The grocery object if found, otherwise None 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: 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: 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: Args:
name (str): The name to normalize name (str): The name to normalize
@ -70,6 +73,9 @@ def normalize_grocery_name(name: str) -> str:
Returns: Returns:
str: The normalized name str: The normalized name
""" """
if not name:
raise ValueError("Grocery name cannot be empty")
# Remove extra whitespace and capitalize first letter # Remove extra whitespace and capitalize first letter
normalized = " ".join(name.split()) normalized = " ".join(name.split())
return normalized.strip().capitalize() return normalized.strip().capitalize()

View File

@ -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.dialects.postgresql import UUID
from sqlalchemy.sql import func from sqlalchemy.sql import func
from core.database import Base from core.database import Base
@ -8,6 +8,11 @@ class Grocery(Base):
__tablename__ = "groceries" __tablename__ = "groceries"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) 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()) created_at = Column(DateTime, default=func.now())
updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) 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'),
)