- TypeScript 98.8%
- JavaScript 1.1%
| be | ||
| data | ||
| fe | ||
| .env.example | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| docker-compose.yml | ||
| README.md | ||
MASOX eshop
B2C eshop pre mäsokombinát MASOX. Monorepo s oddeleným backendom (be/) a frontendom (fe/) postavenými na Next.js 14, SQLite databázou a behom v Dockeri.
Zadávateľ: Peter Kramárik, Wolkrova 31 Bratislava. Plátca DPH, B2C, kuriérske doručenie, pay-by-square QR platba.
Quickstart
git clone <repo-url> masox-eshop
cd masox-eshop
docker compose up --build
Po nábehu:
| Služba | URL |
|---|---|
| Frontend | http://localhost:3000 |
| Backend | http://localhost:3001/api |
| Health | http://localhost:3001/api/health |
Pri prvom behu sa stiahnu image-y, nainštalujú závislosti, vygeneruje sa Prisma client a aplikujú sa všetky migrácie. Pri ďalších behoch je štart rýchly.
Demo dáta
Pri prvom docker compose up (keď ./data/masox.db ešte neexistuje) sa
po prisma migrate deploy automaticky spustí aj npm run seed, takže QA aj
dev majú okamžite naplnené testovacie dáta. Pri ďalších štartoch sa seed
preskočí (DB súbor už existuje).
Re-seed (alebo manuálne spustenie):
docker compose exec be npm run seed
Reset DB do čistého stavu vrátane re-seedu (rýchla cesta cez prisma migrate):
docker compose exec be npm run migrate:reset
# alebo úplne natvrdo (zmaže ./data/masox.db, ďalší `up` ho vytvorí + seedne):
docker compose down
rm -f data/masox.db
docker compose up
Seed je idempotentný — opakované spustenie nezduplikuje záznamy
(upsert podľa slug / email / stable UUID).
Prihlasovacie údaje vytvorené seedom (len dev/QA, žiadne reálne osobné údaje):
| Rola | Heslo | |
|---|---|---|
| customer | demo@masox.sk |
demo1234 |
| admin | admin@masox.sk |
admin1234 |
Obsah seedu: 5 kategórií (Bravčové, Hovädzie, Hydina, Údeniny a klobásy,
Špeciality), 30 produktov mix unit ∈ {piece, kg}, 7 aktívnych akcií
(percent + fixed, per-produkt aj per-kategória), 4 historické objednávky
pre demo@masox.sk (pending, paid, shipped, cancelled) a 30
placeholder SVG obrázkov v fe/public/products/.
Štruktúra
.
├── be/ # Backend — Next.js API only, Prisma + SQLite
│ ├── app/api/ # API routes (health, …)
│ ├── lib/db.ts # Prisma client singleton
│ ├── prisma/ # schema.prisma, migrácie, seed
│ ├── .env.example
│ └── Dockerfile
├── fe/ # Frontend — Next.js (App Router) + Tailwind
│ ├── src/app/ # App Router stránky
│ ├── src/components/ # brand + UI primitívy
│ ├── tailwind.config.ts
│ └── Dockerfile
├── data/ # SQLite súbor (./data/masox.db) — bind mount, persistuje
├── docker-compose.yml
├── .env.example
├── .gitignore
├── CONTRIBUTING.md
└── README.md
Stack
| Vrstva | Voľba |
|---|---|
| Backend | Next.js 14 (App Router), TypeScript strict |
| Frontend | Next.js 14 (App Router), Tailwind 3, Inter |
| Databáza | SQLite (Prisma 5 driver) |
| Migrácie | prisma migrate deploy z prisma/migrations/ |
| Beh | Docker Compose, dva kontajnery, SQLite na bind mounte |
| Platba | pay-by-square QR (BE-6), overenie admin manuálne |
| Doručenie | kuriér |
Konfigurácia
V koreňovom adresári skopíruj .env.example na .env (alebo nech) — defaulty stačia. Per-app premenné sú v be/.env.example a fe/.env.example. Žiadne URL/porty nie sú hardkódované v kóde.
| Premenná | Default | Význam |
|---|---|---|
BE_PORT |
3001 |
Host port pre BE |
FE_PORT |
3000 |
Host port pre FE |
NEXT_PUBLIC_BE_URL |
http://localhost:3001 |
URL BE v prehliadači (client-side fetch) |
BE_INTERNAL_URL |
http://be:3001 |
URL BE vo vnútri docker siete (server-side) |
DATABASE_URL |
file:/data/masox.db |
SQLite súbor cez bind mount |
SEED_ADMIN_PASSWORD |
change-me |
Heslo seed-nutého admina |
PAYMENT_IBAN |
DEV placeholder IBAN | IBAN pre pay-by-square QR (BE-6). Prod musí prepísať vlastným IBAN cez .env — nikdy necommitnúť. |
PAYMENT_RECIPIENT_NAME |
MASOX s.r.o. |
Príjemca v QR. V produkcii prepíš podľa skutočnej firmy. |
PAYMENT_SS |
(prázdne) | Voliteľný špecifický symbol pre QR. |
Branching a PR
mainje chránený — žiadne priame commit-y, len cez Merge Request / Pull Request.- Feature práca cez vetvu
feature/<issue-id>-<slug>(napr.feature/pk-19-checkout-qr). - 1 sub-issue = 1 vetva = 1 MR/PR. Po odsúhlasení tech-lead-om sa MR mergne do
main. - Detaily konvencií viď
CONTRIBUTING.md.
Backup SQLite
Bind mount ./data/masox.db je obyčajný súbor na hoste. Záloha:
docker compose stop be # voliteľné, kvôli konzistentnosti
cp data/masox.db data/masox.db.bak # alebo presunúť do iného úložiska
docker compose start be
Restore: prepíš data/masox.db zálohou pri zastavenom BE kontajneri.
Užitočné príkazy
# spustenie
docker compose up --build
# spustenie na pozadí
docker compose up -d
# logy konkrétnej služby
docker compose logs -f be
docker compose logs -f fe
# zastavenie
docker compose down
# vytvorenie novej migrácie (BE-2 a vyššie)
docker compose exec be npx prisma migrate dev --name <nazov>
# spustenie seedu
docker compose exec be npm run seed
Sub-issues a referencie
Master issue: MASOX eshop — masokombinát eshop (Next.js BE+FE, SQLite, Docker).
Sub-issues sú trasované v Multica workspace MASOX eshop. Každá nová sub-issue ide cez vlastnú feature branch + MR.