rwadurian/backend/services/wallet-service/src/api/controllers/ledger.controller.ts

57 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Controller, Get, Query, UseGuards } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiBearerAuth, ApiResponse, ApiQuery } from '@nestjs/swagger';
import { WalletApplicationService } from '@/application/services';
import { GetMyLedgerQuery } from '@/application/queries';
import { CurrentUser, CurrentUserPayload } from '@/shared/decorators';
import { JwtAuthGuard } from '@/shared/guards/jwt-auth.guard';
import { GetMyLedgerQueryDTO } from '@/api/dto/request';
import { PaginatedLedgerResponseDTO, LedgerStatisticsResponseDTO, LedgerTrendResponseDTO } from '@/api/dto/response';
@ApiTags('Ledger')
@Controller('wallet/ledger')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
export class LedgerController {
constructor(private readonly walletService: WalletApplicationService) {}
@Get('my-ledger')
@ApiOperation({ summary: '查询我的流水', description: '获取当前用户的账本流水记录' })
@ApiResponse({ status: 200, type: PaginatedLedgerResponseDTO })
async getMyLedger(
@CurrentUser() user: CurrentUserPayload,
@Query() queryDto: GetMyLedgerQueryDTO,
): Promise<PaginatedLedgerResponseDTO> {
const query = new GetMyLedgerQuery(
user.accountSequence, // 使用 accountSequence 替代 userId
queryDto.page,
queryDto.pageSize,
queryDto.entryType,
queryDto.assetType,
queryDto.startDate ? new Date(queryDto.startDate) : undefined,
queryDto.endDate ? new Date(queryDto.endDate) : undefined,
);
return this.walletService.getMyLedger(query);
}
@Get('statistics')
@ApiOperation({ summary: '获取流水统计', description: '按类型汇总用户的收支统计' })
@ApiResponse({ status: 200, type: LedgerStatisticsResponseDTO })
async getStatistics(
@CurrentUser() user: CurrentUserPayload,
): Promise<LedgerStatisticsResponseDTO> {
return this.walletService.getLedgerStatistics(user.accountSequence);
}
@Get('trend')
@ApiOperation({ summary: '获取流水趋势', description: '按日期统计用户的收支趋势' })
@ApiQuery({ name: 'days', required: false, description: '统计天数默认30天' })
@ApiResponse({ status: 200, type: LedgerTrendResponseDTO })
async getTrend(
@CurrentUser() user: CurrentUserPayload,
@Query('days') days?: string,
): Promise<LedgerTrendResponseDTO> {
const numDays = days ? parseInt(days, 10) : 30;
return this.walletService.getLedgerTrend(user.accountSequence, numDays);
}
}