14 KiB
MyClub E‑shop – Implementační plán
Cíl: přidat volitelný MyClub e‑shop jako samostatný (ale integrovaný) stack – vlastní backend + frontend, napojený na stávající MyClub uživatele a admin, s podporou Stripe plateb, Packeta (Zásilkovna) dopravy a DeepSeek AI podpory. Vše řízené přes
.enva Docker Compose.
1. Architektura a základní principy
-
Samostatný e‑shop stack
eshop-backend– Go/Gin služba, vlastní API prefix (např./api/v1/eshop), sdílí DB a auth s hlavním backendem.eshop-frontend– React/TSX (Chakra UI + ClubThemeContext), vlastní doména/subdoména (např.shop.klub.cz).- V docker-compose jako dva nové servisy, spouštěné jen pokud
ESHOP_ENABLED=true.
-
Sdílené jádro s MyClub
- Sdílená databáze (PostgreSQL) – nové tabulky s prefixem
eshop_. - Sdílený users / role systém (admin/editor/uživatel) – žádné duplikování účtů.
- Admin správa e‑shopu v existujícím
/admin(nové sekce „E‑shop“ / „Produkty“, „Objednávky“, „Nastavení e‑shopu“).
- Sdílená databáze (PostgreSQL) – nové tabulky s prefixem
-
UI/UX
- Světlý + tmavý režim, jednoduché, mobil‑first.
- Barvy z klubového theme (z inicializačního Setupu) – e‑shop z něj dědí, ale může mít drobné odchylky (např. CTA barvy).
-
Bezpečnost
- Žádné ukládání karetních údajů (vše přes Stripe).
- Sdílená JWT/session autentizace mezi doménami (cookies
Domain=.example.cz). - CORS a CSRF nastavené tak, aby podporovaly hlavní web + e‑shop subdoménu.
2. Konfigurace přes .env
2.1 Klíčové flagy
-
ESHOP_ENABLED=true|falsetrue→ Docker Compose spustí i e‑shop backend/frontend, setup přidá e‑shop doménu a nastavení.false→ běží pouze hlavní MyClub (aktuální chování).
-
Domény & URL
FRONTEND_URL=https://www.klub.cz(stávající)API_URL=https://api.klub.cz(stávající)ESHOP_FRONTEND_URL=https://shop.klub.czESHOP_API_URL=https://eshop-api.klub.cznebohttps://api.klub.cz/eshop(dle zvoleného nasazení)
-
Porty pro lokální vývoj
ESHOP_FRONTEND_PORT=3100ESHOP_BACKEND_PORT=8082
2.2 Stripe
STRIPE_SECRET_KEY=sk_live_...STRIPE_PUBLISHABLE_KEY=pk_live_...STRIPE_WEBHOOK_SECRET=whsec_...STRIPE_CURRENCY=CZKSTRIPE_SUCCESS_URL=${ESHOP_FRONTEND_URL}/objednavka/uspechSTRIPE_CANCEL_URL=${ESHOP_FRONTEND_URL}/kosik
2.3 DeepSeek (AI podpora)
DEEPSEEK_ENABLED=true|falseDEEPSEEK_API_KEY=...DEEPSEEK_MODEL=deepseek-chatDEEPSEEK_API_BASE=https://api.deepseek.com
2.4 Packeta / Zásilkovna
PACKETA_API_PASSWORD=...(hlavní API heslo pro REST/XML)PACKETA_WIDGET_API_KEY=...(16‑znakový klíč pro widget)PACKETA_ESHP_NAME=MyClubEshopPACKETA_ENV=production|test(logika: v test režimu umožnit vytvářet zásilky jen v interním módu)
3. Docker Compose a Makefile
3.1 Nové servisy v docker-compose
-
eshop-backend- build:
./eshop/backend - env: sdílí DB proměnné s hlavním backendem (
DB_HOST,DB_USER,DB_PASS,DB_NAME), plusESHOP_*,STRIPE_*,PACKETA_*,DEEPSEEK_*. - port:
${ESHOP_BACKEND_PORT}:8080(interní port 8080 jako u hlavního backendu).
- build:
-
eshop-frontend- build:
./eshop/frontend - env:
ESHOP_API_URL,ESHOP_FRONTEND_URL,NODE_ENV, atd. - port:
${ESHOP_FRONTEND_PORT}:3000.
- build:
3.2 Podmíněné spouštění
- V
Makefileupravit cíle (např.docker-up):- Shell podmínka: pokud
ESHOP_ENABLED=true, použítdocker compose -f docker-compose.yml -f docker-compose.eshop.yml up; jinak jen základnídocker-compose.yml. - Alternativně: jeden compose soubor, ale cíle
docker-upvsdocker-up-with-eshop(flag řízený z Makefile).
- Shell podmínka: pokud
4. Databázový model e‑shopu
Použít GORM modely v novém modulu, např. internal/models/eshop/....
-
Product (
eshop_products)id,slug,name,description_html,short_description,price,currency,vat_rate,active,stock_mode(finite/unlimited),default_image_url,gallery_urls,tags,metadata.
-
ProductCategory (
eshop_product_categories)- hierarchie kategorií pro filtraci (dresy, fan merchandise, permanentky...).
-
ProductVariant (
eshop_product_variants)- velikosti/barvy, vlastní
sku,stock_qty,barcode(volitelně),image_url.
- velikosti/barvy, vlastní
-
Cart / CartItem (
eshop_carts,eshop_cart_items)- vázané na
user_idnebo anonymní session (session_token).
- vázané na
-
Order / OrderItem (
eshop_orders,eshop_order_items)- stav:
new,awaiting_payment,paid,cancelled,refunded,ready_to_ship,shipped,delivered. - vazba na Packeta/Carrier:
shipping_method,packeta_point_id/address_id,tracking_number.
- stav:
-
Payment (
eshop_payments)- Stripe
payment_intent_id,status,amount,currency,refund_status,raw_payload(JSON pro debug, GDPR‑safe).
- Stripe
-
ShippingLabel (
eshop_shipping_labels)- Packeta
packet_id,label_url/ binární uložiště, historie statusů.
- Packeta
-
EshopSettings (
eshop_settings)default_currency,supported_currencies,default_country,shipping_options,terms_url,returns_policy_url,support_email,support_phone, atd.
5. Backend – API a integrace s MyClub
5.1 Struktura backendu
- Nový modul/složka:
internal/controllers/eshop,internal/services/eshop,internal/routes/eshop_routes.go. - Registrace rout v
routes.go, ale oddělený API prefix/api/v1/eshop. - Middleware:
JWTOptionalpro veřejné e‑shop stránky (checkout, košík, historie objednávek pro přihlášené).- Role guardy pro admin API (jen admin/editor s právem e‑shop).
5.2 Veřejné API (zkrácený přehled)
-
Produkty
GET /api/v1/eshop/products– list s filtrem (kategorie, dostupnost, fulltext).GET /api/v1/eshop/products/:slug– detail.
-
Košík
GET /api/v1/eshop/cart– ze session nebo user_id.POST /api/v1/eshop/cart/items– přidání položky.PATCH /api/v1/eshop/cart/items/:id– změna množství/varianty.DELETE /api/v1/eshop/cart/items/:id.
-
Checkout & platby (Stripe)
POST /api/v1/eshop/checkout– vytvoření draft objednávky + PaymentIntent (viz kapitola Stripe).GET /api/v1/eshop/orders/:id– detail objednávky pro daného uživatele.
-
Doprava (Packeta)
GET /api/v1/eshop/shipping/options– dostupné způsoby dopravy.GET /api/v1/eshop/shipping/packeta/widget-config– vracíPACKETA_WIDGET_API_KEYa další volby pro widget.
-
DeepSeek podpora
POST /api/v1/eshop/support/chat/stream– SSE/WebSocket proxy na DeepSeek (viz níže).
5.3 Admin API
-
Produkty & kategorie
- CRUD endpoints pro produkty, varianty a kategorie.
-
Objednávky
- List/filtering podle stavu, data, zákazníka.
- Akce: změna stavu, přidání poznámky, rušení/refund.
-
Nastavení e‑shopu
- Stripe, Packeta, texty emailů a obchodní podmínky.
6. Autentizace a napojení účtů
- Použít existující
userstabulku a JWT/session middleware. - Upravit nastavení cookies tak, aby
Domain=.example.cz→ token platí pro hlavní web ishop.example.cz. - CORS policy: přidat e‑shop frontend origin mezi povolené.
- V e‑shop frontendu používat stejný mechanismus přihlášení (sdílené služby/axios klient nebo lehké proxy).
7. Frontend – veřejný e‑shop (TSX)
7.1 Technologie
- React 18 + TypeScript + Chakra UI, opět využít
ClubThemeContext(stejný design systém jako hlavní frontend). - Routing:
react-router(oddělené entrypointy v rámcieshop/frontend).
7.2 Stránky
- Domovská stránka e‑shopu – výběr kategorií, bestsellery, CTA.
- Katalog produktů (grid, filtry, stránkování).
- Detail produktu – fotogalerie, varianty (velikost/barva), doporučené produkty.
- Košík – přehled položek, úprava množství, mezisoučet.
- Checkout – kroky:
- Fakturační údaje
- Doprava (Packeta widget / jiní dopravci)
- Shrnutí + platba (Stripe)
- Potvrzení objednávky.
- Můj účet → historie objednávek (pro přihlášené MyClub uživatele).
7.3 UX detaily
- Plná responzivita (mobil, tablet, desktop).
- Dark mode připnutý na globální přepínač (stejný jako u hlavního webu).
- Konsistentní komponenty (buttony, formuláře, toasty) s adminem.
8. Frontend – admin část e‑shopu
-
V existujícím admin SPA přidat navigační kategorii „E‑shop“:
- Produkty – CRUD, nahrávání obrázků, varianty.
- Objednávky – tabulka, detail, timeline stavu, link na Packeta štítky.
- Přehledy – dashboard s grafy (tržby/den, počet objednávek, úspěšnost plateb, rozdělení dopravců).
- Nastavení e‑shopu – měna, Stripe, Packeta, email šablony.
-
Využít existující komponenty (tabulky, filtry, grafy) používané v jiných admin modulech.
9. Stripe – platební tok
-
Checkout (frontend)
- Uživatel vyplní adresu, zvolí dopravu a souhlasí s podmínkami.
- Frontend volá
POST /api/v1/eshop/checkouts obsahem košíku a dopravou.
-
Backend
- Zkontroluje ceny/propočítá dopravu.
- Vytvoří Stripe PaymentIntent (
amount,currency,metadatasorder_id). - V DB uloží draft objednávku se stavem
awaiting_payment. - Vrátí
client_secretpro frontend.
-
Frontend
- Použije Stripe Elements /
stripe-jsk potvrzení platby.
- Použije Stripe Elements /
-
Webhook (backend)
- Endpoint např.
/api/v1/eshop/stripe/webhook(mimo auth, chráněnSTRIPE_WEBHOOK_SECRET). - Reaguje na eventy
payment_intent.succeeded,payment_intent.payment_failed,charge.refunded. - Upraví stav objednávky (
paid,cancelled,refunded).
- Endpoint např.
-
Email & Packeta
- Po
paid:- poslat email zákazníkovi + adminovi (použít existující
pkg/email). - příprava vytvoření Packeta zásilky (viz níže).
- poslat email zákazníkovi + adminovi (použít existující
- Po
10. Packeta / Zásilkovna – doprava (✔ hotovo - MVP)
Vychází z eshop/packeta.md.
10.1 Frontend – widget
- Na stránce checkoutu:
- ✔ načíst
<script src="https://widget.packeta.com/v6/www/js/library.js"></script>(lazy load přesuseEffect). - ✔ na výběr způsobu dopravy „Výdejní místo Packeta“ otevřít widget přes
Packeta.Widget.pick(...). - ✔ výsledek (objekt
point) uložit do checkout state a poslat na backend (addressId,name,country, atd.).
- ✔ načíst
10.2 Backend – vytvoření zásilky
-
Po úspěšné platbě (nebo po manuálním potvrzení objednávky):
- ✔ Vytvořit XML payload
createPacket(vizpacketa.md) –PacketaService.CreatePacket. - ✔ Poslat POST na
https://www.zasilkovna.cz/api/rest. - ✔ Uložit
packetIda případně generovat PDF štítek přespacketLabelPdf–PacketaService.GetPacketLabel. - ✔ Endpoint
/api/v1/eshop/shipping/labels/:packet_idpro stažení PDF.
- ✔ Vytvořit XML payload
-
⬜ Pravidelný cron (např. background job v Go):
packetStatus/packetTracking→ aktualizovat stav objednávky.
-
⬜ V adminu zobrazit log posledních stavů, link na stažení štítku.
11. DeepSeek AI – zákaznická podpora
-
Backend endpoint:
POST /api/v1/eshop/support/chat/stream- Auth: volitelně JWT (výhoda – známe uživatele/jazyk, můžeme dotáhnout jeho objednávky).
- Vstup: zprávy konverzace + kontext (parametry e‑shopu, aktuální objednávky atd.).
- Backend zavolá DeepSeek API s modelem
deepseek-chatastream=true. - Přeposílá stream (SSE/WebSocket) na frontend.
-
System prompt uložit v repu jako Markdown (soubor vedle tohoto plánu) –
DeepSeekSupportPrompt.md(vytvořený v tomto kroku). -
AI odpovídá česky, stručně, s možností přepnout do angličtiny, pokud je dotaz v AJ.
12. Emaily a notifikace
- Využít existující emailový systém (SMTP konfigurace už je v MyClub).
- Nové šablony:
- Potvrzení objednávky (CZ, s rekapitulací a odkazem na detail).
- Informace o platbě (zaplaceno/neúspěch).
- Informace o odeslání (včetně Packeta tracking linku).
- Informace o doručení/uzavření.
13. Dvoukrokový Setup
-
Hlavní MyClub Setup (stávající
/setup)- Klubové údaje, barvy, logo, doména.
-
E‑shop Setup (nový krok/route, aktivní jen pokud
ESHOP_ENABLED=true)- URL e‑shopu (
ESHOP_FRONTEND_URL,ESHOP_API_URL– předvyplnit z hlavního URL + subdomény). - Default měna, země, jazyk.
- Základní texty (obchodní podmínky URL, kontakt na podporu).
- Volba povolených dopravců (Packeta on/off, typy).
- URL e‑shopu (
- E‑shop Setup přebírá klubové informace (název, logo, barvy) jako výchozí.
14. Bezpečnost a performance
- Middleware pro rate‑limit u e‑shop API (checkout, platby, podpora chat).
- Sanitizace všech vstupů (hlavně HTML popisy produktů a AI odpovědi – DOMPurify na frontendu, validace na backendu).
- Logování citlivých dat minimalizovat (žádné celé adresy/karty v debug logu).
- Použít existující httpclient/circuitbreaker vrstvy z MyClub pro Packeta a DeepSeek.
15. Fáze implementace
-
Infrastruktura
- Nové .env proměnné, docker-compose.eshop.yml, Makefile logika.
-
DB a backend jádro
- Migrace tabulek
eshop_*, základní GORM modely. - Produkty, košík, objednávky (bez plateb/dopravy).
- Migrace tabulek
-
E‑shop frontend (MVP)
- Katalog, detail, košík, jednoduchý checkout bez Stripe (např. platba převodem jako první krok).
-
Stripe integrace
- PaymentIntent, webhooky, stav objednávek.
-
Packeta integrace
- Widget na checkoutu, backend
createPacket, štítky, cron pro statusy.
- Widget na checkoutu, backend
-
Admin e‑shop modul
- Produkty, objednávky, přehledy.
-
DeepSeek podpora
- Backend proxy + frontend chat widget, ladění promptu.
-
Hardening a testy
- E2E testy checkoutu, zátěžové testy API, bezpečnostní audit.