Implement versions 0.0.4-0.0.7 features

v0.0.4:
- Add WooCommerce settings tab for default license settings
- Per-product settings override global defaults

v0.0.5:
- Add bulk license operations (activate, deactivate, revoke, extend, delete)
- Add license renewal/extension and lifetime functionality
- Add quick action buttons per license row

v0.0.6:
- Add license dashboard with statistics and analytics
- Add license transfer functionality (admin)
- Add CSV export for licenses
- Add OpenAPI 3.1 specification
- Remove /deactivate API endpoint

v0.0.7:
- Move license dashboard to WooCommerce Reports section
- Add license search and filtering in admin
- Add customer-facing license transfer with AJAX modal
- Add email notifications for license expiration warnings
- Add bulk import licenses from CSV
- Update README with comprehensive documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-21 20:32:35 +01:00
parent 78e43b9aea
commit 49a0699963
21 changed files with 4132 additions and 289 deletions

View File

@@ -180,25 +180,6 @@ final class RestApiController
],
],
]);
// Deactivate license endpoint (public)
register_rest_route(self::NAMESPACE, '/deactivate', [
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'deactivateLicense'],
'permission_callback' => '__return_true',
'args' => [
'license_key' => [
'required' => true,
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
],
'domain' => [
'required' => true,
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
],
],
]);
}
/**
@@ -318,55 +299,4 @@ final class RestApiController
'message' => __('License activated successfully.', 'wc-licensed-product'),
]);
}
/**
* Deactivate license endpoint
*/
public function deactivateLicense(WP_REST_Request $request): WP_REST_Response
{
$rateLimitResponse = $this->checkRateLimit();
if ($rateLimitResponse !== null) {
return $rateLimitResponse;
}
$licenseKey = $request->get_param('license_key');
$domain = $request->get_param('domain');
$license = $this->licenseManager->getLicenseByKey($licenseKey);
if (!$license) {
return new WP_REST_Response([
'success' => false,
'error' => 'license_not_found',
'message' => __('License key not found.', 'wc-licensed-product'),
], 404);
}
$normalizedDomain = $this->licenseManager->normalizeDomain($domain);
// Verify domain matches
if ($license->getDomain() !== $normalizedDomain) {
return new WP_REST_Response([
'success' => false,
'error' => 'domain_mismatch',
'message' => __('License is not activated for this domain.', 'wc-licensed-product'),
], 403);
}
// Set status to inactive
$success = $this->licenseManager->updateLicenseStatus($license->getId(), 'inactive');
if (!$success) {
return new WP_REST_Response([
'success' => false,
'error' => 'deactivation_failed',
'message' => __('Failed to deactivate license.', 'wc-licensed-product'),
], 500);
}
return new WP_REST_Response([
'success' => true,
'message' => __('License deactivated successfully.', 'wc-licensed-product'),
]);
}
}