- Все комментарии в коде должны быть на русском языке
- Следуйте правилам checkstyle от Google Checks
- Следуй практикам SOLID
- Для работы с датами и временем всегда используйте
DateTimeService - При создании нового сервиса всегда сначала создавайте интерфейс, затем реализацию
- Если не хватает каких-то репозиториев или сервисов, создавайте их
- Старайся переиспользовать код, если возможно
- Пиши Javadoc для публичных классов и методов на русском языке
Проект следует многослойной архитектуре:
- Controller - обрабатывает HTTP-запросы, делегирует бизнес-логику сервисам
- Service - содержит бизнес-логику
- Repository - обеспечивает доступ к данным
- Entity - модели данных для хранения в БД
- Модуль api - только контроллеры и дто, мапперы между entity и rest-dto
- Модуль persistence - jpa-репозитории и entity
- Модуль service - бизнес логика (сервисы)
- Контроллеры должны реализовывать интерфейсы, сгенерированные из OpenAPI спецификаций
- Слой контроллеров не должен содержать бизнес-логику
- Для преобразования между DTO и Entity используйте MapStruct маппер
- Для контроллеров обязательно пишите Unit & Happy path тесты
- Сверяй валидацию входящих параметров с уже готовой валидацией в интерфейсах, сгенерированных из OpenAPI спецификаций
- Сервисы должны иметь интерфейс и реализацию
- Сервисы не должны знать о типах запросов или ответов в контроллерах
- Используйте существующие сервисы вместо прямого обращения к репозиториям, когда такие сервисы
доступны (например, используйте
ClientProfileServiceвместоClientProfileRepository) - Для всей логики сервисов пишите unit-тесты
- Используйте конструктор с
@RequiredArgsConstructorдля внедрения зависимостей - Для транзакционных методов используйте аннотацию
@Transactional
- Используйте MapStruct для преобразования между Entity и DTO
- Маппер должен быть интерфейсом с аннотацией
@Mapper(componentModel = "spring") - Для сложных преобразований используйте
@Mappingаннотации - Пиши unit-тесты для слоя мапперов
- Для бизнес-исключений используйте
BusinessExceptionс соответствующимBusinessExceptionReason - При добавлении новых типов ошибок обновляйте
ExceptionReasonHttpStatusMapperImplдля маппинга на HTTP-статусы - Используйте глобальный обработчик исключений для преобразования исключений в HTTP-ответы
- Всегда используйте
DateTimeServiceдля работы с датами и временем - Не используйте напрямую
LocalDateTime.now(),Instant.now()и т.п. - Для хранения времени в БД используйте
LocalDateTimeилиOffsetDateTime - Для API взаимодействий используйте
Instant
- Проект мультимодульный, поэтому для сборки проекта и запусков тестов нужно собирать полностью root-модуль, включая все дочерние модули (название модуля)
- Пишите unit-тесты для всей бизнес-логики в сервисах, для мапперов, утилит, и контроллеров (с happy path)
- Используйте JUnit 5 и Mockito
- Следуйте паттерну Arrange-Act-Assert
- Тестируйте как позитивные, так и негативные сценарии
- Используйте понятные имена тестов, описывающие сценарий и ожидаемый результат
- Имена классов, методов и переменных должны быть на английском языке
- Комментарии должны быть на русском языке
- Интеграционные тесты должны иметь суффикс
IT - Unit-тесты должны иметь суффикс
Test - Реализации интерфейсов должны иметь суффикс
Impl - Реализации интерфейсов должны быть package private
- Все публичные методы должны иметь JavaDoc комментарии на русском языке
- Документируйте параметры, возвращаемые значения и исключения
- Для реализаций интерфейсов используйте
{@inheritDoc} - API должно быть описано в OpenAPI спецификациях в формате YAML
- Создайте интерфейс сервиса с Javadoc
- Реализуйте интерфейс
- Напишите unit-тесты для сервиса
- Создайте или обновите контроллер
- Создайте или обновите маппер
- Напишите или обновите тесты
- Проверьте соответствие правилам checkstyle