## Database Migrations (18 new) - Migrate all primary keys from SERIAL to UUID - Add soft delete (deleted_at) to all 19 entities - Add missing indexes for performance optimization - Add CHECK constraints for data validation - Add user audit fields (last_login_at, timezone, locale) - Add weather station location fields (latitude, longitude, elevation) - Add foreign key relationships (CameraDevice→Device, ValidatedEvent→WeatherStation) - Prepare private key encryption fields ## Backend Entity Updates - All entities updated with UUID primary keys - Added @DeleteDateColumn for soft delete support - Updated relations and foreign key types ## Backend Service/Controller Updates - Changed ID parameters from number to string (UUID) - Removed ParseIntPipe from controllers - Updated TypeORM queries for string IDs ## Frontend Updates - Updated all service interfaces to use string IDs - Fixed CameraDevice.location as JSONB object - Updated weather.ts with new fields (elevation, timezone) - Added Supabase integration hooks and lib - Fixed chart components for new data structure ## Cleanup - Removed deprecated .claude/agents configuration files 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Meteor Web Backend
A NestJS-based backend service for the Meteor application with user authentication.
Features
- User registration with email/password
- Password hashing using bcrypt
- PostgreSQL database with TypeORM
- Database migrations
- Input validation
- Transaction support
- Comprehensive unit and integration tests
Setup
Prerequisites
- Node.js (v18 or higher)
- PostgreSQL database
- npm or yarn
Installation
npm install
Environment Variables
Create a .env file based on .env.example:
DATABASE_URL=postgresql://user:password@localhost:5432/meteor_dev
BCRYPT_SALT_ROUNDS=10
Database Setup
Run migrations to set up the database schema:
npm run migrate:up
API Endpoints
POST /api/v1/auth/register-email
Register a new user with email and password.
Request Body:
{
"email": "user@example.com",
"password": "Password123",
"displayName": "John Doe"
}
Response:
{
"message": "User registered successfully",
"userId": "uuid-string"
}
Validation Rules:
- Email must be a valid email format
- Password must be at least 8 characters long
- Password must contain at least one lowercase letter, one uppercase letter, and one number
- Display name is required
Error Responses:
400 Bad Request- Invalid input data409 Conflict- Email already registered500 Internal Server Error- Server error
Running the Application
Development
npm run start:dev
Production
npm run build
npm run start:prod
Testing
Unit Tests
npm test
Integration Tests
npm run test:e2e
Test Coverage
npm run test:cov
Database Migrations
Create New Migration
npm run migrate:create migration-name
Run Migrations
npm run migrate:up
Rollback Migrations
npm run migrate:down
Project Structure
src/
├── auth/ # Authentication module
│ ├── dto/ # Data transfer objects
│ ├── auth.controller.ts
│ ├── auth.service.ts
│ └── auth.module.ts
├── entities/ # TypeORM entities
│ ├── user-profile.entity.ts
│ └── user-identity.entity.ts
├── app.module.ts # Main application module
└── main.ts # Application entry point
migrations/ # Database migrations
test/ # Integration tests
Database Schema
user_profiles
id(UUID, Primary Key)display_name(VARCHAR, nullable)avatar_url(TEXT, nullable)created_at(TIMESTAMP)updated_at(TIMESTAMP)
user_identities
id(UUID, Primary Key)user_profile_id(UUID, Foreign Key)provider(VARCHAR) - e.g., 'email'provider_id(VARCHAR) - e.g., email addressemail(VARCHAR, nullable, unique for email provider)password_hash(VARCHAR, nullable)created_at(TIMESTAMP)updated_at(TIMESTAMP)
Security Features
- Passwords are hashed using bcrypt with configurable salt rounds
- Email uniqueness validation
- Input sanitization and validation
- Database transactions for data consistency
- No sensitive data exposed in API responses