<?php namespace Give\API\REST\V3\Routes\Subscriptions\DataTransferObjects; use Exception; use Give\API\REST\V3\Routes\Subscriptions\Fields\SubscriptionFields; use Give\Subscriptions\Models\Subscription; use WP_REST_Request; /** * @since 4.8.0 */ class SubscriptionCreateData { /** * @var array */ private $attributes; /** * @since 3.0.0 */ public function __construct(array $attributes) { $this->attributes = $this->processAttributes($attributes); } /** * Create SubscriptionCreateData from REST request * * @since 4.8.0 * * @param WP_REST_Request $request * @return SubscriptionCreateData */ public static function fromRequest(WP_REST_Request $request): SubscriptionCreateData { return new self($request->get_params()); } /** * Convert to Subscription model * * @since 4.8.0 * * @return Subscription * @throws Exception */ public function createSubscription(): Subscription { // Filter out auto-generated fields $subscriptionAttributes = array_filter($this->attributes, function ($key) { return !in_array($key, ['id', 'createdAt', 'updatedAt'], true); }, ARRAY_FILTER_USE_KEY); return Subscription::create($subscriptionAttributes); } /** * Get the processed attributes * * @since 4.8.0 * * @return array */ public function getAttributes(): array { return $this->attributes; } /** * Process attributes for special data types * * @since 4.8.0 * * @param array $attributes * @return array */ private function processAttributes(array $attributes): array { $processedAttributes = []; foreach ($attributes as $key => $value) { if ($key === 'id' || $key === 'createdAt' || $key === 'updatedAt') { // Skip these fields as they are auto-generated continue; } $processedAttributes[$key] = SubscriptionFields::processValue($key, $value); } return $processedAttributes; } }