Часовой пояс отображения захардкожен на фронте и не зависит от APP_TZ_OFFSET_HOURS #68

Closed
opened 2026-09-14 18:55:18 +03:00 by Agent · 2 comments
Collaborator

Проблема

Смещение часового пояса задаётся в двух местах, и они не связаны между собой:

  • Бэкенд — APP_TZ_OFFSET_HOURS (backend/app/core/config.py:44, по умолчанию 3). Используется только в core/timeutil.py:app_today() — для «даты игры» (Match.played_at при старте партии). Все остальные моменты времени API отдаёт в UTC (iso_utc).
  • Фронтенд — frontend/src/domain/format.ts:2: const APP_TZ_OFFSET_MIN = 3 * 60;. На нём работают formatTime / formatDateTime — время старта и завершения партии, уведомления, журнал аудита и т.д.

Сценарий

  1. В .env задать APP_TZ_OFFSET_HOURS=5.
  2. Начать партию в 20:30 UTC.
  3. «Дата игры» посчитается в +5 (уже следующий день), а время старта фронт покажет в +3 (23:30 предыдущего дня). В карточке партии дата и время противоречат друг другу.

Настройка из .env выглядит рабочей, но меняет только половину отображения.

Варианты решения

  • Отдавать смещение фронту (например, полем в GET /api/auth/config или отдельным meta-эндпойнтом) и брать его в format.ts вместо константы; или
  • убрать APP_TZ_OFFSET_HOURS из конфигурации и явно зафиксировать +3 в обоих местах (с комментарием-ссылкой друг на друга).

Найдено при сверке CLAUDE.md с кодом.

## Проблема Смещение часового пояса задаётся в двух местах, и они не связаны между собой: - **Бэкенд** — `APP_TZ_OFFSET_HOURS` (`backend/app/core/config.py:44`, по умолчанию 3). Используется только в `core/timeutil.py:app_today()` — для «даты игры» (`Match.played_at` при старте партии). Все остальные моменты времени API отдаёт в UTC (`iso_utc`). - **Фронтенд** — `frontend/src/domain/format.ts:2`: `const APP_TZ_OFFSET_MIN = 3 * 60;`. На нём работают `formatTime` / `formatDateTime` — время старта и завершения партии, уведомления, журнал аудита и т.д. ## Сценарий 1. В `.env` задать `APP_TZ_OFFSET_HOURS=5`. 2. Начать партию в 20:30 UTC. 3. «Дата игры» посчитается в +5 (уже следующий день), а время старта фронт покажет в +3 (23:30 предыдущего дня). В карточке партии дата и время противоречат друг другу. Настройка из `.env` выглядит рабочей, но меняет только половину отображения. ## Варианты решения - Отдавать смещение фронту (например, полем в `GET /api/auth/config` или отдельным meta-эндпойнтом) и брать его в `format.ts` вместо константы; **или** - убрать `APP_TZ_OFFSET_HOURS` из конфигурации и явно зафиксировать +3 в обоих местах (с комментарием-ссылкой друг на друга). Найдено при сверке CLAUDE.md с кодом.
Agent added the Kind/Bug
Priority
Low
4
labels 2026-09-14 18:55:18 +03:00
Agent self-assigned this 2026-09-19 02:39:23 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-19 02:39:24 +03:00
Author
Collaborator

План выполнения

Решение владельца — один пояс приложения из .env для всех: сервер отдаёт смещение фронту, пояс устройства не учитывается.

  1. GET /api/auth/config получает поле tz_offset_hours из APP_TZ_OFFSET_HOURS; валидатор настроек ограничивает его −12..14.
  2. npm run gen:api — обновлённый schema.d.ts.
  3. format.ts: константа +3 → переменная модуля с setAppTzOffsetHours. App.tsx загружает конфиг до первой отрисовки страниц; при недоступном конфиге — запасные +3. Затрагивает всё отображение времени и ввод дат объявлений в админке.
  4. .env.example и тесты бэкенда: поле в конфиге и границы валидатора.

Критерии готовности

  • Смена APP_TZ_OFFSET_HOURS меняет и «дату игры», и отображение/ввод времени на фронте.
  • pytest и npm run build зелёные; schema.d.ts сгенерирован.

Ветка: issue-68-tz-offset от dev

## План выполнения Решение владельца — **один пояс приложения из `.env` для всех**: сервер отдаёт смещение фронту, пояс устройства не учитывается. 1. `GET /api/auth/config` получает поле `tz_offset_hours` из `APP_TZ_OFFSET_HOURS`; валидатор настроек ограничивает его −12..14. 2. `npm run gen:api` — обновлённый `schema.d.ts`. 3. `format.ts`: константа +3 → переменная модуля с `setAppTzOffsetHours`. `App.tsx` загружает конфиг до первой отрисовки страниц; при недоступном конфиге — запасные +3. Затрагивает всё отображение времени и ввод дат объявлений в админке. 4. `.env.example` и тесты бэкенда: поле в конфиге и границы валидатора. **Критерии готовности** - Смена `APP_TZ_OFFSET_HOURS` меняет и «дату игры», и отображение/ввод времени на фронте. - `pytest` и `npm run build` зелёные; `schema.d.ts` сгенерирован. **Ветка:** `issue-68-tz-offset` от `dev`
Agent added the
Status
In Review
label 2026-09-19 03:05:43 +03:00
Author
Collaborator

Работа выполнена, открыт PR: #98

Итог: APP_TZ_OFFSET_HOURS теперь задаёт один пояс для всего приложения: сервер отдаёт его в /api/auth/config, фронт показывает и принимает время в нём (запасные +3 — только если конфиг недоступен). Смещение ограничено −12..14.
Проверки: pytest — 224 passed (новые тесты падают на старом коде); npm run build — успешно; schema.d.ts сгенерирован.
Статус: Status/In Review
Осталось за вами: ревью и мёрж PR — задача закроется автоматически.

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/98 **Итог:** `APP_TZ_OFFSET_HOURS` теперь задаёт один пояс для всего приложения: сервер отдаёт его в `/api/auth/config`, фронт показывает и принимает время в нём (запасные +3 — только если конфиг недоступен). Смещение ограничено −12..14. **Проверки:** `pytest` — 224 passed (новые тесты падают на старом коде); `npm run build` — успешно; `schema.d.ts` сгенерирован. **Статус:** `Status/In Review` **Осталось за вами:** ревью и мёрж PR — задача закроется автоматически.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#68