Some checks failed
test/timeline-server/pipeline/head There was a failure building this commit
- 新增用户资料、偏好设置、自定义字段管理功能 - 实现评论、反应、相册与智能集合的完整业务逻辑 - 添加离线变更记录与数据同步机制支持冲突解决 - 集成 Redis 缓存配置与用户统计数据聚合 - 创建 8 个业务控制器处理用户交互请求 - 新增 Feign 客户端与故事服务集成 - 补充详细的后端实现与 WebSocket 指南文档 - 更新项目依赖配置支持新增功能模块
267 lines
7.8 KiB
Markdown
267 lines
7.8 KiB
Markdown
# Preferences Backend Implementation Summary
|
|
|
|
## Overview
|
|
|
|
Task 19.1 (Create Preferences service and API endpoints) has been **successfully implemented**. This document summarizes the complete implementation for the Theme Customization backend.
|
|
|
|
## Implementation Status: ✅ COMPLETE
|
|
|
|
All required components for the Preferences backend have been implemented and are ready for use.
|
|
|
|
## Components Implemented
|
|
|
|
### 1. Database Schema ✅
|
|
**File**: `timeline-sql/V1.4.0__personal_user_enhancements.sql`
|
|
|
|
The `user_preferences` table includes:
|
|
- `id` - Primary key
|
|
- `user_id` - Unique user identifier
|
|
- **Theme settings**:
|
|
- `theme_mode` - light/dark/auto (default: 'auto')
|
|
- `color_scheme` - Color scheme name (default: 'default')
|
|
- **Layout settings**:
|
|
- `gallery_layout` - grid/list (default: 'grid')
|
|
- `timeline_layout` - grid/list (default: 'grid')
|
|
- `album_layout` - grid/list (default: 'grid')
|
|
- `card_size` - small/medium/large (default: 'medium')
|
|
- **Timeline display settings**:
|
|
- `timeline_display_mode` - chronological/grouped/masonry (default: 'chronological')
|
|
- `create_time` - Creation timestamp
|
|
- `update_time` - Last update timestamp
|
|
|
|
### 2. Entity Class ✅
|
|
**File**: `src/main/java/com/timeline/user/entity/UserPreferences.java`
|
|
|
|
Java entity class with:
|
|
- All database fields mapped
|
|
- Lombok annotations for getters/setters
|
|
- JSON formatting for timestamps
|
|
|
|
### 3. Data Access Layer (Mapper) ✅
|
|
**Files**:
|
|
- `src/main/java/com/timeline/user/dao/PreferencesMapper.java` (Interface)
|
|
- `src/main/resources/com/timeline/user/dao/PreferencesMapper.xml` (MyBatis XML)
|
|
|
|
Mapper methods:
|
|
- `findByUserId(String userId)` - Get user preferences
|
|
- `insert(UserPreferences)` - Create new preferences
|
|
- `update(UserPreferences)` - Update all preferences
|
|
- `updateTheme(userId, themeMode, colorScheme)` - Update theme only
|
|
- `updateLayout(userId, galleryLayout, timelineLayout, albumLayout, cardSize)` - Update layout only
|
|
- `updateTimelineDisplay(userId, displayMode)` - Update timeline display only
|
|
|
|
### 4. Service Layer ✅
|
|
**Files**:
|
|
- `src/main/java/com/timeline/user/service/PreferencesService.java` (Interface)
|
|
- `src/main/java/com/timeline/user/service/impl/PreferencesServiceImpl.java` (Implementation)
|
|
|
|
Service methods:
|
|
- `getUserPreferences(String userId)` - Get preferences, creates default if not exists
|
|
- `updateThemePreferences(userId, themeMode, colorScheme)` - Update theme settings
|
|
- `updateLayoutPreferences(userId, galleryLayout, timelineLayout, albumLayout, cardSize)` - Update layout settings
|
|
- `updateTimelineDisplayPreferences(userId, displayMode)` - Update timeline display
|
|
- `createDefaultPreferences(String userId)` - Create default preferences
|
|
|
|
**Validation logic**:
|
|
- Theme mode: must be "light", "dark", or "auto"
|
|
- Layout: must be "grid" or "list"
|
|
- Card size: must be "small", "medium", or "large"
|
|
- Display mode: must be "chronological", "grouped", or "masonry"
|
|
|
|
### 5. DTO Classes ✅
|
|
**Files**:
|
|
- `src/main/java/com/timeline/user/dto/UpdateThemeRequest.java`
|
|
- `src/main/java/com/timeline/user/dto/UpdateLayoutRequest.java`
|
|
- `src/main/java/com/timeline/user/dto/UpdateTimelineDisplayRequest.java`
|
|
|
|
All DTOs include:
|
|
- Jakarta validation annotations
|
|
- Pattern validation for enum-like fields
|
|
- Proper error messages in Chinese
|
|
|
|
### 6. REST Controller ✅
|
|
**File**: `src/main/java/com/timeline/user/controller/PreferencesController.java`
|
|
|
|
API Endpoints:
|
|
- `GET /api/v1/preferences` - Get user preferences
|
|
- `PUT /api/v1/preferences/theme` - Update theme preferences
|
|
- `PUT /api/v1/preferences/layout` - Update layout preferences
|
|
- `PUT /api/v1/preferences/timeline` - Update timeline display preferences
|
|
|
|
All endpoints:
|
|
- Use `@RequestHeader("X-User-Id")` for user identification
|
|
- Include request validation with `@Valid`
|
|
- Return standardized `ResponseEntity` responses
|
|
- Include logging for debugging
|
|
|
|
### 7. Unit Tests ✅
|
|
**File**: `src/test/java/com/timeline/user/service/PreferencesServiceTest.java`
|
|
|
|
Test coverage includes:
|
|
- ✅ Default preferences creation when user has none
|
|
- ✅ Theme updates (light, dark, auto)
|
|
- ✅ Layout updates (full and partial)
|
|
- ✅ Timeline display updates
|
|
- ✅ Validation error handling (invalid theme mode, layout, card size, display mode)
|
|
- ✅ Default preferences creation
|
|
|
|
**Test approach**: Uses Mockito for unit testing without requiring full Spring context
|
|
|
|
## API Specification
|
|
|
|
### GET /api/v1/preferences
|
|
Get user preferences (creates default if not exists)
|
|
|
|
**Headers**:
|
|
- `X-User-Id`: User identifier (required)
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"code": 200,
|
|
"message": "success",
|
|
"data": {
|
|
"id": 1,
|
|
"userId": "user123",
|
|
"themeMode": "auto",
|
|
"colorScheme": "default",
|
|
"galleryLayout": "grid",
|
|
"timelineLayout": "grid",
|
|
"albumLayout": "grid",
|
|
"cardSize": "medium",
|
|
"timelineDisplayMode": "chronological",
|
|
"createTime": "2024-01-01 10:00:00",
|
|
"updateTime": "2024-01-01 10:00:00"
|
|
}
|
|
}
|
|
```
|
|
|
|
### PUT /api/v1/preferences/theme
|
|
Update theme preferences
|
|
|
|
**Headers**:
|
|
- `X-User-Id`: User identifier (required)
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"themeMode": "dark",
|
|
"colorScheme": "purple"
|
|
}
|
|
```
|
|
|
|
**Validation**:
|
|
- `themeMode`: Required, must be "light", "dark", or "auto"
|
|
- `colorScheme`: Optional, must be "default", "blue", "green", "purple", "orange", or "red"
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"code": 200,
|
|
"message": "success",
|
|
"data": null
|
|
}
|
|
```
|
|
|
|
### PUT /api/v1/preferences/layout
|
|
Update layout preferences
|
|
|
|
**Headers**:
|
|
- `X-User-Id`: User identifier (required)
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"galleryLayout": "list",
|
|
"timelineLayout": "grid",
|
|
"albumLayout": "list",
|
|
"cardSize": "large"
|
|
}
|
|
```
|
|
|
|
**Validation**:
|
|
- All fields optional
|
|
- `galleryLayout`, `timelineLayout`, `albumLayout`: must be "grid" or "list"
|
|
- `cardSize`: must be "small", "medium", or "large"
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"code": 200,
|
|
"message": "success",
|
|
"data": null
|
|
}
|
|
```
|
|
|
|
### PUT /api/v1/preferences/timeline
|
|
Update timeline display preferences
|
|
|
|
**Headers**:
|
|
- `X-User-Id`: User identifier (required)
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"displayMode": "masonry"
|
|
}
|
|
```
|
|
|
|
**Validation**:
|
|
- `displayMode`: Required, must be "chronological", "grouped", or "masonry"
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"code": 200,
|
|
"message": "success",
|
|
"data": null
|
|
}
|
|
```
|
|
|
|
## Requirements Validation
|
|
|
|
### Requirement 7.5: Theme preferences persist across sessions ✅
|
|
- Preferences are stored in the database
|
|
- GET endpoint retrieves persisted preferences
|
|
- PUT endpoint updates preferences in database
|
|
|
|
### Requirement 7.6: Theme preferences apply on both web and desktop clients ✅
|
|
- Backend API is client-agnostic
|
|
- Both web and desktop clients can call the same endpoints
|
|
- Preferences are stored per user, not per client
|
|
|
|
## Default Values
|
|
|
|
When a user has no preferences, the system creates defaults:
|
|
- Theme mode: `auto` (respects system theme)
|
|
- Color scheme: `default`
|
|
- Gallery layout: `grid`
|
|
- Timeline layout: `grid`
|
|
- Album layout: `grid`
|
|
- Card size: `medium`
|
|
- Timeline display mode: `chronological`
|
|
|
|
## Error Handling
|
|
|
|
The service includes comprehensive validation:
|
|
- Invalid theme mode → `IllegalArgumentException`
|
|
- Invalid layout → `IllegalArgumentException`
|
|
- Invalid card size → `IllegalArgumentException`
|
|
- Invalid display mode → `IllegalArgumentException`
|
|
|
|
All validation errors are caught by the controller and returned as appropriate HTTP error responses.
|
|
|
|
## Next Steps
|
|
|
|
Task 19.1 is **COMPLETE**. The backend implementation is ready for:
|
|
1. Frontend integration (Task 20: Theme Customization frontend)
|
|
2. Property-based testing (Task 19.2: Optional)
|
|
3. Integration testing with the full application stack
|
|
|
|
## Notes
|
|
|
|
- The implementation follows the existing codebase patterns (similar to ReactionService, CommentService)
|
|
- All code includes Chinese and English comments for maintainability
|
|
- The service is transactional to ensure data consistency
|
|
- Partial updates are supported (e.g., updating only theme without changing layout)
|