ifixkart-backend/app/repositories/StorefrontRepository.py

51 lines
2.1 KiB
Python

"""
@repository StorefrontRepository (Backend/app/repositories/StorefrontRepository.py)
@purpose Data access layer for StorefrontContent, ProductReviews, and Settings.
"""
from sqlalchemy.orm import Session
from sqlalchemy import select, and_
from typing import List, Optional
import ulid
from app.models.StorefrontContentModel import StorefrontContent, ContentStatusEnum
from app.models.ProductReviewModel import ProductReview, ProductReviewImage
from app.models.SettingModel import Setting
class StorefrontRepository:
def __init__(self, db: Session):
self.db = db
def get_active_content(self, page: str, region: Optional[str] = None) -> List[StorefrontContent]:
query = select(StorefrontContent).where(StorefrontContent.page == page)
if region:
query = query.where(StorefrontContent.region == region)
query = query.order_by(StorefrontContent.display_order.asc())
return self.db.execute(query).scalars().all()
def get_content_by_id(self, content_id: str) -> Optional[StorefrontContent]:
return self.db.execute(select(StorefrontContent).where(StorefrontContent.content_id == content_id)).scalar_one_or_none()
def create_or_update_content(self, content: StorefrontContent) -> StorefrontContent:
self.db.add(content)
self.db.commit()
self.db.refresh(content)
return content
def get_approved_reviews(self, product_id: str) -> List[ProductReview]:
return self.db.execute(
select(ProductReview)
.where(and_(ProductReview.product_id == product_id, ProductReview.is_approved == True))
.order_by(ProductReview.created_at.desc())
).scalars().all()
def create_review(self, review: ProductReview) -> ProductReview:
self.db.add(review)
self.db.commit()
self.db.refresh(review)
return review
def get_public_settings(self, group: Optional[str] = None) -> List[Setting]:
query = select(Setting).where(Setting.is_public == True)
if group:
query = query.where(Setting.group == group)
return self.db.execute(query).scalars().all()