📋 What Was Accomplished Backend Changes: - ✅ Enhanced API Endpoint: Updated GET /api/v1/events to accept optional date query parameter - ✅ Input Validation: Added YYYY-MM-DD format validation to PaginationQueryDto - ✅ Database Filtering: Implemented timezone-aware date filtering in EventsService - ✅ Controller Integration: Updated EventsController to pass date parameter to service Frontend Changes: - ✅ Date Picker Component: Created reusable DatePicker component following project design system - ✅ Gallery UI Enhancement: Integrated date picker into gallery page with clear labeling - ✅ State Management: Implemented reactive date state with automatic re-fetching - ✅ Clear Filter Functionality: Added "Clear Filter" button for easy reset - ✅ Enhanced UX: Improved empty states for filtered vs unfiltered views 🔍 Technical Implementation API Design: GET /api/v1/events?date=2025-08-02&limit=20&cursor=xxx Key Files Modified: - meteor-web-backend/src/events/dto/pagination-query.dto.ts - meteor-web-backend/src/events/events.service.ts - meteor-web-backend/src/events/events.controller.ts - meteor-frontend/src/components/ui/date-picker.tsx (new) - meteor-frontend/src/app/gallery/page.tsx - meteor-frontend/src/hooks/use-events.ts - meteor-frontend/src/services/events.ts ✅ All Acceptance Criteria Met 1. ✅ Backend API Enhancement: Accepts optional date parameter 2. ✅ Date Filtering Logic: Returns events for specific calendar date 3. ✅ Date Picker UI: Clean, accessible interface component 4. ✅ Automatic Re-fetching: Immediate data updates on date selection 5. ✅ Filtered Display: Correctly shows only events for selected date 6. ✅ Clear Filter: One-click reset to view all events 🧪 Quality Assurance - ✅ Backend Build: Successful compilation with no errors - ✅ Frontend Build: Successful Next.js build with no warnings - ✅ Linting: All ESLint checks pass - ✅ Functionality: Feature working as specified 🎉 Epic 2 Complete! With Story 2.9 completion, Epic 2: Commercialization & Core User Experience is now DONE! Epic 2 Achievements: - 🔐 Full-stack device status monitoring - 💳 Robust payment and subscription system - 🛡️ Subscription-based access control - 📊 Enhanced data browsing with detail pages - 📅 Date-based event filtering
180 lines
3.2 KiB
Markdown
180 lines
3.2 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
Create a `.env` file based on `.env.example`:
|
|
|
|
```env
|
|
DATABASE_URL=postgresql://user:password@localhost:5432/meteor_dev
|
|
BCRYPT_SALT_ROUNDS=10
|
|
```
|
|
|
|
### Database Setup
|
|
|
|
Run migrations to set up the database schema:
|
|
|
|
```bash
|
|
npm run migrate:up
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### POST /api/v1/auth/register-email
|
|
|
|
Register a new user with email and password.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"email": "user@example.com",
|
|
"password": "Password123",
|
|
"displayName": "John Doe"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```bash
|
|
npm run start:dev
|
|
```
|
|
|
|
### Production
|
|
|
|
```bash
|
|
npm run build
|
|
npm run start:prod
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Unit Tests
|
|
|
|
```bash
|
|
npm test
|
|
```
|
|
|
|
### Integration Tests
|
|
|
|
```bash
|
|
npm run test:e2e
|
|
```
|
|
|
|
### Test Coverage
|
|
|
|
```bash
|
|
npm run test:cov
|
|
```
|
|
|
|
## Database Migrations
|
|
|
|
### Create New Migration
|
|
|
|
```bash
|
|
npm run migrate:create migration-name
|
|
```
|
|
|
|
### Run Migrations
|
|
|
|
```bash
|
|
npm run migrate:up
|
|
```
|
|
|
|
### Rollback Migrations
|
|
|
|
```bash
|
|
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
|