saravanakumardb1
0fee7e9ee7
test(platform-service): add products module tests and fix product schema defaults
...
- Added products.test.ts covering CreateProductSchema and UpdateProductSchema
- Added route export smoke test for productRoutes
- Fixed CreateProductSchema packageName default validation (allow empty default)
- Verified: tsc --noEmit clean, 19 test files / 178 tests passing
2026-02-15 14:36:33 -08:00
saravanakumardb1
c0830e3dec
refactor(platform-service): remove BILLING_INTERNAL_KEY guard from server.ts
...
- Billing routes (subscriptions, usage, plans, licenses) now registered directly
- No more X-Internal-Key header check — JWT-based productId auth is sufficient
- BILLING_INTERNAL_KEY removed from config schema and AKV secret resolution
- 166 tests pass, tsc clean
2026-02-15 14:30:30 -08:00
saravanakumardb1
60617ab050
refactor(platform-service): replace PRODUCT_ID with getRequestProductId(req) in all modules
...
- 26 files updated: all repositories accept productId parameter instead of env var
- All route handlers extract productId via getRequestProductId(req) (JWT → header → env fallback)
- Repositories: auth, flags, audit, notifications, licenses, plans, referrals, usage, subscriptions, invitations
- Routes: all above + promos, items, memory, public, ratelimit, stripe
- lib/webhooks.ts: dispatchWebhook accepts optional productId parameter
- Stripe webhook handler uses metadata-based productId (no client JWT available)
- Ratelimit default config uses DEFAULT_PRODUCT_ID at startup
- 166 tests pass, tsc --noEmit clean
2026-02-15 14:29:11 -08:00
saravanakumardb1
8e5c6dc2d6
refactor(platform-service): auth routes + types — add productId to login/register schemas
...
- LoginSchema and RegisterSchema now require productId field
- Login/Register routes use productId from request body (not env var)
- PRODUCT_ID import removed from auth/routes.ts
- Test fixtures updated with productId: 'lysnrai'
2026-02-15 14:18:59 -08:00
saravanakumardb1
8cc70db676
refactor(platform-service): auth/jwt.ts — productId from caller, issuer → 'bytelyst-platform'
...
- createAccessToken() and createRefreshToken() now require productId parameter
- Issuer changed from PRODUCT_ID env var to generic 'bytelyst-platform'
- verifyToken() validates against 'bytelyst-platform' issuer
- auth/routes.ts callers updated to pass productId (still from PRODUCT_ID env var for now)
- Refresh endpoint reads productId from user doc
2026-02-15 14:16:49 -08:00
saravanakumardb1
465d429e09
feat(platform-service): add Fastify onRequest hook to parse JWT → req.jwtPayload
...
- Best-effort JWT parsing on every request (non-blocking for unauthenticated routes)
- Attaches parsed payload to req.jwtPayload for downstream use by getRequestProductId()
- Invalid/expired tokens silently ignored — auth-required routes handle their own validation
2026-02-15 14:15:17 -08:00
saravanakumardb1
365061566a
feat(platform-service): add getRequestProductId() + getRequestProductConfig() helpers
...
- New lib/request-context.ts with product validation against cache
- Priority: JWT payload > X-Product-Id header > env var fallback
- Rejects unknown or disabled products with 400 Bad Request
- Augments FastifyRequest with jwtPayload type declaration
- getRequestProductConfig() for modules needing product-specific values
2026-02-15 14:14:17 -08:00
saravanakumardb1
755c16dbfb
feat(platform-service): add products module (types, repository, cache, routes)
...
- New products container in Cosmos DB (partition key: /id)
- ProductDoc: displayName, licensePrefix, deviceLimits, trialDays, status
- In-memory cache loaded on startup via loadProductCache()
- CRUD routes: GET/POST /products, GET/PUT /products/:id
- Cache refreshed after admin writes (create/update)
- Registered before all other modules in server.ts
2026-02-15 14:13:03 -08:00
e64bba258f
feat(platform-service): allow memory-items to store blob media refs
2026-02-15 03:50:51 -08:00
1011fd85f8
feat(platform-service): restrict blob SAS/list/info to user scope
2026-02-15 03:31:27 -08:00
17c41e8441
feat(platform-service): add memory-items API backed by Cosmos
2026-02-15 03:20:09 -08:00
saravanakumardb1
81999dcbb3
feat(services): wire AKV secret resolution in platform-service and extraction-service startup
2026-02-14 22:18:01 -08:00
saravanakumardb1
11ca4e95e3
docs: Phase 5 update AGENTS.md, package.json, monitoring for consolidated services
2026-02-14 21:54:09 -08:00
saravanakumardb1
29fc8124e4
refactor: merge tracker-service into platform-service
...
Phase 3 of service consolidation (5→2 services).
Moved modules:
- items (16 tests)
- comments (6 tests)
- votes (5 tests)
- public (16 tests) — rate-limited, no auth required
Changes:
- Copied 4 modules from tracker-service
- Added DEFAULT_PRODUCT_ID alias in product-config.ts (Gap 1)
- Created src/lib/auth.ts re-exporting extractAuth from @bytelyst/auth (Gap 2)
- Added @bytelyst/auth and @fastify/rate-limit to package.json (Gap 2)
- Registered itemRoutes, commentRoutes, voteRoutes, publicRoutes in server.ts
- Public routes at top level (no auth scope)
- Removed tracker-service directory
Tests: 158 passing (115 + 43 from tracker = 158) ✅
Build: clean ✅
Service consolidation Phases 1-3 complete:
- growth-service: merged ✅
- billing-service: merged ✅
- tracker-service: merged ✅
Remaining: 2 services (platform-service + extraction-service)
2026-02-14 21:34:21 -08:00
saravanakumardb1
f13c676139
refactor: merge billing-service into platform-service
...
Phase 2 of service consolidation (5→2 services).
Moved modules:
- subscriptions (9 tests)
- usage (7 tests)
- plans (9 tests)
- licenses (7 tests)
- stripe (0 tests — webhook signature verified at runtime)
Changes:
- Copied 5 modules + stripe.ts lib from billing-service
- Added billing env vars to config schema (Stripe, internal key, etc.)
- Scoped billing routes with internal key auth guard (Gap 3)
- When BILLING_INTERNAL_KEY is set, billing routes require x-internal-key header
- When unset, billing routes are open (dev mode)
- Stripe routes always outside scope (own webhook signature check)
- Removed billing-service directory
Tests: 115 passing (83 + 32 from billing = 115) ✅
Build: clean ✅
2026-02-14 21:31:04 -08:00
saravanakumardb1
05008ee04f
refactor: merge growth-service into platform-service
...
Phase 1 of service consolidation (5→2 services).
Moved modules:
- invitations (12 tests)
- referrals (9 tests)
- promos (7 tests)
Changes:
- Copied 3 modules + webhooks.ts lib from growth-service
- Added stripe dep to platform-service package.json
- Added webhook env vars to config schema
- Registered invitationRoutes, referralRoutes, promoRoutes in server.ts
- Removed growth-service directory
Tests: 83 passing (was 55 + 28 from growth = 83) ✅
Build: clean ✅
2026-02-14 21:27:44 -08:00
95b45a9fd3
fix(cosmos): init containers on startup for local compose
2026-02-14 20:57:17 -08:00
125eb03745
feat(blob): add @bytelyst/blob shared package
2026-02-14 15:53:33 -08:00
saravanakumardb1
63c08dbb0a
refactor(services): integrate @bytelyst/fastify-core into all 4 services
...
Replaced duplicated server setup code with createServiceApp() factory:
- platform-service: 91 → 39 lines
- billing-service: 105 → 51 lines (keeps service-specific internal key auth)
- growth-service: 83 → 33 lines
- tracker-service: 88 → 36 lines
Enhanced fastify-core with optional Swagger + Prometheus metrics support.
Total reduction: ~208 lines of duplicated boilerplate eliminated.
All 246 tests pass.
2026-02-12 22:53:22 -08:00
saravanakumardb1
90b9cf93d8
fix(common): configure ESLint 9 and fix lint issues
...
- Added @eslint/js dependency
- Updated eslint.config.js for ESLint 9 compatibility
- Added required globals (crypto, localStorage, React, etc.)
- Fixed unused imports and variables
- Disabled sort-imports temporarily
- Formatted all files with Prettier
2026-02-12 16:37:30 -08:00
saravanakumardb1
86a56339ab
fix: replace Math.random() IDs with crypto.randomUUID() across all services
...
- billing-service: licenses, subscriptions (pay_, lic_)
- growth-service: invitations, referrals (inv_, ref_)
- platform-service: auth, audit (usr_, aud_)
- tracker-service: items, comments, votes, public (trk_, cmt_, vote_)
- Add votes.test.ts — closes the only missing module test
2026-02-12 13:03:09 -08:00
saravanakumardb1
4ae7a9d023
refactor(services): rewire lib/ to @bytelyst/* packages + add docker-compose
...
Rewired all 4 services:
- lib/errors.ts → re-exports from @bytelyst/errors
- lib/cosmos.ts → re-exports from @bytelyst/cosmos
- lib/product-config.ts → uses loadProductIdentity()/getProductId() from @bytelyst/config
- lib/config.ts → kept self-contained (zod v3/v4 type mismatch with loadConfig)
Added workspace deps (@bytelyst/errors, @bytelyst/cosmos, @bytelyst/config) to all 4 services.
Added docker-compose.yml with Loki, Grafana, Traefik, and all 4 services.
Added .env.example with required env vars.
Added passWithNoTests to vitest.config.ts.
Pinned root zod to ^3.24.0 to match service zod versions.
All 12 projects build. 175 tests passing.
2026-02-12 11:49:42 -08:00
saravanakumardb1
e1ab956ac3
feat(services): add platform-service (auth, audit, flags, notifications, blob)
...
- Copied as-is from learning_voice_ai_agent/services/platform-service
- 55 tests passing (vitest)
- Fastify 5 + Cosmos DB + jose + bcryptjs + Zod
- Modules: auth, audit, flags, notifications, blob, ratelimit
- Port 4003
2026-02-12 11:39:00 -08:00