Добавить выдачу репозиториев через GitHub OAuth - #48
Conversation
Код-ревью (автоматическое, high effort)8 поисковых угла × верификация каждого кандидата отдельным агентом. Ниже — 8 подтверждённых находок, от самой серьёзной к менее серьёзной. 1.
|
|
Исправления по ревью добавлены в коммите d8a0686. Что проверено и исправлено:
Локально прошли: 282 pytest-теста, 7 frontend-тестов, frontend build, Ruff, Bandit для новых GitHub-модулей, npm audit и pip-audit (0 известных уязвимостей), сборка и HTTP smoke-test обоих Docker-образов. /register, grade_lab, старые модули оценивания и форма регистрации не изменялись. Для ручной проверки использовался реальный приватный шаблон radjab-labgrader-test/grader-task1-template (is_template=true). В конфиги курсов преподавателя это тестовое значение намеренно не добавлено. Пожалуйста, подтвердите точный production template-repo для курса suai-os-2026; после подтверждения достаточно указать его в нужной лабе в формате owner/repo. |
|
Здравствуйте, @markpolyak! Спасибо за подробное ревью. Замечания проверены повторно, исправления опубликованы.
Исправлено. Переменная теперь действительно передаётся Uvicorn через параметры За reverse proxy Slowapi получает адрес студента, а произвольный
В Нормализация Таким образом, OAuth-часть не создаёт нового смешивания лабораторных, но указанная проблема старого
Исправлено. Ответы После гонки дополнительно проверяется поле Добавлены отдельные тесты успешной гонки и репозитория от другого шаблона.
Исправлено. Ошибки неизвестного курса, лабораторной и отсутствующего Добавлены тесты неизвестной лабораторной и ошибки конфигурации.
Не изменялся. Этот клиент используется старой логикой Новые Проблема старого клиента остаётся отдельным техническим долгом существующей системы оценивания.
Оставлено намеренно, поскольку Дополнительно обработан параллельный callback: если приглашение уже было принято или удалено другим запросом, система повторно проверяет прямой доступ перед созданием нового приглашения. Добавлены тесты pending-приглашения, параллельного удаления и повторной проверки доступа.
Не добавлялось, поскольку запись результата OAuth-выдачи в Google Sheets отсутствует в постановке задачи. Join-flow является дополнительным способом получения репозитория и не заменяет существующие
Обработка уточнена. Поскольку GitHub действительно возвращает одинаковый В серверной диагностике теперь явно указаны обе возможные причины: шаблон не найден либо у Дополнительно исправлено:
Проверки после исправлений:
Ограничения ТЗ соблюдены: Оставшиеся замечания существующего кода, не относящиеся к ТЗ:
|
Переносит фронтенд /join/:courseId/:labId из PR #48 (feature/public-join-github-oauth) поверх бэкенд-контрактов PR #49, адаптируя контракт: lab_short_name вместо lab_name, HTTP 400 вместо 409 для неготовой лабы, reason= вместо error= и repo_url=/username= вместо repository= в редиректе после OAuth-колбэка. - JoinLab/index.jsx, styled.js, state.js, state.test.js - компонент из #48 (переключатель языка на странице, полный набор переводов ошибок), адаптированный под query-параметры и коды ошибок #49 - language.js/.test.js - хранение выбранного языка интерфейса - i18n.js - язык интерфейса запоминается между визитами (readStoredLanguage/persistLanguage + applyDocumentLanguage) - api/index.js - fetchJoinLab/getJoinStartUrl вместо fetchJoinLabInfo, 400 вместо 409 как признак неготовой лабы - App.jsx - роуты /join/error и /join/:courseId/:labId рендерят JoinLab напрямую, joinLabWrapper.jsx удалён (не может обслужить /join/error, у которого нет параметров) - package.json - добавлен скрипт "test": "node --test src" (без апгрейда react-router-dom и прочих правок зависимостей из #48) - locales/{ru,en,zh} - namespace join.* из #48 вместо плоских joinXxx ключей #49; добавлены join.errors.createForbidden (CREATE_FORBIDDEN) и join.usernameLabel (логин студента в success-панели) - state.js: ERROR_TRANSLATION_KEYS переписан под коды ошибок #49 (реcursion main.py redirect reasons, RepoProvisioner.error_code, fetchJoinLab) - Кнопка "Назад" на страницу перенесена (стиль ButtonBack из course-list/styled, текст "← Назад" не переведён - как и в остальных компонентах проекта, где эта кнопка используется) Точечная правка бэкенда (main.py): - добавлен _join_error_redirect() - результат для случая, когда course_id/lab_id ещё неизвестны (битый/просроченный/отсутствующий state) - join_callback оборачивает _parse_join_state() в try/except и редиректит на /join/error?status=error&reason=invalid_state вместо сырого HTTPException(400) - tests/test_join_endpoints.py: три существующих теста (invalid/missing/expired state) переписаны под новое поведение (редирект вместо исключения) Проверено: pytest tests/ (226 passed), npm run lint/test/build.
|
Код из этого PR использован в #49 |
Выполнено задание #46