Skip to main content

Internal Service: database_operations

Handles all database interactions for visibility results and scores. Uses entity_prompts_tracker (combined prompts + visibility) and visibility_score_history tables.

Functions

get_entity_id

Resolves a business/product to its database entity ID.
async def get_entity_id(
    business_id: str,
    product_id: Optional[str] = None
) -> Optional[str]
ParameterTypeDescription
business_idstrClerk org slug
product_idstrOptional product slug

get_business_info

Fetches business/product information for visibility checks.
async def get_business_info(
    business_id: str,
    product_id: Optional[str] = None
) -> dict
Returns:
{
    "business_name": "...",
    "business_url": "...",
    "product_name": "..."  # Only if product_id provided
}

update_prompt_visibility

Updates visibility results for a single prompt.
async def update_prompt_visibility(
    entity_id: str,
    prompt: str,
    visibility_results: dict
) -> bool
Updates columns: chatgpt, claude, gemini, perplexity, copilot, deepseek, grok, google_ai, checked_at, last_tested_at

batch_update_visibility_results

Updates visibility results for multiple prompts in parallel.
async def batch_update_visibility_results(
    entity_id: str,
    results: list[dict]
) -> int
Returns: Number of prompts successfully updated Performance: Uses asyncio.gather for parallel database updates.

update_visibility_scores

Updates the overall visibility score for an entity (UPSERT pattern).
async def update_visibility_scores(
    business_id: str,
    product_id: Optional[str],
    platform_scores: dict,
    overall_score: int,
    total_queries: int,
    total_visible: int
) -> None
Behavior:
  • Updates recent_score column
  • Appends to history_scores JSONB array
  • Keeps last 365 days of history

get_visibility_results_from_db

Retrieves visibility results from entity_prompts_tracker.
async def get_visibility_results_from_db(
    business_id: str,
    product_id: Optional[str] = None,
    limit: int = 100
) -> list[dict]

Gets visibility score history for trend analysis.
async def get_visibility_trends_from_db(
    business_id: str,
    product_id: Optional[str] = None,
    days: int = 30
) -> list[dict]
Returns: List of history entries from history_scores JSONB array

Database Tables

entity_prompts_tracker

Combined prompts and visibility results per entity.
ColumnTypeDescription
entity_idUUIDForeign key to entities
prompttextThe search prompt
chatgptbooleanVisibility on ChatGPT
claudebooleanVisibility on Claude
geminibooleanVisibility on Gemini
perplexitybooleanVisibility on Perplexity
copilotbooleanVisibility on Copilot
deepseekbooleanVisibility on DeepSeek
grokbooleanVisibility on Grok
google_aibooleanVisibility on Google AI
checked_attimestampWhen last checked
last_tested_attimestampWhen last tested

visibility_score_history

Historical visibility scores per entity.
ColumnTypeDescription
entity_idUUIDForeign key to entities
recent_scoreintegerLatest overall score (0-100)
history_scoresJSONBArray of daily score entries

Code Location

src/app/apis/cron/analyze_visibility/database_operations.py