feat(share): 分享挑战关卡进度记录功能

- 新增 Level.timeLimit 字段支持关卡时间限制
- 新增 ShareLevelProgress 实体记录单关通关进度
- 新增 ShareLevelProgressRepository
- 新增 DTO: ReportLevelProgressDto, ReportLevelProgressResponseDto
- 新增 POST /v1/share/progress 接口用于上报进度
- 支持仅首次通关有效判断
- 支持时间限制内通关判断
- 不可变模式更新进度记录
- 数据库迁移脚本

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
richarjiang
2026-04-08 11:46:54 +08:00
parent 2dd22b10b1
commit 3d52cfe843
12 changed files with 960 additions and 2 deletions

View File

@@ -15,6 +15,8 @@ import { ApiResponseDto } from '../../common/dto/api-response.dto';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import type { JwtPayload } from '../../common/guards/jwt-auth.guard';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import { ReportLevelProgressDto } from './dto/report-level-progress.dto';
import { ReportLevelProgressResponseDto } from './dto/share-level-progress-response.dto';
@ApiTags('分享挑战')
@Controller('v1/share')
@@ -54,4 +56,21 @@ export class ShareController {
const data = await this.shareService.joinShare(user.sub, code);
return ApiResponseDto.success(data);
}
@Post('progress')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
@ApiOperation({
summary: '上报单关进度',
description: '用户在分享挑战中通关后上报进度,仅首次通关(passed=true)有效',
})
@ApiResponse({ status: 200, description: '成功' })
@ApiResponse({ status: 404, description: '分享或关卡不存在' })
async reportLevelProgress(
@CurrentUser() user: JwtPayload,
@Body() dto: ReportLevelProgressDto,
): Promise<ApiResponseDto<ReportLevelProgressResponseDto>> {
const data = await this.shareService.reportLevelProgress(user.sub, dto);
return ApiResponseDto.success(data);
}
}