Skip to content

Commit 4eb94ff

Browse files
committed
feat:Implement Request Validation DTOs for All Endpoints #7
1 parent 3f13cd2 commit 4eb94ff

13 files changed

Lines changed: 214 additions & 47 deletions

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,91 +40,92 @@
4040
"health": "curl -f http://localhost:3000/health || exit 1"
4141
},
4242
"dependencies": {
43+
"@nestjs/bull": "^10.0.1",
4344
"@nestjs/common": "^10.3.0",
45+
"@nestjs/config": "^3.1.1",
4446
"@nestjs/core": "^10.3.0",
47+
"@nestjs/passport": "^10.0.3",
4548
"@nestjs/platform-express": "^10.3.0",
46-
"@nestjs/config": "^3.1.1",
47-
"@nestjs/swagger": "^7.2.0",
48-
"@nestjs/throttler": "^5.1.1",
49-
"@nestjs/bull": "^10.0.1",
5049
"@nestjs/schedule": "^4.0.0",
50+
"@nestjs/swagger": "^7.2.0",
5151
"@nestjs/terminus": "^10.2.3",
52+
"@nestjs/throttler": "^5.1.1",
53+
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
54+
"@prisma/client": "^5.7.1",
55+
"axios": "^1.6.2",
56+
"bcrypt": "^5.1.1",
5257
"bull": "^4.12.2",
53-
"redis": "^4.6.12",
54-
"ioredis": "^5.3.2",
55-
"winston": "^3.11.0",
56-
"winston-daily-rotate-file": "^4.7.1",
57-
"nest-winston": "^1.9.4",
58-
"class-validator": "^0.14.1",
5958
"class-transformer": "^0.5.1",
60-
"helmet": "^7.1.0",
61-
"cors": "^2.8.5",
59+
"class-validator": "^0.14.1",
6260
"compression": "^1.7.4",
63-
"express-rate-limit": "^7.1.5",
64-
"reflect-metadata": "^0.1.13",
65-
"rxjs": "^7.8.1",
66-
"pg": "^8.11.3",
67-
"@prisma/client": "^5.7.1",
68-
"prisma": "^5.7.1",
61+
"cors": "^2.8.5",
62+
"crypto-js": "^4.2.0",
63+
"csv-parser": "^3.0.0",
64+
"dotenv": "^16.3.1",
6965
"ethers": "^6.9.0",
70-
"web3": "^4.3.0",
71-
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
66+
"express-rate-limit": "^7.1.5",
7267
"hardhat": "^2.19.4",
73-
"dotenv": "^16.3.1",
68+
"helmet": "^7.1.0",
69+
"ioredis": "^5.3.2",
7470
"joi": "^17.11.0",
75-
"bcrypt": "^5.1.1",
7671
"jsonwebtoken": "^9.0.2",
72+
"lodash": "^4.17.21",
73+
"mapped-types": "^0.0.1",
74+
"moment": "^2.29.4",
75+
"multer": "^1.4.5-lts.1",
76+
"nest-winston": "^1.9.4",
7777
"passport": "^0.7.0",
78-
"@nestjs/passport": "^10.0.3",
7978
"passport-jwt": "^4.0.1",
8079
"passport-local": "^1.0.0",
81-
"multer": "^1.4.5-lts.1",
80+
"pg": "^8.11.3",
81+
"prisma": "^5.7.1",
82+
"redis": "^4.6.12",
83+
"reflect-metadata": "^0.1.13",
84+
"rxjs": "^7.8.1",
8285
"sharp": "^0.33.1",
8386
"uuid": "^9.0.1",
84-
"crypto-js": "^4.2.0",
85-
"axios": "^1.6.2",
86-
"lodash": "^4.17.21",
87-
"moment": "^2.29.4",
88-
"csv-parser": "^3.0.0",
87+
"web3": "^4.3.0",
88+
"winston": "^3.11.0",
89+
"winston-daily-rotate-file": "^4.7.1",
8990
"xlsx": "^0.18.5"
9091
},
9192
"devDependencies": {
93+
"@commitlint/cli": "^18.4.3",
94+
"@commitlint/config-conventional": "^18.4.3",
9295
"@nestjs/cli": "^10.3.0",
9396
"@nestjs/schematics": "^10.0.3",
9497
"@nestjs/testing": "^10.3.0",
98+
"@types/bcrypt": "^5.0.2",
99+
"@types/compression": "^1.7.5",
100+
"@types/cors": "^2.8.17",
101+
"@types/crypto-js": "^4.2.1",
95102
"@types/express": "^4.17.21",
96103
"@types/jest": "^29.5.8",
97-
"@types/node": "^20.10.4",
98-
"@types/supertest": "^2.0.16",
99-
"@types/bcrypt": "^5.0.2",
100104
"@types/jsonwebtoken": "^9.0.5",
105+
"@types/lodash": "^4.14.202",
106+
"@types/multer": "^1.4.11",
107+
"@types/node": "^20.10.4",
101108
"@types/passport-jwt": "^3.0.13",
102109
"@types/passport-local": "^1.0.38",
103-
"@types/multer": "^1.4.11",
110+
"@types/supertest": "^2.0.16",
104111
"@types/uuid": "^9.0.7",
105-
"@types/crypto-js": "^4.2.1",
106-
"@types/lodash": "^4.14.202",
107-
"@types/compression": "^1.7.5",
108-
"@types/cors": "^2.8.17",
109112
"@typescript-eslint/eslint-plugin": "^6.13.1",
110113
"@typescript-eslint/parser": "^6.13.1",
111114
"eslint": "^8.54.0",
112115
"eslint-config-prettier": "^9.0.0",
113116
"eslint-plugin-prettier": "^5.0.1",
117+
"husky": "^8.0.3",
118+
"jest": "^29.7.0",
119+
"lint-staged": "^15.2.0",
114120
"prettier": "^3.1.0",
121+
"rimraf": "^5.0.5",
115122
"source-map-support": "^0.5.21",
116123
"supertest": "^6.3.3",
117-
"jest": "^29.7.0",
118124
"ts-jest": "^29.1.1",
119125
"ts-loader": "^9.5.1",
120126
"ts-node": "^10.9.1",
121127
"tsconfig-paths": "^4.2.0",
122-
"typescript": "^5.3.2",
123-
"rimraf": "^5.0.5",
124-
"@commitlint/cli": "^18.4.3",
125-
"@commitlint/config-conventional": "^18.4.3",
126-
"husky": "^8.0.3",
127-
"lint-staged": "^15.2.0"
128+
"typescript": "^5.3.2"
128129
},
129130
"jest": {
130131
"moduleFileExtensions": [

src/app.module.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { BlockchainModule } from './blockchain/blockchain.module';
1515
import { AuthModule } from './auth/auth.module';
1616
import { FilesModule } from './files/files.module';
1717
import { AuthRateLimitMiddleware } from './auth/middleware/auth.middleware';
18+
import { PropertiesModule } from './properties/properties.module';
1819
import configuration from './config/configuration';
1920

2021
@Module({
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { IsString, IsNotEmpty, IsNumber, ValidateNested, IsArray } from 'class-validator';
2+
import { Type } from 'class-transformer';
3+
4+
class AddressDto {
5+
@IsString()
6+
@IsNotEmpty()
7+
street: string;
8+
9+
@IsString()
10+
@IsNotEmpty()
11+
city: string;
12+
13+
@IsString()
14+
@IsNotEmpty()
15+
country: string;
16+
}
17+
18+
export class CreatePropertyDto {
19+
@IsString()
20+
@IsNotEmpty()
21+
title: string;
22+
23+
@IsNumber()
24+
price: number;
25+
26+
@ValidateNested()
27+
@Type(() => AddressDto)
28+
address: AddressDto;
29+
30+
@IsArray()
31+
@IsString({ each: true })
32+
features: string[];
33+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { PartialType } from '@nestjs/swagger';
2+
import { CreatePropertyDto } from './create-property.dto';
3+
4+
export class UpdatePropertyDto extends PartialType(CreatePropertyDto) {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export class Property {}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { PropertiesController } from './properties.controller';
3+
import { PropertiesService } from './properties.service';
4+
5+
describe('PropertiesController', () => {
6+
let controller: PropertiesController;
7+
8+
beforeEach(async () => {
9+
const module: TestingModule = await Test.createTestingModule({
10+
controllers: [PropertiesController],
11+
providers: [PropertiesService],
12+
}).compile();
13+
14+
controller = module.get<PropertiesController>(PropertiesController);
15+
});
16+
17+
it('should be defined', () => {
18+
expect(controller).toBeDefined();
19+
});
20+
});
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
2+
import { PropertiesService } from './properties.service';
3+
import { CreatePropertyDto } from './dto/create-property.dto';
4+
import { UpdatePropertyDto } from './dto/update-property.dto';
5+
6+
@Controller('properties')
7+
export class PropertiesController {
8+
constructor(private readonly propertiesService: PropertiesService) {}
9+
10+
@Post()
11+
create(@Body() createPropertyDto: CreatePropertyDto) {
12+
return this.propertiesService.create(createPropertyDto);
13+
}
14+
15+
@Get()
16+
findAll() {
17+
return this.propertiesService.findAll();
18+
}
19+
20+
@Get(':id')
21+
findOne(@Param('id') id: string) {
22+
return this.propertiesService.findOne(+id);
23+
}
24+
25+
@Patch(':id')
26+
update(@Param('id') id: string, @Body() updatePropertyDto: UpdatePropertyDto) {
27+
return this.propertiesService.update(+id, updatePropertyDto);
28+
}
29+
30+
@Delete(':id')
31+
remove(@Param('id') id: string) {
32+
return this.propertiesService.remove(+id);
33+
}
34+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
import { Module } from '@nestjs/common';
2+
import { PropertiesService } from './properties.service';
3+
import { PropertiesController } from './properties.controller';
24

3-
@Module({})
5+
@Module({
6+
controllers: [PropertiesController],
7+
providers: [PropertiesService],
8+
})
49
export class PropertiesModule {}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { PropertiesService } from './properties.service';
3+
4+
describe('PropertiesService', () => {
5+
let service: PropertiesService;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [PropertiesService],
10+
}).compile();
11+
12+
service = module.get<PropertiesService>(PropertiesService);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(service).toBeDefined();
17+
});
18+
});

0 commit comments

Comments
 (0)