From fd311e82740279d2735a68d4f5142b29dd613c54 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Wed, 8 May 2024 17:33:20 +0200 Subject: [PATCH 01/27] add use hashids method --- src/LunarApi.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/LunarApi.php b/src/LunarApi.php index 807d55c7..bedc7eb1 100644 --- a/src/LunarApi.php +++ b/src/LunarApi.php @@ -43,6 +43,14 @@ public static function checkoutCartUsing(string $class): void App::singleton(CheckoutCart::class, $class); } + /** + * Use hashids are used. + */ + public static function useHashids(bool $useHashids = true): void + { + Config::set('lunar-api.general.use_hashids', $useHashids); + } + /** * Check if hashids are used. */ From e349196d915d9f5abca2929345fad40bdf966d3b Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Wed, 8 May 2024 17:33:27 +0200 Subject: [PATCH 02/27] add lunar api config --- src/LunarApiConfig.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/LunarApiConfig.php diff --git a/src/LunarApiConfig.php b/src/LunarApiConfig.php new file mode 100644 index 00000000..65bf702b --- /dev/null +++ b/src/LunarApiConfig.php @@ -0,0 +1,15 @@ +config = DomainConfigCollection::make(); + } +} From f0c9a351040abe54ac92bcd49894f7d07a0199c9 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Wed, 8 May 2024 17:33:31 +0200 Subject: [PATCH 03/27] register lunar api config --- src/LunarApiServiceProvider.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/LunarApiServiceProvider.php b/src/LunarApiServiceProvider.php index 3bc21fa8..85bc037e 100644 --- a/src/LunarApiServiceProvider.php +++ b/src/LunarApiServiceProvider.php @@ -42,11 +42,8 @@ public function register(): void $this->registerPolicies(); }); - // Register the main class to use with the facade. - $this->app->singleton( - 'lunar-api', - fn () => new LunarApi, - ); + $this->app->singleton('lunar-api', fn () => new LunarApi); + $this->app->singleton('lunar-api-config', fn () => new LunarApiConfig); // Register payment adapters register. $this->app->singleton( From 4b0df2ad81d32ee6d669160203a3924984a9ab37 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Wed, 8 May 2024 23:27:34 +0200 Subject: [PATCH 04/27] add lunar api config facade --- src/Facades/LunarApiConfig.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Facades/LunarApiConfig.php diff --git a/src/Facades/LunarApiConfig.php b/src/Facades/LunarApiConfig.php new file mode 100644 index 00000000..f4914842 --- /dev/null +++ b/src/Facades/LunarApiConfig.php @@ -0,0 +1,18 @@ + Date: Thu, 9 May 2024 00:18:01 +0200 Subject: [PATCH 05/27] add docblocks --- src/Facades/LunarApiConfig.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Facades/LunarApiConfig.php b/src/Facades/LunarApiConfig.php index f4914842..668babcd 100644 --- a/src/Facades/LunarApiConfig.php +++ b/src/Facades/LunarApiConfig.php @@ -4,14 +4,20 @@ use Illuminate\Support\Facades\Facade; +/** + * @method static \Illuminate\Support\Collection getSchemas() + * @method static \Illuminate\Support\Collection getRoutes() + * @method static \Illuminate\Support\Collection getModels() + * @method static \Illuminate\Support\Collection getPolicies() + * + * @see \Dystcz\LunarApi\LunarApiConfig + */ class LunarApiConfig extends Facade { /** * Get the registered name of the component. - * - * @return string */ - protected static function getFacadeAccessor() + protected static function getFacadeAccessor(): string { return 'lunar-api-config'; } From 2159844553afc90315ced4d82a40f81c49765508 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Thu, 9 May 2024 00:18:04 +0200 Subject: [PATCH 06/27] add docblocks --- src/Facades/LunarApi.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Facades/LunarApi.php b/src/Facades/LunarApi.php index 4873a081..a5948abe 100644 --- a/src/Facades/LunarApi.php +++ b/src/Facades/LunarApi.php @@ -4,14 +4,22 @@ use Illuminate\Support\Facades\Facade; +/** + * @method static void createUserUsing(string $class) + * @method static void createUserFromCartUsing(string $class) + * @method static void registerUserUsing(string $class) + * @method static void checkoutCartUsing(string $class) + * @method static void useHashids(bool $useHashids = true) + * @method static bool usesHashids() + * + * @see \Dystcz\LunarApi\LunarApi + */ class LunarApi extends Facade { /** * Get the registered name of the component. - * - * @return string */ - protected static function getFacadeAccessor() + protected static function getFacadeAccessor(): string { return 'lunar-api'; } From b2216d720f600e8daf16e296fde8c6739a480d83 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Thu, 9 May 2024 00:18:18 +0200 Subject: [PATCH 07/27] rename method and set domain name for domain config --- .../Config/Collections/DomainConfigCollection.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Support/Config/Collections/DomainConfigCollection.php b/src/Support/Config/Collections/DomainConfigCollection.php index b51e28ec..76d00fc0 100644 --- a/src/Support/Config/Collections/DomainConfigCollection.php +++ b/src/Support/Config/Collections/DomainConfigCollection.php @@ -25,9 +25,11 @@ public static function make($items = []): self */ public static function fromConfig(string $configKey): self { - $items = array_map(function (array $domain) { - return new DomainConfig(...$domain); - }, Config::get($configKey, [])); + $items = array_map( + fn (string $domain, array $config) => new DomainConfig($domain, ...$config), + array_keys(Config::get($configKey, [])), + array_values(Config::get($configKey, [])) + ); return new static($items); } @@ -63,7 +65,7 @@ public function getRoutes(): self /** * Get models for Lunar model manifest. */ - public function getModelsForModelManifest(): self + public function getModels(): self { return $this->mapWithKeys(function (DomainConfig $domain) { if (! $domain->swapsLunarModel()) { From e24d91e9a72d59219978e83c084516dd662b0af6 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Thu, 9 May 2024 00:18:39 +0200 Subject: [PATCH 08/27] update domain config --- src/Support/Config/Data/DomainConfig.php | 175 +++++++++++++++++++++-- 1 file changed, 161 insertions(+), 14 deletions(-) diff --git a/src/Support/Config/Data/DomainConfig.php b/src/Support/Config/Data/DomainConfig.php index 700da78d..4b4ae77a 100644 --- a/src/Support/Config/Data/DomainConfig.php +++ b/src/Support/Config/Data/DomainConfig.php @@ -2,18 +2,20 @@ namespace Dystcz\LunarApi\Support\Config\Data; +use Dystcz\LunarApi\Domain\JsonApi\Resources\JsonApiResource; +use Dystcz\LunarApi\Routing\Contracts\RouteGroup as RouteGroupContract; use Exception; use Illuminate\Support\Str; +use LaravelJsonApi\Contracts\Schema\Schema; +use Lunar\Base\BaseModel; class DomainConfig { /** - * @param array $route_actions - * @param array $actions - * @param array $notifications - * @param array $settings + * @param array $rest */ public function __construct( + public string $domain, public ?string $model = null, public ?string $lunar_model = null, public ?string $policy = null, @@ -22,20 +24,97 @@ public function __construct( public ?string $query = null, public ?string $collection_query = null, public ?string $routes = null, - public array $route_actions = [], - public array $actions = [], - public array $notifications = [], - public array $settings = [], + array ...$rest, ) { $this->validate(); } + /** + * Get domain name. + */ + public function getDomain(): string + { + return $this->domain; + } + + /** + * Get model class. + */ + public function getModel(): ?string + { + return $this->model; + } + + /** + * Get lunar model class. + */ + public function getLunarModel(): ?string + { + return $this->lunar_model; + } + + /** + * Get policy class. + */ + public function getPolicy(): ?string + { + return $this->policy; + } + + /** + * Get schema class. + */ + public function getSchema(): ?string + { + return $this->schema; + } + + /** + * Get resource class. + */ + public function getResource(): ?string + { + return $this->resource; + } + + /** + * Get query class. + */ + public function getQuery(): ?string + { + return $this->query; + } + + /** + * Get collection query class. + */ + public function getCollectionQuery(): ?string + { + return $this->collection_query; + } + + /** + * Get routes class. + */ + public function getRoutes(): ?string + { + return $this->routes; + } + /** * Check if domain has schema. */ public function hasSchema(): bool { - return ! is_null($this->schema); + return ! is_null($this->getSchema()); + } + + /** + * Check if domain has resource. + */ + public function hasResource(): bool + { + return ! is_null($this->getResource()); } /** @@ -43,7 +122,7 @@ public function hasSchema(): bool */ public function hasModel(): bool { - return ! is_null($this->model); + return ! is_null($this->getModel()); } /** @@ -51,7 +130,7 @@ public function hasModel(): bool */ public function hasLunarModel(): bool { - return ! is_null($this->lunar_model); + return ! is_null($this->getLunarModel()); } /** @@ -67,7 +146,7 @@ public function swapsLunarModel(): bool */ public function hasPolicy(): bool { - return ! is_null($this->policy); + return ! is_null($this->getPolicy()); } /** @@ -75,7 +154,7 @@ public function hasPolicy(): bool */ public function hasRoutes(): bool { - return ! is_null($this->routes); + return ! is_null($this->getRoutes()); } /** @@ -84,8 +163,12 @@ public function hasRoutes(): bool public function validate(): void { $this->validateClassExistence(); + $this->validateModel(); + $this->validateSchema(); + $this->validateResource(); + $this->validateRoutes(); - // TODO: Add remaining checks + // ... } /** @@ -113,6 +196,70 @@ private function validateClassExistence(): void } } + /** + * Validate model. + */ + private function validateModel(): void + { + if (! $this->swapsLunarModel()) { + return; + } + + $this->validateSubclassOf( + 'model', + $this->getModel(), + BaseModel::class, + ); + } + + /** + * Validate schema. + */ + private function validateSchema(): void + { + if (! $this->hasSchema()) { + return; + } + + $this->validateClassImplements( + 'schema', + $this->getSchema(), + Schema::class, + ); + } + + /** + * Validate resource. + */ + private function validateResource(): void + { + if (! $this->hasResource()) { + return; + } + + $this->validateSubclassOf( + 'resource', + $this->getResource(), + JsonApiResource::class, + ); + } + + /** + * Validate domain route groups. + */ + private function validateRoutes(): void + { + if (! $this->hasRoutes()) { + return; + } + + $this->validateClassImplements( + 'routes', + $this->getRoutes(), + RouteGroupContract::class, + ); + } + /** * Validate that a class exists. * From 99508f46925c1507b683c36a0bc2ecbedacb6cad Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Thu, 9 May 2024 00:19:01 +0200 Subject: [PATCH 09/27] add methods which get collections of configured classes from domain config --- src/LunarApiConfig.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/LunarApiConfig.php b/src/LunarApiConfig.php index 65bf702b..7d7fd8a6 100644 --- a/src/LunarApiConfig.php +++ b/src/LunarApiConfig.php @@ -3,6 +3,7 @@ namespace Dystcz\LunarApi; use Dystcz\LunarApi\Support\Config\Collections\DomainConfigCollection; +use Illuminate\Support\Collection; class LunarApiConfig { @@ -12,4 +13,36 @@ public function __construct() { $this->config = DomainConfigCollection::make(); } + + /** + * Get schemas. + */ + public function getSchemas(): Collection + { + return $this->config->getSchemas(); + } + + /** + * Get routes. + */ + public function getRoutes(): Collection + { + return $this->config->getRoutes(); + } + + /** + * Get models for model manifest. + */ + public function getModels(): Collection + { + return $this->config->getModels(); + } + + /** + * Get policies. + */ + public function getPolicies(): Collection + { + return $this->config->getPolicies(); + } } From e46f2f14d6c9cd2457f2f790c1f8b8695a4fdfe7 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Thu, 9 May 2024 00:19:06 +0200 Subject: [PATCH 10/27] rename method --- src/LunarApiServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LunarApiServiceProvider.php b/src/LunarApiServiceProvider.php index ae5f730d..8f00b951 100644 --- a/src/LunarApiServiceProvider.php +++ b/src/LunarApiServiceProvider.php @@ -346,7 +346,7 @@ protected function registerObservers(): void protected function registerModels(): void { ModelManifest::register( - DomainConfigCollection::make()->getModelsForModelManifest(), + DomainConfigCollection::make()->getModels(), ); } From aa492588b77792e54c22cd4186e80b15d3c8f399 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Thu, 9 May 2024 00:19:10 +0200 Subject: [PATCH 11/27] add lunar api config test --- tests/Unit/LunarApiConfigTest.php | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/Unit/LunarApiConfigTest.php diff --git a/tests/Unit/LunarApiConfigTest.php b/tests/Unit/LunarApiConfigTest.php new file mode 100644 index 00000000..46478ffe --- /dev/null +++ b/tests/Unit/LunarApiConfigTest.php @@ -0,0 +1,64 @@ +getSchemas(); + + expect($schemas)->toBeInstanceOf(\Illuminate\Support\Collection::class); + +})->group('config'); + +it('can list configured route groups', function () { + /** @var TestCase $this */ + + /** @var \Dystcz\LunarApi\LunarApiConfig $config */ + $config = App::make('lunar-api-config'); + + $routes = $config->getRoutes(); + + expect($routes)->toBeInstanceOf(\Illuminate\Support\Collection::class); + +})->group('config'); + +it('can list configured models for lunar model manifest', function () { + /** @var TestCase $this */ + + /** @var \Dystcz\LunarApi\LunarApiConfig $config */ + $config = App::make('lunar-api-config'); + + $models = $config->getModels(); + + expect($models)->toBeInstanceOf(\Illuminate\Support\Collection::class); + + $registeredModels = ModelManifest::getRegisteredModels(); + + $this->assertSame($models->toArray(), $registeredModels->toArray()); + +})->group('config'); + +it('can list configured policies', function () { + /** @var TestCase $this */ + + /** @var \Dystcz\LunarApi\LunarApiConfig $config */ + $config = App::make('lunar-api-config'); + + $policies = $config->getPolicies(); + + expect($policies)->toBeInstanceOf(\Illuminate\Support\Collection::class); + +})->group('config'); From 88fb549d8907897ba285f6c139a4699fcd1e8ccb Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 02:15:31 +0200 Subject: [PATCH 12/27] rename method --- src/LunarApiConfig.php | 2 +- src/LunarApiServiceProvider.php | 8 ++++---- src/Support/Config/Collections/DomainConfigCollection.php | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/LunarApiConfig.php b/src/LunarApiConfig.php index 7d7fd8a6..fcef4439 100644 --- a/src/LunarApiConfig.php +++ b/src/LunarApiConfig.php @@ -35,7 +35,7 @@ public function getRoutes(): Collection */ public function getModels(): Collection { - return $this->config->getModels(); + return $this->config->getModelsForModelManifest(); } /** diff --git a/src/LunarApiServiceProvider.php b/src/LunarApiServiceProvider.php index 9b703fc3..b36efed6 100644 --- a/src/LunarApiServiceProvider.php +++ b/src/LunarApiServiceProvider.php @@ -14,7 +14,7 @@ use Illuminate\Support\Facades\Gate; use Illuminate\Support\ServiceProvider; use Lunar\Base\CartSessionInterface; -use Lunar\Facades\ModelManifest; +use Lunar\Facades\ModelManifest as ModelManifestFacade; class LunarApiServiceProvider extends ServiceProvider { @@ -403,9 +403,9 @@ protected function registerObservers(): void */ protected function registerModels(): void { - ModelManifest::register( - DomainConfigCollection::make()->getModels(), - ); + foreach (DomainConfigCollection::make()->getModelsForModelManifest() as $contract => $model) { + ModelManifestFacade::add($contract, $model); + } } /** diff --git a/src/Support/Config/Collections/DomainConfigCollection.php b/src/Support/Config/Collections/DomainConfigCollection.php index fdd2881a..2738ee9a 100644 --- a/src/Support/Config/Collections/DomainConfigCollection.php +++ b/src/Support/Config/Collections/DomainConfigCollection.php @@ -75,7 +75,7 @@ public function getRoutes(): self /** * Get models for Lunar model manifest. */ - public function getModels(): self + public function getModelsForModelManifest(): self { return $this->mapWithKeys(function (DomainConfig $domain) { if (! $domain->swapsModel()) { From 3b4ca3f98fe3fad21e862f30f3a3102a70df3833 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 02:17:18 +0200 Subject: [PATCH 13/27] fix test --- tests/Unit/LunarApiConfigTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/LunarApiConfigTest.php b/tests/Unit/LunarApiConfigTest.php index 46478ffe..2ace2b2a 100644 --- a/tests/Unit/LunarApiConfigTest.php +++ b/tests/Unit/LunarApiConfigTest.php @@ -45,9 +45,9 @@ expect($models)->toBeInstanceOf(\Illuminate\Support\Collection::class); - $registeredModels = ModelManifest::getRegisteredModels(); - - $this->assertSame($models->toArray(), $registeredModels->toArray()); + foreach ($models as $contract => $model) { + $this->assertSame($model, ModelManifest::get($contract)); + } })->group('config'); From 3798ce96cf58b9e70d61eda150d87e906c44abbe Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 02:18:52 +0200 Subject: [PATCH 14/27] add spatie php structure discoverer package --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8bc7a4fd..9941ec2a 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,8 @@ "laravel-json-api/hashids": "^3.0", "laravel-json-api/laravel": "^4.0", "laravel-json-api/non-eloquent": "^4.0", - "lunarphp/lunar": "^1.0.0-beta.1" + "lunarphp/lunar": "^1.0.0-beta.3", + "spatie/php-structure-discoverer": "^2.0" }, "require-dev": { "barryvdh/laravel-ide-helper": "^3.0", From 92ff88d148a4f457504dbb811c58c7de226aee1c Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:51:31 +0200 Subject: [PATCH 15/27] add replace model attribute to models --- src/Base/Attributes/ReplaceModel.php | 16 ++++++++++++++++ src/Domain/Addresses/Models/Address.php | 3 +++ .../AttributeGroups/Models/AttributeGroup.php | 3 +++ src/Domain/Attributes/Models/Attribute.php | 3 +++ src/Domain/Brands/Models/Brand.php | 3 +++ src/Domain/CartAddresses/Models/CartAddress.php | 3 +++ src/Domain/CartLines/Models/CartLine.php | 3 +++ src/Domain/Carts/Models/Cart.php | 3 +++ src/Domain/Channels/Models/Channel.php | 3 +++ .../CollectionGroups/Models/CollectionGroup.php | 3 +++ src/Domain/Collections/Models/Collection.php | 3 +++ src/Domain/Countries/Models/Country.php | 3 +++ src/Domain/Currencies/Models/Currency.php | 3 +++ src/Domain/Customers/Models/Customer.php | 3 +++ .../OrderAddresses/Models/OrderAddress.php | 3 +++ src/Domain/OrderLines/Models/OrderLine.php | 3 +++ src/Domain/Orders/Models/Order.php | 3 +++ src/Domain/Prices/Models/Price.php | 3 +++ .../Models/ProductAssociation.php | 3 +++ .../Models/ProductOptionValue.php | 3 +++ .../ProductOptions/Models/ProductOption.php | 3 +++ src/Domain/ProductTypes/Models/ProductType.php | 3 +++ .../ProductVariants/Models/ProductVariant.php | 3 +++ src/Domain/Products/Models/Product.php | 3 +++ src/Domain/Tags/Models/Tag.php | 3 +++ src/Domain/TaxZones/Models/TaxZone.php | 3 +++ src/Domain/Transactions/Models/Transaction.php | 3 +++ src/Domain/Urls/Models/Url.php | 3 +++ src/Domain/Users/Models/User.php | 2 ++ 29 files changed, 99 insertions(+) create mode 100644 src/Base/Attributes/ReplaceModel.php diff --git a/src/Base/Attributes/ReplaceModel.php b/src/Base/Attributes/ReplaceModel.php new file mode 100644 index 00000000..4fb1ccaa --- /dev/null +++ b/src/Base/Attributes/ReplaceModel.php @@ -0,0 +1,16 @@ + Date: Tue, 22 Oct 2024 04:51:42 +0200 Subject: [PATCH 16/27] add type resolver to schemas --- .../JsonApi/V1/PaymentOptionSchema.php | 19 +++++++++++++++---- .../JsonApi/V1/ShippingOptionSchema.php | 19 +++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php b/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php index 6947cabb..bc5a43c0 100644 --- a/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php +++ b/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php @@ -2,6 +2,7 @@ namespace Dystcz\LunarApi\Domain\PaymentOptions\JsonApi\V1; +use Dystcz\LunarApi\Domain\JsonApi\Core\Schema\TypeResolver; use Dystcz\LunarApi\Domain\PaymentOptions\Entities\PaymentOption; use LaravelJsonApi\Core\Schema\Schema; use LaravelJsonApi\Eloquent\Fields\ArrayHash; @@ -40,6 +41,16 @@ public function fields(): iterable ]; } + /** + * {@inheritDoc} + */ + public function repository(): PaymentOptionRepository + { + return PaymentOptionRepository::make() + ->withServer($this->server) + ->withSchema($this); + } + /** * {@inheritDoc} */ @@ -51,10 +62,10 @@ public function authorizable(): bool /** * {@inheritDoc} */ - public function repository(): PaymentOptionRepository + public static function type(): string { - return PaymentOptionRepository::make() - ->withServer($this->server) - ->withSchema($this); + $resolver = new TypeResolver; + + return $resolver(static::class); } } diff --git a/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php b/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php index 6db1aec6..016a425d 100644 --- a/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php +++ b/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php @@ -2,6 +2,7 @@ namespace Dystcz\LunarApi\Domain\ShippingOptions\JsonApi\V1; +use Dystcz\LunarApi\Domain\JsonApi\Core\Schema\TypeResolver; use Dystcz\LunarApi\Domain\ShippingOptions\Entities\ShippingOption; use LaravelJsonApi\Core\Schema\Schema; use LaravelJsonApi\Eloquent\Fields\ArrayHash; @@ -33,6 +34,16 @@ public function fields(): iterable ]; } + /** + * {@inheritDoc} + */ + public function repository(): ShippingOptionRepository + { + return ShippingOptionRepository::make() + ->withServer($this->server) + ->withSchema($this); + } + /** * {@inheritDoc} */ @@ -44,10 +55,10 @@ public function authorizable(): bool /** * {@inheritDoc} */ - public function repository(): ShippingOptionRepository + public static function type(): string { - return ShippingOptionRepository::make() - ->withServer($this->server) - ->withSchema($this); + $resolver = new TypeResolver; + + return $resolver(static::class); } } From 4387c92754ca35b876f016bcfb3d8deaa84f0ce9 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:51:50 +0200 Subject: [PATCH 17/27] update model contract --- config/domains.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/domains.php b/config/domains.php index 2bb38510..30b54968 100644 --- a/config/domains.php +++ b/config/domains.php @@ -359,7 +359,7 @@ SchemaType::get(Dystcz\LunarApi\Domain\Users\Contracts\User::class) => [ 'model' => Dystcz\LunarApi\Domain\Users\Models\User::class, - 'model_contract' => Dystcz\LunarApi\Domain\Users\Contracts\User::class, + 'model_contract' => Lunar\Base\LunarUser::class, 'policy' => Dystcz\LunarApi\Domain\Users\Policies\UserPolicy::class, 'schema' => Dystcz\LunarApi\Domain\Users\JsonApi\V1\UserSchema::class, 'resource' => Dystcz\LunarApi\Domain\Users\JsonApi\V1\UserResource::class, From b5f19621aadec05f743563e9c680729b36eb8e36 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:51:58 +0200 Subject: [PATCH 18/27] add get root method --- src/Facades/LunarApi.php | 1 + src/LunarApi.php | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/Facades/LunarApi.php b/src/Facades/LunarApi.php index 10de45a5..7a95fbb4 100644 --- a/src/Facades/LunarApi.php +++ b/src/Facades/LunarApi.php @@ -14,6 +14,7 @@ * @method static \Dystcz\LunarApi\LunarApi checkoutCartUsing(class-string $class) * @method static \Dystcz\LunarApi\LunarApi hashIds(bool $value) Set ID hashing * @method static bool usesHashids() Check if the API hashes resource IDs + * @method static string getRoot() * * @see \Dystcz\LunarApi\LunarApi */ diff --git a/src/LunarApi.php b/src/LunarApi.php index 593582d3..131b4e92 100644 --- a/src/LunarApi.php +++ b/src/LunarApi.php @@ -8,4 +8,9 @@ class LunarApi { use Concerns\HasAuth; use Concerns\HashesIds; + + public function getRoot(): string + { + return __DIR__; + } } From d3af869afd72c9ea8c4a86226eb832e4ebc3ba58 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:52:08 +0200 Subject: [PATCH 19/27] add domain methods --- src/LunarApiConfig.php | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/LunarApiConfig.php b/src/LunarApiConfig.php index fcef4439..3e3ccd1b 100644 --- a/src/LunarApiConfig.php +++ b/src/LunarApiConfig.php @@ -3,44 +3,49 @@ namespace Dystcz\LunarApi; use Dystcz\LunarApi\Support\Config\Collections\DomainConfigCollection; +use Dystcz\LunarApi\Support\Config\Data\DomainConfig; use Illuminate\Support\Collection; class LunarApiConfig { public DomainConfigCollection $config; + /** @param array $domains */ + public array $domains = []; + public function __construct() { $this->config = DomainConfigCollection::make(); } + public function domain(string $domain): DomainConfig + { + return $this->config->get($domain); + } + /** - * Get schemas. + * @param string[] $domains */ + public function domains(...$domains): DomainConfig + { + return $this->config->only($domains); + } + public function getSchemas(): Collection { return $this->config->getSchemas(); } - /** - * Get routes. - */ public function getRoutes(): Collection { return $this->config->getRoutes(); } - /** - * Get models for model manifest. - */ public function getModels(): Collection { return $this->config->getModelsForModelManifest(); } - /** - * Get policies. - */ public function getPolicies(): Collection { return $this->config->getPolicies(); From d7b962b505bf4aa1fecd23fa94e7f285fad5aaef Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:52:16 +0200 Subject: [PATCH 20/27] update domain config --- src/Support/Config/Data/DomainConfig.php | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Support/Config/Data/DomainConfig.php b/src/Support/Config/Data/DomainConfig.php index 81ad8d46..8c0aa6d7 100644 --- a/src/Support/Config/Data/DomainConfig.php +++ b/src/Support/Config/Data/DomainConfig.php @@ -13,6 +13,7 @@ class DomainConfig { /** * @param array $rest + * @param array $controllers */ public function __construct( public string $domain, @@ -24,6 +25,7 @@ public function __construct( public ?string $query = null, public ?string $collection_query = null, public ?string $routes = null, + public array $controllers = [], array ...$rest, ) { $this->validate(); @@ -39,6 +41,8 @@ public function getDomain(): string /** * Get model class. + * + * @return class-string|null */ public function getModel(): ?string { @@ -46,15 +50,19 @@ public function getModel(): ?string } /** - * Get lunar model class. + * Get model contract. + * + * @return interface-string|null */ - public function getLunarModel(): ?string + public function getModelContract(): ?string { - return $this->lunar_model; + return $this->model_contract; } /** * Get policy class. + * + * @return class-string|null */ public function getPolicy(): ?string { @@ -63,6 +71,8 @@ public function getPolicy(): ?string /** * Get schema class. + * + * @return class-string|null */ public function getSchema(): ?string { @@ -71,6 +81,8 @@ public function getSchema(): ?string /** * Get resource class. + * + * @return class-string|null */ public function getResource(): ?string { @@ -79,6 +91,8 @@ public function getResource(): ?string /** * Get query class. + * + * @return class-string|null */ public function getQuery(): ?string { @@ -87,6 +101,8 @@ public function getQuery(): ?string /** * Get collection query class. + * + * @return class-string|null */ public function getCollectionQuery(): ?string { @@ -95,6 +111,8 @@ public function getCollectionQuery(): ?string /** * Get routes class. + * + * @return class-string|null */ public function getRoutes(): ?string { From 5056def3bef8b8533f31a523a69d55ea78d93a7b Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:52:40 +0200 Subject: [PATCH 21/27] create domain config by discovery --- .../Collections/DomainConfigCollection.php | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/src/Support/Config/Collections/DomainConfigCollection.php b/src/Support/Config/Collections/DomainConfigCollection.php index 2738ee9a..abfca32f 100644 --- a/src/Support/Config/Collections/DomainConfigCollection.php +++ b/src/Support/Config/Collections/DomainConfigCollection.php @@ -2,9 +2,26 @@ namespace Dystcz\LunarApi\Support\Config\Collections; +use Dystcz\LunarApi\Base\Attributes\ReplaceModel; +use Dystcz\LunarApi\Domain\JsonApi\Queries\CollectionQuery; +use Dystcz\LunarApi\Domain\JsonApi\Queries\Query; +use Dystcz\LunarApi\Domain\JsonApi\Resources\JsonApiResource; +use Dystcz\LunarApi\Facades\LunarApi; +use Dystcz\LunarApi\Routing\Contracts\RouteGroup; use Dystcz\LunarApi\Support\Config\Data\DomainConfig; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\Pivot; +use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Config; +use Illuminate\Support\Str; +use LaravelJsonApi\Contracts\Schema\Schema as SchemaContract; +use LaravelJsonApi\Core\Schema\Schema as BaseSchema; +use ReflectionAttribute; +use ReflectionClass; +use Spatie\StructureDiscoverer\Data\DiscoveredStructure; +use Spatie\StructureDiscoverer\Discover; +use Spatie\StructureDiscoverer\Support\Conditions\ConditionBuilder; class DomainConfigCollection extends Collection { @@ -20,6 +37,102 @@ public static function make($items = []): self return self::fromConfig('lunar-api.domains'); } + /** + * Create domain config collection from a given config file. + */ + public static function discover(?string $root = null): self + { + $root = $root ?? LunarApi::getRoot(); + + $schemas = Discover::in($root) + ->classes() + ->any( + ConditionBuilder::create() + ->implementing(SchemaContract::class) + ->custom(fn (DiscoveredStructure $structure) => ! $structure->isAbstract), + + ConditionBuilder::create() + ->custom(fn (DiscoveredStructure $structure) => in_array($structure->extends, [BaseSchema::class])) + ) + ->get(); + + $domains = Collection::make($schemas) + ->mapWithKeys(function (string $schema) use ($root) { + $domain = (string) Str::of($schema)->after('Domain')->betweenFirst('\\', '\\'); + $domainRoot = "{$root}/Domain/{$domain}"; + + $model = Arr::first( + Discover::in($domainRoot) + ->classes() + ->custom(fn (DiscoveredStructure $structure) => Str::contains("{$structure->namespace}/{$structure->name}", "Models/{$structure->name}")) + ->custom(fn (DiscoveredStructure $structure) => ! in_array(Pivot::class, $structure->extendsChain)) + ->get() + ); + + if ($model) { + $modelReflection = new ReflectionClass($model); + /** @var ReflectionAttribute|null $replacesModelAttribute */ + $replacesModelAttribute = Arr::first( + $modelReflection->getAttributes(), + fn (ReflectionAttribute $attribute) => $attribute->getName() === ReplaceModel::class, + ); + $modelContract = Arr::first($replacesModelAttribute->getArguments()); + } + + $policy = Arr::first( + Discover::in($domainRoot) + ->classes() + ->custom(fn (DiscoveredStructure $structure) => Str::contains($structure->namespace, 'Policies')) + ->get() + ); + + $resource = Arr::first( + Discover::in($domainRoot) + ->classes() + ->extending(JsonApiResource::class) + ->get() + ); + + $query = Arr::first( + Discover::in($domainRoot) + ->classes() + ->extending(Query::class) + ->get() + ); + + $collectionQuery = Arr::first( + Discover::in($domainRoot) + ->classes() + ->extending(CollectionQuery::class) + ->get() + ); + + $routeGroup = Arr::first( + Discover::in($domainRoot) + ->classes() + ->implementing(RouteGroup::class) + ->custom(fn (DiscoveredStructure $structure) => Str::contains($structure->namespace, 'Domain')) + ->get() + ); + + return [ + $schema::type() => new DomainConfig( + domain: $schema::type(), + schema: $schema, + model: $model, + model_contract: $modelContract ?? null, + policy: $policy, + resource: $resource, + query: $query, + collection_query: $collectionQuery, + routes: $routeGroup, + ), + ]; + }); + + return new static($domains); + } + /** * Create domain config collection from a given config file. */ From 3ad2b5a7a7332a1ba98b93990acb96f97318eb42 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:52:53 +0200 Subject: [PATCH 22/27] add attributes --- src/Domain/JsonApi/Attributes/HasAuthorizer.php | 16 ++++++++++++++++ .../JsonApi/Attributes/HasCollectionQuery.php | 16 ++++++++++++++++ src/Domain/JsonApi/Attributes/HasQuery.php | 16 ++++++++++++++++ src/Domain/JsonApi/Attributes/HasResource.php | 16 ++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 src/Domain/JsonApi/Attributes/HasAuthorizer.php create mode 100644 src/Domain/JsonApi/Attributes/HasCollectionQuery.php create mode 100644 src/Domain/JsonApi/Attributes/HasQuery.php create mode 100644 src/Domain/JsonApi/Attributes/HasResource.php diff --git a/src/Domain/JsonApi/Attributes/HasAuthorizer.php b/src/Domain/JsonApi/Attributes/HasAuthorizer.php new file mode 100644 index 00000000..9c86d417 --- /dev/null +++ b/src/Domain/JsonApi/Attributes/HasAuthorizer.php @@ -0,0 +1,16 @@ + Date: Tue, 22 Oct 2024 04:53:01 +0200 Subject: [PATCH 23/27] use static type --- src/Domain/JsonApi/Eloquent/Schema.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Domain/JsonApi/Eloquent/Schema.php b/src/Domain/JsonApi/Eloquent/Schema.php index 8bee045a..1a1d0d3f 100644 --- a/src/Domain/JsonApi/Eloquent/Schema.php +++ b/src/Domain/JsonApi/Eloquent/Schema.php @@ -12,7 +12,6 @@ use Illuminate\Support\Arr; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Config; -use Illuminate\Support\Str; use LaravelJsonApi\Contracts\Server\Server; use LaravelJsonApi\Core\Schema\IncludePathIterator; use LaravelJsonApi\Eloquent\Contracts\Paginator; @@ -119,7 +118,7 @@ public static function model(): string */ public static function resource(): string { - $type = Str::snake(static::type()); + $type = static::type(); return Config::get( "lunar-api.domains.{$type}.resource", @@ -132,7 +131,7 @@ public static function resource(): string */ public static function authorizer(): string { - $type = Str::snake(static::type()); + $type = static::type(); return Config::get( "lunar-api.domains.{$type}.authorizer", From 35f7929a5e33879c81a390f35923015833d9c61c Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:55:15 +0200 Subject: [PATCH 24/27] update user model contract --- config/domains.php | 2 +- src/Domain/Users/Models/User.php | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config/domains.php b/config/domains.php index 30b54968..2bb38510 100644 --- a/config/domains.php +++ b/config/domains.php @@ -359,7 +359,7 @@ SchemaType::get(Dystcz\LunarApi\Domain\Users\Contracts\User::class) => [ 'model' => Dystcz\LunarApi\Domain\Users\Models\User::class, - 'model_contract' => Lunar\Base\LunarUser::class, + 'model_contract' => Dystcz\LunarApi\Domain\Users\Contracts\User::class, 'policy' => Dystcz\LunarApi\Domain\Users\Policies\UserPolicy::class, 'schema' => Dystcz\LunarApi\Domain\Users\JsonApi\V1\UserSchema::class, 'resource' => Dystcz\LunarApi\Domain\Users\JsonApi\V1\UserResource::class, diff --git a/src/Domain/Users/Models/User.php b/src/Domain/Users/Models/User.php index dbff9a16..cd84fe90 100644 --- a/src/Domain/Users/Models/User.php +++ b/src/Domain/Users/Models/User.php @@ -14,15 +14,14 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Config; -use Lunar\Base\LunarUser as LunarUserContract; use Lunar\Base\Traits\HasModelExtending; use Lunar\Base\Traits\LunarUser; use Lunar\Models\Cart; use Lunar\Models\Customer; use Lunar\Models\Order; -#[ReplaceModel(LunarUserContract::class)] -class User extends Authenticatable implements LunarUserContract, UserContract +#[ReplaceModel(UserContract::class)] +class User extends Authenticatable implements UserContract { use HasFactory; use HasModelExtending; From 40042c65ad8ebb3830e7da432406fa278593f984 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 05:11:55 +0200 Subject: [PATCH 25/27] rename payment-options to payment_options --- .../JsonApi/V1/PaymentOptionSchema.php | 12 ++++++++++++ .../Domain/Cart/JsonApi/V1/SetPaymentOptionTest.php | 4 ++-- .../Cart/JsonApi/V1/UnsetPaymentOptionTest.php | 2 +- .../JsonApi/V1/CreatePaymentOptionTest.php | 4 ++-- .../JsonApi/V1/DeletePaymentOptionTest.php | 6 +++--- .../JsonApi/V1/ListPaymentOptionsTest.php | 8 ++++---- tests/Unit/Domain/Carts/Models/CartTest.php | 2 +- tests/Unit/Domain/Carts/Pipelines/SetPaymentTest.php | 4 ++-- .../Domain/PaymentOptions/Data/PaymentOptionTest.php | 2 +- 9 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php b/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php index bc5a43c0..fed4d39c 100644 --- a/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php +++ b/src/Domain/PaymentOptions/JsonApi/V1/PaymentOptionSchema.php @@ -68,4 +68,16 @@ public static function type(): string return $resolver(static::class); } + + /** + * {@inheritDoc} + */ + public function uriType(): string + { + if ($this->uriType) { + return $this->uriType; + } + + return $this->uriType = $this->type(); + } } diff --git a/tests/Feature/Domain/Cart/JsonApi/V1/SetPaymentOptionTest.php b/tests/Feature/Domain/Cart/JsonApi/V1/SetPaymentOptionTest.php index 6201d4e3..eab06066 100644 --- a/tests/Feature/Domain/Cart/JsonApi/V1/SetPaymentOptionTest.php +++ b/tests/Feature/Domain/Cart/JsonApi/V1/SetPaymentOptionTest.php @@ -44,7 +44,7 @@ ]); expect($this->cart->fresh()->payment_option)->toBe($data['attributes']['payment_option']); -})->group('carts', 'payment-options'); +})->group('carts', 'payment_options'); it('validates payment option attribute when setting payment option to cart', function () { /** @var TestCase $this */ @@ -63,4 +63,4 @@ 'detail' => __('lunar-api::validations.payments.set_payment_option.payment_option.required'), 'status' => '422', ]); -})->group('carts', 'payment-options'); +})->group('carts', 'payment_options'); diff --git a/tests/Feature/Domain/Cart/JsonApi/V1/UnsetPaymentOptionTest.php b/tests/Feature/Domain/Cart/JsonApi/V1/UnsetPaymentOptionTest.php index 4ca81a97..a1e5543b 100644 --- a/tests/Feature/Domain/Cart/JsonApi/V1/UnsetPaymentOptionTest.php +++ b/tests/Feature/Domain/Cart/JsonApi/V1/UnsetPaymentOptionTest.php @@ -38,4 +38,4 @@ ]); expect($this->cart->fresh()->payment_option)->toBeNull(); -})->group('carts', 'payment-options'); +})->group('carts', 'payment_options'); diff --git a/tests/Feature/Domain/PaymentOptions/JsonApi/V1/CreatePaymentOptionTest.php b/tests/Feature/Domain/PaymentOptions/JsonApi/V1/CreatePaymentOptionTest.php index 37c06487..f80b1f50 100644 --- a/tests/Feature/Domain/PaymentOptions/JsonApi/V1/CreatePaymentOptionTest.php +++ b/tests/Feature/Domain/PaymentOptions/JsonApi/V1/CreatePaymentOptionTest.php @@ -7,10 +7,10 @@ test('users cannot create new payment options', function () { /** @var TestCase $this */ - $response = $this->createTest('payment-options', []); + $response = $this->createTest('payment_options', []); $response->assertErrorStatus([ 'status' => '405', 'title' => 'Method Not Allowed', ]); -})->group('payment-options', 'policies'); +})->group('payment_options', 'policies'); diff --git a/tests/Feature/Domain/PaymentOptions/JsonApi/V1/DeletePaymentOptionTest.php b/tests/Feature/Domain/PaymentOptions/JsonApi/V1/DeletePaymentOptionTest.php index 3007bcbe..1544d154 100644 --- a/tests/Feature/Domain/PaymentOptions/JsonApi/V1/DeletePaymentOptionTest.php +++ b/tests/Feature/Domain/PaymentOptions/JsonApi/V1/DeletePaymentOptionTest.php @@ -18,11 +18,11 @@ /** @var TestCase $this */ $response = $this ->jsonApi() - ->expects('payment-options') - ->delete(serverUrl('/payment-options/1')); + ->expects('payment_options') + ->delete(serverUrl('/payment_options/1')); $response->assertErrorStatus([ 'status' => '405', 'title' => 'Method Not Allowed', ]); -})->group('payment-options', 'policies'); +})->group('payment_options', 'policies'); diff --git a/tests/Feature/Domain/PaymentOptions/JsonApi/V1/ListPaymentOptionsTest.php b/tests/Feature/Domain/PaymentOptions/JsonApi/V1/ListPaymentOptionsTest.php index 433d0bb6..b46be317 100644 --- a/tests/Feature/Domain/PaymentOptions/JsonApi/V1/ListPaymentOptionsTest.php +++ b/tests/Feature/Domain/PaymentOptions/JsonApi/V1/ListPaymentOptionsTest.php @@ -14,8 +14,8 @@ /** @var TestCase $this */ $response = $this ->jsonApi() - ->expects('payment-options') - ->get(serverUrl('/payment-options')); + ->expects('payment_options') + ->get(serverUrl('/payment_options')); $response->assertSuccessful(); @@ -24,7 +24,7 @@ $response->assertFetchedMany( $options->map(function (PaymentOption $paymentOption) { return [ - 'type' => 'payment-options', + 'type' => 'payment_options', 'id' => Str::slug($paymentOption->getId()), 'attributes' => [ 'driver' => $paymentOption->getDriver(), @@ -42,4 +42,4 @@ })->toArray() ); -})->group('payment-options'); +})->group('payment_options'); diff --git a/tests/Unit/Domain/Carts/Models/CartTest.php b/tests/Unit/Domain/Carts/Models/CartTest.php index e11de579..4b5f598d 100644 --- a/tests/Unit/Domain/Carts/Models/CartTest.php +++ b/tests/Unit/Domain/Carts/Models/CartTest.php @@ -77,4 +77,4 @@ $this->assertEquals(600, $cart->paymentTotal->value); $this->assertEquals(1000, $cart->total->value); -})->group('carts', 'carts.payment-options'); +})->group('carts', 'carts.payment_options'); diff --git a/tests/Unit/Domain/Carts/Pipelines/SetPaymentTest.php b/tests/Unit/Domain/Carts/Pipelines/SetPaymentTest.php index f7418992..2038f652 100644 --- a/tests/Unit/Domain/Carts/Pipelines/SetPaymentTest.php +++ b/tests/Unit/Domain/Carts/Pipelines/SetPaymentTest.php @@ -56,7 +56,7 @@ }); $this->assertInstanceOf(PriceDataType::class, $cart->paymentSubTotal); -})->group('payment-options', 'carts.payment-options'); +})->group('payment_options', 'carts.payment_options'); it('can set payment totals', function () { /** @var TestCase $this */ @@ -116,4 +116,4 @@ $this->assertInstanceOf(PriceDataType::class, $cart->paymentSubTotal); $this->assertEquals(500, $cart->paymentSubTotal->value); -})->group('payment-options', 'carts.payment-options'); +})->group('payment_options', 'carts.payment_options'); diff --git a/tests/Unit/Domain/PaymentOptions/Data/PaymentOptionTest.php b/tests/Unit/Domain/PaymentOptions/Data/PaymentOptionTest.php index 3781f24d..c5310ab5 100644 --- a/tests/Unit/Domain/PaymentOptions/Data/PaymentOptionTest.php +++ b/tests/Unit/Domain/PaymentOptions/Data/PaymentOptionTest.php @@ -86,4 +86,4 @@ $this->assertEquals(0, $cart->paymentTotal->value); $this->assertEquals(0, $cart->total->value); -})->group('payment-options'); +})->group('payment_options'); From ef7737ac7082b50a29323a33d50702b941d70c53 Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 05:12:07 +0200 Subject: [PATCH 26/27] rename shipping-options to shipping_options --- .../JsonApi/V1/ShippingOptionSchema.php | 12 ++++++++++++ .../JsonApi/V1/SetShippingOptionTest.php | 6 +++--- .../JsonApi/V1/UnsetShippingOptionTest.php | 4 ++-- .../JsonApi/V1/CreateShippingOptionTest.php | 4 ++-- .../JsonApi/V1/DeleteShippingOptionTest.php | 6 +++--- .../JsonApi/V1/ListShippingOptionsTest.php | 18 +++++++++--------- .../JsonApi/V1/UpdateShippingOptionTest.php | 4 ++-- 7 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php b/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php index 016a425d..efecf6a1 100644 --- a/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php +++ b/src/Domain/ShippingOptions/JsonApi/V1/ShippingOptionSchema.php @@ -61,4 +61,16 @@ public static function type(): string return $resolver(static::class); } + + /** + * {@inheritDoc} + */ + public function uriType(): string + { + if ($this->uriType) { + return $this->uriType; + } + + return $this->uriType = $this->type(); + } } diff --git a/tests/Feature/Domain/CartAddresses/JsonApi/V1/SetShippingOptionTest.php b/tests/Feature/Domain/CartAddresses/JsonApi/V1/SetShippingOptionTest.php index 0f656c65..828b4d2e 100644 --- a/tests/Feature/Domain/CartAddresses/JsonApi/V1/SetShippingOptionTest.php +++ b/tests/Feature/Domain/CartAddresses/JsonApi/V1/SetShippingOptionTest.php @@ -48,7 +48,7 @@ ]); expect($this->cartAddress->fresh()->shipping_option)->toBe($this->data['attributes']['shipping_option']); -})->group('cart-addresses', 'shipping-options'); +})->group('cart-addresses', 'shipping_options'); it('validates shipping option attribute when setting shipping option to cart address', function () { /** @var TestCase $this */ @@ -70,7 +70,7 @@ 'detail' => __('lunar-api::validations.shipping.set_shipping_option.shipping_option.required'), 'status' => '422', ]); -})->group('cart-addresses', 'shipping-options'); +})->group('cart-addresses', 'shipping_options'); test('only the user who owns the cart address can set shipping option for it', function () { /** @var TestCase $this */ @@ -87,4 +87,4 @@ 'status' => '401', 'title' => 'Unauthorized', ]); -})->group('cart-addresses', 'shipping-options'); +})->group('cart-addresses', 'shipping_options'); diff --git a/tests/Feature/Domain/CartAddresses/JsonApi/V1/UnsetShippingOptionTest.php b/tests/Feature/Domain/CartAddresses/JsonApi/V1/UnsetShippingOptionTest.php index 360aa95f..8338d700 100644 --- a/tests/Feature/Domain/CartAddresses/JsonApi/V1/UnsetShippingOptionTest.php +++ b/tests/Feature/Domain/CartAddresses/JsonApi/V1/UnsetShippingOptionTest.php @@ -40,7 +40,7 @@ ]); expect($this->cartAddress->fresh()->shipping_option)->toBeNull(); -})->group('cart-addresses', 'shipping-options'); +})->group('cart-addresses', 'shipping_options'); test('only the user who owns the cart address can unset shipping option for it', function () { /** @var TestCase $this */ @@ -56,4 +56,4 @@ 'status' => '401', 'title' => 'Unauthorized', ]); -})->group('cart-addresses', 'shipping-options'); +})->group('cart-addresses', 'shipping_options'); diff --git a/tests/Feature/Domain/Shipping/JsonApi/V1/CreateShippingOptionTest.php b/tests/Feature/Domain/Shipping/JsonApi/V1/CreateShippingOptionTest.php index fb41d99a..0c2b18fe 100644 --- a/tests/Feature/Domain/Shipping/JsonApi/V1/CreateShippingOptionTest.php +++ b/tests/Feature/Domain/Shipping/JsonApi/V1/CreateShippingOptionTest.php @@ -7,10 +7,10 @@ test('users cannot create new shipping options', function () { /** @var TestCase $this */ - $response = $this->createTest('shipping-options', []); + $response = $this->createTest('shipping_options', []); $response->assertErrorStatus([ 'status' => '405', 'title' => 'Method Not Allowed', ]); -})->group('shipping-options', 'policies'); +})->group('shipping_options', 'policies'); diff --git a/tests/Feature/Domain/Shipping/JsonApi/V1/DeleteShippingOptionTest.php b/tests/Feature/Domain/Shipping/JsonApi/V1/DeleteShippingOptionTest.php index e17269ec..d554479d 100644 --- a/tests/Feature/Domain/Shipping/JsonApi/V1/DeleteShippingOptionTest.php +++ b/tests/Feature/Domain/Shipping/JsonApi/V1/DeleteShippingOptionTest.php @@ -18,11 +18,11 @@ /** @var TestCase $this */ $response = $this ->jsonApi() - ->expects('shipping-options') - ->delete(serverUrl('/shipping-options/1')); + ->expects('shipping_options') + ->delete(serverUrl('/shipping_options/1')); $response->assertErrorStatus([ 'status' => '405', 'title' => 'Method Not Allowed', ]); -})->group('shipping-options', 'policies'); +})->group('shipping_options', 'policies'); diff --git a/tests/Feature/Domain/Shipping/JsonApi/V1/ListShippingOptionsTest.php b/tests/Feature/Domain/Shipping/JsonApi/V1/ListShippingOptionsTest.php index 97208216..5e4b5257 100644 --- a/tests/Feature/Domain/Shipping/JsonApi/V1/ListShippingOptionsTest.php +++ b/tests/Feature/Domain/Shipping/JsonApi/V1/ListShippingOptionsTest.php @@ -26,8 +26,8 @@ /** @var TestCase $this */ $response = $this ->jsonApi() - ->expects('shipping-options') - ->get(serverUrl('/shipping-options')); + ->expects('shipping_options') + ->get(serverUrl('/shipping_options')); $response->assertSuccessful(); @@ -35,7 +35,7 @@ $response->assertFetchedMany([ [ - 'type' => 'shipping-options', + 'type' => 'shipping_options', 'id' => 'ffcdel', 'attributes' => [ 'name' => 'Basic Delivery', @@ -49,7 +49,7 @@ ], ], ]); -})->group('shipping-options'); +})->group('shipping_options'); it('can list shipping options for a cart based on country', function () { /** @var TestCase $this */ @@ -69,8 +69,8 @@ $response = $this ->jsonApi() - ->expects('shipping-options') - ->get(serverUrl('/shipping-options')); + ->expects('shipping_options') + ->get(serverUrl('/shipping_options')); $response->assertSuccessful(); @@ -78,7 +78,7 @@ $response->assertFetchedMany([ [ - 'type' => 'shipping-options', + 'type' => 'shipping_options', 'id' => (string) Str::slug($shippingOptions[0]->getIdentifier()), 'attributes' => [ 'name' => $shippingOptions[0]->getName(), @@ -87,7 +87,7 @@ ], ], [ - 'type' => 'shipping-options', + 'type' => 'shipping_options', 'id' => (string) Str::slug($shippingOptions[1]->getIdentifier()), 'attributes' => [ 'name' => $shippingOptions[1]->getName(), @@ -96,4 +96,4 @@ ], ], ]); -})->group('shipping-options'); +})->group('shipping_options'); diff --git a/tests/Feature/Domain/Shipping/JsonApi/V1/UpdateShippingOptionTest.php b/tests/Feature/Domain/Shipping/JsonApi/V1/UpdateShippingOptionTest.php index ca99d7c1..7a941d3e 100644 --- a/tests/Feature/Domain/Shipping/JsonApi/V1/UpdateShippingOptionTest.php +++ b/tests/Feature/Domain/Shipping/JsonApi/V1/UpdateShippingOptionTest.php @@ -21,10 +21,10 @@ /** @var TestCase $this */ $shippingOption = App::get(ShippingModifiers::class)->getModifiers()->first(); - $response = $this->updateTest('shipping-options', Tag::class, []); + $response = $this->updateTest('shipping_options', Tag::class, []); $response->assertErrorStatus([ 'status' => '405', 'title' => 'Method Not Allowed', ]); -})->group('shipping-options', 'policies'); +})->group('shipping_options', 'policies'); From 3b51cd21ccecd63fdc7f534faa2aabdbc4aa165b Mon Sep 17 00:00:00 2001 From: Jakub Theimer <5587309+theimerj@users.noreply.github.com> Date: Tue, 22 Oct 2024 05:12:12 +0200 Subject: [PATCH 27/27] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e2cc773..3c7c2632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ ### ⚠️ Breaking changes - Renamed `lunar_model` to `model_contract` in `domains.php` config file +- Renamed `shipping-options` to `shipping_options` +- Renamed `payment-options` to `payment_options` ## 1.0.0-beta.2