Приложение для отображения и управления списком транзакций. Построено с использованием 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;
}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 compose up -d# Бэкенд
cd backend
npm install
npm run dev
# Фронтенд
cd frontend
npm install
npm run dev- Качество кода и его организация
- Типизация и использование TypeScript
- Тестовое покрытие
- Производительность
- UX/UI реализация
- Качество GraphQL схемы и резолверов
- Оптимизация запросов и кэширование
- Безопасность и защита от уязвимостей
- Качество реализации авторизации