Trains management CRUD issues solved

This commit is contained in:
hagiye
2026-06-05 21:07:04 +03:00
parent 9676a6bb56
commit dc42838a43
41 changed files with 2192 additions and 1830 deletions

View File

@@ -1,14 +1,18 @@
import {
Body,
Controller,
Delete,
Get,
Param,
ParseUUIDPipe,
Patch,
Post,
Query,
} from "@nestjs/common";
import { ApiOperation, ApiTags } from "@nestjs/swagger";
import { CreateTrainDto } from "./dto/create-train.dto";
import { UpdateTrainDto } from "./dto/update-train.dto";
import { TrainsService } from "./trains.service";
@ApiTags("trains")
@@ -24,8 +28,8 @@ export class TrainsController {
@Get()
@ApiOperation({ summary: "List all trains" })
findAll() {
return this.trainsService.findAll();
findAll(@Query() query: Record<string, string | undefined>) {
return this.trainsService.findAll(query);
}
@Get(":id")
@@ -33,4 +37,16 @@ export class TrainsController {
findOne(@Param("id", ParseUUIDPipe) id: string) {
return this.trainsService.findById(id);
}
@Patch(":id")
@ApiOperation({ summary: "Update a train" })
update(@Param("id", ParseUUIDPipe) id: string, @Body() dto: UpdateTrainDto) {
return this.trainsService.update(id, dto);
}
@Delete(":id")
@ApiOperation({ summary: "Delete a train" })
remove(@Param("id", ParseUUIDPipe) id: string) {
return this.trainsService.remove(id);
}
}

View File

@@ -1,6 +1,6 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { FindOptionsOrder, FindOptionsWhere, ILike, Repository } from 'typeorm';
import { CreateTrainDto } from './dto/create-train.dto';
import { UpdateTrainDto } from './dto/update-train.dto';
import { Train } from './entities/train.entity';
@@ -17,8 +17,28 @@ export class TrainsService {
return this.trainRepo.save(train);
}
findAll(): Promise<Train[]> {
return this.trainRepo.find({ order: { code: 'ASC' } });
findAll(query: Record<string, string | undefined> = {}): Promise<Train[]> {
const where: FindOptionsWhere<Train>[] | FindOptionsWhere<Train> = [];
const search = query.search?.trim();
const status = query.status?.trim();
if (search) {
where.push({ code: ILike(`%${search}%`), ...(status ? { status: status as Train['status'] } : {}) });
where.push({ trainNumber: ILike(`%${search}%`), ...(status ? { status: status as Train['status'] } : {}) });
where.push({ trainName: ILike(`%${search}%`), ...(status ? { status: status as Train['status'] } : {}) });
}
const sortBy = ['code', 'trainNumber', 'trainName', 'capacityTons', 'status'].includes(query.sortBy ?? '')
? (query.sortBy as keyof Train)
: 'code';
const sortOrder = query.sortOrder?.toUpperCase() === 'DESC' ? 'DESC' : 'ASC';
return this.trainRepo.find({
where: search ? where : status ? { status: status as Train['status'] } : {},
order: { [sortBy]: sortOrder } as FindOptionsOrder<Train>,
skip: query.page && query.limit ? (Number(query.page) - 1) * Number(query.limit) : undefined,
take: query.limit ? Number(query.limit) : undefined,
});
}
async findById(id: string): Promise<Train> {
@@ -38,4 +58,4 @@ export class TrainsService {
const train = await this.findById(id);
await this.trainRepo.remove(train);
}
}
}