Привет, друзья! 👋
Завершил четвёртый спринт Jobs Service: 7 из 7 задач закрыты ✅
Цель была в том, чтобы у каждой вакансии появилась страница с подробной информацией. Что получилось:
▪️ 📄 Страница деталей. Появился API GET /vacancies/:id и страница вакансии с описанием, навыками и ссылками на все источники. Описание приходит из чужих источников, поэтому единая политика очистки HTML записана и работает на каждом уровне, а образцы атак общие для parser и backend. Список вакансий перевёл на серверные компоненты Next.js.
▪️ 🔍 Анализ базы вакансий. Проверил данные на большом объёме и записал методику, чтобы повторять анализ после изменений. Нашлись дефекты, которых не видели тесты: вакансии уходили в архив из-за того, что не попали в очередной запуск, нулевая нижняя граница зарплаты, расхождение ограничений контракта и колонок БД, порядок навыков. Всё исправлено.
▪️ 🛠 Параллельно закрыл ещё 18 задач техдолга: браузерные e2e-тесты на Playwright и объединённое покрытие, обновление содержимого известной вакансии при повторном получении, подтверждение источником снятия вакансии, проверка в источнике тех публикаций, которых не нашёл поиск, хук pre-push с проверками и сканированием секретов, именованные константы вместо кодов ответа HTTP.
▪️ 🔐 Безопасность. Закрыл ещё 4 задачи: backend API стал внутренним, сайт отдаёт заголовки безопасности и CSP с nonce на каждый ответ, закрыты оповещения по зависимостям.
Автоматизированных тестов теперь больше 1150.
Главный вывод ретроспективы: значительная часть работы пришлась на дефекты, которые находил анализ данных, а не тесты, и на утверждения о безопасности, которые подтверждал только запуск.
Курьёз спринта: CORS в backend добавлял в начале проекта, как в любом учебном проекте, а в этом спринте сам же и удалил. Когда запросы к API переехали с браузера на сервер Next.js, он стал не нужен. Пришлось разбираться, в каких сценариях CORS вернётся (мобильное приложение, публичный API, авторизация), и записать это решение в ADR, чтобы вопрос «зачем удалили» не возникал снова.
Следующий спринт — поиск по вакансиям. Следите за продолжением! 🚀