Hệ thống timelapse construction monitoring.
/Users/kingkong/Documents/code/timelaspe-2--registry https://registry.npmjs.org/ khi cài package từ public npmconstruction-timelapse/
├── apps/
│ ├── api-server/ # NestJS — API backend
│ ├── web-dashboard/ # Next.js 14 — Dashboard UI
│ ├── worker/ # (stub)
│ └── device-agent/ # Python — Pi agent (chưa implement)
├── packages/
│ ├── shared-types/ # Shared TypeScript types/enums
│ └── config/ # tsconfig.base
└── docs/
├── api/ # (trống)
└── firmware/ # (trống)
apps/* trong workspaces — device-agent là PythonWorkspace config đúng:
"workspaces": ["apps/api-server", "apps/web-dashboard", "apps/worker", "packages/*"]
@shared-types KHÔNG hợp lệ — đổi thành @shared/types ở mọi nơi (package.json + tsconfig.json)
Luôn cd vào workspace trước khi bun add
Chạy dev: cd apps/api-server && bun run dev
Build: cd apps/api-server && bun run build ✅
Auth module (src/modules/auth/):
auth.module.ts, auth.controller.ts, auth.service.ts — stub endpointsstrategies/jwt.strategy.ts, strategies/google.strategy.ts — OAuth stubsDevices module (src/modules/devices/):
devices.controller.ts — 4 endpoints:
POST /v1/devices/:deviceId/heartbeat — X-API-Key authGET /v1/devices — listGET /v1/devices/:id — detailGET /v1/devices/:id/heartbeats — historydevices.service.ts — heartbeat logic + API key verifydevices.repository.ts — Drizzle queriesdto/heartbeat.dto.ts — class-validator DTOCommon guards/decorators (src/common/):
guards/api-key.guard.ts — X-API-Key header guarddecorators/api-key.decorator.ts — @ApiKey() decoratorCác module stub (đều rỗng, chỉ để compile):
modules/orgs/, modules/projects/, modules/captures/,
modules/videos/, modules/alerts/, realtime/Chạy dev: cd apps/web-dashboard && bun run dev
Build: cd apps/web-dashboard && bun run build ✅
pages/index.tsx — Dashboard home (stats cards + recent devices)pages/devices/index.tsx — Device listpages/devices/[id].tsx — Device detailcomponents/StatsCard.tsx, DeviceCard.tsxhooks/useDashboardStats.ts, useDevices.tsFile: apps/api-server/src/db/schema.ts
devices, deviceHeartbeats) nhưng khi truy vấn phải dùng devices, deviceHeartbeats đúng tên export@shared-types → đổi package name thành @shared/typesdevice-agent (Python) trong npm workspaces → loại khỏi workspacesnpm install không hoạt động → dùng bun install --registry https://registry.npmjs.org/bun add với nexus registry → luôn thêm --registry https://registry.npmjs.org/db không export được → import từ database.module.ts riêngexperimentalDecorators thiếu → thêm vào packages/config/tsconfig.node.jsonrootDir conflict → bỏ rootDir khỏi tsconfig base# Backend
cd apps/api-server && bun run dev # http://localhost:3001
# Dashboard
cd apps/web-dashboard && bun run dev # http://localhost:3000
# API test (heartbeat stub)
curl -X POST http://localhost:3001/v1/devices/test-device-1/heartbeat \
-H "Content-Type: application/json" \
-H "X-API-Key: dev-key-123" \
-d '{"deviceId":"test-device-1","apiKey":"dev-key-123","status":"online","storageFreeGb":50,"capturesToday":12,"firmwareVersion":"1.0.0"}'