feat: Добавлена базовая структура приложения Home Service с бэкендом на NestJS и фронтендом на Next.js для управления событиями.

This commit is contained in:
2025-12-06 10:50:50 +03:00
parent 850c9d2a9e
commit 07c1285bb9
50 changed files with 22542 additions and 0 deletions

245
README.md
View File

@@ -1,2 +1,247 @@
# home-service
Современный монорепозиторий для сервиса домашней автоматизации с бэкендом и админ-панелью.
## 🚀 Стек технологий
**Инфраструктура:**
- Turborepo - система сборки монорепозитория
- pnpm Workspaces - управление зависимостями
**Backend:**
- NestJS 10
- PGLite (встроенная PostgreSQL БД)
- Drizzle ORM
- Zod для валидации
- date-fns для работы с датами
**Admin:**
- Next.js 16 (App Router)
- React 19
- TailwindCSS 4
- TypeScript
## 📁 Структура проекта
```
home-service/
├── backend/ # NestJS API (@home-service/backend)
│ ├── src/
│ │ ├── database/ # Схема БД и модуль
│ │ ├── events/ # Модуль событий
│ │ ├── utils/ # Утилиты для дат
│ │ └── pipes/ # Zod validation pipe
│ ├── migrations/ # Миграции БД
│ └── data/ # База данных PGLite
├── admin/ # Next.js админка (@home-service/admin)
│ └── src/
│ ├── app/ # Страницы
│ ├── components/ # React компоненты
│ └── lib/ # API клиент
├── turbo.json # Конфигурация Turborepo
├── pnpm-workspace.yaml # Конфигурация pnpm workspaces
└── package.json # Корневой package.json
```
## 🎯 Типы событий
База данных поддерживает три типа событий. Тип определяется автоматически по заполненным полям:
1. **recurring** - Обычное повторяющееся событие
- Поля: `month`, `day`
- Пример: Новый год, 8 марта
2. **anniversary** - Годовщина с отслеживанием времени
- Поля: `month`, `day`, `startYear`
- Пример: день рождения, свадьба
3. **duration** - Продолжительное событие
- Поля: `month`, `day`, `startYear`, `endMonth`, `endDay`, `endYear`
- Пример: отпуск, командировка
## ⚡ Быстрый старт
### Требования
- Node.js 20+
- pnpm 9+
### Установка
```bash
# Установить pnpm глобально (если еще не установлен)
npm install -g pnpm
# Установить все зависимости для всех пакетов
pnpm install
```
### Разработка
```bash
# Запустить все приложения в режиме разработки
pnpm dev
# Запустить только backend
pnpm --filter @home-service/backend dev
# Запустить только admin
pnpm --filter @home-service/admin dev
```
**Адреса:**
- Backend API: `http://localhost:3000`
- Admin панель: `http://localhost:3001`
### Сборка
```bash
# Собрать все приложения (с кешированием через Turborepo)
pnpm build
# Собрать только backend
pnpm --filter @home-service/backend build
# Собрать только admin
pnpm --filter @home-service/admin build
```
### Другие команды
```bash
# Линтинг всех пакетов
pnpm lint
# Форматирование (для backend с Biome)
pnpm format
# Тестирование
pnpm test
# Очистка всех node_modules и кеша
pnpm clean
```
## API Endpoints
### GET /countdown
Главный endpoint для виджета Glance. Возвращает все события с расчетами.
**Ответ:**
```json
{
"events": [
{
"id": "uuid",
"type": "recurring",
"emoji": "🎄",
"name": "Новый год",
"date": "2026-01-01",
"display": "365д 5ч 36м",
"days": 365,
"hours": 5,
"minutes": 36
}
],
"current": {
"year": 2025,
"month": 11,
"day": 29
},
"months": [...],
"timelineGrid": [...]
}
```
### GET /api/events
Получить все события
### POST /api/events
Создать новое событие
**Body:**
```json
{
"title": "День рождения",
"emoji": "🎂",
"month": 6,
"day": 15,
"startYear": 1990
}
```
### DELETE /api/events/:id
Удалить событие
## Конфигурация
### Backend (.env)
```
PORT=3000
CORS_ORIGIN=http://localhost:3001
DATABASE_PATH=./data/events.db
```
### Admin (.env.local)
```
NEXT_PUBLIC_API_URL=http://localhost:3000
```
## Миграция данных
Для импорта событий из старого Python бэкенда можно использовать API:
```bash
# Пример импорта события
curl -X POST http://localhost:3000/api/events \
-H "Content-Type: application/json" \
-d '{"title":"Новый год","emoji":"🎄","month":1,"day":1}'
```
## 🚢 Production
### Все приложения
```bash
pnpm build
pnpm --filter @home-service/backend start:prod
pnpm --filter @home-service/admin start
```
### Backend отдельно
```bash
pnpm --filter @home-service/backend build
pnpm --filter @home-service/backend start:prod
```
### Admin отдельно
```bash
pnpm --filter @home-service/admin build
pnpm --filter @home-service/admin start
```
## 🛠️ Разработка
### Создание миграции
```bash
pnpm --filter @home-service/backend exec drizzle-kit generate
```
### Применение миграций
Миграции применяются автоматически при старте приложения.
### Работа с Turborepo
**Кеширование:**
Turborepo автоматически кеширует результаты сборок. При повторном запуске `pnpm build` без изменений файлов, сборка завершится мгновенно.
**Очистка кеша:**
```bash
rm -rf .turbo
# или
pnpm clean
```
## Лицензия
MIT