Тестовое задание Frontend разработчика
Описание
Приложение для отображения и управления списком транзакций. Построено с использованием React, TypeScript, GraphQL и современных практик разработки.
Структура проекта
.
├── frontend/ # React приложение
└── backend/ # GraphQL сервер
Технологии
Фронтенд
- React 18
- TypeScript
- Vite
- ESLint + Prettier
- Jest + React Testing Library
- CSS Modules
- Apollo Client
- React Query
- JWT авторизация
Бэкенд
- Node.js
- TypeScript
- Apollo Server
- GraphQL
- Jest
- Prisma (ORM)
- JWT авторизация
- bcrypt для хеширования паролей
Функциональность
Бэкенд
- GraphQL API с поддержкой:
- Запросов (Queries):
- Получение списка транзакций с пагинацией и фильтрацией
- Получение детальной информации о транзакции
- Получение информации о текущем пользователе
- Мутаций (Mutations):
- Создание новой транзакции
- Обновление статуса транзакции
- Регистрация пользователя
- Авторизация пользователя
- Запросов (Queries):
- JWT авторизация:
- Генерация JWT токена при успешной авторизации
- Валидация JWT токена для защищенных эндпоинтов
- Рефреш токен для обновления JWT
- Валидация входных данных
- Обработка ошибок
Фронтенд
- Страницы авторизации и регистрации
- Защищенные роуты
- Хранение JWT токена в localStorage
- Автоматическое обновление токена
- Таблица транзакций с возможностью:
- Фильтрации по дате, типу и статусу
- Сортировки по любому столбцу
- Пагинации (10 записей на странице)
- Добавление новых транзакций через модальное окно
- Кэширование запросов
- Обработка ошибок и состояний загрузки
Модели данных
Пользователь
interface User { id: string; email: string; name: string; createdAt: string; updatedAt: string; }
Транзакция
interface Transaction { id: string; date: string; type: 'income' | 'expense'; amount: number; status: 'completed' | 'pending' | 'failed'; description: string; userId: string; createdAt: string; updatedAt: string; }
GraphQL схема
type User { id: ID! email: String! name: String! createdAt: String! updatedAt: String! } type Transaction { id: ID! date: String! type: TransactionType! amount: Float! status: TransactionStatus! description: String! userId: ID! createdAt: String! updatedAt: String! } type AuthPayload { token: String! refreshToken: String! user: User! } enum TransactionType { INCOME EXPENSE } enum TransactionStatus { COMPLETED PENDING FAILED } input RegisterInput { email: String! password: String! name: String! } input LoginInput { email: String! password: String! } type Query { transactions( page: Int! limit: Int! filters: TransactionFilters ): TransactionConnection! transaction(id: ID!): Transaction! me: User! } type Mutation { register(input: RegisterInput!): AuthPayload! login(input: LoginInput!): AuthPayload! refreshToken(token: String!): AuthPayload! createTransaction(input: CreateTransactionInput!): Transaction! updateTransactionStatus( id: ID! status: TransactionStatus! ): Transaction! }
Запуск проекта
Через Docker
Локально
# Бэкенд cd backend npm install npm run dev # Фронтенд cd frontend npm install npm run dev
Критерии оценки
- Качество кода и его организация
- Типизация и использование TypeScript
- Тестовое покрытие
- Производительность
- UX/UI реализация
- Качество GraphQL схемы и резолверов
- Оптимизация запросов и кэширование
- Безопасность и защита от уязвимостей
- Качество реализации авторизации