grabbit f557c06771 feat: complete database schema migration to UUID primary keys
## 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>
2025-12-21 03:33:26 +08:00
..

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 data
  • 409 Conflict - Email already registered
  • 500 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 address
  • email (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