Skip to content

Wellysa API

Mikroserwis API zastępujący Firebase Functions. Jednolity backend dla serwisów korzystających z Firebase Authentication, obsługujący dwa projekty Firebase (ORAP i ORAM) w jednej instancji.

Stack

  • Hono 4.12+ + Zod OpenAPI + Scalar — lekki framework z walidacją i interaktywną dokumentacją
  • Firebase Admin SDK 13.7+ — autoryzacja i Firestore (multi-project)
  • Stripe 22.1+ — płatności i subskrypcje
  • Resend 6.9+ — email transakcyjny
  • TypeScript 5.9+ strict, ESNext, ESM
  • Bun — runtime + package manager
  • Prometheus — metryki aplikacji
  • reCAPTCHA — ochrona formularzy
  • OpenCV OCR — integracja rozpoznawania tekstu

Szybki start

bash
# Instalacja
bun install

# Konfiguracja
cp .env.example .env
# Uzupełnij FIREBASE_ORAP_SERVICE_ACCOUNT, FIREBASE_ORAM_SERVICE_ACCOUNT i pozostałe zmienne

# Uruchomienie (dev)
bun dev

# Type-check
bun run build

# Produkcja
bun start

# Seed algorytmów
bun run seed:score2
bun run seed:wcrf

Serwer nasłuchuje domyślnie na http://localhost:3000.

Zmienne środowiskowe

ZmiennaDomyślnaOpis
PORT3000Port serwera
NODE_ENVdevelopmentproduction — ukrywa /docs i /openapi.json
FIREBASE_ORAP_SERVICE_ACCOUNTJSON service account dla projektu orap-dev
FIREBASE_ORAM_SERVICE_ACCOUNTJSON service account dla projektu oram-dev
TEST_COVERAGE_PERCENT0Metryka pokrycia testami (Prometheus)
README_TOKENToken chroniący endpoint /readme (puste = publiczny)
RESEND_API_KEYKlucz API Resend (email transakcyjny)
STRIPE_SECRET_KEYKlucz API Stripe
RECAPTCHA_SECRET_KEYSecret key Google reCAPTCHA

Klucze Firebase muszą być w formacie jednoliniowego JSON (bez newlines).

Endpointy

System (bez wersji, bez auth)

MetodaŚcieżkaOpis
GET/healthHealth check
GET/metricsMetryki Prometheus
GET/readmeDokumentacja Markdown (opcjonalnie chroniona tokenem)

Tools (bez wersji)

MetodaŚcieżkaOpis
POST/tools/auth/firebaseFirebase ID token (tylko dev)
GET/tools/synevo-servicesLista usług Synevo

Auth (/v1/auth)

MetodaŚcieżkaOpis
POST/v1/auth/loginLogowanie (email + hasło)
POST/v1/auth/verifyWeryfikacja sesji
POST/v1/auth/logoutWylogowanie
PUT/v1/auth/password/changeZmiana hasła (auth required)
POST/v1/auth/password/resetŻądanie resetu hasła
POST/v1/auth/password/reset/validateWalidacja tokenu resetu
POST/v1/auth/password/reset/confirmPotwierdzenie resetu hasła
POST/v1/auth/password/reset/code-requestŻądanie kodu weryfikacyjnego (email/SMS)
POST/v1/auth/password/reset/code-confirmPotwierdzenie kodu weryfikacyjnego

Codes (/v1/codes, auth required)

MetodaŚcieżkaOpis
POST/v1/codesTworzenie kodu
GET/v1/codes/{id}/statusStatus kodu
PUT/v1/codes/{id}Aktualizacja kodu
DELETE/v1/codes/{id}Usunięcie kodu

Products (/v1/products) (w trakcie implementacji — zweryfikuj z zespołem)

MetodaŚcieżkaOpis
GET/v1/productsLista produktów
GET/v1/products/{id}Szczegóły produktu
GET/v1/products/{id}/stripeStripe IDs produktu (auth)
GET/v1/products/{id}/collectionPointsPunkty pobrań produktu (auth)

Query param ?lang=pl (domyślny), ?lang=en, ?lang=all.

Users (/v1/users) (w trakcie implementacji — zweryfikuj z zespołem)

MetodaŚcieżkaOpis
GET/v1/users/meDane zalogowanego użytkownika
PUT/v1/users/meAktualizacja własnego profilu
GET/v1/usersLista użytkowników (paginacja, search, sort)
POST/v1/usersTworzenie użytkownika
GET/v1/users/{uid}Szczegóły użytkownika
PUT/v1/users/{uid}Aktualizacja użytkownika
DELETE/v1/users/{uid}Usunięcie użytkownika
POST/v1/users/{uid}/reset-passwordReset hasła użytkownika CMS
POST/v1/users/{uid}/reset-accountReset konta klienta

Collection Points (/v1/collection-points) (w trakcie implementacji — zweryfikuj z zespołem)

MetodaŚcieżkaOpis
GET/v1/collection-pointsLista punktów pobrań
GET/v1/collection-points/{id}Szczegóły punktu pobrań
POST/v1/collection-pointsTworzenie punktu pobrań
PATCH/v1/collection-points/{id}Aktualizacja punktu pobrań
DELETE/v1/collection-points/{id}Usunięcie punktu pobrań
GET/v1/collection-points/companiesLista firm
POST/v1/collection-points/companiesTworzenie firmy
PATCH/v1/collection-points/companies/{id}Aktualizacja firmy
DELETE/v1/collection-points/companies/{id}Usunięcie firmy
POST/v1/collection-points/companies/replaceZamiana firmy (migracja punktów)

Algorithms (/v1/algorithms) (w trakcie implementacji — zweryfikuj z zespołem)

MetodaŚcieżkaOpis
POST/v1/algorithms/wcrfKalkulacja WCRF lifestyle score
POST/v1/algorithms/score2Kalkulacja SCORE2 ryzyka sercowo-naczyniowego

Seeding dostępny przez bun run seed:wcrf i bun run seed:score2.

Dokumentacja API

W trybie development:

  • Interaktywna dokumentacja: http://localhost:3000/docs (Scalar)
  • OpenAPI 3.1 spec: http://localhost:3000/openapi.json

W NODE_ENV=production oba endpointy są wyłączone (404).

Cachowanie

Mechanizm in-memory cache (TTL = 1 godzina) dla optymalizacji zapytań Firestore. Cache przechowuje dane przed transformacją językową — jeden wpis obsługuje wszystkie warianty lang.

Autoryzacja

Firebase Admin SDK z obsługą dwóch projektów:

  • ORAP (orap-dev) — produkty, Firestore
  • ORAM (oram-dev) — dostępny dla auth

Middleware weryfikuje token w kolejności:

  1. Jeśli header X-Firebase-Project ustawiony → weryfikuje tylko tym projektem
  2. Bez hinta → próbuje ORAP, potem ORAM (fallback)

Inicjalizacja Firebase jest lazy — serwer startuje bez credentials (publiczne endpointy działają).

System uprawnień

Role-based access control (RBAC) przez middleware require-role. Cache permission checks: 5 min. Dostępne role i uprawnienia definiowane w src/lib/permissions.ts.

Struktura projektu

src/
├── index.ts                 # Entry point (Bun.serve)
├── app.ts                   # Route mounting, CORS, OpenAPI, Scalar
├── lib/
│   ├── firebase.ts          # Firebase Admin SDK (lazy, multi-project)
│   ├── cache.ts             # In-memory cache (MemoryCache<T>)
│   ├── permissions.ts       # System uprawnień (role → permissions)
│   ├── email.ts             # Resend integration
│   ├── stripe.ts            # Stripe integration
│   ├── recaptcha.ts         # reCAPTCHA verification
│   ├── prometheus.ts        # Metryki Prometheus
│   ├── notifications.ts     # Push notifications
│   └── password-reset-*.ts  # Password reset flow (token/code stores)
├── middleware/
│   ├── firebase-auth.ts     # Bearer token verification
│   ├── optional-auth.ts     # Optional authentication
│   ├── require-role.ts      # Role/type check (cache 5 min)
│   └── prometheus.ts        # Metrics middleware
├── routes/
│   ├── system/              # /health, /metrics, /readme
│   ├── tools/               # /tools/synevo-services
│   ├── dev/                 # /tools/auth/firebase (dev only)
│   └── v1/
│       ├── auth/            # /v1/auth/* (login, verify, logout, password)
│       └── codes/           # /v1/codes/* (CRUD kodów)
├── integrations/
│   └── opencv-ocr.ts        # OpenCV OCR integration
└── scripts/
    ├── seed-score2.ts       # Seed algorytmu SCORE2
    ├── seed-wcrf.ts         # Seed algorytmu WCRF
    └── set-password.ts      # Narzędzie do ustawiania haseł

Docker

bash
docker build -t wellysa-api .
docker run -p 3000:3000 --env-file .env wellysa-api

Multi-stage build na oven/bun:1 — minimalistyczny obraz produkcyjny (frozen lockfile + production dependencies only).

Deploy (Railway)

Wymagane zmienne na Railway:

  • NODE_ENV=production
  • FIREBASE_ORAP_SERVICE_ACCOUNT i FIREBASE_ORAM_SERVICE_ACCOUNT
  • RESEND_API_KEY, STRIPE_SECRET_KEY, RECAPTCHA_SECRET_KEY
  • PORT ustawiany automatycznie przez Railway

Development Scripts

bash
bun dev              # Hot-reload development server
bun run build        # TypeScript type-check (no emit)
bun test             # Run test suite
bun run seed:score2  # Seed SCORE2 algorithm data
bun run seed:wcrf    # Seed WCRF algorithm data

Status

Aktywny development. Core features (auth, system endpoints, codes) zaimplementowane. Products, Users, Collection Points, Algorithms — w trakcie migracji z Firebase Functions (zweryfikuj aktualny stan z zespołem).

Wellysa Consigliere — internal use only.