шлется на реальный сервер #2

Merged
gorbenko.pavel merged 15 commits from initial-fixes into main 2026-08-24 08:54:41 +00:00

15 Commits

Author SHA1 Message Date
gorbenko.pavel f1caa62f28 refactor: сертификат и ключ в каталоге secrets/, один параметр на каталог
Tests / frontend-test (pull_request) Successful in 3m14s
Локально путь к сертификату вёл в ~/Downloads у каждого свой, а в контейнере
задавался двумя отдельными переменными. Теперь каталог один и подменяется
целиком через SECRETS_DIR: по умолчанию secrets/ в корне репозитория, в
контейнере /certs (смонтированный каталог с хоста, GRAPH_CERT_DIR не меняется).

Имена файлов внутри фиксированы, поэтому GRAPH_CERT_PATH и GRAPH_KEY_PATH
больше не нужны. Содержимое secrets/ в .gitignore, кроме README.

Отсутствие файлов теперь даёт понятную ошибку вместо ENOENT — на свежем
клоне это основной сценарий отказа.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 13:34:37 +05:00
gorbenko.pavel b4a10510e1 feat: справочник компаний из api.tnsu.kz вместо копии в коде
Список юрлиц группы меняется без нашего участия, а две копии в репозитории
(COMPANY_OPTIONS во фронте и COMPANY_NAMES на сервере) неизбежно разошлись
бы с источником и между собой. Теперь единственный источник —
/Dictionary/Companies:

- GET /companies проксирует справочник, чтобы токен не утекал в браузер;
- имя компании для колонки Company резолвится по нему же, на сервере;
- в кэше 10 минут — новое юрлицо подхватится без перезапуска сервиса.

Пока список грузится, в select показывается «Загружаем…»; если не
загрузился — ошибка в слоте обязательного поля, а не пустой список.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 13:06:09 +05:00
gorbenko.pavel e9ae3d5bab fix: не отправлять в SharePoint поля с пустым значением
Состав полей зависит от вида обращения и анонимности, поэтому часть строк
заведомо пустая. Пустая строка в списке выглядит как заполненное значение,
а не как отсутствующее поле — теперь такие поля выпадают из payload.
Значения обрезаются, так что поле из одних пробелов тоже не уедет.

WantsFeedback остаётся всегда: false здесь осмысленно, а не пусто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 13:01:25 +05:00
gorbenko.pavel 0eb81e61e5 chore: npm run dev поднимает фронтенд и auth-сервис вместе
Локальное окружение требовало двух терминалов, а без запущенного
auth-сервиса форма отдаёт 500 от vite-прокси — это легко принять за баг
приложения. Теперь concurrently стартует оба процесса с метками
[web]/[auth]; только фронтенд — npm run dev:web.

Заодно поправлен README сервиса: GRAPH_SCOPE больше не нужно задавать
руками, дефолт уже указывает на App ID URI api.tnsu.kz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 12:57:36 +05:00
gorbenko.pavel 07a44e3b0e chore: запуск auth-сервиса локально одной командой
npm run dev читает server/.env через --env-file (нативно в Node 20+),
чтобы не передавать GRAPH_* руками при каждом старте. Без запущенного
сервиса на 3100 vite-прокси отдаёт 500, что легко принять за баг формы.

.env добавлен в .gitignore, в репозиторий положен только .env.example.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 12:52:07 +05:00
gorbenko.pavel 091e4e41b9 fix: запрашивать токен для api.tnsu.kz, а не для Graph
Токен с aud=graph.microsoft.com api.tnsu.kz отклонял с 401 — он проверяет
аудиторию входящего JWT. Меняем scope по умолчанию на App ID URI самого
api-tnsu-portal; наш сертификат для него уже авторизован, отдельный
client secret не нужен.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 12:43:38 +05:00
gorbenko.pavel 948ef76d17 правка
Tests / frontend-test (pull_request) Successful in 12s
2026-08-24 12:10:11 +05:00
gorbenko.pavel 89168024df Merge remote-tracking branch 'origin/main' into initial-fixes
Tests / frontend-test (pull_request) Successful in 13s
# Conflicts:
#	server/src/config.ts
#	server/src/index.ts
2026-08-24 11:48:49 +05:00
gorbenko.pavel f2d4fd1768 fix: захардкодить SHAREPOINT_SITE_URL и SHAREPOINT_LIST_NAME
Убрал требование задавать их через .env на сервере — значения одни
и те же для единственного прод-окружения.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:42:17 +05:00
gorbenko.pavel 07bafde43f feat: отправка формы обращения в SharePoint через api.tnsu.kz
POST /feedback собирает поля формы в столбцы списка (Company резолвится
в название по справочнику, Type/Title — по виду обращения) и создаёт
элемент через api.tnsu.kz /SharePoint/ListItem. Ошибки авторизации и
апстрима логируются в stdout и возвращаются клиенту как 502, чтобы сбой
на проде было видно явно.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:39:20 +05:00
gorbenko.pavel 49bf9b3c4e fix: переименовать вид обращения "Жалоба" в "Обращение"
Обновлены label в KIND_OPTIONS, комментарии и placeholder ФИО в форме.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:13:23 +05:00
gorbenko.pavel e4678210ab Merge remote-tracking branch 'origin/main' into initial-fixes 2026-08-24 09:09:22 +05:00
admin a8d46208a6 добавлена авторизация для запросов на api.tnsu.kz
Tests / frontend-test (pull_request) Successful in 18s
2026-08-21 17:11:34 +05:00
admin 60e654c80e fix: update port mapping for hr-appeals-web service to use 80:80 2026-08-21 16:36:27 +05:00
admin 838fd644e9 Настроен деплой 2026-08-21 15:47:43 +05:00