# Backend API

`apps/backend` - новое backend API на Symfony 7.3. Оно выступает единым хранилищем данных и публичным API для клиентских приложений.

## Где смотреть код

| Зона | Путь | Что внутри |
| --- | --- | --- |
| Контроллеры | `apps/backend/src/Controller` | HTTP-эндпоинты, маршруты, security-атрибуты |
| Сущности | `apps/backend/src/Entity` | Doctrine ORM mapping, serializer groups |
| Репозитории | `apps/backend/src/Repository` | QueryBuilder, фильтры, поиск |
| Сервисы | `apps/backend/src/Service` | бизнес-логика, интеграции, общие helpers |
| Команды | `apps/backend/src/Command` | консольные sync/import задачи |
| Конфиг | `apps/backend/config` | security, routes, Nelmio/Swagger, Doctrine |

## Основные разделы документации

- [DDD-обзор и бизнес-сущности](./backend-ddd.md) - контексты предметной области, связь сущностей с контроллерами, сервисами и командами.
- [Бизнес-сценарии (use cases)](./backend-scenarios/index.md) - отдельные статьи по ключевым потокам: JWT, pcode, расписание, запись, синхронизация, фиды.
- [CRUD для контентных сущностей](./backend-content-crud.md) - подробный разбор свежей задачи: контроллеры, пагинация, `CrudResponder`, `ContentRepositoryFilter`, sync services.
- [API и Swagger](../api-routes.md) - список HTTP-методов и где открыть Swagger.
- [Потоки данных](../flows.md) - запуск, синхронизация, авторизация, расписание.
- [Модели данных](../data-model.md) - ER-схемы и ключевые сущности.

## Архитектурный стиль backend

Для новых backend-задач стоит придерживаться таких правил:

- контроллеры должны быть тонкими и маршрутизировать запрос к сервисам/репозиториям;
- фильтрация списков должна жить в repository через `QueryBuilder`;
- пагинация должна использовать `Pagerfanta`, если список отдаётся наружу;
- write-поля должны контролироваться serializer groups (`*:write`);
- read-поля должны контролироваться serializer groups (`*:read`);
- admin-only операции должны быть закрыты через `#[IsGranted('ROLE_ADMIN')]`;
- sync/import из внешних источников не нужно смешивать с HTTP CRUD.

## Быстрая проверка backend

```bash
php bin/console cache:warmup --env=dev
php bin/console debug:router --env=dev
```

Публичный smoke-test списка:

```bash
curl 'http://localhost:8081/news/list?page=1&perPage=2'
```

Swagger UI:

```text
http://localhost:8081/docs
```

## Стек

- PHP `>=8.2`, контейнер `php84`.
- Symfony 7.3.
- Doctrine ORM 3, DBAL 4, migrations.
- PostgreSQL как основная БД.
- Дополнительные подключения к Bitrix MySQL и базе cabinet.
- Redis через `predis/predis`.
- JWT-аутентификация через `lexik/jwt-authentication-bundle`.
- OpenAPI-аннотации и `nelmio/api-doc-bundle`.
- Symfony Messenger/Scheduler для фоновой логики.

## Основные директории

- `src/Controller` - API-контроллеры.
- `src/Dto` - DTO для входных данных.
- `src/Entity` - Doctrine entities.
- `src/Repository` - запросы к БД.
- `src/Service` - бизнес-логика и интеграции.
- `src/Command` - CLI-команды импорта и синхронизации.
- `src/Message` и `src/MessageHandler` - асинхронные задачи.
- `migrations` - миграции БД.

## Точки входа

nginx направляет `api.sovamed.ru` в `apps/backend/public/index.php`, далее запросы обрабатываются Symfony router. Роуты объявлены PHP attributes в контроллерах.

Примеры групп контроллеров:

- `UserController` - логин, JWT, профиль пользователя, регистрация.
- `SpecialistController` - врачи и расписание.
- `PriceListController` и `PriceDepartmentController` - цены и категории.
- `ReviewController` - отзывы.
- `FilialController`, `DepartmentController`, `MedicalCenterController` - справочники клиник.
- `InfoclinicaController`, `CalltouchController` - интеграции.

## Авторизация

Security настроен как stateless API с JWT. Provider берет пользователя из `App\Entity\User` по email.

Для защищенных методов используются `#[IsGranted('ROLE_USER')]` и роли Symfony Security.

## Полезные команды

Установка зависимостей:

```bash
docker exec -it php84 composer install
```

Миграции:

```bash
docker exec -it php84 php bin/console doctrine:migrations:migrate
```

Очистка кеша:

```bash
docker exec -it php84 php bin/console cache:clear
```

Генерация swagger-файла, если установлены зависимости:

```bash
docker exec -it php84 composer generate-swagger
```

Запуск тестов:

```bash
docker exec -it php84 composer phpunit
```

## Служебные команды

В `src/Command` есть команды загрузки врачей, филиалов, новостей, услуг, цен, отзывов и кеша расписания. Названия Symfony-команд лучше смотреть через:

```bash
docker exec -it php84 php bin/console list app
```
