yachts controller added

This commit is contained in:
Иван 2025-12-01 19:56:07 +03:00
parent e2797ed159
commit 171d670629
13 changed files with 242 additions and 3 deletions

View File

@ -10,7 +10,7 @@ deploy:
only: only:
- main - main
script: script:
- docker-compose -p "$COMPOSE_PROJECT_NAME" up -d --build - docker compose -p "$COMPOSE_PROJECT_NAME" up -d --build
environment: environment:
name: production name: production
url: http://89.169.188.2 url: http://89.169.188.2

54
package-lock.json generated
View File

@ -11,7 +11,9 @@
"dependencies": { "dependencies": {
"@nestjs/common": "^11.0.1", "@nestjs/common": "^11.0.1",
"@nestjs/core": "^11.0.1", "@nestjs/core": "^11.0.1",
"@nestjs/mapped-types": "^2.1.0",
"@nestjs/platform-express": "^11.0.1", "@nestjs/platform-express": "^11.0.1",
"class-validator": "^0.14.3",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1" "rxjs": "^7.8.1"
}, },
@ -2368,6 +2370,26 @@
} }
} }
}, },
"node_modules/@nestjs/mapped-types": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz",
"integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==",
"license": "MIT",
"peerDependencies": {
"@nestjs/common": "^10.0.0 || ^11.0.0",
"class-transformer": "^0.4.0 || ^0.5.0",
"class-validator": "^0.13.0 || ^0.14.0",
"reflect-metadata": "^0.1.12 || ^0.2.0"
},
"peerDependenciesMeta": {
"class-transformer": {
"optional": true
},
"class-validator": {
"optional": true
}
}
},
"node_modules/@nestjs/platform-express": { "node_modules/@nestjs/platform-express": {
"version": "11.1.9", "version": "11.1.9",
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.9.tgz", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.9.tgz",
@ -2987,6 +3009,12 @@
"@types/superagent": "^8.1.0" "@types/superagent": "^8.1.0"
} }
}, },
"node_modules/@types/validator": {
"version": "13.15.10",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
"integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==",
"license": "MIT"
},
"node_modules/@types/yargs": { "node_modules/@types/yargs": {
"version": "17.0.35", "version": "17.0.35",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
@ -4443,6 +4471,17 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/class-validator": {
"version": "0.14.3",
"resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz",
"integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==",
"license": "MIT",
"dependencies": {
"@types/validator": "^13.15.3",
"libphonenumber-js": "^1.11.1",
"validator": "^13.15.20"
}
},
"node_modules/cli-cursor": { "node_modules/cli-cursor": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@ -7327,6 +7366,12 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/libphonenumber-js": {
"version": "1.12.30",
"resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.30.tgz",
"integrity": "sha512-KxH7uIJFD6+cR6nhdh+wY6prFiH26A3W/W1gTMXnng2PXSwVfi5MhYkdq3Z2Y7vhBVa1/5VJgpNtI76UM2njGA==",
"license": "MIT"
},
"node_modules/lines-and-columns": { "node_modules/lines-and-columns": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@ -9901,6 +9946,15 @@
"node": ">=10.12.0" "node": ">=10.12.0"
} }
}, },
"node_modules/validator": {
"version": "13.15.23",
"resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz",
"integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==",
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/vary": { "node_modules/vary": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",

View File

@ -22,7 +22,9 @@
"dependencies": { "dependencies": {
"@nestjs/common": "^11.0.1", "@nestjs/common": "^11.0.1",
"@nestjs/core": "^11.0.1", "@nestjs/core": "^11.0.1",
"@nestjs/mapped-types": "^2.1.0",
"@nestjs/platform-express": "^11.0.1", "@nestjs/platform-express": "^11.0.1",
"class-validator": "^0.14.3",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1" "rxjs": "^7.8.1"
}, },

View File

@ -1,7 +1,7 @@
import { Controller, Get } from '@nestjs/common'; import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service'; import { AppService } from './app.service';
@Controller() @Controller('test')
export class AppController { export class AppController {
constructor(private readonly appService: AppService) {} constructor(private readonly appService: AppService) {}

View File

@ -1,9 +1,10 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { AppController } from './app.controller'; import { AppController } from './app.controller';
import { AppService } from './app.service'; import { AppService } from './app.service';
import { YachtModule } from './yacht/yacht.module';
@Module({ @Module({
imports: [], imports: [YachtModule],
controllers: [AppController], controllers: [AppController],
providers: [AppService], providers: [AppService],
}) })

View File

@ -0,0 +1,24 @@
import { IsString, IsNumber, IsBoolean, IsUrl, Min } from 'class-validator';
export class CreateYachtDto {
@IsString()
name: string;
@IsNumber()
@Min(1)
length: number;
@IsNumber()
@Min(0)
speed: number;
@IsNumber()
@Min(0)
minCost: number;
@IsBoolean()
hasQuickRent: boolean;
@IsUrl()
pictureUrl: string;
}

View File

@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/mapped-types';
import { CreateYachtDto } from './create-yacht.dto';
export class UpdateYachtDto extends PartialType(CreateYachtDto) {}

View File

@ -0,0 +1,9 @@
export class Yacht {
id?: number;
name: string;
length: number;
speed: number;
minCost: number;
hasQuickRent: boolean;
pictureUrl: string;
}

View File

@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { YachtController } from './yacht.controller';
describe('YachtController', () => {
let controller: YachtController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [YachtController],
}).compile();
controller = module.get<YachtController>(YachtController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});

View File

@ -0,0 +1,47 @@
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
ParseIntPipe,
} from '@nestjs/common';
import { YachtService } from './yacht.service';
import { CreateYachtDto } from './dto/create-yacht.dto';
import { UpdateYachtDto } from './dto/update-yacht.dto';
import { Yacht } from './entities/yacht.entity';
@Controller('yacht') // Routes will be /yacht
export class YachtController {
constructor(private readonly yachtService: YachtService) {}
@Post()
create(@Body() createYachtDto: CreateYachtDto): Yacht {
return this.yachtService.create(createYachtDto);
}
@Get()
getAll(): Yacht[] {
return this.yachtService.getAll();
}
@Get(':id')
getById(@Param('id', ParseIntPipe) id: number): Yacht {
return this.yachtService.getById(id);
}
@Patch(':id')
update(
@Param('id', ParseIntPipe) id: number,
@Body() updateYachtDto: UpdateYachtDto,
): Yacht {
return this.yachtService.update(id, updateYachtDto);
}
@Delete(':id')
remove(@Param('id', ParseIntPipe) id: number): void {
return this.yachtService.remove(id);
}
}

View File

@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { YachtService } from './yacht.service';
import { YachtController } from './yacht.controller';
@Module({
controllers: [YachtController],
providers: [YachtService],
})
export class YachtModule {}

View File

@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { YachtService } from './yacht.service';
describe('YachtService', () => {
let service: YachtService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [YachtService],
}).compile();
service = module.get<YachtService>(YachtService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,53 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { Yacht } from './entities/yacht.entity';
import { CreateYachtDto } from './dto/create-yacht.dto';
import { UpdateYachtDto } from './dto/update-yacht.dto';
@Injectable()
export class YachtService {
private yachts: Yacht[] = [];
private idCounter = 1;
create(createYachtDto: CreateYachtDto): Yacht {
const yacht: Yacht = {
id: this.idCounter++,
...createYachtDto,
};
this.yachts.push(yacht);
return yacht;
}
getAll(): Yacht[] {
return this.yachts;
}
getById(id: number): Yacht {
const yacht = this.yachts.find((y) => y.id === id);
if (!yacht) {
throw new NotFoundException(`Yacht with ID ${id} not found`);
}
return yacht;
}
update(id: number, updateYachtDto: UpdateYachtDto): Yacht {
const index = this.yachts.findIndex((y) => y.id === id);
if (index === -1) {
throw new NotFoundException(`Yacht with ID ${id} not found`);
}
this.yachts[index] = {
...this.yachts[index],
...updateYachtDto,
};
return this.yachts[index];
}
remove(id: number): void {
const index = this.yachts.findIndex((y) => y.id === id);
if (index === -1) {
throw new NotFoundException(`Yacht with ID ${id} not found`);
}
this.yachts.splice(index, 1);
}
}