Release 202506141856

This commit is contained in:
pluja
2025-06-14 18:56:58 +00:00
parent cf5f3b3228
commit effb6689d7
37 changed files with 276 additions and 221 deletions

View File

@@ -96,7 +96,7 @@ Tasks will run according to their configured cron schedules.
### Force Triggers Task
- Maintains database triggers by forcing them to run under certain conditions
- Currently handles updating the "isRecentlyListed" flag for services after 15 days
- Currently handles updating the "isRecentlyApproved" flag for services after 15 days
- Scheduled via `CRON_FORCE-TRIGGERS_TASK`
### Service Score Recalculation Task

View File

@@ -89,6 +89,11 @@ def parse_args(args: List[str]) -> argparse.Namespace:
score_recalc_parser.add_argument(
"--service-id", type=int, help="Specific service ID to process (optional)"
)
score_recalc_parser.add_argument(
"--all",
action="store_true",
help="Recalculate scores for all services (ignores --service-id)",
)
return parser.parse_args(args)
@@ -295,12 +300,15 @@ def run_force_triggers_task() -> int:
close_db_pool()
def run_service_score_recalc_task(service_id: Optional[int] = None) -> int:
def run_service_score_recalc_task(
service_id: Optional[int] = None, all_services: bool = False
) -> int:
"""
Run the service score recalculation task.
Args:
service_id: Optional specific service ID to process.
all_services: Whether to recalculate scores for all services.
Returns:
Exit code.
@@ -310,7 +318,34 @@ def run_service_score_recalc_task(service_id: Optional[int] = None) -> int:
try:
# Initialize task and use as context manager
with ServiceScoreRecalculationTask() as task: # type: ignore
result = task.run(service_id) # type: ignore
if all_services:
queued = task.recalculate_all_services() # type: ignore
if not queued:
logger.warning(
"Failed to queue recalculation jobs for all services"
)
# Continuously process queued jobs in batches until none remain
while True:
_ = task.run() # type: ignore
# Check if there are still unprocessed jobs
remaining = 0
if task.conn:
with task.conn.cursor() as cursor:
cursor.execute(
'SELECT COUNT(*) FROM "ServiceScoreRecalculationJob" WHERE "processedAt" IS NULL'
)
remaining = cursor.fetchone()[0]
if remaining == 0:
break
result = True # All jobs processed successfully
else:
result = task.run(service_id) # type: ignore
if result:
logger.info("Successfully recalculated service scores")
else:
@@ -419,7 +454,9 @@ def main() -> int:
elif args.task == "force-triggers":
return run_force_triggers_task()
elif args.task == "service-score-recalc":
return run_service_score_recalc_task(args.service_id)
return run_service_score_recalc_task(
args.service_id, getattr(args, "all", False)
)
elif args.task:
logger.error(f"Unknown task: {args.task}")
return 1

View File

@@ -9,7 +9,7 @@ class ForceTriggersTask(Task):
Force triggers to run under certain conditions.
"""
RECENT_LISTED_INTERVAL_DAYS = 15
RECENT_APPROVED_INTERVAL_DAYS = 15
def __init__(self):
super().__init__("force_triggers")
@@ -24,10 +24,10 @@ class ForceTriggersTask(Task):
update_query = f"""
UPDATE "Service"
SET "isRecentlyListed" = FALSE, "updatedAt" = NOW()
WHERE "isRecentlyListed" = TRUE
AND "listedAt" IS NOT NULL
AND "listedAt" < NOW() - INTERVAL '{self.RECENT_LISTED_INTERVAL_DAYS} days'
SET "isRecentlyApproved" = FALSE, "updatedAt" = NOW()
WHERE "isRecentlyApproved" = TRUE
AND "approvedAt" IS NOT NULL
AND "approvedAt" < NOW() - INTERVAL '{self.RECENT_APPROVED_INTERVAL_DAYS} days'
"""
try:
with self.conn.cursor() as cursor:

View File

@@ -205,8 +205,7 @@ class ServiceScoreRecalculationTask(Task):
cursor.execute(
"""
SELECT id
FROM "Service"
WHERE "isActive" = TRUE
FROM "Service"
"""
)
services = cursor.fetchall()