Files
goodgo-platform/apps/api/src/modules/analytics/presentation/controllers/analytics.controller.ts
Ho Ngoc Hai 8e7672694b feat(api): add OpenAPI/Swagger documentation for all API endpoints
Install @nestjs/swagger, configure Swagger UI at /api/docs with JWT bearer
auth, and add ApiTags/ApiOperation/ApiResponse/ApiProperty decorators to
all 8 controllers (50+ endpoints) and 31 DTOs across auth, listings,
search, payments, subscriptions, admin, notifications, and analytics modules.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-08 04:08:11 +07:00

64 lines
2.7 KiB
TypeScript

import {
Controller,
Get,
Query,
} from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { QueryBus } from '@nestjs/cqrs';
import { GetMarketReportQuery } from '../../application/queries/get-market-report/get-market-report.query';
import { GetHeatmapQuery } from '../../application/queries/get-heatmap/get-heatmap.query';
import { GetPriceTrendQuery } from '../../application/queries/get-price-trend/get-price-trend.query';
import { GetDistrictStatsQuery } from '../../application/queries/get-district-stats/get-district-stats.query';
import { GetMarketReportDto } from '../dto/get-market-report.dto';
import { GetHeatmapDto } from '../dto/get-heatmap.dto';
import { GetPriceTrendDto } from '../dto/get-price-trend.dto';
import { GetDistrictStatsDto } from '../dto/get-district-stats.dto';
import { type MarketReportDto } from '../../application/queries/get-market-report/get-market-report.handler';
import { type HeatmapDto } from '../../application/queries/get-heatmap/get-heatmap.handler';
import { type PriceTrendDto } from '../../application/queries/get-price-trend/get-price-trend.handler';
import { type DistrictStatsDto } from '../../application/queries/get-district-stats/get-district-stats.handler';
@ApiTags('analytics')
@Controller('analytics')
export class AnalyticsController {
constructor(
private readonly queryBus: QueryBus,
) {}
@Get('market-report')
@ApiOperation({ summary: 'Get market report for a city' })
@ApiResponse({ status: 200, description: 'Market report retrieved' })
async getMarketReport(@Query() dto: GetMarketReportDto): Promise<MarketReportDto> {
return this.queryBus.execute(
new GetMarketReportQuery(dto.city, dto.period, dto.propertyType),
);
}
@Get('price-trend')
@ApiOperation({ summary: 'Get price trend for a district' })
@ApiResponse({ status: 200, description: 'Price trend data retrieved' })
async getPriceTrend(@Query() dto: GetPriceTrendDto): Promise<PriceTrendDto> {
return this.queryBus.execute(
new GetPriceTrendQuery(dto.district, dto.city, dto.propertyType, dto.periods),
);
}
@Get('heatmap')
@ApiOperation({ summary: 'Get price heatmap for a city' })
@ApiResponse({ status: 200, description: 'Heatmap data retrieved' })
async getHeatmap(@Query() dto: GetHeatmapDto): Promise<HeatmapDto> {
return this.queryBus.execute(
new GetHeatmapQuery(dto.city, dto.period),
);
}
@Get('district-stats')
@ApiOperation({ summary: 'Get statistics by district' })
@ApiResponse({ status: 200, description: 'District statistics retrieved' })
async getDistrictStats(@Query() dto: GetDistrictStatsDto): Promise<DistrictStatsDto> {
return this.queryBus.execute(
new GetDistrictStatsQuery(dto.city, dto.period),
);
}
}