""" Contact API Router - Simplified (Read-Only) Only GET endpoints for now """ from fastapi import APIRouter, HTTPException, Query from typing import Optional from app.core.database import execute_query import logging logger = logging.getLogger(__name__) router = APIRouter() @router.get("/contacts-debug") async def debug_contacts(): """Debug endpoint: Check contact-company links""" try: # Count links links = execute_query("SELECT COUNT(*) as total FROM contact_companies") # Get sample with links sample = execute_query(""" SELECT c.id, c.first_name, c.last_name, COUNT(cc.customer_id) as company_count, ARRAY_AGG(cu.name) as company_names FROM contacts c LEFT JOIN contact_companies cc ON c.id = cc.contact_id LEFT JOIN customers cu ON cc.customer_id = cu.id GROUP BY c.id, c.first_name, c.last_name HAVING COUNT(cc.customer_id) > 0 LIMIT 10 """) # Test the actual query used in get_contacts test_query = """ SELECT c.id, c.first_name, c.last_name, COUNT(DISTINCT cc.customer_id) as company_count, ARRAY_AGG(DISTINCT cu.name ORDER BY cu.name) FILTER (WHERE cu.name IS NOT NULL) as company_names FROM contacts c LEFT JOIN contact_companies cc ON c.id = cc.contact_id LEFT JOIN customers cu ON cc.customer_id = cu.id GROUP BY c.id, c.first_name, c.last_name ORDER BY c.last_name, c.first_name LIMIT 10 """ test_result = execute_query(test_query) return { "total_links": links[0]['total'] if links else 0, "sample_contacts_with_companies": sample or [], "test_query_result": test_result or [], "note": "If company_count is 0, the JOIN might not be working" } except Exception as e: logger.error(f"Debug failed: {e}", exc_info=True) raise HTTPException(status_code=500, detail=str(e)) @router.get("/contacts") async def get_contacts( search: Optional[str] = None, customer_id: Optional[int] = None, is_active: Optional[bool] = None, limit: int = Query(default=100, le=1000), offset: int = Query(default=0, ge=0) ): """Get all contacts with optional filtering""" try: where_clauses = [] params = [] if search: where_clauses.append("(c.first_name ILIKE %s OR c.last_name ILIKE %s OR c.email ILIKE %s)") params.extend([f"%{search}%", f"%{search}%", f"%{search}%"]) if is_active is not None: where_clauses.append("c.is_active = %s") params.append(is_active) where_sql = "WHERE " + " AND ".join(where_clauses) if where_clauses else "" # Count total (needs alias c for consistency) count_query = f"SELECT COUNT(*) as count FROM contacts c {where_sql}" count_result = execute_query(count_query, tuple(params)) total = count_result[0]['count'] if count_result else 0 # Get contacts with company info query = f""" SELECT c.id, c.first_name, c.last_name, c.email, c.phone, c.mobile, c.title, c.department, c.is_active, c.created_at, c.updated_at, COUNT(DISTINCT cc.customer_id) as company_count, ARRAY_AGG(DISTINCT cu.name ORDER BY cu.name) FILTER (WHERE cu.name IS NOT NULL) as company_names FROM contacts c LEFT JOIN contact_companies cc ON c.id = cc.contact_id LEFT JOIN customers cu ON cc.customer_id = cu.id {where_sql} GROUP BY c.id, c.first_name, c.last_name, c.email, c.phone, c.mobile, c.title, c.department, c.is_active, c.created_at, c.updated_at ORDER BY c.first_name, c.last_name LIMIT %s OFFSET %s """ params.extend([limit, offset]) contacts = execute_query(query, tuple(params)) return { "total": total, "contacts": contacts, "limit": limit, "offset": offset } except Exception as e: logger.error(f"Failed to get contacts: {e}") raise HTTPException(status_code=500, detail=str(e)) @router.get("/contacts/{contact_id}") async def get_contact(contact_id: int): """Get a single contact by ID with linked companies""" try: # Get contact info query = """ SELECT id, first_name, last_name, email, phone, mobile, title, department, is_active, user_company, vtiger_id, created_at, updated_at FROM contacts WHERE id = %s """ contacts = execute_query(query, (contact_id,)) if not contacts: raise HTTPException(status_code=404, detail="Contact not found") contact = contacts[0] # Get linked companies companies_query = """ SELECT cu.id, cu.name, cu.cvr_number, cc.is_primary, cc.role, cc.notes FROM contact_companies cc JOIN customers cu ON cc.customer_id = cu.id WHERE cc.contact_id = %s ORDER BY cc.is_primary DESC, cu.name """ companies = execute_query(companies_query, (contact_id,)) contact['companies'] = companies or [] return contact except HTTPException: raise except Exception as e: logger.error(f"Failed to get contact {contact_id}: {e}") raise HTTPException(status_code=500, detail=str(e))