AIAI University/ Stadika Смотреть курсы
AI University / Промпты / Программисту
Программисту

Промпт: ревью pull request по diff

Ревью изменений с приоритетами: блокирующие ошибки, безопасность, тесты, готовые комментарии. Готовый промт на русском: скопируйте, подставьте свои данные и вставьте в GigaChat, YandexGPT, ChatGPT, Claude или Gemini.

Проверено на: GigaChatChatGPTClaudeGemini · Обновлено 01.10.2026

Текст промпта

Ты ведущий разработчик и проводишь ревью pull request. Задача PR: {goal}. Стек и правила команды: {rules}. Diff: {diff} Дай: 1. Итог: approve, approve с замечаниями или request changes, и почему, в 1-2 предложениях. 2. Замечания по приоритету: блокирующие (баги, безопасность, потеря данных), важные (производительность, обработка ошибок, тесты), мелкие (стиль, имена). Для каждого: строка из diff, что не так, как исправить (с кодом). 3. Каких тестов не хватает. 4. Что в PR сделано хорошо (1-2 пункта, конкретно). Пиши замечания так, как оставил бы их комментариями в GitLab: вежливо, по делу, без «очевидно». Не придумывай код, которого нет в diff; если вывод зависит от кода вне diff, напиши, что нужно посмотреть.

Что подставить в промт

ПолеПример
{goal}эндпоинт загрузки аватара пользователя
{rules}Node.js 20, Express, TypeScript, хранилище Yandex Object Storage через S3 API, входные данные валидируем через zod, авторизация через middleware requireAuth
{diff}+ router.post('/users/:id/avatar', upload.single('file'), async (req, res) => {
+ const user = await db.user.findUnique({ where: { id: req.params.id } })
+ const key = 'avatars/' + req.params.id + '/' + req.file.originalname
+ await s3.putObject({ Bucket: BUCKET, Key: key, Body: req.file.buffer })
+ await db.user.update({ where: { id: user.id }, data: { avatarKey: key } })
+ res.json({ url: CDN + '/' + key })
+ })
+
+ const upload = multer({ storage: multer.memoryStorage() })

Ответы нейросетей на этот промпт

Один и тот же промпт с примером выше, ответы без правок: выберите нейросеть, которой пользуетесь, и посмотрите, что она выдаёт.

GigaChat 2 Max06.10.2026
Итог: Request Changes

Технически функция работает, но есть серьёзные проблемы безопасности и корректности работы, которые требуют исправления перед слиянием.


Блокирующие замечания 🔥

Строка: const key = 'avatars/' + req.params.id + '/' + req.file.originalname
📌 Что не так: Используется оригинальное имя файла (originalname), которое легко подделывается злоумышленником — это создаёт уязвимость типа Path Traversal и открывает возможность атак XSS и CSRF. Необходимо проверить расширение файла и генерировать уникальное имя самостоятельно.
✅ Исправление: Генерируйте случайный хеш имени файла вместе с расширением и проверяйте допустимые типы файлов заранее.

import crypto from 'crypto';
// Допустимые расширения изображений
const validExtensions = ['jpg', 'jpeg', 'png'];

const extension = path.extname(req.file.originalname);
if (!validExtensions.includes(extension)) throw new Error('Invalid file type');

const hashName = crypto.randomBytes(16).toString('hex') + extension;
const key = `avatars/${req.params.id}/${hashName}`;

Строка: await db.user.update({ where: { id: user.id }, data: { avatarKey: key } })
📌 Что не так: Нет проверки, совпадает ли параметр id запроса с идентификатором текущего аутентифицированного пользователя. Это позволяет загружать файл за другого пользователя.
✅ Исправление: Проверять соответствие ID пользователя из токена и параметра маршрута.

const currentUserId = getCurrentUserFromToken(); // Метод получения пользователя из middleware auth
if (currentUserId !== Number(req.params.id)) return res.status(403).json({ error: 'Forbidden' });

Строка: upload.single('file')
📌 Что не так: Отсутствует ограничение размера загружаемого файла. Если не ограничить размер файла, сервер рискует перегрузкой памяти и отказом в обслуживании.
✅ Исправление: Добавьте ограничение максимального размера файла.

const upload = multer({
  storage: multer.memoryStorage(),
  limits: { fileSize: 5 * 1024 * 1024 } // Ограничение до 5MB
});

Важные замечания ⚠️

Строка: router.post('/users/:id/avatar', upload.single('file'), async (req, res) => {...})
📌 Что не так: Ошибки внутри обработчика запросов обрабатываются плохо — потенциальная ошибка будет возвращаться пользователю как внутренняя ошибка сервера (500 Internal Server Error). В случае ошибки клиент должен получать осмысленные HTTP-коды и понятные описания ошибок.
✅ Исправление: Обрабатывайте ошибки централизованно либо используйте try-catch блок вокруг асинхронной части.

try {
  // основная логика здесь...
} catch(err) {
  console.error(err); 
  if (err instanceof KnownErrorType) {
    return res.status(err.httpCode || 500).json({ message: err.message });
  }
  return res.status(500).send("Internal server error");
}

Отсутствуют: Валидаторы входных данных
📌 Что не так: Не проводится предварительная проверка полей (например, MIME-типа файла, допустимых размеров изображения) с помощью библиотеки Zod. Из-за этого возможен приём некорректных данных.
✅ Исправление: Создать схему Zod для проверок поля file.

import { z } from 'zod';

export const AvatarUploadSchema = z.object({
  file: z.instanceof(File)
}).refine((data) => {
  const isValidImage = ['image/jpeg', 'image/png'].includes(data.file.mimetype);
  return isValidImage && data.file.size <= 5 * 1024 * 1024;
}, {
  message: 'File must be a JPEG or PNG image under 5 MB'
});

Мелкие замечания ✨

Строка: await db.user.findUnique({ where: { id: req.params.id } })
📌 Что не так: Использован метод .findUnique, который предполагает наличие уникального ключа. Лучше использовать более точный термин .findFirst.
✅ Исправление: Замените на db.user.findFirst(...)


Какие тесты отсутствуют? 🎯

Что реализовано хорошо?

Советы

Как пользоваться
  1. Скопируйте промпт кнопкой выше.
  2. Замените поля в фигурных скобках своими данными.
  3. Отправьте в нейросеть и сравните ответ с примером на этой странице.

Подробнее о структуре хорошего запроса: гид AI University.

Похожие промпты

ПрограммистуБесплатно Найти причину ошибки по стектрейсу и логамВероятная причина плавающей ошибки, гипотезы с проверками, исправление и защита от повторения. 4 ответаОткрытьПрограммистуБесплатно Ускорить медленный SQL-запрос по EXPLAINРазбор плана выполнения, индексы и переписанный запрос, безопасное создание индекса на проде. 4 ответаОткрытьПрограммистуС доступом Миграция базы данных без простояПлан изменения схемы по шагам expand и contract, миграции, перенос данных батчами и откат. 4 ответаСмотреть ответы

Все 435 промптов и 6 наборов

172 промптов открыты бесплатно. Остальные и наборы-цепочки открывает доступ к библиотеке за 1 490 ₽. Полный доступ за 4 900 ₽: все курсы AI University на русском и библиотека промптов. Разовый платёж, новые промпты входят.