Skip to content

Commit d8c2c19

Browse files
committed
feature/EF-202[VisitShowroomBooking]List and Detail API
1 parent 3916651 commit d8c2c19

File tree

5 files changed

+111
-2
lines changed

5 files changed

+111
-2
lines changed

src/common/contracts/error.ts

+5
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,9 @@ export const Errors: Record<string, ErrorResponse> = {
111111
message: 'Công việc được chọn không hợp lệ',
112112
httpStatus: HttpStatus.BAD_REQUEST
113113
},
114+
VISIT_SHOWROOM_BOOKING_NOT_FOUND: {
115+
error: 'VISIT_SHOWROOM_BOOKING_NOT_FOUND',
116+
message: 'Không tìm thấy lịch tham quan showroom. Vui lòng thử lại',
117+
httpStatus: HttpStatus.BAD_REQUEST
118+
}
114119
}

src/visit-showroom-booking/booking.module.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import { VisitShowroomBookingCustomerController } from '@visit-showroom-booking/
77
import { VisitShowroomBookingService } from '@visit-showroom-booking/services/booking.service'
88
import { VisitShowroomBookingRepository } from '@visit-showroom-booking/repositories/booking.repository'
99
import { CustomerModule } from '@customer/customer.module'
10+
import { VisitShowroomBookingProviderController } from './controllers/provider.controller'
1011

1112
@Module({
1213
imports: [
1314
MongooseModule.forFeature([{ name: VisitShowroomBooking.name, schema: VisitShowroomBookingSchema }]),
1415
CategoryModule,
1516
CustomerModule
1617
],
17-
controllers: [VisitShowroomBookingCustomerController],
18+
controllers: [VisitShowroomBookingCustomerController, VisitShowroomBookingProviderController],
1819
providers: [VisitShowroomBookingService, VisitShowroomBookingRepository],
1920
exports: [VisitShowroomBookingService]
2021
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { Controller, Get, Param, Req, UseGuards } from '@nestjs/common'
2+
import { ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'
3+
import * as _ from 'lodash'
4+
5+
import { ErrorResponse, PaginationQuery } from '@common/contracts/dto'
6+
import { UserRole } from '@common/contracts/constant'
7+
import { Roles } from '@auth/decorators/roles.decorator'
8+
import { JwtAuthGuard } from '@auth/guards/jwt-auth.guard'
9+
import { RolesGuard } from '@auth/guards/roles.guard'
10+
import { Pagination, PaginationParams } from '@common/decorators/pagination.decorator'
11+
import { ParseObjectIdPipe } from '@common/pipes/parse-object-id.pipe'
12+
import { VisitShowroomBookingService } from '@visit-showroom-booking/services/booking.service'
13+
import { VisitShowroomBookingPaginateResponseDto, VisitShowroomBookingResponseDto } from '@visit-showroom-booking/dto/booking.dto'
14+
15+
@ApiTags('VisitShowroomBooking - Provider')
16+
@ApiBearerAuth()
17+
@UseGuards(JwtAuthGuard.ACCESS_TOKEN)
18+
@Controller('provider')
19+
export class VisitShowroomBookingProviderController {
20+
constructor(private readonly visitShowroomBookingService: VisitShowroomBookingService) {}
21+
22+
@Get()
23+
@ApiOperation({
24+
summary: 'Get visit showroom bookings list'
25+
})
26+
@Roles(UserRole.ADMIN, UserRole.STAFF)
27+
@UseGuards(RolesGuard)
28+
@ApiQuery({ type: PaginationQuery })
29+
@ApiOkResponse({ type: VisitShowroomBookingPaginateResponseDto })
30+
async paginate(@Pagination() paginationParams: PaginationParams) {
31+
return await this.visitShowroomBookingService.paginate({}, paginationParams)
32+
}
33+
34+
@Get(':bookingId')
35+
@ApiOperation({
36+
summary: 'Get visit showroom booking details'
37+
})
38+
@Roles(UserRole.ADMIN, UserRole.STAFF)
39+
@UseGuards(RolesGuard)
40+
@ApiOkResponse({ type: VisitShowroomBookingResponseDto })
41+
@ApiBadRequestResponse({ type: ErrorResponse })
42+
async getOne(@Req() req, @Param('bookingId', ParseObjectIdPipe) bookingId: string) {
43+
return await this.visitShowroomBookingService.getOne({ _id: bookingId })
44+
}
45+
}

src/visit-showroom-booking/dto/booking.dto.ts

+29
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'
22
import { IsDateString, IsMongoId, IsNotEmpty, MaxLength, ValidateNested } from 'class-validator'
33
import { Type } from 'class-transformer'
44
import { BookingHistoryDto, CustomerDto } from '@visit-showroom-booking/schemas/booking.schema'
5+
import { BookingStatus } from '@common/contracts/constant'
6+
import { Category } from '@category/schemas/category.schema'
7+
import { DataResponse, PaginateResponse } from '@common/contracts/openapi-builder'
58

69
export class CreateVisitShowroomBookingDto {
710
@ApiProperty({ type: () => CustomerDto })
@@ -25,3 +28,29 @@ export class CreateVisitShowroomBookingDto {
2528

2629
bookingHistory?: BookingHistoryDto[]
2730
}
31+
32+
export class VisitShowroomBookingDto {
33+
@ApiProperty()
34+
_id: string
35+
36+
@ApiProperty({ type: CustomerDto })
37+
customer: CustomerDto
38+
39+
@ApiProperty()
40+
bookingDate: Date
41+
42+
@ApiProperty()
43+
bookingStatus: BookingStatus
44+
45+
@ApiPropertyOptional({ isArray: true, type: Category })
46+
interestedCategories?: Category[]
47+
48+
@ApiPropertyOptional()
49+
notes?: string
50+
}
51+
52+
export class VisitShowroomBookingPaginateResponseDto extends DataResponse(
53+
class VisitShowroomBookingPaginateResponse extends PaginateResponse(VisitShowroomBookingDto) {}
54+
) {}
55+
56+
export class VisitShowroomBookingResponseDto extends DataResponse(VisitShowroomBookingDto) {}

src/visit-showroom-booking/services/booking.service.ts

+30-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import { Errors } from '@src/common/contracts/error'
66
import { CreateVisitShowroomBookingDto } from '@visit-showroom-booking/dto/booking.dto'
77
import { CategoryRepository } from '@category/repositories/category.repository'
88
import { VisitShowroomBookingRepository } from '@visit-showroom-booking/repositories/booking.repository'
9-
import { BookingHistoryDto } from '@visit-showroom-booking/schemas/booking.schema'
9+
import { BookingHistoryDto, VisitShowroomBooking } from '@visit-showroom-booking/schemas/booking.schema'
1010
import { CustomerRepository } from '@customer/repositories/customer.repository'
1111
import { MailerService } from '@nestjs-modules/mailer'
1212
import * as moment from 'moment'
13+
import { FilterQuery } from 'mongoose'
14+
import { PaginationParams } from '@common/decorators/pagination.decorator'
1315

1416
@Injectable()
1517
export class VisitShowroomBookingService {
@@ -71,4 +73,31 @@ export class VisitShowroomBookingService {
7173

7274
return new IDResponse(booking._id)
7375
}
76+
77+
public async paginate(filter: FilterQuery<VisitShowroomBooking>, paginationParams: PaginationParams) {
78+
const result = await this.visitShowroomBookingRepository.paginate(
79+
{
80+
...filter,
81+
status: {
82+
$ne: BookingStatus.DELETED
83+
}
84+
},
85+
{ ...paginationParams }
86+
)
87+
return result
88+
}
89+
90+
public async getOne(filter: FilterQuery<VisitShowroomBooking>) {
91+
const booking = await this.visitShowroomBookingRepository.findOne({
92+
conditions: {
93+
...filter,
94+
status: {
95+
$ne: BookingStatus.DELETED
96+
}
97+
}
98+
})
99+
if (!booking) throw new AppException(Errors.VISIT_SHOWROOM_BOOKING_NOT_FOUND)
100+
101+
return booking
102+
}
74103
}

0 commit comments

Comments
 (0)