Untitled

 avatar
unknown
plain_text
5 months ago
4.3 kB
3
Indexable
  from typing import List, Optional
from sqlalchemy.orm import Session, joinedload
from sqlalchemy import or_

from app.graphql.schema import Info
from app.graphql.types.product_type import ProductType, ProductFieldType, StatusType, CountryType, TherapeuticType
from app.models import Product, User


async def product_data(
    self, info: Info, user: str = None, page: int = 1, rows: int = 10
) -> List[ProductType]:
    session: Session = info.context.session
    try:
        # Fetch user details
        user_obj = session.query(User)
        if user:
            user_obj = user_obj.filter_by(login=user).first()
        if not user_obj:
            return "User not found"
        # Get associated countries and therapeutic areas
        country_ids = [uc.id for uc in user_obj.users_countries]
        ta_ids = [ut.id for ut in user_obj.users_therapeutics]
        # Apply filters on Product records
        products = (
            session.query(Product)
            .filter(
                Product.is_deleted != 2,  # Check if product is not marked as deleted
                or_(
                    Product.last_active > 0,  # Last active condition
                    Product.current_record == 1,  # Current record condition
                    Product.is_deleted == 1  # Allow deleted product if marked with 1
                ),
                Product.country_id.in_(country_ids) if country_ids else True,
                Product.th_area.in_(ta_ids) if ta_ids else True
            )
            .options(
                joinedload(Product.status),
                joinedload(Product.country),
                joinedload(Product.therapeutic),
                joinedload(Product.product_fields)  # Load product_fields relationship
            )
            #.limit(10)
            .all()
        )

        # Construct product response
        response = []
        for product in products:
            product_fields = [
                ProductFieldType(
                    record_id=pf.record_id,  # Corrected to use product_field_id
                    field_id=pf.field_id,
                    max_field_value=pf.field_value,  # Set field_value as max_field_value
                    field_detail=FieldDetailType(
                        field_id=pf.field_detail.field_id,
                        field_name=pf.field_detail.field_name
                    )
                )
                for pf in product.product_fields
            ]
            
            response.append(ProductType(
                record_id=product.record_id,
                janssen_mstr_prdct_nm=product.janssen_mstr_prdct_nm,
                product_phase=product.product_phase,
                jnj_full_compound_id=product.jnj_full_compound_id,
                generic_name=product.generic_name,
                jnj_flag=product.jnj_flag,
                product_status=product.product_status,
                current_record=product.current_record,
                last_active=product.last_active,
                created_date=product.created_date,
                updated_date=product.updated_date,
                status=StatusType(
                    status_id=product.status.id,
                    status_desc=product.status.description
                ),
                country=CountryType(
                    country_id=product.country.id,
                    country_name=product.country.name
                ),
                therapeutic=TherapeuticType(
                    ta_id=product.therapeutic.id,
                    ta_name=product.therapeutic.name
                ),
                product_fields=product_fields  # Add product_fields to the response
            ))

        return response

    finally:
        session.close()
For the above code I am passing the payload for resolver as:
query {
  productData(user: "mkr3", page: 1, rows: 10) {
    id
    mdmId
    seriesId
    countryId
    productFields {
      recordId
      fieldId
      fieldDetails {
        id
        name
      }
    }
  }
}
But I am getting the response as:
{
  "data": {
    "productData": []
  }
}
The 'productData' should not be an empty list
Editor is loading...
Leave a Comment