docs: add admin test checklist design spec

This commit is contained in:
Kirill
2026-05-24 16:03:37 +05:00
parent f6c9d1e5a9
commit e0e94f4439
@@ -0,0 +1,147 @@
# Design: Admin Test Checklist
**Date:** 2026-05-24
**Status:** Approved
## Summary
Админ-страница с чек-листом для ручного тестирования функционала сайта. Каждая проверка имеет описание действия и ожидаемый результат. Отметка сохраняется в SQLite с автоматической датой.
## Architecture
### Data Model
Новая модель `ChecklistResult` в Prisma schema:
```prisma
model ChecklistResult {
id String @id @default(cuid())
itemKey String @unique // уникальный ключ проверки
passed Boolean
checkedAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
```
### Elements Source
Элементы чек-листа — хардкод в `shared/constants/test-checklist-items.ts` (JS + .d.ts). Версионируются с кодом.
Структура элемента:
```ts
{
key: string // уникальный идентификатор
section: string // раздел (группировка)
action: string // что сделать
expectedResult: string // что должно произойти
}
```
### API
**Server route:** `server/src/routes/api/admin/test-checklist.js`
- `GET /api/admin/test-checklist` — возвращает все элементы + их результаты из БД
- `PATCH /api/admin/test-checklist` — body: `{ itemKey, passed }`, обновляет/создаёт результат, `checkedAt = now()`
- `POST /api/admin/test-checklist/reset` — сбрасывает все результаты (удаляет записи)
Только для админов.
### Frontend
**Page:** `client/src/pages/admin-test-checklist/ui/AdminTestChecklistPage.tsx`
- Аккордеон по разделам (MUI Accordion)
- Каждая строка: чекбокс, колонка "Действие", колонка "Ожидаемый результат", дата проверки
- Чекбокс отмечен = `passed: true`, снят = `passed: false`
- Дата проставляется автоматически при изменении чекбокса
- Кнопка «Сбросить все» для полного ре-теста
- `@tanstack/react-query` для данных, `apiClient` для запросов
**Navigation:** новый пункт в `AdminLayoutPage` — «Тест-чеклист» с иконкой `ClipboardCheck`, роут `/admin/test-checklist`
## Sections & Items
### Авторизация (auth)
- `auth.register-email` — Регистрация по email → код приходит, аккаунт создаётся
- `auth.login-password` — Вход по паролю → корректный пускает, неправильный — ошибка
- `auth.oauth-vk` — OAuth VK → редирект, callback, авторизация
- `auth.oauth-yandex` — OAuth Yandex → редирект, callback, авторизация
- `auth.reset-password` — Сброс пароля → письмо приходит, ссылка работает
- `auth.logout` — Выход → сессия очищается
### Каталог и товары (catalog)
- `catalog.homepage` — Главная → слайдер грузится, товары отображаются
- `catalog.filters` — Фильтры → по категории, цене, материалам работают
- `catalog.product-page` — Страница товара → фото, описание, цена, кнопка "В корзину"
- `catalog.seo` — SEO → title, meta, slug корректные
### Корзина (cart)
- `cart.add` — Добавление товара → счётчик обновляется
- `cart.change-qty` — Изменение количества → пересчёт суммы
- `cart.remove` — Удаление → товар убирается, сумма пересчитывается
### Чекаут (checkout)
- `checkout.address` — Выбор адреса → из сохранённых / новый
- `checkout.delivery` — Выбор доставки → Почта, OZON, Яндекс, 5post
- `checkout.payment` — Выбор оплаты → онлайн / при получении
- `checkout.comment` — Комментарий к заказу → поле работает
- `checkout.create` — Создание заказа → заказ создаётся, статус DRAFT
### Оплата (payment)
- `payment.yookassa` — ЮKassa → редирект на оплату, webhook обрабатывается
- `payment.status` — Статус платежа → обновляется после webhook
### Профиль пользователя (profile)
- `profile.avatar` — Аватар → загрузка, отображение, удаление
- `profile.settings` — Настройки → email, имя, способы входа
- `profile.addresses` — Адреса → добавление, редактирование, удаление, по умолчанию
- `profile.orders` — Заказы → список, детали, статусы
- `profile.messages` — Сообщения по заказу → отправка, получение, read state
- `profile.notifications` — Уведомления → вкл/выкл каналы
- `profile.delete-account` — Удаление аккаунта → данные удаляются
### Админ — Товары (admin-products)
- `admin-products.list` — Список → пагинация, поиск
- `admin-products.create` — Создание → все поля, загрузка фото, публикация
- `admin-products.edit` — Редактирование → изменения сохраняются
- `admin-products.delete` — Удаление → товар удаляется
- `admin-products.images` — Изображения → добавление, сортировка, удаление
### Админ — Категории (admin-categories)
- `admin-categories.crud` — CRUD категорий, сортировка
### Админ — Заказы (admin-orders)
- `admin-orders.list` — Список → фильтрация по статусу, внимание
- `admin-orders.details` — Детали → состав, статус, смена статуса
- `admin-orders.messages` — Сообщения → ответ пользователю
### Админ — Отзывы (admin-reviews)
- `admin-reviews.list` — Список → pending/approved/rejected
- `admin-reviews.moderate` — Модерация → approve/reject
### Админ — Пользователи (admin-users)
- `admin-users.list` — Список → email, дата регистрации
- `admin-users.orders` — Просмотр заказов пользователя
### Админ — Галерея (admin-gallery)
- `admin-gallery.upload` — Загрузка, удаление, использование в слайдере
### Админ — Настройки (admin-settings)
- `admin-settings.notifications` — Уведомления → email, telegram
### Инфо-страницы (info)
- `info.pages` — Доставка, оплата, как заказать, статусы заказов
- `info.legal` — Политика конфиденциальности, условия использования
### SSE / Realtime (sse)
- `sse.notifications` — Уведомления приходят в реальном времени
## Implementation Plan
1. Prisma migration — добавить модель `ChecklistResult`
2. Shared constants — `test-checklist-items.ts`
3. Server API route — GET/PATCH/POST
4. Client page — `AdminTestChecklistPage`
5. Client routing — добавить в `AdminLayoutPage`
6. Register route in `client/src/app/routes/index.tsx`