Files
whale-town-end-v2/src/business/player/player.controller.ts
2026-07-21 22:19:58 +08:00

96 lines
4.4 KiB
TypeScript

import { Body, Controller, Get, HttpStatus, Patch, Res, UseGuards, UsePipes, ValidationPipe } from '@nestjs/common';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse as SwaggerApiResponse, ApiTags } from '@nestjs/swagger';
import { Response } from 'express';
import { CurrentUser } from '../../gateway/auth/current_user.decorator';
import { JwtAuthGuard } from '../../gateway/auth/jwt_auth.guard';
import { JwtPayload } from '../../core/login_core/login_core.service';
import { PlayerStateService } from './player_state.service';
import { EconomyService } from './economy.service';
import { UpdatePlayerAppearanceDto } from './dto/update_player_appearance.dto';
import { UpdatePlayerProfileAssetsDto } from './dto/update_player_profile_assets.dto';
import { UpdatePlayerSettingsDto } from './dto/update_player_settings.dto';
import { SocialService } from '../social/social.service';
import { UpdateSocialProfileDto } from '../social/dto/social.dto';
@ApiTags('player')
@ApiBearerAuth()
@Controller('player')
@UseGuards(JwtAuthGuard)
export class PlayerController {
constructor(
private readonly playerStateService: PlayerStateService,
private readonly economyService: EconomyService,
private readonly socialService: SocialService,
) {}
@ApiOperation({ summary: '获取当前玩家快照' })
@SwaggerApiResponse({ status: 200, description: '玩家快照获取成功' })
@Get('snapshot')
async getSnapshot(@CurrentUser() user: JwtPayload, @Res() res: Response): Promise<void> {
const data = await this.playerStateService.getSnapshot(BigInt(user.sub));
res.status(HttpStatus.OK).json({ success: true, data, message: '玩家快照获取成功' });
}
@ApiOperation({ summary: '获取当前玩家钱包' })
@SwaggerApiResponse({ status: 200, description: '钱包获取成功' })
@Get('wallet')
async getWallet(@CurrentUser() user: JwtPayload, @Res() res: Response): Promise<void> {
const data = await this.economyService.getWallet(BigInt(user.sub));
res.status(HttpStatus.OK).json({ success: true, data, message: '钱包获取成功' });
}
@ApiOperation({ summary: '更新当前穿戴皮肤' })
@ApiBody({ type: UpdatePlayerAppearanceDto })
@SwaggerApiResponse({ status: 200, description: '外观更新成功' })
@Patch('appearance')
@UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
async updateAppearance(
@CurrentUser() user: JwtPayload,
@Body() dto: UpdatePlayerAppearanceDto,
@Res() res: Response,
): Promise<void> {
const data = await this.playerStateService.updateAppearance(BigInt(user.sub), dto.skin_id);
res.status(HttpStatus.OK).json({ success: true, data, message: '外观更新成功' });
}
@ApiOperation({ summary: '更新当前玩家设置' })
@ApiBody({ type: UpdatePlayerSettingsDto })
@SwaggerApiResponse({ status: 200, description: '设置更新成功' })
@Patch('settings')
@UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
async updateSettings(
@CurrentUser() user: JwtPayload,
@Body() dto: UpdatePlayerSettingsDto,
@Res() res: Response,
): Promise<void> {
const data = await this.playerStateService.updateSettings(BigInt(user.sub), dto.settings);
res.status(HttpStatus.OK).json({ success: true, data, message: '设置更新成功' });
}
@ApiOperation({ summary: '更新当前玩家头像或自定义皮肤资源' })
@ApiBody({ type: UpdatePlayerProfileAssetsDto })
@SwaggerApiResponse({ status: 200, description: '玩家资源更新成功' })
@Patch('profile-assets')
@UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
async updateProfileAssets(
@CurrentUser() user: JwtPayload,
@Body() dto: UpdatePlayerProfileAssetsDto,
@Res() res: Response,
): Promise<void> {
const data = await this.playerStateService.updateProfileAssets(BigInt(user.sub), dto);
res.status(HttpStatus.OK).json({ success: true, data, message: '玩家资源更新成功' });
}
@ApiOperation({ summary: '更新当前玩家社区名片' })
@Patch('social-profile')
@UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
async updateSocialProfile(
@CurrentUser() user: JwtPayload,
@Body() dto: UpdateSocialProfileDto,
@Res() res: Response,
): Promise<void> {
const data = await this.socialService.updateSocialProfile(BigInt(user.sub), dto);
res.status(HttpStatus.OK).json({ success: true, data, message: '社区名片已更新' });
}
}