Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 19 additions & 7 deletions backend/services/auto_close_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ def run(self) -> Dict:
Execute the auto-close job.

Process:
1. Fetch all resolved tickets
1. Fetch all resolved tickets (paginated to avoid memory exhaustion)
2. Group by company_id
3. For each company, check auto-close settings from DATABASE
4. Close tickets older than auto_close_days
Expand All @@ -196,14 +196,26 @@ def run(self) -> Dict:
try:
logger.info("Starting auto-close job...")

# Fetch all resolved tickets
response = self.supabase.table("tickets").select(
"id, company_id, status, updated_at"
).eq("status", "resolved").execute()
# Fetch resolved tickets in pages to avoid memory exhaustion at scale
PAGE_SIZE = 1000
resolved_tickets: List[Dict] = []
offset = 0

while True:
response = self.supabase.table("tickets").select(
"id, company_id, status, updated_at"
).eq("status", "resolved").range(offset, offset + PAGE_SIZE - 1).execute()

page = response.data if response.data else []
resolved_tickets.extend(page)
logger.info(f"Fetched page of {len(page)} resolved tickets (offset={offset})")

if len(page) < PAGE_SIZE:
break
offset += PAGE_SIZE

resolved_tickets = response.data if response.data else []
stats["processed_count"] = len(resolved_tickets)
logger.info(f"Found {len(resolved_tickets)} resolved tickets")
logger.info(f"Found {len(resolved_tickets)} resolved tickets total")

if not resolved_tickets:
logger.info("No resolved tickets to process")
Expand Down