rwadurian/backend/services/mining-admin-service/src/api/controllers/manual-mining.controller.ts

117 lines
3.4 KiB
TypeScript

import {
Controller,
Get,
Post,
Body,
Query,
Param,
HttpException,
HttpStatus,
Req,
} from '@nestjs/common';
import {
ApiTags,
ApiOperation,
ApiBearerAuth,
ApiBody,
ApiQuery,
ApiParam,
} from '@nestjs/swagger';
import { ManualMiningService } from '../../application/services/manual-mining.service';
@ApiTags('Manual Mining')
@ApiBearerAuth()
@Controller('manual-mining')
export class ManualMiningController {
constructor(private readonly manualMiningService: ManualMiningService) {}
@Post('calculate')
@ApiOperation({ summary: '计算手工补发挖矿预估金额' })
@ApiBody({
schema: {
type: 'object',
required: ['accountSequence', 'adoptionDate'],
properties: {
accountSequence: { type: 'string', description: '用户账户序列号' },
adoptionDate: {
type: 'string',
format: 'date',
description: '认种日期 (YYYY-MM-DD)',
},
},
},
})
async calculate(
@Body() body: { accountSequence: string; adoptionDate: string },
) {
if (!body.accountSequence || !body.adoptionDate) {
throw new HttpException('账户序列号和认种日期不能为空', HttpStatus.BAD_REQUEST);
}
return this.manualMiningService.calculate(body);
}
@Post('execute')
@ApiOperation({ summary: '执行手工补发挖矿(仅超级管理员)' })
@ApiBody({
schema: {
type: 'object',
required: ['accountSequence', 'adoptionDate', 'reason'],
properties: {
accountSequence: { type: 'string', description: '用户账户序列号' },
adoptionDate: {
type: 'string',
format: 'date',
description: '认种日期 (YYYY-MM-DD)',
},
reason: { type: 'string', description: '补发原因(必填)' },
},
},
})
async execute(
@Body() body: { accountSequence: string; adoptionDate: string; reason: string },
@Req() req: any,
) {
if (!body.accountSequence || !body.adoptionDate) {
throw new HttpException('账户序列号和认种日期不能为空', HttpStatus.BAD_REQUEST);
}
if (!body.reason || body.reason.trim().length === 0) {
throw new HttpException('补发原因不能为空', HttpStatus.BAD_REQUEST);
}
const admin = req.admin;
return this.manualMiningService.execute(
{
accountSequence: body.accountSequence,
adoptionDate: body.adoptionDate,
operatorId: admin.id,
operatorName: admin.username,
reason: body.reason,
},
admin.id,
);
}
@Get('records')
@ApiOperation({ summary: '获取手工补发记录列表' })
@ApiQuery({ name: 'page', required: false, type: Number })
@ApiQuery({ name: 'pageSize', required: false, type: Number })
async getRecords(
@Query('page') page?: number,
@Query('pageSize') pageSize?: number,
) {
return this.manualMiningService.getRecords(page ?? 1, pageSize ?? 20);
}
@Get('records/:accountSequence')
@ApiOperation({ summary: '查询指定用户的手工补发记录' })
@ApiParam({ name: 'accountSequence', type: String })
async getRecordByAccount(@Param('accountSequence') accountSequence: string) {
const record =
await this.manualMiningService.getRecordByAccountSequence(accountSequence);
if (!record) {
throw new HttpException('该用户没有手工补发记录', HttpStatus.NOT_FOUND);
}
return record;
}
}