https://github.com/justhackone/logiclike_test_task_fullstack_2025
https://github.com/justhackone/logiclike_test_task_fullstack_2025
Last synced: 7 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/justhackone/logiclike_test_task_fullstack_2025
- Owner: JusthackOne
- Created: 2025-10-05T17:14:58.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-10-05T20:14:58.000Z (8 months ago)
- Last Synced: 2025-10-05T21:26:48.161Z (8 months ago)
- Language: TypeScript
- Homepage: http://45.9.42.228/
- Size: 74.2 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
*LogicLike_Тестовое задание Fullstack*
http://45.9.42.228/ - проверка ОНЛАЙН. Попросил друзей, чтобы поставили пару голосов. Браузер может жаловаться, что сайт незащищенный. НО ВСЁ ХОРОШО! Не бойтесь.
- Backend: Node.js + TypeScript + Express + PostgreSQL
- Frontend: React + Vite + Tailwind (shadcn‑style UI components)
- Deploy: Docker + docker-compose
**Структура**
- `backend/` — API, миграции, сиды.
- `frontend/` — React SPA.
- `docker-compose.yml` — БД, backend, frontend.
**Запуск через Docker**
- Требования: Docker, docker-compose.
- Команда: `docker compose up --build`
- Откройте: `http://localhost:5173`
- API: `http://localhost:4000/api`
Сервис сам применяет миграции и один раз наполняет БД базовыми идеями (seed-файл пропускается, если таблица не пустая).
**Переменные окружения**
- Backend: см. `backend/.env.example`. По умолчанию в compose:
- `DB_HOST=db`, `DB_PORT=5432`, `DB_USER=app`, `DB_PASSWORD=app`, `DB_NAME=app`, `PORT=4000`.
- Frontend: `VITE_API_BASE_URL` пробрасывается как ARG на этапе сборки образа (см. `frontend/Dockerfile`). В `docker-compose.yml` — `http://backend:4000/api`.
**База данных**
- Таблицы:
- `ideas(id, title, description, vote_count, created_at)`
- `votes(id, idea_id, voter_ip inet, created_at)` с уникальным ограничением `(idea_id, voter_ip)` + индексы по `voter_ip`, `idea_id`.
- Миграции: `backend/src/db/migrations/*.sql` и раннер `backend/src/db/migrate.ts`.
- Seed: `backend/src/seed/seed.ts` — добавляет ~10 идей при пустой таблице `ideas`.
**API**
- `GET /api/ideas` → `{ items: [{ id, title, description, voteCount, hasVoted }], votesUsed, votesLimit }`.
- `POST /api/ideas/:id/vote` → `201` если успешно. Ошибки: `409 { error: "ALREADY_VOTED" }` или `409 { error: "VOTE_LIMIT_REACHED" }`, `404` если идея не найдена.
- `DELETE /api/ideas/:id/vote` → снимает голос, `404` если голоса не было.
IP извлекается из `X-Forwarded-For` (первый адрес) или из `remoteAddress`. Express настроен с `trust proxy`.
**Локальная разработка (без Docker)**
1) PostgreSQL локально: создайте БД `app` и пользователя `app/app`, или используйте `DATABASE_URL`.
2) Backend:
- `cd backend`
- `cp .env.example .env` и поправьте при необходимости
- `npm install`
- `npm run build && npm run migrate && npm run seed`
- `npm run start` (или `npm run dev` для watch)
3) Frontend:
- `cd frontend`
- `npm install`
- `npm run dev` → `http://localhost:5173`
- Убедитесь, что `VITE_API_BASE_URL=http://localhost:4000/api`
**Команды**
- Compose: `docker compose up --build`
- Backend (dev): `npm run dev`
- Backend (prod): `npm run build && npm run start:prod`
- Frontend (dev): `npm run dev`
- Миграции вручную: `npm run migrate`
- Сид: `npm run seed`