Не вказано
47 ставок
Є діюча production-платформа з каталогом та автоматичним оновленням зовнішніх пропозицій і цін.
Стек:
— Node.js / TypeScript;
— PostgreSQL;
— існуючий сервіс оновлення цін і cron;
— окремий готовий Python-модуль валідації та вибору пропозицій;
— staging і production.
Необхідно точково доопрацювати існуючий pipeline оновлення цін без повного переписування backend.
ОБОВ'ЯЗКОВИЙ СКОП
1. Інтеграція Python-модуля
— Python-модуль залишається окремим компонентом;
— повертає структурований результат: offers, selected offer, statuses та risk flags;
— Node.js валідує результат і виконує запис у БД;
— передбачити обробку помилок і partial/failed runs;
— legacy pipeline не відключається до завершення QA.
2. Запуск оновлення за списком
Додати запуск:
— по одному slug/id;
— по переданому списку slug/id.
Допустимо CLI або існуючий службовий API. Новий користувацький інтерфейс не потрібен.
3. Shadow Mode
Нові результати повинні записуватися окремо і не впливати на production до QA.
Потрібні shadow-поля:
— price;
— selected offer ID;
— direct URL;
— offer status;
— risk/QA flags;
— checkedAt;
— engineVersion.
4. Розширення існуючої таблиці offers
Додати:
— source;
— external_offer_id;
— last_seen_at;
— last_checked_at;
— engine_version;
— risk flags або зберігання в існуючому JSON;
— unique constraint для захисту від дублів.
Нову паралельну систему пропозицій створювати не потрібно, якщо існуючу таблицю можна безпечно розширити.
5. UPSERT, STALE і транзакція БД
Замінити поточну схему DELETE → CREATE:
— UPSERT існуючих і нових пропозицій;
— відсутні в повному успішному snapshot пропозиції переводяться в STALE;
— при API error, partial result або незавершеному snapshot активні пропозиції не повинні ставати STALE;
— оновлення пропозицій, metadata вибраної пропозиції та shadow fields по одній моделі виконується всередині однієї транзакції БД;
— при помилці виконується повний rollback.
6. Canonical-safe refresh
Оновлення цін не повинно змінювати:
— brand;
— reference;
— model;
— collection;
— name/title;
— slug;
— descriptions;
— images;
— SEO fields.
Оновлюються тільки offer, price і shadow data.
7. Збереження поточної cron-логіки
Зберегти:
— existing cron;
— rolling batches;
— cooldown;
— перевірку PRICE_REFRESH_MIN_DAYS до виклику зовнішнього API;
— legacy production pipeline до завершення Shadow QA.
8. Audit output
Достатньо одного варіанту:
— shadow-колонки в існуючій admin table;
або
— CSV export.
Мінімальні дані:
— model/reference;
— production price;
— shadow price;
— delta;
— production/shadow URL;
— status;
— risk flags;
— checkedAt;
— engineVersion.
Новий складний dashboard не потрібен.
9. Staging і QA
— DB migrations;
— staging deployment;
— smoke test на 5 переданих моделях;
— потім Shadow Mode приблизно на 50 моделях;
— виправлення технічних помилок, виявлених під час цих прогонів;
— коротка документація контракту Python → Node.js та rollback procedure.
ОПЦІОНАЛЬНО ОЦІНИТИ ОКРЕМО
Простий технічний promotion без нового UI:
— promotion однієї моделі по slug;
— promotion списку slug;
— перенесення підтверджених shadow values в production;
— технічна перевірка після rollout.
РЕЗУЛЬТАТ
— Pull Request;
— DB migrations;
— робоча інтеграція Python → Node.js;
— Shadow Mode;
— UPSERT, STALE і транзакційне оновлення;
— запуск по slug/id;
— staging deployment;
— smoke-test results;
— коротка документація;
— не менше 7 днів виправлення багів по реалізованому scope після приймання.
В ОТКЛИКУ УКАЗАТИ
1. Фіксована ціна за обов'язковий scope.
2. Окрему вартість механізму promotion.
3. Термін.
4. Оцінку годин.
5. Коли готові почати.
6. Досвід з PostgreSQL transactions, migrations та ingestion pipelines.
7. Які питання потрібно уточнити до початку.
8. Включені чи staging, QA, migrations та період виправлення помилок.
Шаблонні відповіді без конкретної оцінки розглядатися не будуть.
Доступ до production на першому етапі не надається. Робота починається з обмеженого code review та staging.