# Code Style

Turista follows Laravel conventions and uses Laravel Pint for code-style enforcement.

## Laravel Pint

Pint is included as a dev dependency. To check style without making changes:

```bash
vendor/bin/pint --test
```

To apply fixes:

```bash
vendor/bin/pint
```

## CI / pre-commit

Run Pint before committing:

```bash
vendor/bin/pint --test
```

If it reports issues, run `vendor/bin/pint` and review the changes.

## Conventions

### Naming

- Controllers: `PascalCase`, singular where possible (`BuildingController`).
- Models: `PascalCase`, singular (`Building`, `Unit`).
- Form requests: `PascalCase` + `Request` suffix (`BuildingRequest`).
- Resources: `PascalCase` + `Resource` suffix (`BuildingResource`).
- Services: `PascalCase` + `Service` suffix (`ReservationService`).
- Policies: `PascalCase` + `Policy` suffix (`BuildingPolicy`).
- Database tables: plural, snake_case (`buildings`, `unit_availabilities`).
- Columns: snake_case.

### Controllers

Keep controllers thin:

- Validate input via Form Requests.
- Authorize via policies (`$this->authorize(...)`).
- Delegate business logic to services.
- Return resources or responses.

### Services

Services live in `app/Services/` and are exposed through facades in `app/Facades/`. Public methods should have clear, single responsibilities.

### Models

- Define relationships explicitly.
- Use casts for dates, enums, and JSON fields.
- Avoid business logic in models; use services.

### Mass assignment

`Model::unguard()` is enabled globally by project decision. This means every model accepts any database column during mass assignment. Be extremely careful to whitelist input in controllers and Form Requests.

See [`security/overview.md`](../security/overview.md) for the rationale and risks.
