import { Controller, Get, Post, Body, Param, Query, Delete } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger'; import { RegionRepository } from '../../infrastructure/persistence/repositories/region.repository'; import { AdminOnly } from '../../shared/guards/jwt-auth.guard'; class CreateProvinceDto { code: string; name: string; } class CreateCityDto { provinceId: string; code: string; name: string; } class AssignUserRegionDto { accountSequence: string; cityId: string; assignedBy?: string; } class BulkInitializeRegionsDto { regions: { provinceCode: string; provinceName: string; cities: { code: string; name: string }[]; }[]; } @ApiTags('Regions') @Controller('regions') @ApiBearerAuth() export class RegionController { constructor(private readonly regionRepo: RegionRepository) {} // ==================== Province ==================== @Get('provinces') @AdminOnly() @ApiOperation({ summary: '获取所有省份' }) async getAllProvinces() { return this.regionRepo.findAllProvinces(); } @Get('provinces/:id') @AdminOnly() @ApiOperation({ summary: '根据ID获取省份' }) async getProvinceById(@Param('id') id: string) { return this.regionRepo.findProvinceById(id); } @Post('provinces') @AdminOnly() @ApiOperation({ summary: '创建省份' }) async createProvince(@Body() dto: CreateProvinceDto) { return this.regionRepo.createProvince(dto); } // ==================== City ==================== @Get('cities') @AdminOnly() @ApiOperation({ summary: '获取所有城市' }) async getAllCities() { return this.regionRepo.findAllCities(); } @Get('cities/by-province/:provinceId') @AdminOnly() @ApiOperation({ summary: '根据省份获取城市' }) async getCitiesByProvince(@Param('provinceId') provinceId: string) { return this.regionRepo.findCitiesByProvince(provinceId); } @Get('cities/:id') @AdminOnly() @ApiOperation({ summary: '根据ID获取城市' }) async getCityById(@Param('id') id: string) { return this.regionRepo.findCityById(id); } @Post('cities') @AdminOnly() @ApiOperation({ summary: '创建城市' }) async createCity(@Body() dto: CreateCityDto) { return this.regionRepo.createCity(dto); } // ==================== User Region Mapping ==================== @Get('user-mappings/:accountSequence') @AdminOnly() @ApiOperation({ summary: '获取用户区域映射' }) async getUserRegion(@Param('accountSequence') accountSequence: string) { return this.regionRepo.findUserRegion(accountSequence); } @Get('user-mappings/by-city/:cityId') @AdminOnly() @ApiOperation({ summary: '根据城市获取用户列表' }) @ApiQuery({ name: 'limit', required: false, type: Number }) @ApiQuery({ name: 'offset', required: false, type: Number }) async getUsersByCity( @Param('cityId') cityId: string, @Query('limit') limit?: number, @Query('offset') offset?: number, ) { return this.regionRepo.findUsersByCity(cityId, { limit: limit ? Number(limit) : undefined, offset: offset ? Number(offset) : undefined, }); } @Get('user-mappings/by-province/:provinceId') @AdminOnly() @ApiOperation({ summary: '根据省份获取用户列表' }) @ApiQuery({ name: 'limit', required: false, type: Number }) @ApiQuery({ name: 'offset', required: false, type: Number }) async getUsersByProvince( @Param('provinceId') provinceId: string, @Query('limit') limit?: number, @Query('offset') offset?: number, ) { return this.regionRepo.findUsersByProvince(provinceId, { limit: limit ? Number(limit) : undefined, offset: offset ? Number(offset) : undefined, }); } @Post('user-mappings') @AdminOnly() @ApiOperation({ summary: '分配用户到区域' }) async assignUserToRegion(@Body() dto: AssignUserRegionDto) { return this.regionRepo.assignUserToRegion(dto); } @Delete('user-mappings/:accountSequence') @AdminOnly() @ApiOperation({ summary: '移除用户区域映射' }) async removeUserFromRegion(@Param('accountSequence') accountSequence: string) { await this.regionRepo.removeUserFromRegion(accountSequence); return { success: true }; } // ==================== Statistics & Initialization ==================== @Get('stats') @AdminOnly() @ApiOperation({ summary: '获取区域统计' }) async getRegionStats() { return this.regionRepo.getRegionStats(); } @Post('bulk-initialize') @AdminOnly() @ApiOperation({ summary: '批量初始化区域数据' }) async bulkInitializeRegions(@Body() dto: BulkInitializeRegionsDto) { await this.regionRepo.bulkInitializeRegions(dto.regions); return { success: true, message: 'Regions initialized successfully' }; } }