# Project Conventions
## Test database safety
- Tests must use SQLite `:memory:` through `tests/bootstrap.php` and `Tests\TestCase`.
- Never run tests, `migrate:fresh`, `migrate:refresh`, or `db:wipe` against a persistent database, including the developer's `shopit` database.
- Never bypass the connection safety guard to resolve test failures. Use `php tests/verify-database-safety.php` to verify isolation without queries or migrations.
## Architecture
This project uses a domain-oriented structure grouped by business area under
`app/Domains`. Cross-cutting modules live under `app/Shared`.
Business domains must live in:
```text
app/Domains///
```
The current areas are `Core`, `Commerce`, and `Ticketing`. Cross-cutting
modules live in `app/Shared//`.
Supported folders inside each domain:
```text
app/Domains///
├── Models/
├── Controllers/
├── Requests/
├── Resources/
├── Services/
├── Policies/
├── Exceptions/
└── routes/
```
## Routing
- Root API routes live in `routes/api.php`.
- `routes/api.php` should act as an aggregator only.
- Each business domain defines its own routes in
`app/Domains///routes/api.php`.
- Shared modules that expose routes define them in
`app/Shared//routes/api.php`.
## Namespaces
Use this namespace pattern:
```php
App\Domains\\\Models
App\Domains\\\Controllers
App\Domains\\\Requests
App\Domains\\\Resources
App\Domains\\\Services
App\Domains\\\Policies
App\Domains\\\Exceptions
```
For cross-cutting modules, use `App\Shared\\...`. Reusable enums
and rules live directly under `App\Shared`.
## Responsibilities
- `Models/`: Eloquent models and model relationships.
- `Controllers/`: HTTP entrypoints only.
- `Requests/`: validation and request authorization with `FormRequest`.
- `Resources/`: API response transformation with `JsonResource`.
- `Services/`: business logic and application workflows.
- `Policies/`: authorization rules.
- `Exceptions/`: domain-specific exceptions.
- `routes/`: domain route definitions.
## Controller Rules
- Controllers should stay thin.
- Do not validate inline in controllers when a `FormRequest` can be used.
- Do not place business logic in controllers.
- Prefer returning `JsonResource` or resource collections instead of raw models.
## Model Rules
- Models must stay inside their domain.
- Cross-domain relations are allowed when the dependency is explicit and necessary.
- Preserve existing table names and key mappings when the database uses legacy names.
## Naming Rules
- Domains use singular English names such as `Tenant` and `Product`.
- Namespace, folder, and class names must stay aligned.
- Route files should be named `api.php`.
## Current Areas and Modules
- `Core`: `Administrator`, `Auth`, `Authorization`, `Bootstrap`, `Client`,
`Menu`, `Staff`, `Tenant`.
- `Commerce`: `Cart`, `Catalog`, `Purchase`, `Sale`.
- `Ticketing`: `Desfile`, `Event`, `FiestaFutbolInfantil`, `Ticket`.
- `Shared`: `Attachable`, `Forms`, `Integration`, `Logging`, `MailTest`,
`Notification`, `StorageTest`, plus shared enums and rules.
## Notes For Future Changes
- New features should be added inside the corresponding domain first.
- Add new business features to the appropriate area under `app/Domains`.
- Keep generic reusable code in `app/Shared`; do not use it as a catch-all for
business features.
- Avoid placing new business code in `app/Http/Controllers` or `app/Models`.