shopit-back/AGENTS.md

87 lines
2.3 KiB
Markdown

# Project Conventions
## Architecture
This project uses a domain-oriented structure under `app/Domains`.
Each domain must live in:
```text
app/Domains/<DomainName>/
```
Supported folders inside each domain:
```text
app/Domains/<DomainName>/
├── 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 domain defines its own routes in `app/Domains/<DomainName>/routes/api.php`.
## Namespaces
Use this namespace pattern:
```php
App\Domains\<DomainName>\Models
App\Domains\<DomainName>\Controllers
App\Domains\<DomainName>\Requests
App\Domains\<DomainName>\Resources
App\Domains\<DomainName>\Services
App\Domains\<DomainName>\Policies
App\Domains\<DomainName>\Exceptions
```
## 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 Domains
- `Tenant`
- `Product`
## Notes For Future Changes
- New features should be added inside the corresponding domain first.
- If a concern does not belong to an existing domain, create a new domain under `app/Domains`.
- Avoid placing new business code in `app/Http/Controllers` or `app/Models`.