From 063105b844d1b7f04ce5ea5b57611f2e8ffb5023 Mon Sep 17 00:00:00 2001 From: Tomas van Rijsse Date: Wed, 10 Dec 2025 16:45:19 +0100 Subject: [PATCH 1/2] add name fields and team to User requests --- factories/UserFactory.php | 3 +++ src/Dto/User.php | 9 +++++++++ tests/Requests/UserTest.php | 27 +++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/factories/UserFactory.php b/factories/UserFactory.php index a7c7c77..3649d73 100644 --- a/factories/UserFactory.php +++ b/factories/UserFactory.php @@ -13,6 +13,9 @@ protected function definition(): array return [ 'externalId' => $this->faker->uuid(), 'email' => $this->faker->safeEmail(), + 'givenName' => $this->faker->company(), + 'familyName' => $this->faker->company(), + 'teamId' => $this->faker->uuid(), ]; } diff --git a/src/Dto/User.php b/src/Dto/User.php index a704c1c..9f81b4d 100644 --- a/src/Dto/User.php +++ b/src/Dto/User.php @@ -14,4 +14,13 @@ class User extends Model #[Property] public ?string $email; + + #[Property] + public ?string $givenName; + + #[Property] + public ?string $familyName; + + #[Property] + public ?string $teamId; } diff --git a/tests/Requests/UserTest.php b/tests/Requests/UserTest.php index 4edda58..ca1c4fc 100644 --- a/tests/Requests/UserTest.php +++ b/tests/Requests/UserTest.php @@ -25,6 +25,9 @@ 'attributes' => [ 'externalId' => 'mock-id-123', 'email' => 'test@example.com', + 'givenName' => 'Mock value', + 'familyName' => 'Mock value', + 'teamId' => 'mock-id-123', ], ], 1 => [ @@ -33,6 +36,9 @@ 'attributes' => [ 'externalId' => 'mock-id-123', 'email' => 'test@example.com', + 'givenName' => 'Mock value', + 'familyName' => 'Mock value', + 'teamId' => 'mock-id-123', ], ], ], @@ -61,7 +67,10 @@ expect($dtoCollection->first()) ->externalId->toBe('mock-id-123') - ->email->toBe('test@example.com'); + ->email->toBe('test@example.com') + ->givenName->toBe('Mock value') + ->familyName->toBe('Mock value') + ->teamId->toBe('mock-id-123'); }); it('calls the postUsers method in the User resource', function () { @@ -73,6 +82,8 @@ $dto = \Timatic\Dto\User::factory()->state([ 'externalId' => 'external_id-123', 'email' => 'test@example.com', + 'givenName' => 'test value', + 'familyName' => 'test value', ])->make(); $request = new PostUsersRequest($dto); @@ -87,6 +98,8 @@ ->data->attributes->scoped(fn ($attributes) => $attributes ->externalId->toBe('external_id-123') ->email->toBe('test@example.com') + ->givenName->toBe('test value') + ->familyName->toBe('test value') ); return true; @@ -102,6 +115,9 @@ 'attributes' => [ 'externalId' => 'mock-id-123', 'email' => 'test@example.com', + 'givenName' => 'Mock value', + 'familyName' => 'Mock value', + 'teamId' => 'mock-id-123', ], ], ], 200), @@ -120,7 +136,10 @@ expect($dto) ->externalId->toBe('mock-id-123') - ->email->toBe('test@example.com'); + ->email->toBe('test@example.com') + ->givenName->toBe('Mock value') + ->familyName->toBe('Mock value') + ->teamId->toBe('mock-id-123'); }); it('calls the deleteUser method in the User resource', function () { @@ -147,6 +166,8 @@ $dto = \Timatic\Dto\User::factory()->state([ 'externalId' => 'external_id-123', 'email' => 'test@example.com', + 'givenName' => 'test value', + 'familyName' => 'test value', ])->make(); $request = new PatchUserRequest(userId: 'test string', data: $dto); @@ -161,6 +182,8 @@ ->data->attributes->scoped(fn ($attributes) => $attributes ->externalId->toBe('external_id-123') ->email->toBe('test@example.com') + ->givenName->toBe('test value') + ->familyName->toBe('test value') ); return true; From 021275947324d88dbf1e4be2044fdb52fe110742 Mon Sep 17 00:00:00 2001 From: Tomas van Rijsse Date: Mon, 15 Dec 2025 14:45:22 +0100 Subject: [PATCH 2/2] update claude instructions --- CLAUDE.md | 298 ++++-------------------------------------------------- 1 file changed, 22 insertions(+), 276 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index addbfc6..4d266e7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,263 +1,5 @@ Make sure the package is compatible with Laravel 10, 11 and 12 - -=== foundation rules === - -# Laravel Boost Guidelines - -The Laravel Boost guidelines are specifically curated by Laravel maintainers for this application. These guidelines should be followed closely to enhance the user's satisfaction building Laravel applications. - -## Foundational Context -This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions. - -- php - 8.4.14 -- laravel/framework (LARAVEL) - v12 -- laravel/horizon (HORIZON) - v5 -- laravel/pint (PINT) - v1 -- laravel/prompts (PROMPTS) - v0 -- laravel/sanctum (SANCTUM) - v4 -- laravel/breeze (BREEZE) - v2 -- laravel/mcp (MCP) - v0 -- laravel/sail (SAIL) - v1 -- phpunit/phpunit (PHPUNIT) - v11 -- vue (VUE) - v3 -- prettier (PRETTIER) - v3 -- tailwindcss (TAILWINDCSS) - v3 - - -## Conventions -- You must follow all existing code conventions used in this application. When creating or editing a file, check sibling files for the correct structure, approach, naming. -- Use descriptive names for variables and methods. For example, `isRegisteredForDiscounts`, not `discount()`. -- Check for existing components to reuse before writing a new one. - -## Verification Scripts -- Do not create verification scripts or tinker when tests cover that functionality and prove it works. Unit and feature tests are more important. - -## Application Structure & Architecture -- Stick to existing directory structure - don't create new base folders without approval. -- Do not change the application's dependencies without approval. - -## Frontend Bundling -- If the user doesn't see a frontend change reflected in the UI, it could mean they need to run `npm run build`, `npm run dev`, or `composer run dev`. Ask them. - -## Replies -- Be concise in your explanations - focus on what's important rather than explaining obvious details. - -## Documentation Files -- You must only create documentation files if explicitly requested by the user. - - -=== boost rules === - -## Laravel Boost -- Laravel Boost is an MCP server that comes with powerful tools designed specifically for this application. Use them. - -## Artisan -- Use the `list-artisan-commands` tool when you need to call an Artisan command to double check the available parameters. - -## URLs -- Whenever you share a project URL with the user you should use the `get-absolute-url` tool to ensure you're using the correct scheme, domain / IP, and port. - -## Tinker / Debugging -- You should use the `tinker` tool when you need to execute PHP to debug code or query Eloquent models directly. -- Use the `database-query` tool when you only need to read from the database. - -## Reading Browser Logs With the `browser-logs` Tool -- You can read browser logs, errors, and exceptions using the `browser-logs` tool from Boost. -- Only recent browser logs will be useful - ignore old logs. - -## Searching Documentation (Critically Important) -- Boost comes with a powerful `search-docs` tool you should use before any other approaches. This tool automatically passes a list of installed packages and their versions to the remote Boost API, so it returns only version-specific documentation specific for the user's circumstance. You should pass an array of packages to filter on if you know you need docs for particular packages. -- The 'search-docs' tool is perfect for all Laravel related packages, including Laravel, Inertia, Livewire, Filament, Tailwind, Pest, Nova, Nightwatch, etc. -- You must use this tool to search for Laravel-ecosystem documentation before falling back to other approaches. -- Search the documentation before making code changes to ensure we are taking the correct approach. -- Use multiple, broad, simple, topic based queries to start. For example: `['rate limiting', 'routing rate limiting', 'routing']`. -- Do not add package names to queries - package information is already shared. For example, use `test resource table`, not `filament 4 test resource table`. - -### Available Search Syntax -- You can and should pass multiple queries at once. The most relevant results will be returned first. - -1. Simple Word Searches with auto-stemming - query=authentication - finds 'authenticate' and 'auth' -2. Multiple Words (AND Logic) - query=rate limit - finds knowledge containing both "rate" AND "limit" -3. Quoted Phrases (Exact Position) - query="infinite scroll" - Words must be adjacent and in that order -4. Mixed Queries - query=middleware "rate limit" - "middleware" AND exact phrase "rate limit" -5. Multiple Queries - queries=["authentication", "middleware"] - ANY of these terms - - -=== php rules === - -## PHP - -- Always use curly braces for control structures, even if it has one line. - -### Constructors -- Use PHP 8 constructor property promotion in `__construct()`. - - public function __construct(public GitHub $github) { } -- Do not allow empty `__construct()` methods with zero parameters. - -### Type Declarations -- Always use explicit return type declarations for methods and functions. -- Use appropriate PHP type hints for method parameters. - - -protected function isAccessible(User $user, ?string $path = null): bool -{ - ... -} - - -## Comments -- Prefer PHPDoc blocks over comments. Never use comments within the code itself unless there is something _very_ complex going on. - -## PHPDoc Blocks -- Add useful array shape type definitions for arrays when appropriate. - -## Enums -- Typically, keys in an Enum should be TitleCase. For example: `FavoritePerson`, `BestLake`, `Monthly`. - - -=== herd rules === - -## Laravel Herd - -- The application is served by Laravel Herd and will be available at: https?://[kebab-case-project-dir].test. Use the `get-absolute-url` tool to generate URLs for the user to ensure valid URLs. -- You must not run any commands to make the site available via HTTP(s). It is _always_ available through Laravel Herd. - - -=== laravel/core rules === - -## Do Things the Laravel Way - -- Use `php artisan make:` commands to create new files (i.e. migrations, controllers, models, etc.). You can list available Artisan commands using the `list-artisan-commands` tool. -- If you're creating a generic PHP class, use `artisan make:class`. -- Pass `--no-interaction` to all Artisan commands to ensure they work without user input. You should also pass the correct `--options` to ensure correct behavior. - -### Database -- Always use proper Eloquent relationship methods with return type hints. Prefer relationship methods over raw queries or manual joins. -- Use Eloquent models and relationships before suggesting raw database queries -- Avoid `DB::`; prefer `Model::query()`. Generate code that leverages Laravel's ORM capabilities rather than bypassing them. -- Generate code that prevents N+1 query problems by using eager loading. -- Use Laravel's query builder for very complex database operations. - -### Model Creation -- When creating new models, create useful factories and seeders for them too. Ask the user if they need any other things, using `list-artisan-commands` to check the available options to `php artisan make:model`. - -### APIs & Eloquent Resources -- For APIs, default to using Eloquent API Resources and API versioning unless existing API routes do not, then you should follow existing application convention. - -### Controllers & Validation -- Always create Form Request classes for validation rather than inline validation in controllers. Include both validation rules and custom error messages. -- Check sibling Form Requests to see if the application uses array or string based validation rules. - -### Queues -- Use queued jobs for time-consuming operations with the `ShouldQueue` interface. - -### Authentication & Authorization -- Use Laravel's built-in authentication and authorization features (gates, policies, Sanctum, etc.). - -### URL Generation -- When generating links to other pages, prefer named routes and the `route()` function. - -### Configuration -- Use environment variables only in configuration files - never use the `env()` function directly outside of config files. Always use `config('app.name')`, not `env('APP_NAME')`. - -### Testing -- When creating models for tests, use the factories for the models. Check if the factory has custom states that can be used before manually setting up the model. -- Faker: Use methods such as `$this->faker->word()` or `fake()->randomDigit()`. Follow existing conventions whether to use `$this->faker` or `fake()`. -- When creating tests, make use of `php artisan make:test [options] ` to create a feature test, and pass `--unit` to create a unit test. Most tests should be feature tests. - -### Vite Error -- If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `npm run build` or ask the user to run `npm run dev` or `composer run dev`. - - -=== laravel/v11 rules === - -## Laravel 11 - -- Use the `search-docs` tool to get version specific documentation. -- Laravel 11 brought a new streamlined file structure which this project now uses. - -### Laravel 11 Structure -- No middleware files in `app/Http/Middleware/`. -- `bootstrap/app.php` is the file to register middleware, exceptions, and routing files. -- `bootstrap/providers.php` contains application specific service providers. -- **No app\Console\Kernel.php** - use `bootstrap/app.php` or `routes/console.php` for console configuration. -- **Commands auto-register** - files in `app/Console/Commands/` are automatically available and do not require manual registration. - -### Database -- When modifying a column, the migration must include all of the attributes that were previously defined on the column. Otherwise, they will be dropped and lost. -- Laravel 11 allows limiting eagerly loaded records natively, without external packages: `$query->latest()->limit(10);`. - -### Models -- Casts can and likely should be set in a `casts()` method on a model rather than the `$casts` property. Follow existing conventions from other models. - -### New Artisan Commands -- List Artisan commands using Boost's MCP tool, if available. New commands available in Laravel 11: - - `php artisan make:enum` - - `php artisan make:class` - - `php artisan make:interface` - - -=== pint/core rules === - -## Laravel Pint Code Formatter - -- You must run `vendor/bin/pint --dirty` before finalizing changes to ensure your code matches the project's expected style. -- Do not run `vendor/bin/pint --test`, simply run `vendor/bin/pint` to fix any formatting issues. - - -=== phpunit/core rules === - -## PHPUnit Core - -- This application uses PHPUnit for testing. All tests must be written as PHPUnit classes. Use `php artisan make:test --phpunit ` to create a new test. -- If you see a test using "Pest", convert it to PHPUnit. -- Every time a test has been updated, run that singular test. -- When the tests relating to your feature are passing, ask the user if they would like to also run the entire test suite to make sure everything is still passing. -- Tests should test all of the happy paths, failure paths, and weird paths. -- You must not remove any tests or test files from the tests directory without approval. These are not temporary or helper files, these are core to the application. - -### Running Tests -- Run the minimal number of tests, using an appropriate filter, before finalizing. -- To run all tests: `php artisan test`. -- To run all tests in a file: `php artisan test tests/Feature/ExampleTest.php`. -- To filter on a particular test name: `php artisan test --filter=testName` (recommended after making a change to a related file). - - -=== tailwindcss/core rules === - -## Tailwind Core - -- Use Tailwind CSS classes to style HTML, check and use existing tailwind conventions within the project before writing your own. -- Offer to extract repeated patterns into components that match the project's conventions (i.e. Blade, JSX, Vue, etc..) -- Think through class placement, order, priority, and defaults - remove redundant classes, add classes to parent or child carefully to limit repetition, group elements logically -- You can use the `search-docs` tool to get exact examples from the official documentation when needed. - -### Spacing -- When listing items, use gap utilities for spacing, don't use margins. - - -
-
Superior
-
Michigan
-
Erie
-
-
- - -### Dark Mode -- If existing pages and components support dark mode, new pages and components must support dark mode in a similar way, typically using `dark:`. - - -=== tailwindcss/v3 rules === - -## Tailwind 3 - -- Always use Tailwind CSS v3 - verify you're using only classes supported by this version. -
- -=== timatic-sdk rules === - ## Timatic PHP SDK - Auto-Generated Files This SDK is automatically generated from the OpenAPI specification. **DO NOT manually edit auto-generated files**. @@ -272,25 +14,29 @@ This SDK **does not support PUT requests**. Only the following HTTP methods are PUT is intentionally excluded as PATCH provides better semantics for partial updates in JSON:API applications. The generator will throw an exception if it encounters PUT endpoints. -### ❌ NEVER EDIT THESE FILES/DIRECTORIES: -- **`src/Dto/`** - All Model/DTO classes (auto-generated with flattened JSON:API attributes) -- **`src/Requests/`** - All Request classes (auto-generated from OpenAPI endpoints) -- **`src/Resource/`** - All Resource classes (auto-generated to group related requests) -- **`src/TimaticConnector.php`** - The main Connector class (auto-generated with custom JSON:API configuration) -- **`tests/*Test.php`** - All test files (auto-generated from OpenAPI endpoints, Pest.php and TestCase.php are preserved) +### 🔍 How to Tell if a File Can Be Edited + +**Simple Rule:** Check the file header. If it contains `// auto-generated`, **DO NOT edit it manually**. + +```php +