repository = $repository; $this->redactor = $redactor; } /** * Log a successful submission append. */ public function logSuccess(NormalizedSubmission $submission, array $settings): void { $this->saveEntry( $submission->getSubmissionId(), $submission->getProviderId(), $submission->getFormId(), $settings['connection_id'] ?? '', $settings['spreadsheet_id'] ?? '', $settings['worksheet_name'] ?? '', 'success', null, null, $submission->toArray() ); } /** * Log a queued/retrying submission attempt. */ public function logQueued( NormalizedSubmission $submission, array $settings, string $errorCode, string $errorMessage ): void { $this->saveEntry( $submission->getSubmissionId(), $submission->getProviderId(), $submission->getFormId(), $settings['connection_id'] ?? '', $settings['spreadsheet_id'] ?? '', $settings['worksheet_name'] ?? '', 'queued', $errorCode, $errorMessage, $submission->toArray() ); } /** * Log a terminal submission failure. */ public function logFailure( NormalizedSubmission $submission, array $settings, string $errorCode, string $errorMessage ): void { $this->saveEntry( $submission->getSubmissionId(), $submission->getProviderId(), $submission->getFormId(), $settings['connection_id'] ?? '', $settings['spreadsheet_id'] ?? '', $settings['worksheet_name'] ?? '', 'failed', $errorCode, $errorMessage, $submission->toArray() ); } /** * Log a background retry success. */ public function logBackgroundSuccess(QueueItem $item): void { $payload = $item->getPayload(); $submissionId = $payload['submission_id'] ?? ('oneclickformsync_bg_' . uniqid('', true)); $providerId = $payload['provider_id'] ?? 'queue_retry'; $formId = $payload['form_id'] ?? ('queue_item_' . $item->getId()); $logPayload = isset($payload['submission']) ? $payload['submission'] : $payload; $this->saveEntry( $submissionId, $providerId, $formId, $item->getConnectionId(), $item->getSpreadsheetId(), $item->getWorksheetName(), 'success', null, __('Background retry attempt succeeded.', '1-click-form-sync'), $logPayload ); } /** * Log a background retry rescheduled state. */ public function logBackgroundQueued(QueueItem $item, string $errorCode, string $errorMessage): void { $payload = $item->getPayload(); $submissionId = $payload['submission_id'] ?? ('oneclickformsync_bg_' . uniqid('', true)); $providerId = $payload['provider_id'] ?? 'queue_retry'; $formId = $payload['form_id'] ?? ('queue_item_' . $item->getId()); $logPayload = isset($payload['submission']) ? $payload['submission'] : $payload; $this->saveEntry( $submissionId, $providerId, $formId, $item->getConnectionId(), $item->getSpreadsheetId(), $item->getWorksheetName(), 'queued', $errorCode, $errorMessage, $logPayload ); } /** * Log a background retry terminal failure. */ public function logBackgroundFailed(QueueItem $item, string $errorCode, string $errorMessage): void { $payload = $item->getPayload(); $submissionId = $payload['submission_id'] ?? ('oneclickformsync_bg_' . uniqid('', true)); $providerId = $payload['provider_id'] ?? 'queue_retry'; $formId = $payload['form_id'] ?? ('queue_item_' . $item->getId()); $logPayload = isset($payload['submission']) ? $payload['submission'] : $payload; $this->saveEntry( $submissionId, $providerId, $formId, $item->getConnectionId(), $item->getSpreadsheetId(), $item->getWorksheetName(), 'failed', $errorCode, $errorMessage, $logPayload ); } /** * Run old logs retention purge. */ public function runCleanUp(): void { $days = (int)apply_filters('oneclickformsync_log_retention_days', 30); $this->repository->clearOldLogs($days); } /** * Write entry to database. */ private function saveEntry( string $submissionId, string $providerId, string $formId, string $connectionId, string $spreadsheetId, string $worksheetName, string $status, ?string $errorCode = null, ?string $errorMessage = null, ?array $payload = null ): void { $maskedId = $this->redactor->maskSpreadsheetId($spreadsheetId); $safeMessage = $errorMessage ? $this->redactor->redactSecrets($errorMessage) : null; $entry = new LogEntry([ 'submission_id' => $submissionId, 'provider_id' => $providerId, 'form_id' => $formId, 'connection_id' => $connectionId, 'spreadsheet_id_masked' => $maskedId, 'worksheet_name' => $worksheetName, 'status' => $status, 'error_code' => $errorCode, 'error_message' => $safeMessage, 'payload' => $payload, ]); $this->repository->save($entry); } }