Skip to content

Commit facdd2c

Browse files
committed
WIP dto tickets module
1 parent ba50edc commit facdd2c

File tree

18 files changed

+474
-72
lines changed

18 files changed

+474
-72
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { IsEnum, IsString } from 'class-validator'
2+
import { ApiProperty } from '@nestjs/swagger'
3+
import { IdnamePartDto } from '~/_common/dto/parts/idname.part.dto'
4+
import { EntityType, EntityTypeList } from '~/_common/enum/entity-type.enum'
5+
6+
export class EntityPartDto extends IdnamePartDto {
7+
@IsString()
8+
@IsEnum(EntityTypeList)
9+
@ApiProperty({ enum: EntityTypeList })
10+
public type: EntityType
11+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { IsMimeType, IsOptional, IsString } from 'class-validator'
2+
import { IdnamePartDto } from '~/_common/dto/parts/idname.part.dto'
3+
import { ApiProperty } from '@nestjs/swagger'
4+
5+
export class IdfsPartDto extends IdnamePartDto {
6+
@IsString()
7+
@ApiProperty()
8+
public namespace: string
9+
10+
@IsString()
11+
@ApiProperty()
12+
public path: string
13+
14+
@IsOptional()
15+
@IsString()
16+
@IsMimeType()
17+
@ApiProperty()
18+
public mime?: string
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { IsMongoId, IsString } from 'class-validator'
2+
import { ApiProperty } from '@nestjs/swagger'
3+
4+
export class IdnamePartDto {
5+
@IsMongoId()
6+
@IsString()
7+
@ApiProperty()
8+
public id: string
9+
10+
@IsString()
11+
@ApiProperty()
12+
public name: string
13+
}

service/src/tickets/sla/_dto/sla.dto.ts

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,52 @@
1-
import { PartialType } from '@nestjs/swagger'
1+
import { ApiProperty, PartialType } from '@nestjs/swagger'
2+
import { AbstractCustomFieldsDto } from '~/_common/abstracts/dto/abstract.custom-fields.dto'
3+
import { IsArray, IsMongoId, IsNumber, IsOptional, IsString, Min } from 'class-validator'
24

3-
export class SlaDto {
5+
export class SlaCreateDto extends AbstractCustomFieldsDto {
6+
@IsString()
7+
@ApiProperty()
8+
public name: string
9+
10+
@IsOptional()
11+
@IsString()
12+
@ApiProperty()
13+
public description?: string
14+
15+
@IsOptional()
16+
@IsString()
17+
@ApiProperty()
18+
public icon?: string
19+
20+
@IsOptional()
21+
@IsString()
22+
@ApiProperty()
23+
public color?: string
24+
25+
@IsArray()
26+
@IsOptional()
27+
@ApiProperty()
28+
public rules: { [key: string]: any }[]
29+
30+
@IsOptional()
31+
@IsString()
32+
@ApiProperty()
33+
public backgroundColor?: string
34+
35+
@IsOptional()
36+
@IsNumber()
37+
@ApiProperty()
38+
public order?: number
39+
40+
@IsNumber()
41+
@Min(1)
42+
@ApiProperty()
43+
public timeToExpire: number
444
}
545

6-
export class SlaCreateDto {
46+
export class SlaDto extends SlaCreateDto {
47+
@IsMongoId()
48+
@ApiProperty()
49+
public _id: string
750
}
851

952
export class SlaUpdateDto extends PartialType(SlaCreateDto) {

service/src/tickets/sla/sla.controller.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@ import { Body, Controller, Delete, Get, HttpStatus, Param, Patch, Post, Req, Res
22
import { SlaService } from './sla.service'
33
import { AbstractController } from '~/_common/abstracts/abstract.controller'
44
import { Request, Response } from 'express'
5-
import { SlaCreateDto, SlaUpdateDto } from '~/tickets/sla/_dto/sla.dto'
5+
import { SlaCreateDto, SlaDto, SlaUpdateDto } from '~/tickets/sla/_dto/sla.dto'
66
import { FilterOptions, FilterSchema, SearchFilterOptions, SearchFilterSchema } from '@streamkits/nestjs_module_scrud'
77
import { ApiParam, ApiTags } from '@nestjs/swagger'
88
import { ObjectIdValidationPipe } from '~/_common/pipes/object-id-validation.pipe'
99
import { Types } from 'mongoose'
10+
import { ApiCreateDecorator } from '~/_common/decorators/api-create.decorator'
11+
import { ApiPaginatedDecorator } from '~/_common/decorators/api-paginated.decorator'
12+
import { PickProjectionHelper } from '~/_common/helpers/pick-projection.helper'
13+
import { PartialProjectionType } from '~/_common/types/partial-projection.type'
14+
import { ApiReadResponseDecorator } from '~/_common/decorators/api-read-response.decorator'
15+
import { ApiUpdateDecorator } from '~/_common/decorators/api-update.decorator'
16+
import { ApiDeletedResponseDecorator } from '~/_common/decorators/api-deleted-response.decorator'
1017

1118
@ApiTags('tickets')
1219
@Controller('sla')
1320
export class SlaController extends AbstractController {
14-
protected readonly projection = {
21+
protected static readonly projection: PartialProjectionType<SlaDto> = {
1522
name: 1,
1623
color: 1,
1724
icon: 1,
@@ -22,7 +29,8 @@ export class SlaController extends AbstractController {
2229
}
2330

2431
@Post()
25-
public async create(@Req() req: Request, @Res() res: Response, @Body() body: SlaCreateDto) {
32+
@ApiCreateDecorator(SlaCreateDto, SlaDto)
33+
public async create(@Req() req: Request, @Res() res: Response, @Body() body: SlaCreateDto): Promise<Response> {
2634
const data = await this._service.create(body)
2735
return res.status(HttpStatus.CREATED).json({
2836
statusCode: HttpStatus.CREATED,
@@ -31,8 +39,9 @@ export class SlaController extends AbstractController {
3139
}
3240

3341
@Get()
34-
public async search(@Res() res: Response, @SearchFilterSchema() searchFilterSchema: FilterSchema, @SearchFilterOptions() searchFilterOptions: FilterOptions) {
35-
const [data, total] = await this._service.findAndCount(searchFilterSchema, this.projection, searchFilterOptions)
42+
@ApiPaginatedDecorator(PickProjectionHelper(SlaDto, SlaController.projection))
43+
public async search(@Res() res: Response, @SearchFilterSchema() searchFilterSchema: FilterSchema, @SearchFilterOptions() searchFilterOptions: FilterOptions): Promise<Response> {
44+
const [data, total] = await this._service.findAndCount(searchFilterSchema, SlaController.projection, searchFilterOptions)
3645
return res.status(HttpStatus.OK).json({
3746
statusCode: HttpStatus.OK,
3847
total,
@@ -42,7 +51,8 @@ export class SlaController extends AbstractController {
4251

4352
@Get(':_id([0-9a-fA-F]{24})')
4453
@ApiParam({ name: '_id', type: String })
45-
public async read(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response) {
54+
@ApiReadResponseDecorator(SlaDto)
55+
public async read(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response): Promise<Response> {
4656
const data = await this._service.findById(_id)
4757
return res.status(HttpStatus.OK).json({
4858
statusCode: HttpStatus.OK,
@@ -52,7 +62,8 @@ export class SlaController extends AbstractController {
5262

5363
@Patch(':_id([0-9a-fA-F]{24})')
5464
@ApiParam({ name: '_id', type: String })
55-
public async update(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Body() body: SlaUpdateDto, @Res() res: Response) {
65+
@ApiUpdateDecorator(SlaUpdateDto, SlaDto)
66+
public async update(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Body() body: SlaUpdateDto, @Res() res: Response): Promise<Response> {
5667
const data = await this._service.update(_id, body)
5768
return res.status(HttpStatus.OK).json({
5869
statusCode: HttpStatus.OK,
@@ -62,7 +73,8 @@ export class SlaController extends AbstractController {
6273

6374
@Delete(':_id([0-9a-fA-F]{24})')
6475
@ApiParam({ name: '_id', type: String })
65-
public async remove(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response) {
76+
@ApiDeletedResponseDecorator(SlaDto)
77+
public async remove(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response): Promise<Response> {
6678
const data = await this._service.delete(_id)
6779
return res.status(HttpStatus.OK).json({
6880
statusCode: HttpStatus.OK,

service/src/tickets/source-request/_dto/source-request.dto.ts

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
1-
import { PartialType } from '@nestjs/swagger'
1+
import { ApiProperty, PartialType } from '@nestjs/swagger'
2+
import { AbstractCustomFieldsDto } from '~/_common/abstracts/dto/abstract.custom-fields.dto'
3+
import { IsArray, IsMongoId, IsNumber, IsOptional, IsString, ValidateNested } from 'class-validator'
24

3-
export class SourceRequestCreateDto {
5+
export class SourceRequestCreateDto extends AbstractCustomFieldsDto {
6+
@IsString()
7+
@ApiProperty()
8+
public name: string
9+
10+
@IsString()
11+
@IsOptional()
12+
@ApiProperty()
13+
public description?: string
14+
15+
@IsString()
16+
@IsOptional()
17+
@ApiProperty()
18+
public icon?: string
19+
20+
@IsString()
21+
@IsOptional()
22+
@ApiProperty()
23+
public color?: string
24+
25+
@IsArray()
26+
@IsOptional()
27+
@ApiProperty()
28+
public rules: { [key: string]: any }[]
29+
30+
@IsString()
31+
@IsOptional()
32+
@ApiProperty()
33+
public backgroundColor?: string
34+
35+
@IsNumber()
36+
@IsOptional()
37+
@ApiProperty()
38+
public order?: number
39+
}
40+
41+
export class SourceRequestDto extends SourceRequestCreateDto {
42+
@IsMongoId()
43+
@ApiProperty()
44+
public _id: string
445
}
546

647
export class SourceRequestUpdateDto extends PartialType(SourceRequestCreateDto) {

service/src/tickets/source-request/source-request.controller.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
1-
import { Body, Controller, Delete, Get, HttpStatus, Param, Patch, Post, Req, Res } from '@nestjs/common'
1+
import { Body, Controller, Delete, Get, HttpStatus, Param, Patch, Post, Res } from '@nestjs/common'
22
import { AbstractController } from '~/_common/abstracts/abstract.controller'
3-
import { Request, Response } from 'express'
3+
import { Response } from 'express'
44
import { FilterOptions, FilterSchema, SearchFilterOptions, SearchFilterSchema } from '@streamkits/nestjs_module_scrud'
55
import { ApiParam, ApiTags } from '@nestjs/swagger'
66
import { ObjectIdValidationPipe } from '~/_common/pipes/object-id-validation.pipe'
77
import { Types } from 'mongoose'
8-
import { SourceRequestCreateDto, SourceRequestUpdateDto } from '~/tickets/source-request/_dto/source-request.dto'
8+
import {
9+
SourceRequestCreateDto,
10+
SourceRequestDto,
11+
SourceRequestUpdateDto,
12+
} from '~/tickets/source-request/_dto/source-request.dto'
913
import { SourceRequestService } from '~/tickets/source-request/source-request.service'
14+
import { PartialProjectionType } from '~/_common/types/partial-projection.type'
15+
import { ApiCreateDecorator } from '~/_common/decorators/api-create.decorator'
16+
import { ApiPaginatedDecorator } from '~/_common/decorators/api-paginated.decorator'
17+
import { PickProjectionHelper } from '~/_common/helpers/pick-projection.helper'
18+
import { ApiReadResponseDecorator } from '~/_common/decorators/api-read-response.decorator'
19+
import { ApiUpdateDecorator } from '~/_common/decorators/api-update.decorator'
20+
import { ApiDeletedResponseDecorator } from '~/_common/decorators/api-deleted-response.decorator'
1021

1122
@ApiTags('tickets')
1223
@Controller('source-request')
1324
export class SourceRequestController extends AbstractController {
14-
protected readonly projection = {
25+
protected static readonly projection: PartialProjectionType<SourceRequestDto> = {
1526
name: 1,
1627
color: 1,
1728
icon: 1,
@@ -22,7 +33,8 @@ export class SourceRequestController extends AbstractController {
2233
}
2334

2435
@Post()
25-
public async create(@Req() req: Request, @Res() res: Response, @Body() body: SourceRequestCreateDto) {
36+
@ApiCreateDecorator(SourceRequestCreateDto, SourceRequestDto)
37+
public async create(@Res() res: Response, @Body() body: SourceRequestCreateDto): Promise<Response> {
2638
const data = await this._service.create(body)
2739
return res.status(HttpStatus.CREATED).json({
2840
statusCode: HttpStatus.CREATED,
@@ -31,8 +43,9 @@ export class SourceRequestController extends AbstractController {
3143
}
3244

3345
@Get()
34-
public async search(@Res() res: Response, @SearchFilterSchema() searchFilterSchema: FilterSchema, @SearchFilterOptions() searchFilterOptions: FilterOptions) {
35-
const [data, total] = await this._service.findAndCount(searchFilterSchema, this.projection, searchFilterOptions)
46+
@ApiPaginatedDecorator(PickProjectionHelper(SourceRequestDto, SourceRequestController.projection))
47+
public async search(@Res() res: Response, @SearchFilterSchema() searchFilterSchema: FilterSchema, @SearchFilterOptions() searchFilterOptions: FilterOptions): Promise<Response> {
48+
const [data, total] = await this._service.findAndCount(searchFilterSchema, SourceRequestController.projection, searchFilterOptions)
3649
return res.status(HttpStatus.OK).json({
3750
statusCode: HttpStatus.OK,
3851
total,
@@ -42,7 +55,8 @@ export class SourceRequestController extends AbstractController {
4255

4356
@Get(':_id([0-9a-fA-F]{24})')
4457
@ApiParam({ name: '_id', type: String })
45-
public async read(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response) {
58+
@ApiReadResponseDecorator(SourceRequestDto)
59+
public async read(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response): Promise<Response> {
4660
const data = await this._service.findById(_id)
4761
return res.status(HttpStatus.OK).json({
4862
statusCode: HttpStatus.OK,
@@ -52,7 +66,8 @@ export class SourceRequestController extends AbstractController {
5266

5367
@Patch(':_id([0-9a-fA-F]{24})')
5468
@ApiParam({ name: '_id', type: String })
55-
public async update(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Body() body: SourceRequestUpdateDto, @Res() res: Response) {
69+
@ApiUpdateDecorator(SourceRequestUpdateDto, SourceRequestDto)
70+
public async update(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Body() body: SourceRequestUpdateDto, @Res() res: Response): Promise<Response> {
5671
const data = await this._service.update(_id, body)
5772
return res.status(HttpStatus.OK).json({
5873
statusCode: HttpStatus.OK,
@@ -62,7 +77,8 @@ export class SourceRequestController extends AbstractController {
6277

6378
@Delete(':_id([0-9a-fA-F]{24})')
6479
@ApiParam({ name: '_id', type: String })
65-
public async remove(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response) {
80+
@ApiDeletedResponseDecorator(SourceRequestDto)
81+
public async remove(@Param('_id', ObjectIdValidationPipe) _id: Types.ObjectId, @Res() res: Response): Promise<Response> {
6682
const data = await this._service.delete(_id)
6783
return res.status(HttpStatus.OK).json({
6884
statusCode: HttpStatus.OK,

service/src/tickets/state/_dto/state.dto.ts

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,48 @@
1-
import { PartialType } from '@nestjs/swagger'
1+
import { ApiProperty, PartialType } from '@nestjs/swagger'
2+
import { AbstractCustomFieldsDto } from '~/_common/abstracts/dto/abstract.custom-fields.dto'
3+
import { IsArray, IsMongoId, IsNumber, IsOptional, IsString } from 'class-validator'
24

3-
export class StatesCreateDto {
5+
export class StatesCreateDto extends AbstractCustomFieldsDto {
6+
@IsString()
7+
@ApiProperty()
8+
public name: string
9+
10+
@IsOptional()
11+
@IsString()
12+
@ApiProperty()
13+
public description: string
14+
15+
@IsOptional()
16+
@IsString()
17+
@ApiProperty()
18+
public icon?: string
19+
20+
@IsOptional()
21+
@IsString()
22+
@ApiProperty()
23+
public color?: string
24+
25+
@IsArray()
26+
@IsOptional()
27+
@ApiProperty()
28+
@ApiProperty()
29+
public rules: { [key: string]: any }[]
30+
31+
@IsOptional()
32+
@IsString()
33+
@ApiProperty()
34+
public backgroundColor?: string
35+
36+
@IsOptional()
37+
@IsNumber()
38+
@ApiProperty()
39+
public order: number
40+
}
41+
42+
export class StatesDto extends StatesCreateDto {
43+
@IsMongoId()
44+
@ApiProperty()
45+
public _id: string
446
}
547

648
export class StatesUpdateDto extends PartialType(StatesCreateDto) {

0 commit comments

Comments
 (0)