diff --git a/src/GraphQL/Types/Substrate/AttributeType.php b/src/GraphQL/Types/Substrate/AttributeType.php index 135a97fa..9c20e27d 100644 --- a/src/GraphQL/Types/Substrate/AttributeType.php +++ b/src/GraphQL/Types/Substrate/AttributeType.php @@ -5,6 +5,7 @@ use Enjin\Platform\GraphQL\Types\Traits\InSubstrateSchema; use Enjin\Platform\Interfaces\PlatformGraphQlType; use Enjin\Platform\Models\Attribute; +use Illuminate\Support\Str; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Type; @@ -40,7 +41,7 @@ public function fields(): array 'description' => __('enjin-platform::mutation.batch_set_attribute.args.value'), 'resolve' => function ($attribute) { if (strtolower($attribute->key) == 'uri' && strpos($attribute->value, '{id}') !== false && $attribute->token_id) { - return str_replace('{id}', $attribute->token->token_chain_id, $attribute->value); + return Str::replace('{id}', "{$attribute->token->collection->collection_chain_id}-{$attribute->token->token_chain_id}", $attribute->value); } return $attribute->value; diff --git a/src/Models/Laravel/Block.php b/src/Models/Laravel/Block.php index 63027709..adb48071 100644 --- a/src/Models/Laravel/Block.php +++ b/src/Models/Laravel/Block.php @@ -44,7 +44,7 @@ class Block extends BaseModel /** * Get the prunable model query. * - * @return \Illuminate\Database\Eloquent\Builder + * @return Builder */ public function prunable(): Builder { diff --git a/src/Models/Laravel/Token.php b/src/Models/Laravel/Token.php index 884cc9c6..dac02148 100644 --- a/src/Models/Laravel/Token.php +++ b/src/Models/Laravel/Token.php @@ -11,6 +11,7 @@ use Facades\Enjin\Platform\Services\Database\MetadataService; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Support\Str; use Staudenmeir\EloquentEagerLimit\HasEagerLimit; class Token extends BaseModel @@ -140,7 +141,21 @@ protected function fetchMetadata(): Attribute protected function metadata(): Attribute { return new Attribute( - get: fn () => $this->attributes['metadata'] ?? MetadataService::fetch($this->getRelation('attributes')->first()), + get: function () { + $tokenUriAttribute = $this->fetchUriAttribute($this); + $fetchedMetadata = $this->attributes['metadata'] ?? MetadataService::fetch($tokenUriAttribute); + + if (!$fetchedMetadata) { + $collectionUriAttribute = $this->fetchUriAttribute($this->collection); + if ($collectionUriAttribute && Str::contains($collectionUriAttribute->value, '{id}')) { + $collectionUriAttribute->value = Str::replace('{id}', "{$this->collection->collection_chain_id}-{$this->token_chain_id}", $collectionUriAttribute->value); + } + + $fetchedMetadata = MetadataService::fetch($collectionUriAttribute); + } + + return $fetchedMetadata; + }, ); } @@ -162,4 +177,11 @@ protected function pivotIdentifier(): Attribute get: fn () => "{$collection->collection_chain_id}:{$this->token_chain_id}", ); } + + private function fetchUriAttribute($model) + { + return $model->load('attributes')->getRelation('attributes') + ->filter(fn ($attribute) => 'uri' == $attribute->key) + ->first(); + } } diff --git a/tests/Feature/GraphQL/Queries/GetTokenTest.php b/tests/Feature/GraphQL/Queries/GetTokenTest.php index 51e1b5d3..2f8b3ccd 100644 --- a/tests/Feature/GraphQL/Queries/GetTokenTest.php +++ b/tests/Feature/GraphQL/Queries/GetTokenTest.php @@ -83,7 +83,7 @@ public function test_it_can_replace_id_metadata(): void $this->assertArraySubset([ 'attributes' => [[ 'key' => 'uri', - 'value' => 'https://example.com/' . $this->token->token_chain_id, + 'value' => "https://example.com/{$this->collection->collection_chain_id}-{$this->token->token_chain_id}", ], ], ], $response);