Код-ревью Middle Код-ревью и правила команды обновлено

Код-ревью: эндпоинт из пулреквеста, написанный с ИИ

Вопрос

Пулреквест «Добавить экспорт заказов пользователя в CSV». Код написан ассистентом, автор говорит, что тесты зелёные. Найдите проблемы.

import { stringify } from 'csv-stringify-fast';

// Экспортирует заказы пользователя в CSV
app.get('/api/orders/export', async (req, res) => {
  const userId = req.query.userId;
  const rows = await db.query(
    `SELECT * FROM orders WHERE user_id = ${userId}`
  );
  try {
    const csv = stringify(rows);
    res.setHeader('Content-Type', 'text/csv');
    res.send(csv);
  } catch (e) {
    console.log(e);
  }
});

function formatDate(d: Date): string {
  return d.toISOString().slice(0, 10);
}

Коротко

Код выглядит аккуратно, но в нём классический набор: выдуманная или подозрительная зависимость, доступ к чужим данным через параметр, SQL-инъекция, выгрузка всего подряд и проглоченная ошибка. Зелёные тесты этого не ловят, если тесты проверяют только счастливый путь.

Что должен найти ревьюер

  1. Безопасностьстрока 1
    Незнакомый пакет с похожим на популярный названием: проверить, что он существует, поддерживается и это не подделка. Возможно, ассистент его выдумал.
  2. Безопасностьстрока 5
    userId берётся из query: любой может выгрузить чужие заказы. Пользователь должен браться из сессии.
  3. Безопасностьстрока 7
    SQL собирается склейкой строк: инъекция. Нужен параметризованный запрос.
  4. Производительностьстрока 7
    SELECT * без лимита: выгрузит лишние колонки, включая внутренние, и может вернуть огромный объём за раз.
  5. Ошибкастрока 14
    Ошибка проглатывается: клиент не получит ответа и запрос повиснет. Нужен ответ с кодом ошибки.
  6. Стильстрока 18
    Неиспользуемая функция formatDate, к тому же в проекте, скорее всего, уже есть общий форматтер дат.

Разбор

Код выглядит аккуратно, но в нём классический набор: выдуманная или подозрительная зависимость, доступ к чужим данным через параметр, SQL-инъекция, выгрузка всего подряд и проглоченная ошибка. Зелёные тесты этого не ловят, если тесты проверяют только счастливый путь. Автор должен был заметить это сам до ревью.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.