Fix summarizer worker infinite loop and map AI trigger errors to safe HTTP responses.

Paginate un-summarized tenders and mark rows missing notice/folder IDs as handled so the worker cannot spin forever. Return 400/404 for validation and not-found cases on AI summarize/analyze triggers instead of leaking internal errors as 500.
This commit is contained in:
Mazyar
2026-06-08 20:24:02 +03:30
parent 7d383c36c3
commit d07e1c9cf0
4 changed files with 64 additions and 13 deletions
+18 -2
View File
@@ -589,7 +589,7 @@ func (h *TenderHandler) TriggerAISummarize(c echo.Context) error {
"tender_id": id,
"error": err.Error(),
})
return response.InternalServerError(c, err.Error())
return mapAITriggerHTTPError(c, err, "AI summarization")
}
return response.Success(c, result, "AI summarization completed successfully")
@@ -619,12 +619,28 @@ func (h *TenderHandler) TriggerAIAnalyze(c echo.Context) error {
"tender_id": id,
"error": err.Error(),
})
return response.InternalServerError(c, err.Error())
return mapAITriggerHTTPError(c, err, "AI analysis")
}
return response.Success(c, result, "AI analysis completed successfully")
}
// mapAITriggerHTTPError maps AI trigger service errors to safe HTTP responses.
func mapAITriggerHTTPError(c echo.Context, err error, action string) error {
switch {
case errors.Is(err, ErrEmptyTenderID), errors.Is(err, ErrInvalidTenderID):
return response.BadRequest(c, "Invalid request", "Invalid tender ID")
case errors.Is(err, ErrTenderNotFound), errors.Is(err, orm.ErrDocumentNotFound):
return response.NotFound(c, "Tender not found")
case errors.Is(err, ErrTenderMissingNoticeID), errors.Is(err, ErrTenderMissingContractFolderID):
return response.BadRequest(c, "Tender not eligible", "Tender is missing required identifiers for AI processing")
case errors.Is(err, ErrAINotConfigured):
return response.InternalServerError(c, "AI service is not available")
default:
return response.InternalServerError(c, action+" failed")
}
}
// TriggerAITranslate triggers on-demand AI translation for a tender
// @Summary Trigger AI translation
// @Description Trigger on-demand AI translation for tender title and description (cached in MinIO by the AI service)