Files
meetletacbfree/classes/registration/error_mapper.php
T

136 lines
5.4 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
/**
* Map registration API / local error codes → product status and UX behaviour.
*
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
/**
* Branch on stable error.code only (never on message text).
*/
class error_mapper {
public const STATUS_ACTIVE = 'active';
public const STATUS_GRACE = 'grace';
public const STATUS_OFFLINE_GRACE_EXPIRED = 'offline_grace_expired';
public const STATUS_INVALID_KEY = 'invalid_key';
public const STATUS_EXPIRED = 'expired';
public const STATUS_SUSPENDED = 'suspended';
public const STATUS_REVOKED = 'revoked';
public const STATUS_DOMAIN_MISMATCH = 'domain_mismatch';
public const STATUS_ACTIVATION_LIMIT = 'activation_limit';
public const STATUS_NETWORK_ERROR = 'network_error';
public const STATUS_MISCONFIGURED = 'misconfigured';
public const STATUS_UNKNOWN = 'unknown';
public const STATUS_INACTIVE = 'inactive';
public const LOCAL_NETWORK_ERROR = 'NETWORK_ERROR';
public const LOCAL_INVALID_AUTHORIZATION_SIGNATURE = 'INVALID_AUTHORIZATION_SIGNATURE';
/**
* @return array{code:string,status:string,clear_auth:bool,message_key:string,details:?array}
*/
public static function map(string $code, ?array $details = null, bool $hasgraceauth = false): array {
$code = strtoupper(trim($code));
if ($code === '') {
$code = 'UNKNOWN';
}
switch ($code) {
case 'INVALID_LICENSE':
case 'INSTALLATION_NOT_FOUND':
return self::result($code, self::STATUS_INVALID_KEY, true, 'registration_err_invalid_key', $details);
case 'LICENSE_EXPIRED':
return self::result($code, self::STATUS_EXPIRED, true, 'registration_err_expired', $details);
case 'LICENSE_REVOKED':
case 'INSTALLATION_REVOKED':
return self::result($code, self::STATUS_REVOKED, true, 'registration_err_revoked', $details);
case 'LICENSE_SUSPENDED':
case 'CUSTOMER_SUSPENDED':
case 'PRODUCT_SUSPENDED':
return self::result($code, self::STATUS_SUSPENDED, true, 'registration_err_suspended', $details);
case 'PRODUCT_NOT_FOUND':
case 'PRODUCT_NOT_ENTITLED':
case 'PRODUCT_MISMATCH':
return self::result($code, self::STATUS_MISCONFIGURED, true, 'registration_err_product_mismatch', $details);
case 'DOMAIN_NOT_ALLOWED':
return self::result($code, self::STATUS_DOMAIN_MISMATCH, true, 'registration_err_domain', $details);
case 'ACTIVATION_LIMIT_REACHED':
case 'ACTIVATION_LIMIT':
return self::result($code, self::STATUS_ACTIVATION_LIMIT, true, 'registration_err_activation_limit', $details);
case 'INVALID_REQUEST_SIGNATURE':
case 'INVALID_SIGNATURE':
case 'TIMESTAMP_INVALID':
case 'VALIDATION_ERROR':
case 'INVALID_REQUEST':
return self::result($code, self::STATUS_MISCONFIGURED, false, 'registration_err_misconfigured', $details);
case self::LOCAL_INVALID_AUTHORIZATION_SIGNATURE:
return self::result($code, self::STATUS_MISCONFIGURED, true, 'registration_err_bad_signature', $details);
case 'REPLAY_DETECTED':
case 'RATE_LIMITED':
case 'TEMPORARY_LICENSE_SERVICE_UNAVAILABLE':
case self::LOCAL_NETWORK_ERROR:
if ($hasgraceauth) {
return self::result($code, self::STATUS_ACTIVE, false, '', $details);
}
return self::result($code, self::STATUS_NETWORK_ERROR, false, 'registration_err_network', $details);
default:
return self::result($code, self::STATUS_UNKNOWN, false, 'registration_err_unknown', $details);
}
}
/**
* @return array{code:string,status:string,clear_auth:bool,message_key:string,details:?array,request_id:?string,message:string}
*/
public static function from_exception(registration_exception $e, bool $hasgraceauth = false): array {
$mapped = self::map($e->get_error_code(), $e->get_details(), $hasgraceauth);
$mapped['request_id'] = $e->get_request_id();
$mapped['message'] = self::user_message($mapped['message_key'], $e->get_api_message());
return $mapped;
}
public static function user_message(string $messagekey, string $fallback = ''): string {
if ($messagekey !== '' && get_string_manager()->string_exists($messagekey, 'meetletacbfree')) {
return get_string($messagekey, 'meetletacbfree');
}
return $fallback !== '' ? $fallback : $messagekey;
}
/**
* @param array|null $details
* @return array{code:string,status:string,clear_auth:bool,message_key:string,details:?array}
*/
protected static function result(
string $code,
string $status,
bool $clearauth,
string $messagekey,
?array $details
): array {
return [
'code' => $code,
'status' => $status,
'clear_auth' => $clearauth,
'message_key' => $messagekey,
'details' => $details,
];
}
}