4cc3f5bee4
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: PR Check / Validate PR (pull_request) Successful in 5s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 6s
Generic: Repo Health / Release configuration (push) Successful in 5s
Generic: Repo Health / Scripts governance (push) Successful in 5s
Generic: Repo Health / Release configuration (pull_request) Successful in 6s
Generic: Repo Health / Scripts governance (pull_request) Successful in 6s
Generic: Repo Health / Repository health (push) Successful in 14s
Generic: Repo Health / Repository health (pull_request) Successful in 12s
Platform: moko-platform CI / Gate 1: Code Quality (pull_request) Failing after 44s
Platform: moko-platform CI / Gate 1: Code Quality (push) Failing after 49s
Platform: moko-platform CI / Gate 5: Template Integrity (pull_request) Has been skipped
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been skipped
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Platform: moko-platform CI / CI Summary (pull_request) Has been cancelled
- Convert tabs to spaces (3,413 violations) - Fix line endings, trailing whitespace, brace placement - Break lines exceeding 150-char absolute limit - Replace heredoc tab closers with spaces - Fix empty elseif, forbidden function calls - Update phpcs.xml: exclude rules inappropriate for CLI scripts (SideEffects, MissingNamespace, MultipleClasses, HeaderOrder, empty catch blocks) Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
132 lines
3.4 KiB
PHP
132 lines
3.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Recovery Manager - High-level manager for recovery operations
|
|
*
|
|
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* FILE INFORMATION
|
|
* DEFGROUP: MokoStandards.Enterprise.Recovery
|
|
* INGROUP: MokoStandards.Enterprise
|
|
* REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
|
|
* PATH: /lib/Enterprise/RecoveryManager.php
|
|
* BRIEF: Recovery manager for failed operations
|
|
*
|
|
* @package MokoStandards\Enterprise
|
|
* @version 04.00.04
|
|
* @author MokoStandards Team
|
|
* @license GPL-3.0-or-later
|
|
*/
|
|
|
|
namespace MokoEnterprise;
|
|
|
|
use DateTime;
|
|
use DateTimeZone;
|
|
|
|
/**
|
|
* High-level manager for recovery operations.
|
|
*
|
|
* Features:
|
|
* - Check recovery availability
|
|
* - Recover operations from checkpoints
|
|
* - Track recovery history
|
|
* - Cleanup old checkpoints
|
|
*
|
|
* Example:
|
|
* ```php
|
|
* $manager = new RecoveryManager();
|
|
*
|
|
* if ($manager->canRecover('my_operation')) {
|
|
* $state = $manager->recoverOperation('my_operation');
|
|
* // Resume from saved state
|
|
* }
|
|
* ```
|
|
*/
|
|
class RecoveryManager
|
|
{
|
|
private CheckpointManager $checkpointManager;
|
|
/** @var array<array<string, mixed>> */
|
|
private array $recoveryLog = [];
|
|
|
|
/**
|
|
* Initialize recovery manager.
|
|
*
|
|
* @param string $checkpointDir Directory for checkpoints
|
|
*/
|
|
public function __construct(string $checkpointDir = '.checkpoints')
|
|
{
|
|
$this->checkpointManager = new CheckpointManager($checkpointDir);
|
|
}
|
|
|
|
/**
|
|
* Check if an operation can be recovered.
|
|
*
|
|
* @param string $operationName Name of the operation
|
|
* @return bool True if recovery checkpoint exists
|
|
*/
|
|
public function canRecover(string $operationName): bool
|
|
{
|
|
$checkpoints = $this->checkpointManager->listCheckpoints($operationName);
|
|
return count($checkpoints) > 0;
|
|
}
|
|
|
|
/**
|
|
* Recover an operation from checkpoint.
|
|
*
|
|
* @param string $operationName Name of the operation to recover
|
|
* @return array<string, mixed>|null Recovered state or null
|
|
*/
|
|
public function recoverOperation(string $operationName): ?array
|
|
{
|
|
error_log("Attempting to recover operation: {$operationName}");
|
|
$state = $this->checkpointManager->loadCheckpoint($operationName);
|
|
|
|
if ($state !== null) {
|
|
$this->recoveryLog[] = [
|
|
'operation' => $operationName,
|
|
'recovered_at' => (new DateTime('now', new DateTimeZone('UTC')))->format('c'),
|
|
'state' => $state,
|
|
];
|
|
error_log("Successfully recovered operation: {$operationName}");
|
|
} else {
|
|
error_log("No checkpoint found for operation: {$operationName}");
|
|
}
|
|
|
|
return $state;
|
|
}
|
|
|
|
/**
|
|
* Get recovery log.
|
|
*
|
|
* @return array<array<string, mixed>> List of recovery operations
|
|
*/
|
|
public function getRecoveryLog(): array
|
|
{
|
|
return $this->recoveryLog;
|
|
}
|
|
|
|
/**
|
|
* Clean up old checkpoints.
|
|
*
|
|
* @param int $keepLatest Number of latest checkpoints to keep per operation
|
|
*/
|
|
public function cleanupOldCheckpoints(int $keepLatest = 5): void
|
|
{
|
|
$this->checkpointManager->cleanupCheckpoints(null, $keepLatest);
|
|
}
|
|
|
|
/**
|
|
* Get checkpoint manager instance.
|
|
*
|
|
* @return CheckpointManager
|
|
*/
|
|
public function getCheckpointManager(): CheckpointManager
|
|
{
|
|
return $this->checkpointManager;
|
|
}
|
|
}
|