137 lines
4.0 KiB
TypeScript
137 lines
4.0 KiB
TypeScript
import {
|
|
Controller,
|
|
Get,
|
|
Post,
|
|
Put,
|
|
Delete,
|
|
Body,
|
|
Param,
|
|
Query,
|
|
UseGuards,
|
|
ParseUUIDPipe,
|
|
HttpCode,
|
|
HttpStatus,
|
|
} from '@nestjs/common';
|
|
import {
|
|
ApiTags,
|
|
ApiOperation,
|
|
ApiResponse,
|
|
ApiBearerAuth,
|
|
ApiQuery,
|
|
} from '@nestjs/swagger';
|
|
import { AssetService } from '../services/asset.service';
|
|
import { CreateAssetDto, UpdateAssetDto } from '../dto';
|
|
import { AssetType, AssetStatus } from '../entities/asset.entity';
|
|
import { JwtAuthGuard } from '@/common/guards/jwt-auth.guard';
|
|
import { TenantMemberGuard } from '@/common/guards/tenant-member.guard';
|
|
import { CurrentTenant } from '@/common/decorators/current-tenant.decorator';
|
|
import { PaginationDto } from '@/shared/dto/pagination.dto';
|
|
|
|
@ApiTags('Assets')
|
|
@Controller('assets')
|
|
@UseGuards(JwtAuthGuard, TenantMemberGuard)
|
|
@ApiBearerAuth('JWT-auth')
|
|
export class AssetController {
|
|
constructor(private readonly assetService: AssetService) {}
|
|
|
|
@Get()
|
|
@ApiOperation({ summary: 'Get all assets with pagination' })
|
|
@ApiQuery({ name: 'brandId', required: false })
|
|
@ApiQuery({ name: 'type', enum: AssetType, required: false })
|
|
@ApiQuery({ name: 'search', required: false })
|
|
@ApiResponse({ status: 200, description: 'List of assets' })
|
|
async findAll(
|
|
@CurrentTenant() tenantId: string,
|
|
@Query() pagination: PaginationDto,
|
|
@Query('brandId') brandId?: string,
|
|
@Query('type') type?: AssetType,
|
|
@Query('search') search?: string,
|
|
) {
|
|
return this.assetService.findAllPaginated(tenantId, {
|
|
...pagination,
|
|
brandId,
|
|
type,
|
|
search,
|
|
});
|
|
}
|
|
|
|
@Get(':id')
|
|
@ApiOperation({ summary: 'Get asset by ID' })
|
|
@ApiResponse({ status: 200, description: 'Asset found' })
|
|
@ApiResponse({ status: 404, description: 'Asset not found' })
|
|
async findOne(
|
|
@CurrentTenant() tenantId: string,
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
) {
|
|
return this.assetService.findById(tenantId, id);
|
|
}
|
|
|
|
@Get('brand/:brandId')
|
|
@ApiOperation({ summary: 'Get assets by brand' })
|
|
@ApiResponse({ status: 200, description: 'List of brand assets' })
|
|
async findByBrand(
|
|
@CurrentTenant() tenantId: string,
|
|
@Param('brandId', ParseUUIDPipe) brandId: string,
|
|
) {
|
|
return this.assetService.findByBrand(tenantId, brandId);
|
|
}
|
|
|
|
@Post()
|
|
@ApiOperation({ summary: 'Create new asset' })
|
|
@ApiResponse({ status: 201, description: 'Asset created' })
|
|
@ApiResponse({ status: 400, description: 'Bad request' })
|
|
async create(
|
|
@CurrentTenant() tenantId: string,
|
|
@Body() dto: CreateAssetDto,
|
|
) {
|
|
return this.assetService.create(tenantId, dto);
|
|
}
|
|
|
|
@Put(':id')
|
|
@ApiOperation({ summary: 'Update asset' })
|
|
@ApiResponse({ status: 200, description: 'Asset updated' })
|
|
@ApiResponse({ status: 404, description: 'Asset not found' })
|
|
async update(
|
|
@CurrentTenant() tenantId: string,
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body() dto: UpdateAssetDto,
|
|
) {
|
|
return this.assetService.update(tenantId, id, dto);
|
|
}
|
|
|
|
@Put(':id/status')
|
|
@ApiOperation({ summary: 'Update asset status' })
|
|
@ApiResponse({ status: 200, description: 'Asset status updated' })
|
|
@ApiResponse({ status: 404, description: 'Asset not found' })
|
|
async updateStatus(
|
|
@CurrentTenant() tenantId: string,
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body('status') status: AssetStatus,
|
|
) {
|
|
return this.assetService.updateStatus(tenantId, id, status);
|
|
}
|
|
|
|
@Delete(':id')
|
|
@HttpCode(HttpStatus.NO_CONTENT)
|
|
@ApiOperation({ summary: 'Delete asset (soft delete)' })
|
|
@ApiResponse({ status: 204, description: 'Asset deleted' })
|
|
@ApiResponse({ status: 404, description: 'Asset not found' })
|
|
async delete(
|
|
@CurrentTenant() tenantId: string,
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
) {
|
|
await this.assetService.softDelete(tenantId, id);
|
|
}
|
|
|
|
@Delete('bulk')
|
|
@HttpCode(HttpStatus.NO_CONTENT)
|
|
@ApiOperation({ summary: 'Delete multiple assets' })
|
|
@ApiResponse({ status: 204, description: 'Assets deleted' })
|
|
async bulkDelete(
|
|
@CurrentTenant() tenantId: string,
|
|
@Body('ids') ids: string[],
|
|
) {
|
|
await this.assetService.bulkDelete(tenantId, ids);
|
|
}
|
|
}
|