Files
timeline-server/timeline-user-service/PREFERENCES_BACKEND_IMPLEMENTATION.md
jhao 10ef5918fc
Some checks failed
test/timeline-server/pipeline/head There was a failure building this commit
feat(user-service): 实现用户服务核心功能与数据同步
- 新增用户资料、偏好设置、自定义字段管理功能
- 实现评论、反应、相册与智能集合的完整业务逻辑
- 添加离线变更记录与数据同步机制支持冲突解决
- 集成 Redis 缓存配置与用户统计数据聚合
- 创建 8 个业务控制器处理用户交互请求
- 新增 Feign 客户端与故事服务集成
- 补充详细的后端实现与 WebSocket 指南文档
- 更新项目依赖配置支持新增功能模块
2026-02-25 15:04:30 +08:00

7.8 KiB

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):

{
  "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:

{
  "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):

{
  "code": 200,
  "message": "success",
  "data": null
}

PUT /api/v1/preferences/layout

Update layout preferences

Headers:

  • X-User-Id: User identifier (required)

Request Body:

{
  "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):

{
  "code": 200,
  "message": "success",
  "data": null
}

PUT /api/v1/preferences/timeline

Update timeline display preferences

Headers:

  • X-User-Id: User identifier (required)

Request Body:

{
  "displayMode": "masonry"
}

Validation:

  • displayMode: Required, must be "chronological", "grouped", or "masonry"

Response (200 OK):

{
  "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)