diff --git a/src/actions/actions.controller.ts b/src/actions/actions.controller.ts index 097ff18..4af9152 100644 --- a/src/actions/actions.controller.ts +++ b/src/actions/actions.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { ActionsService } from './actions.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; @@ -50,6 +50,7 @@ export class ActionsController { } @Post() + @UsePipes(new ValidationPipe({ whitelist: true})) async insert(@Body() actions: Actions, @Res() res: Response) { if(!actions) { const response = new GenericResponse({ diff --git a/src/actions/actions.service.ts b/src/actions/actions.service.ts index 1cd77e7..aaf140e 100644 --- a/src/actions/actions.service.ts +++ b/src/actions/actions.service.ts @@ -25,7 +25,7 @@ export class ActionsService { return Actions.destroy({ where: { id: id } }); } - async upsert(actions: Actions, insertIfNotFound: boolean): Promise { + async upsert(actions: any, insertIfNotFound: boolean): Promise { if (actions.id) { const existingActions = await this.findByPk(actions.id); if (existingActions) { diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 9fb42cf..5b2d623 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -13,7 +13,7 @@ export class AuthService { constructor(private userService: UserService, private jwtService: JwtService) { } - private signToken(payload: any, type: 'accessToken' | 'refreshToken') { + private signToken(payload: any, type: 'accessToken' | 'refreshToken') { const config = Utility.jwtConfig[type]; return this.jwtService.sign(payload, { secret: config.secretOrKey, @@ -28,17 +28,17 @@ export class AuthService { secret: config.secretOrKey, }); } catch (error) { - // console.log(`${type} token is invalid`, error); return null; } } - async validateUser(payload: JwtPayload) { + async validateUser(payload: any) { return this.userService.findByEmail(payload.email); } async login(user: any) { - const payload: JwtPayload = { email: user.email, password: user.password }; + const { password, ...rest } = user; + const payload = { rest }; const accessToken = this.signToken(payload, 'accessToken'); const refreshToken = this.signToken(payload, 'refreshToken'); await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' }); @@ -49,7 +49,8 @@ export class AuthService { } async signup(user: any) { - const payload: JwtPayload = { email: user.email, password: user.password }; + const { password, ...rest } = user; + const payload = { rest }; const accessToken = this.signToken(payload, 'accessToken'); const refreshToken = this.signToken(payload, 'refreshToken'); await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' }); @@ -64,34 +65,23 @@ export class AuthService { if (!payload) { throw new Error('Invalid refresh token'); } - - // console.log(refreshToken); - // console.log(payload); const user = await this.userService.findByEmail(payload.email); if (!user) { throw new Error('User not found'); } - // console.log(user) - const accessToken = this.signToken({ - email: payload.email - }, 'accessToken'); - // console.log(accessToken) + const { password, ...rest } = user; + const newPayload = { rest }; + const accessToken = this.signToken({ newPayload }, 'accessToken'); return { access_token: accessToken }; } async verifyRefreshToken(refreshToken: string) { const payload = this.verifyToken(refreshToken, 'refreshToken'); - if (payload) { - console.log("Refresh token is valid", payload); - } return payload; } async verifyAccessToken(accessToken: string) { const payload = this.verifyToken(accessToken, 'accessToken'); - if (payload) { - console.log("Access token is valid", payload); - } return payload; } @@ -122,8 +112,9 @@ export class AuthService { } const payload = existingUser.get(); - const accessToken = await this.signToken(payload, 'accessToken'); - const refreshToken = await this.signToken(payload, 'refreshToken'); + const { password, ...rest } = payload + const accessToken = this.signToken(rest, 'accessToken'); + const refreshToken = this.signToken(rest, 'refreshToken'); await RefreshToken.create({ email: payload.email, token: refreshToken, type: 'jwt' }); return { statusCode: 200, diff --git a/src/cast/cast.controller.ts b/src/cast/cast.controller.ts index 2032ef8..e045683 100644 --- a/src/cast/cast.controller.ts +++ b/src/cast/cast.controller.ts @@ -1,14 +1,15 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; -import { CastService } from './cast.service'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; +import { CastService } from './cast.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; -import Cast from './cast.entity'; +import Cast from './cast.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { CastDTO, CastUpdateDTO } from './cast.dto'; @ApiTags('cast') @Controller('cast') export class CastController { - constructor(private castService: CastService) {} + constructor(private castService: CastService) { } @Get("/all") @ApiOperation({ summary: 'Get all casts' }) @@ -160,7 +161,7 @@ export class CastController { @Post() @ApiOperation({ summary: 'Insert a new cast' }) - @ApiBody({ type: Cast, description: 'Cast data to insert' }) + @ApiBody({ type: CastDTO, description: 'Cast data to insert' }) @ApiResponse({ status: 400, description: 'Invalid cast data', @@ -178,7 +179,8 @@ export class CastController { status: 201, description: 'Successfully created a cast', }) - async insert(@Body() cast: Cast, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() cast: CastDTO, @Res() res: Response) { if (!cast) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class CastController { }, null); return res.status(400).send(response); } - delete cast.id; // Ensure no ID is passed in the creation const response = await this.castService.upsert(cast, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class CastController { @Put() @ApiOperation({ summary: 'Update an existing cast' }) - @ApiBody({ type: Cast, description: 'Cast data to update' }) + @ApiBody({ type: CastUpdateDTO, description: 'Cast data to update' }) @ApiResponse({ status: 400, description: 'Invalid cast data or ID missing', @@ -227,7 +228,8 @@ export class CastController { status: 200, description: 'Successfully updated cast', }) - async update(@Body() cast: Cast, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() cast: CastUpdateDTO, @Res() res: Response) { if (!cast || !cast.id) { const response = new GenericResponse({ exception: true, diff --git a/src/cast/cast.dto.ts b/src/cast/cast.dto.ts index b5fe881..79999a5 100644 --- a/src/cast/cast.dto.ts +++ b/src/cast/cast.dto.ts @@ -2,7 +2,7 @@ import { IsString, IsNumber, IsDate, IsOptional, IsNotEmpty } from 'class-valida import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -export class CastMemberDTO { +export class CastDTO { @ApiProperty({ type: Number }) @IsNumber() @@ -69,3 +69,11 @@ export class CastMemberDTO { @IsNotEmpty() version: number; } + +export class CastUpdateDTO extends CastDTO { + + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + id: number; +} \ No newline at end of file diff --git a/src/cast/cast.service.ts b/src/cast/cast.service.ts index 8430bed..1d04519 100644 --- a/src/cast/cast.service.ts +++ b/src/cast/cast.service.ts @@ -27,7 +27,7 @@ export class CastService { return Cast.destroy({ where: { id: id } }); } - async upsert(cast: Cast, insertIfNotFound: boolean): Promise { + async upsert(cast: any, insertIfNotFound: boolean): Promise { if (cast.id) { const existingCast = await this.findByPk(cast.id); if (existingCast) { diff --git a/src/event-analytics/event-analytics.controller.ts b/src/event-analytics/event-analytics.controller.ts index a0e531d..1127e39 100644 --- a/src/event-analytics/event-analytics.controller.ts +++ b/src/event-analytics/event-analytics.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { EventAnalyticsService } from './event-analytics.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import EventAnalytics from './event-analytics.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { EventAnalyticsDTO, EventAnalyticsUpdateDTO } from './event-analytics.dto'; @ApiTags('event-analytics') @Controller('event-analytics') @@ -148,7 +149,7 @@ export class EventAnalyticsController { @Post() @ApiOperation({ summary: 'Insert a new event analytics record' }) - @ApiBody({ type: EventAnalytics, description: 'Event analytics data to insert' }) + @ApiBody({ type: EventAnalyticsDTO, description: 'Event analytics data to insert' }) @ApiResponse({ status: 400, description: 'Invalid event analytics data', @@ -163,7 +164,8 @@ export class EventAnalyticsController { } }) @ApiResponse({ status: 201, description: 'Successfully created event analytics record' }) - async insert(@Body() analytics: EventAnalytics, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() analytics: EventAnalyticsDTO, @Res() res: Response) { if (!analytics) { return res.status(400).send(new GenericResponse({ exception: true, @@ -172,15 +174,13 @@ export class EventAnalyticsController { stackTrace: 'Request' }, null)); } - - delete analytics.id; const response = await this.eventAnalyticsService.upsert(analytics, true); res.status(201).send(new GenericResponse(null, response)); } @Put() @ApiOperation({ summary: 'Update an existing event analytics record' }) - @ApiBody({ type: EventAnalytics, description: 'Event analytics data to update' }) + @ApiBody({ type: EventAnalyticsUpdateDTO, description: 'Event analytics data to update' }) @ApiResponse({ status: 400, description: 'Invalid event analytics data or ID missing', @@ -208,7 +208,8 @@ export class EventAnalyticsController { } }) @ApiResponse({ status: 200, description: 'Successfully updated event analytics record' }) - async update(@Body() analytics: EventAnalytics, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() analytics: EventAnalyticsUpdateDTO, @Res() res: Response) { if (!analytics || !analytics.id) { return res.status(400).send(new GenericResponse({ exception: true, diff --git a/src/event-analytics/event-analytics.service.ts b/src/event-analytics/event-analytics.service.ts index 02e5413..d3e1528 100644 --- a/src/event-analytics/event-analytics.service.ts +++ b/src/event-analytics/event-analytics.service.ts @@ -27,7 +27,7 @@ export class EventAnalyticsService { return EventAnalytics.destroy({ where: { id: id } }); } - async upsert(eventAnalytics: EventAnalytics, insertIfNotFound: boolean): Promise { + async upsert(eventAnalytics: any, insertIfNotFound: boolean): Promise { if (eventAnalytics.id) { const existing = await this.findByPk(eventAnalytics.id); if (existing) { diff --git a/src/event-category/event-category.controller.ts b/src/event-category/event-category.controller.ts index c438898..c659c5c 100644 --- a/src/event-category/event-category.controller.ts +++ b/src/event-category/event-category.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { EventCategoryService } from './event-category.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import EventCategory from './event-category.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { EventCategoryDTO, EventCategoryUpdateDTO } from './event-category.dto'; @ApiTags('eventCategory') @Controller('eventCategory') @@ -151,7 +152,7 @@ export class EventCategoryController { @Post() @ApiOperation({ summary: 'Insert a new event category' }) - @ApiBody({ type: EventCategory, description: 'Event category data to insert' }) + @ApiBody({ type: EventCategoryDTO, description: 'Event category data to insert' }) @ApiResponse({ status: 201, description: 'Successfully created an event category' }) @ApiResponse({ status: 400, @@ -166,7 +167,8 @@ export class EventCategoryController { data: null } }) - async insert(@Body() category: EventCategory, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() category: EventCategoryDTO, @Res() res: Response) { if (!category) { return res.status(400).send(new GenericResponse({ exception: true, @@ -175,15 +177,13 @@ export class EventCategoryController { stackTrace: 'Request' }, null)); } - - delete category.id; const response = await this.eventCategoryService.upsert(category, true); res.status(201).send(new GenericResponse(null, response)); } @Put() @ApiOperation({ summary: 'Update an existing event category' }) - @ApiBody({ type: EventCategory, description: 'Event category data to update' }) + @ApiBody({ type: EventCategoryUpdateDTO, description: 'Event category data to update' }) @ApiResponse({ status: 200, description: 'Successfully updated event category' }) @ApiResponse({ status: 400, @@ -211,7 +211,8 @@ export class EventCategoryController { data: null } }) - async update(@Body() category: EventCategory, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() category: EventCategoryUpdateDTO, @Res() res: Response) { if (!category || !category.id) { return res.status(400).send(new GenericResponse({ exception: true, diff --git a/src/event-category/event-category.service.ts b/src/event-category/event-category.service.ts index 5944be3..c28f251 100644 --- a/src/event-category/event-category.service.ts +++ b/src/event-category/event-category.service.ts @@ -26,7 +26,7 @@ export class EventCategoryService { return EventCategory.destroy({ where: { id } }); } - async upsert(category: EventCategory, insertIfNotFound: boolean): Promise { + async upsert(category: any, insertIfNotFound: boolean): Promise { if (category.id) { const existingCategory = await this.findByPk(category.id); if (existingCategory) { diff --git a/src/event-episodes/event-episodes.controller.ts b/src/event-episodes/event-episodes.controller.ts index 1269d33..e7a24ba 100644 --- a/src/event-episodes/event-episodes.controller.ts +++ b/src/event-episodes/event-episodes.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { EventEpisodeService } from './event-episodes.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import EventEpisode from './event-episodes.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { EventEpisodeDTO, EventEpisodeUpdateDTO } from './event-episodes.dto'; @ApiTags('event-episode') @Controller('event-episode') @@ -160,7 +161,7 @@ export class EventEpisodeController { @Post() @ApiOperation({ summary: 'Insert a new event episode' }) - @ApiBody({ type: EventEpisode, description: 'Event episode data to insert' }) + @ApiBody({ type: EventEpisodeDTO, description: 'Event episode data to insert' }) @ApiResponse({ status: 400, description: 'Invalid event episode data', @@ -178,7 +179,8 @@ export class EventEpisodeController { status: 201, description: 'Successfully created an event episode', }) - async insert(@Body() eventEpisode: EventEpisode, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() eventEpisode: EventEpisodeDTO, @Res() res: Response) { if (!eventEpisode) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class EventEpisodeController { }, null); return res.status(400).send(response); } - delete eventEpisode.id; // Ensure no ID is passed in the creation const response = await this.eventEpisodeService.upsert(eventEpisode, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class EventEpisodeController { @Put() @ApiOperation({ summary: 'Update an existing event episode' }) - @ApiBody({ type: EventEpisode, description: 'Event episode data to update' }) + @ApiBody({ type: EventEpisodeUpdateDTO, description: 'Event episode data to update' }) @ApiResponse({ status: 400, description: 'Invalid event episode data or ID missing', @@ -227,7 +228,8 @@ export class EventEpisodeController { status: 200, description: 'Successfully updated event episode', }) - async update(@Body() eventEpisode: EventEpisode, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() eventEpisode: EventEpisodeUpdateDTO, @Res() res: Response) { if (!eventEpisode || !eventEpisode.id) { const response = new GenericResponse({ exception: true, diff --git a/src/event-episodes/event-episodes.dto.ts b/src/event-episodes/event-episodes.dto.ts index 1622c57..31fff94 100644 --- a/src/event-episodes/event-episodes.dto.ts +++ b/src/event-episodes/event-episodes.dto.ts @@ -91,3 +91,9 @@ export class EventEpisodeDTO { @IsNotEmpty() version: number; } +export class EventEpisodeUpdateDTO extends EventEpisodeDTO { + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + id: number; +} \ No newline at end of file diff --git a/src/event-episodes/event-episodes.service.ts b/src/event-episodes/event-episodes.service.ts index e6e8079..5a7b92c 100644 --- a/src/event-episodes/event-episodes.service.ts +++ b/src/event-episodes/event-episodes.service.ts @@ -27,7 +27,7 @@ export class EventEpisodeService { return EventEpisode.destroy({ where: { id: id } }); } - async upsert(eventEpisode: EventEpisode, insertIfNotFound: boolean): Promise { + async upsert(eventEpisode: any, insertIfNotFound: boolean): Promise { if (eventEpisode.id) { const existingEventEpisode = await this.findByPk(eventEpisode.id); if (existingEventEpisode) { diff --git a/src/event/event.controller.ts b/src/event/event.controller.ts index 26b9427..3d06aca 100644 --- a/src/event/event.controller.ts +++ b/src/event/event.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res, UploadedFile, UploadedFiles, UseInterceptors } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UploadedFile, UploadedFiles, UseInterceptors, UsePipes, ValidationPipe } from '@nestjs/common'; import { EventService } from './event.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; @@ -7,6 +7,7 @@ import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/s import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; import { diskStorage } from 'multer'; import path from 'path'; +import { EventDTO, EventUpdateDTO } from './event.dto'; @ApiTags('event') @Controller('event') @@ -191,23 +192,24 @@ export class EventController { } }) })) - async insert(@Body() body: any, @Res() res: Response, @UploadedFiles() files?: Express.Multer.File[]) { - const event = JSON.parse(body.event) - console.log(event); - if (!files) { - console.log("No files"); - } - if (!event.orgEmail) { + @UsePipes(new ValidationPipe({ whitelist: true , skipMissingProperties: true })) + async insert(@Body() body: EventDTO, @Res() res: Response, @UploadedFiles() files?: Express.Multer.File[]) { + // const event = JSON.parse(body) + // console.log(body); + // if (!files) { + // console.log("No files"); + // } + if (!body.organizer_id) { const response = new GenericResponse({ exception: true, exceptionSeverity: 'HIGH', - exceptionMessage: 'ERR.MISSING_ORG_EMAIL', + exceptionMessage: 'ERR.MISSING_ORGANIZER_ID', stackTrace: 'Request' }, null); return res.status(400).send(response); } - console.log(files); - if (!event || !files) { + // console.log(files); + if (!body || !files) { const response = new GenericResponse({ exception: true, exceptionSeverity: 'HIGH', @@ -218,12 +220,11 @@ export class EventController { } const imageFiles = files.filter(file => file.mimetype.startsWith('image/')).map(file => file.filename); const videoFiles = files.filter(file => file.mimetype.startsWith('video/')).map(file => file.filename); - event.images = { + body.images = { images: imageFiles, videos: videoFiles, }; - delete event.id; - const response = await this.eventService.upsert(event, true); + const response = await this.eventService.upsert(body, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); } @@ -261,7 +262,8 @@ export class EventController { status: 200, description: 'Successfully updated event', }) - async update(@Body() event: Event, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() event: EventUpdateDTO, @Res() res: Response) { if (!event || !event.id) { const response = new GenericResponse({ exception: true, diff --git a/src/event/event.service.ts b/src/event/event.service.ts index 02c0079..625aa01 100644 --- a/src/event/event.service.ts +++ b/src/event/event.service.ts @@ -13,11 +13,7 @@ export class EventService { } async findByPk(id: number): Promise { - - const event = Event.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await event).textbookId); - - return event + return Event.findByPk(id); } findOne(event: Event): Promise { @@ -32,16 +28,14 @@ export class EventService { return Event.destroy({ where: { id: id } }); } - async upsert(event: Event, insertIfNotFound: boolean): Promise { + async upsert(event: any, insertIfNotFound: boolean): Promise { if (event.id) { const existingEvent = await this.findByPk(event.id); if (existingEvent) { return Event.update(event, { where: { id: event.id } }); } } - if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(event.textbookId); - + if (insertIfNotFound) { return Event.create(event as any) } } diff --git a/src/event/eventAdditionalDetail/eventAdditionalDetail.controller.ts b/src/event/eventAdditionalDetail/eventAdditionalDetail.controller.ts index e7bd5ba..0bc063a 100644 --- a/src/event/eventAdditionalDetail/eventAdditionalDetail.controller.ts +++ b/src/event/eventAdditionalDetail/eventAdditionalDetail.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { EventAdditionalDetailService } from './eventAdditionalDetail.service'; import { Response } from 'express'; import { GenericResponse } from '../../common/GenericResponse.model'; import EventAdditionalDetail from './eventAdditionalDetail.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { EventAdditionalDetailDTO, EventAdditionalDetailUpdateDTO } from './eventAdditionalDetail.dto'; @ApiTags('event/addl') @Controller('event/addl/') @@ -160,7 +161,7 @@ export class EventAdditionalDetailController { @Post() @ApiOperation({ summary: 'Insert a new eventAdditionalDetail' }) - @ApiBody({ type: EventAdditionalDetail, description: 'EventAdditionalDetail data to insert' }) + @ApiBody({ type: EventAdditionalDetailDTO, description: 'EventAdditionalDetail data to insert' }) @ApiResponse({ status: 400, description: 'Invalid eventAdditionalDetail data', @@ -178,7 +179,8 @@ export class EventAdditionalDetailController { status: 201, description: 'Successfully created a eventAdditionalDetail', }) - async insert(@Body() eventAdditionalDetail: EventAdditionalDetail, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() eventAdditionalDetail: EventAdditionalDetailDTO, @Res() res: Response) { if (!eventAdditionalDetail) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class EventAdditionalDetailController { }, null); return res.status(400).send(response); } - delete eventAdditionalDetail.id; const response = await this.eventAdditionalDetailService.upsert(eventAdditionalDetail, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class EventAdditionalDetailController { @Put() @ApiOperation({ summary: 'Update an existing eventAdditionalDetail' }) - @ApiBody({ type: EventAdditionalDetail, description: 'EventAdditionalDetail data to update' }) + @ApiBody({ type: EventAdditionalDetailUpdateDTO, description: 'EventAdditionalDetail data to update' }) @ApiResponse({ status: 400, description: 'Invalid eventAdditionalDetail data or ID missing', @@ -227,7 +228,8 @@ export class EventAdditionalDetailController { status: 200, description: 'Successfully updated eventAdditionalDetail', }) - async update(@Body() eventAdditionalDetail: EventAdditionalDetail, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() eventAdditionalDetail: EventAdditionalDetailUpdateDTO, @Res() res: Response) { if (!eventAdditionalDetail || !eventAdditionalDetail.id) { const response = new GenericResponse({ exception: true, diff --git a/src/event/eventAdditionalDetail/eventAdditionalDetail.service.ts b/src/event/eventAdditionalDetail/eventAdditionalDetail.service.ts index db04604..dc2c3e2 100644 --- a/src/event/eventAdditionalDetail/eventAdditionalDetail.service.ts +++ b/src/event/eventAdditionalDetail/eventAdditionalDetail.service.ts @@ -14,9 +14,7 @@ export class EventAdditionalDetailService { async findByPk(id: number): Promise { - const eventAdditionalDetail = EventAdditionalDetail.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await eventAdditionalDetail).textbookId); - + const eventAdditionalDetail = EventAdditionalDetail.findByPk(id,) return eventAdditionalDetail } @@ -32,16 +30,14 @@ export class EventAdditionalDetailService { return EventAdditionalDetail.destroy({ where: { id: id } }); } - async upsert(eventAdditionalDetail: EventAdditionalDetail, insertIfNotFound: boolean): Promise { + async upsert(eventAdditionalDetail: any, insertIfNotFound: boolean): Promise { if (eventAdditionalDetail.id) { const existingEventAdditionalDetail = await this.findByPk(eventAdditionalDetail.id); if (existingEventAdditionalDetail) { return EventAdditionalDetail.update(eventAdditionalDetail, { where: { id: eventAdditionalDetail.id } }); } } - if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(eventAdditionalDetail.textbookId); - + if (insertIfNotFound) { return EventAdditionalDetail.create(eventAdditionalDetail as any) } } diff --git a/src/payout/payout.controller.ts b/src/payout/payout.controller.ts index 67be855..fc579d8 100644 --- a/src/payout/payout.controller.ts +++ b/src/payout/payout.controller.ts @@ -181,7 +181,6 @@ export class PayoutController { }) @UsePipes(new ValidationPipe({ whitelist: true })) async insert(@Body() payout: PayoutDTO, @Res() res: Response) { - console.log("Received payout:", payout); if (!payout) { const response = new GenericResponse({ exception: true, diff --git a/src/payout/payout.service.ts b/src/payout/payout.service.ts index d794132..c0d4cb6 100644 --- a/src/payout/payout.service.ts +++ b/src/payout/payout.service.ts @@ -14,11 +14,7 @@ export class PayoutService { } async findByPk(id: number): Promise { - - const payout = Payout.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await payout).textbookId); - - return payout + return Payout.findByPk(id); } findOne(payout: Payout): Promise { @@ -40,7 +36,7 @@ export class PayoutService { return Payout.update(payout, { where: { id: payout.id } }); } } - if (insertIfNotFound) { + if (insertIfNotFound) { return Payout.create(payout as any) } } diff --git a/src/policy/policy.service.ts b/src/policy/policy.service.ts index 9008878..de65d9e 100644 --- a/src/policy/policy.service.ts +++ b/src/policy/policy.service.ts @@ -25,7 +25,7 @@ export class PolicyService { return Policy.destroy({ where: { id: id } }); } - async upsert(policy: Policy, insertIfNotFound: boolean): Promise { + async upsert(policy: any, insertIfNotFound: boolean): Promise { if (policy.id) { const existingPolicy = await this.findByPk(policy.id); if (existingPolicy) { diff --git a/src/promotions/promotions.controller.ts b/src/promotions/promotions.controller.ts index a93668e..01f0ee0 100644 --- a/src/promotions/promotions.controller.ts +++ b/src/promotions/promotions.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { PromotionService } from './promotions.service'; // Updated service import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import Promotion from './promotions.entity'; // Updated entity import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { PromotionDTO, PromotionUpdateDTO } from './promotions.dto'; @ApiTags('promotion') @Controller('promotion') @@ -160,7 +161,7 @@ export class PromotionController { @Post() @ApiOperation({ summary: 'Insert a new promotion' }) - @ApiBody({ type: Promotion, description: 'Promotion data to insert' }) + @ApiBody({ type: PromotionDTO, description: 'Promotion data to insert' }) @ApiResponse({ status: 400, description: 'Invalid promotion data', @@ -178,7 +179,8 @@ export class PromotionController { status: 201, description: 'Successfully created a promotion', }) - async insert(@Body() promotion: Promotion, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() promotion: PromotionDTO, @Res() res: Response) { if (!promotion) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class PromotionController { }, null); return res.status(400).send(response); } - delete promotion.id; // Ensure no ID is passed in the creation const response = await this.promotionService.upsert(promotion, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class PromotionController { @Put() @ApiOperation({ summary: 'Update an existing promotion' }) - @ApiBody({ type: Promotion, description: 'Promotion data to update' }) + @ApiBody({ type: PromotionUpdateDTO, description: 'Promotion data to update' }) @ApiResponse({ status: 400, description: 'Invalid promotion data or ID missing', @@ -227,7 +228,8 @@ export class PromotionController { status: 200, description: 'Successfully updated promotion', }) - async update(@Body() promotion: Promotion, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() promotion: PromotionUpdateDTO, @Res() res: Response) { if (!promotion || !promotion.id) { const response = new GenericResponse({ exception: true, diff --git a/src/promotions/promotions.service.ts b/src/promotions/promotions.service.ts index 19023f5..d42386d 100644 --- a/src/promotions/promotions.service.ts +++ b/src/promotions/promotions.service.ts @@ -27,7 +27,7 @@ export class PromotionService { return Promotion.destroy({ where: { id: id } }); } - async upsert(promotion: Promotion, insertIfNotFound: boolean): Promise { + async upsert(promotion: any, insertIfNotFound: boolean): Promise { if (promotion.id) { const existingPromotion = await this.findByPk(promotion.id); if (existingPromotion) { diff --git a/src/push-subscription/push-subscription.controller.spec.ts b/src/push-subscription/push-subscription.controller.spec.ts deleted file mode 100644 index 80b7c45..0000000 --- a/src/push-subscription/push-subscription.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { PushSubscriptionController } from './push-subscription.controller'; - -describe('PushSubscriptionController', () => { - let controller: PushSubscriptionController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [PushSubscriptionController], - }).compile(); - - controller = module.get(PushSubscriptionController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/refund/refund.controller.ts b/src/refund/refund.controller.ts index 214fea2..bada5b6 100644 --- a/src/refund/refund.controller.ts +++ b/src/refund/refund.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { RefundService } from './refund.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import Refund from './refund.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { RefundDTO, RefundUpdateDTO } from './refund.dto'; @ApiTags('refund') @Controller('refund') @@ -160,7 +161,7 @@ export class RefundController { @Post() @ApiOperation({ summary: 'Insert a new refund' }) - @ApiBody({ type: Refund, description: 'Refund data to insert' }) + @ApiBody({ type: RefundDTO, description: 'Refund data to insert' }) @ApiResponse({ status: 400, description: 'Invalid refund data', @@ -178,7 +179,8 @@ export class RefundController { status: 201, description: 'Successfully created a refund', }) - async insert(@Body() refund: Refund, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() refund: RefundDTO, @Res() res: Response) { if (!refund) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class RefundController { }, null); return res.status(400).send(response); } - delete refund.id; const response = await this.refundService.upsert(refund, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class RefundController { @Put() @ApiOperation({ summary: 'Update an existing refund' }) - @ApiBody({ type: Refund, description: 'Refund data to update' }) + @ApiBody({ type: RefundUpdateDTO, description: 'Refund data to update' }) @ApiResponse({ status: 400, description: 'Invalid refund data or ID missing', @@ -227,7 +228,8 @@ export class RefundController { status: 200, description: 'Successfully updated refund', }) - async update(@Body() refund: Refund, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() refund: RefundUpdateDTO, @Res() res: Response) { if (!refund || !refund.id) { const response = new GenericResponse({ exception: true, diff --git a/src/refund/refund.service.ts b/src/refund/refund.service.ts index a9b59e1..fc23aa9 100644 --- a/src/refund/refund.service.ts +++ b/src/refund/refund.service.ts @@ -13,11 +13,7 @@ export class RefundService { } async findByPk(id: number): Promise { - - const refund = Refund.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await refund).textbookId); - - return refund + return Refund.findByPk(id); } findOne(refund: Refund): Promise { @@ -32,7 +28,7 @@ export class RefundService { return Refund.destroy({ where: { id: id } }); } - async upsert(refund: Refund, insertIfNotFound: boolean): Promise { + async upsert(refund: any, insertIfNotFound: boolean): Promise { if (refund.id) { const existingRefund = await this.findByPk(refund.id); if (existingRefund) { @@ -40,8 +36,6 @@ export class RefundService { } } if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(refund.textbookId); - return Refund.create(refund as any) } } diff --git a/src/resources/resources.service.ts b/src/resources/resources.service.ts index 3472662..c64ab2a 100644 --- a/src/resources/resources.service.ts +++ b/src/resources/resources.service.ts @@ -25,7 +25,7 @@ export class ResourcesService { return Resources.destroy({ where: { id: id } }); } - async upsert(resources: Resources, insertIfNotFound: boolean): Promise { + async upsert(resources: any, insertIfNotFound: boolean): Promise { if (resources.id) { const existingResources = await this.findByPk(resources.id); if (existingResources) { diff --git a/src/review/review.controller.ts b/src/review/review.controller.ts index 3dbda7f..ada7722 100644 --- a/src/review/review.controller.ts +++ b/src/review/review.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { ReviewService } from './review.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import Review from './review.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { ReviewDTO, ReviewUpdateDTO } from './review.dto'; @ApiTags('review') @Controller('review') @@ -160,7 +161,7 @@ export class ReviewController { @Post() @ApiOperation({ summary: 'Insert a new review' }) - @ApiBody({ type: Review, description: 'Review data to insert' }) + @ApiBody({ type: ReviewDTO, description: 'Review data to insert' }) @ApiResponse({ status: 400, description: 'Invalid review data', @@ -178,7 +179,8 @@ export class ReviewController { status: 201, description: 'Successfully created a review', }) - async insert(@Body() review: Review, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() review: ReviewDTO, @Res() res: Response) { if (!review) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class ReviewController { }, null); return res.status(400).send(response); } - delete review.id; const response = await this.reviewService.upsert(review, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class ReviewController { @Put() @ApiOperation({ summary: 'Update an existing review' }) - @ApiBody({ type: Review, description: 'Review data to update' }) + @ApiBody({ type: ReviewUpdateDTO, description: 'Review data to update' }) @ApiResponse({ status: 400, description: 'Invalid review data or ID missing', @@ -227,7 +228,8 @@ export class ReviewController { status: 200, description: 'Successfully updated review', }) - async update(@Body() review: Review, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() review: ReviewUpdateDTO, @Res() res: Response) { if (!review || !review.id) { const response = new GenericResponse({ exception: true, diff --git a/src/review/review.service.ts b/src/review/review.service.ts index 08bb09a..cbb767d 100644 --- a/src/review/review.service.ts +++ b/src/review/review.service.ts @@ -13,11 +13,7 @@ export class ReviewService { } async findByPk(id: number): Promise { - - const review = Review.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await review).textbookId); - - return review + return Review.findByPk(id); } findOne(review: Review): Promise { @@ -32,16 +28,14 @@ export class ReviewService { return Review.destroy({ where: { id: id } }); } - async upsert(review: Review, insertIfNotFound: boolean): Promise { + async upsert(review: any, insertIfNotFound: boolean): Promise { if (review.id) { const existingReview = await this.findByPk(review.id); if (existingReview) { return Review.update(review, { where: { id: review.id } }); } } - if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(review.textbookId); - + if (insertIfNotFound) { return Review.create(review as any) } } diff --git a/src/seat/seat.controller.ts b/src/seat/seat.controller.ts index e0015f6..a155106 100644 --- a/src/seat/seat.controller.ts +++ b/src/seat/seat.controller.ts @@ -1,10 +1,11 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { SeatService } from './seat.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import Seat from './seat.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; import { RedisService } from 'src/redis/redis.service'; +import { SeatDTO, SeatUpdateDTO } from './seat.dto'; @ApiTags('seat') @Controller('seat') @@ -166,7 +167,7 @@ export class SeatController { @Post() @ApiOperation({ summary: 'Insert a new seat' }) - @ApiBody({ type: Seat, description: 'Seat data to insert' }) + @ApiBody({ type: SeatDTO, description: 'Seat data to insert' }) @ApiResponse({ status: 400, description: 'Invalid seat data', @@ -184,7 +185,8 @@ export class SeatController { status: 201, description: 'Successfully created a seat', }) - async insert(@Body() seat: Seat, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() seat: SeatDTO, @Res() res: Response) { if (!seat) { const response = new GenericResponse({ exception: true, @@ -194,7 +196,6 @@ export class SeatController { }, null); return res.status(400).send(response); } - delete seat.id; const response = await this.seatService.upsert(seat, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -202,7 +203,7 @@ export class SeatController { @Put() @ApiOperation({ summary: 'Update an existing seat' }) - @ApiBody({ type: Seat, description: 'Seat data to update' }) + @ApiBody({ type: SeatUpdateDTO, description: 'Seat data to update' }) @ApiResponse({ status: 400, description: 'Invalid seat data or ID missing', @@ -233,7 +234,8 @@ export class SeatController { status: 200, description: 'Successfully updated seat', }) - async update(@Body() seat: Seat, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() seat: SeatUpdateDTO, @Res() res: Response) { if (!seat || !seat.id) { const response = new GenericResponse({ exception: true, diff --git a/src/seat/seat.service.ts b/src/seat/seat.service.ts index 02f7be6..9436a6a 100644 --- a/src/seat/seat.service.ts +++ b/src/seat/seat.service.ts @@ -13,9 +13,7 @@ export class SeatService { } async findByPk(id: number): Promise { - - const seat = Seat.findByPk(id,) - return seat + return Seat.findByPk(id); } findOne(seat: Seat): Promise { @@ -34,14 +32,14 @@ export class SeatService { return Seat.update({ available: 'booked' }, { where: { eventId: eventId, seatNumber: seatNumber } }); } - async upsert(seat: Seat, insertIfNotFound: boolean): Promise { + async upsert(seat: any, insertIfNotFound: boolean): Promise { if (seat.id) { const existingSeat = await this.findByPk(seat.id); if (existingSeat) { return Seat.update(seat, { where: { id: seat.id } }); } } - if (insertIfNotFound) { + if (insertIfNotFound) { return Seat.create(seat as any) } } diff --git a/src/theatre/theatre.controller.ts b/src/theatre/theatre.controller.ts index 296d977..627d31e 100644 --- a/src/theatre/theatre.controller.ts +++ b/src/theatre/theatre.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { TheatreService } from './theatre.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import Theatre from './theatre.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { TheatreDTO, TheatreUpdateDTO } from './theatre.dto'; @ApiTags('theatre') @Controller('theatre') @@ -160,7 +161,7 @@ export class TheatreController { @Post() @ApiOperation({ summary: 'Insert a new theatre' }) - @ApiBody({ type: Theatre, description: 'Theatre data to insert' }) + @ApiBody({ type: TheatreDTO, description: 'Theatre data to insert' }) @ApiResponse({ status: 400, description: 'Invalid theatre data', @@ -178,7 +179,8 @@ export class TheatreController { status: 201, description: 'Successfully created a theatre', }) - async insert(@Body() theatre: Theatre, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() theatre: TheatreDTO, @Res() res: Response) { if (!theatre) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class TheatreController { }, null); return res.status(400).send(response); } - delete theatre.id; const response = await this.theatreService.upsert(theatre, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class TheatreController { @Put() @ApiOperation({ summary: 'Update an existing theatre' }) - @ApiBody({ type: Theatre, description: 'Theatre data to update' }) + @ApiBody({ type: TheatreUpdateDTO, description: 'Theatre data to update' }) @ApiResponse({ status: 400, description: 'Invalid theatre data or ID missing', @@ -227,7 +228,8 @@ export class TheatreController { status: 200, description: 'Successfully updated theatre', }) - async update(@Body() theatre: Theatre, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() theatre: TheatreUpdateDTO, @Res() res: Response) { if (!theatre || !theatre.id) { const response = new GenericResponse({ exception: true, diff --git a/src/theatre/theatre.service.ts b/src/theatre/theatre.service.ts index 8254610..4f5541b 100644 --- a/src/theatre/theatre.service.ts +++ b/src/theatre/theatre.service.ts @@ -13,11 +13,7 @@ export class TheatreService { } async findByPk(id: number): Promise { - - const theatre = Theatre.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await theatre).textbookId); - - return theatre + return Theatre.findByPk(id); } findOne(theatre: Theatre): Promise { @@ -32,7 +28,7 @@ export class TheatreService { return Theatre.destroy({ where: { id: id } }); } - async upsert(theatre: Theatre, insertIfNotFound: boolean): Promise { + async upsert(theatre: any, insertIfNotFound: boolean): Promise { if (theatre.id) { const existingTheatre = await this.findByPk(theatre.id); if (existingTheatre) { @@ -40,8 +36,6 @@ export class TheatreService { } } if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(theatre.textbookId); - return Theatre.create(theatre as any) } } diff --git a/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.controller.ts b/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.controller.ts index 9367aa2..6bb24e9 100644 --- a/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.controller.ts +++ b/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { TheatreAdditionalDetailsService } from './theatreAdditionalDetails.service'; import { Response } from 'express'; import { GenericResponse } from '../../common/GenericResponse.model'; import TheatreAdditionalDetails from './theatreAdditionalDetails.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { TheatreAdditionalDetailsDTO, TheatreAdditionalDetailsUpdateDTO } from './theatreAdditionalDetails.dto'; @ApiTags('theatreAdditionalDetails') @Controller('theatreAdditionalDetails') @@ -160,7 +161,7 @@ export class TheatreAdditionalDetailsController { @Post() @ApiOperation({ summary: 'Insert a new theatreAdditionalDetails' }) - @ApiBody({ type: TheatreAdditionalDetails, description: 'TheatreAdditionalDetails data to insert' }) + @ApiBody({ type: TheatreAdditionalDetailsDTO, description: 'TheatreAdditionalDetails data to insert' }) @ApiResponse({ status: 400, description: 'Invalid theatreAdditionalDetails data', @@ -178,7 +179,8 @@ export class TheatreAdditionalDetailsController { status: 201, description: 'Successfully created a theatreAdditionalDetails', }) - async insert(@Body() theatreAdditionalDetails: TheatreAdditionalDetails, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() theatreAdditionalDetails: TheatreAdditionalDetailsDTO, @Res() res: Response) { if (!theatreAdditionalDetails) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class TheatreAdditionalDetailsController { }, null); return res.status(400).send(response); } - delete theatreAdditionalDetails.id; const response = await this.theatreAdditionalDetailsService.upsert(theatreAdditionalDetails, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class TheatreAdditionalDetailsController { @Put() @ApiOperation({ summary: 'Update an existing theatreAdditionalDetails' }) - @ApiBody({ type: TheatreAdditionalDetails, description: 'TheatreAdditionalDetails data to update' }) + @ApiBody({ type: TheatreAdditionalDetailsUpdateDTO, description: 'TheatreAdditionalDetails data to update' }) @ApiResponse({ status: 400, description: 'Invalid theatreAdditionalDetails data or ID missing', @@ -227,7 +228,8 @@ export class TheatreAdditionalDetailsController { status: 200, description: 'Successfully updated theatreAdditionalDetails', }) - async update(@Body() theatreAdditionalDetails: TheatreAdditionalDetails, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() theatreAdditionalDetails: TheatreAdditionalDetailsUpdateDTO, @Res() res: Response) { if (!theatreAdditionalDetails || !theatreAdditionalDetails.id) { const response = new GenericResponse({ exception: true, diff --git a/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.service.ts b/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.service.ts index 60e18cf..73be472 100644 --- a/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.service.ts +++ b/src/theatre/theatreAdditionalDetails/theatreAdditionalDetails.service.ts @@ -13,11 +13,7 @@ export class TheatreAdditionalDetailsService { } async findByPk(id: number): Promise { - - const theatreAdditionalDetails = TheatreAdditionalDetails.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await theatreAdditionalDetails).textbookId); - - return theatreAdditionalDetails + return TheatreAdditionalDetails.findByPk(id); } findOne(theatreAdditionalDetails: TheatreAdditionalDetails): Promise { @@ -32,7 +28,7 @@ export class TheatreAdditionalDetailsService { return TheatreAdditionalDetails.destroy({ where: { id: id } }); } - async upsert(theatreAdditionalDetails: TheatreAdditionalDetails, insertIfNotFound: boolean): Promise { + async upsert(theatreAdditionalDetails: any, insertIfNotFound: boolean): Promise { if (theatreAdditionalDetails.id) { const existingTheatreAdditionalDetails = await this.findByPk(theatreAdditionalDetails.id); if (existingTheatreAdditionalDetails) { @@ -40,8 +36,6 @@ export class TheatreAdditionalDetailsService { } } if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(theatreAdditionalDetails.textbookId); - return TheatreAdditionalDetails.create(theatreAdditionalDetails as any) } } diff --git a/src/ticket/ticket.controller.ts b/src/ticket/ticket.controller.ts index 616dd18..1b25bc7 100644 --- a/src/ticket/ticket.controller.ts +++ b/src/ticket/ticket.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { TicketService } from './ticket.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import Ticket from './ticket.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { TicketDTO, TicketUpdateDTO } from './ticket.dto'; @ApiTags('ticket') @Controller('ticket') @@ -160,7 +161,7 @@ export class TicketController { @Post() @ApiOperation({ summary: 'Insert a new ticket' }) - @ApiBody({ type: Ticket, description: 'Ticket data to insert' }) + @ApiBody({ type: TicketDTO, description: 'Ticket data to insert' }) @ApiResponse({ status: 400, description: 'Invalid ticket data', @@ -178,7 +179,8 @@ export class TicketController { status: 201, description: 'Successfully created a ticket', }) - async insert(@Body() ticket: Ticket, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() ticket: TicketDTO, @Res() res: Response) { if (!ticket) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class TicketController { }, null); return res.status(400).send(response); } - delete ticket.id; const response = await this.ticketService.upsert(ticket, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class TicketController { @Put() @ApiOperation({ summary: 'Update an existing ticket' }) - @ApiBody({ type: Ticket, description: 'Ticket data to update' }) + @ApiBody({ type: TicketUpdateDTO, description: 'Ticket data to update' }) @ApiResponse({ status: 400, description: 'Invalid ticket data or ID missing', @@ -227,7 +228,8 @@ export class TicketController { status: 200, description: 'Successfully updated ticket', }) - async update(@Body() ticket: Ticket, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() ticket: TicketUpdateDTO, @Res() res: Response) { if (!ticket || !ticket.id) { const response = new GenericResponse({ exception: true, diff --git a/src/ticket/ticket.service.ts b/src/ticket/ticket.service.ts index e14405a..0f6ea0c 100644 --- a/src/ticket/ticket.service.ts +++ b/src/ticket/ticket.service.ts @@ -13,11 +13,7 @@ export class TicketService { } async findByPk(id: number): Promise { - - const ticket = Ticket.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await ticket).textbookId); - - return ticket + return Ticket.findByPk(id); } findOne(ticket: Ticket): Promise { @@ -32,7 +28,7 @@ export class TicketService { return Ticket.destroy({ where: { id: id } }); } - async upsert(ticket: Ticket, insertIfNotFound: boolean): Promise { + async upsert(ticket: any, insertIfNotFound: boolean): Promise { if (ticket.id) { const existingTicket = await this.findByPk(ticket.id); if (existingTicket) { @@ -40,14 +36,7 @@ export class TicketService { } } if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(ticket.textbookId); - return Ticket.create(ticket as any) } } - - // async assignTicketToUser(ticketId: number, userId: number): Promise { - // return Ticket.update({ userId: userId }, { where: { id: ticketId } }); - // } - } diff --git a/src/ticketPricing/ticketPricing.controller.ts b/src/ticketPricing/ticketPricing.controller.ts index d7f9566..294f0bf 100644 --- a/src/ticketPricing/ticketPricing.controller.ts +++ b/src/ticketPricing/ticketPricing.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { TicketPricingService } from './ticketPricing.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import TicketPricing from './ticketPricing.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { TicketPricingDTO, TicketPricingUpdateDTO } from './ticketPricing.dto'; @ApiTags('ticketPricing') @Controller('ticketPricing') @@ -160,7 +161,7 @@ export class TicketPricingController { @Post() @ApiOperation({ summary: 'Insert a new ticketPricing' }) - @ApiBody({ type: TicketPricing, description: 'TicketPricing data to insert' }) + @ApiBody({ type: TicketPricingDTO, description: 'TicketPricing data to insert' }) @ApiResponse({ status: 400, description: 'Invalid ticketPricing data', @@ -178,7 +179,8 @@ export class TicketPricingController { status: 201, description: 'Successfully created a ticketPricing', }) - async insert(@Body() ticketPricing: TicketPricing, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() ticketPricing: TicketPricingDTO, @Res() res: Response) { if (!ticketPricing) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class TicketPricingController { }, null); return res.status(400).send(response); } - delete ticketPricing.id; const response = await this.ticketPricingService.upsert(ticketPricing, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class TicketPricingController { @Put() @ApiOperation({ summary: 'Update an existing ticketPricing' }) - @ApiBody({ type: TicketPricing, description: 'TicketPricing data to update' }) + @ApiBody({ type: TicketPricingUpdateDTO, description: 'TicketPricing data to update' }) @ApiResponse({ status: 400, description: 'Invalid ticketPricing data or ID missing', @@ -227,7 +228,8 @@ export class TicketPricingController { status: 200, description: 'Successfully updated ticketPricing', }) - async update(@Body() ticketPricing: TicketPricing, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() ticketPricing: TicketPricingUpdateDTO, @Res() res: Response) { if (!ticketPricing || !ticketPricing.id) { const response = new GenericResponse({ exception: true, diff --git a/src/ticketPricing/ticketPricing.dto.ts b/src/ticketPricing/ticketPricing.dto.ts index f9cdff7..5f84834 100644 --- a/src/ticketPricing/ticketPricing.dto.ts +++ b/src/ticketPricing/ticketPricing.dto.ts @@ -2,64 +2,71 @@ import { IsString, IsNumber, IsDate, IsOptional, IsNotEmpty } from 'class-valida import { ApiProperty } from '@nestjs/swagger'; import { Transform } from 'class-transformer'; -export class TimeSlotDTO { +export class TicketPricingDTO { @ApiProperty({ type: Number }) @IsNumber() @IsNotEmpty() eventId: number; - @ApiProperty({ type: Date }) - @IsDate() - @IsNotEmpty() - @Transform(({ value }) => new Date(value)) - startTime: Date; - - @ApiProperty({ type: Date }) - @IsDate() - @IsNotEmpty() - @Transform(({ value }) => new Date(value)) - endTime: Date; + @ApiProperty({ type: Number }) + @IsOptional() + @IsNumber() + timeSlotId: number; @ApiProperty({ type: String }) @IsString() @IsNotEmpty() + ticketType: string; + + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + price: number; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() status: string; @ApiProperty({ type: Date }) @IsDate() - @IsNotEmpty() - @Transform(({ value }) => new Date(value)) + @IsOptional() + @Transform(({ value }) => new Date(value)) validFrom: Date; @ApiProperty({ type: Date }) @IsDate() - @IsNotEmpty() - @Transform(({ value }) => new Date(value)) + @IsOptional() + @Transform(({ value }) => new Date(value)) validTill: Date; @ApiProperty({ type: Date }) @IsDate() - @Transform(({ value }) => new Date(value)) + @IsOptional() + @Transform(({ value }) => new Date(value)) createdAt: Date; @ApiProperty({ type: Date }) @IsDate() - @Transform(({ value }) => new Date(value)) + @IsOptional() + @Transform(({ value }) => new Date(value)) updatedAt: Date; @ApiProperty({ type: String }) @IsString() + @IsOptional() createdBy: string; @ApiProperty({ type: String }) @IsString() + @IsOptional() modifiedBy: string; @ApiProperty({ type: Date }) @IsOptional() @IsDate() - @Transform(({ value }) => value ? new Date(value) : null) + @Transform(({ value }) => value ? new Date(value) : null) deletedAt: Date; @ApiProperty({ type: Number }) @@ -68,9 +75,9 @@ export class TimeSlotDTO { version: number; } -export class TimeSlotUpdateDTO extends TimeSlotDTO { +export class TicketPricingUpdateDTO extends TicketPricingDTO { @ApiProperty({ type: Number }) @IsNumber() @IsNotEmpty() - id: number -} + id: number; +} \ No newline at end of file diff --git a/src/ticketPricing/ticketPricing.service.ts b/src/ticketPricing/ticketPricing.service.ts index a032f25..6534394 100644 --- a/src/ticketPricing/ticketPricing.service.ts +++ b/src/ticketPricing/ticketPricing.service.ts @@ -13,11 +13,7 @@ export class TicketPricingService { } async findByPk(id: number): Promise { - - const ticketPricing = TicketPricing.findByPk(id,) - // //const textbookExists = await this.checkTextbookExists((await ticketPricing).textbookId); - - return ticketPricing + return TicketPricing.findByPk(id); } findOne(ticketPricing: TicketPricing): Promise { @@ -32,7 +28,7 @@ export class TicketPricingService { return TicketPricing.destroy({ where: { id: id } }); } - async upsert(ticketPricing: TicketPricing, insertIfNotFound: boolean): Promise { + async upsert(ticketPricing: any, insertIfNotFound: boolean): Promise { if (ticketPricing.id) { const existingTicketPricing = await this.findByPk(ticketPricing.id); if (existingTicketPricing) { @@ -40,8 +36,6 @@ export class TicketPricingService { } } if (insertIfNotFound) { - //const textbookExists = await this.checkTextbookExists(ticketPricing.textbookId); - return TicketPricing.create(ticketPricing as any) } } diff --git a/src/timeSlot/timeSlot.controller.ts b/src/timeSlot/timeSlot.controller.ts index 7090a3c..a346fff 100644 --- a/src/timeSlot/timeSlot.controller.ts +++ b/src/timeSlot/timeSlot.controller.ts @@ -1,14 +1,15 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { TimeSlotService } from './timeSlot.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import TimeSlot from './timeSlot.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { TimeSlotDTO, TimeSlotUpdateDTO } from './timeSlot.dto'; @ApiTags('timeSlot') @Controller('timeSlot') export class TimeSlotController { - constructor(private timeSlotService: TimeSlotService) {} + constructor(private timeSlotService: TimeSlotService) { } @Get("/all") @ApiOperation({ summary: 'Get all timeSlots' }) @@ -31,7 +32,7 @@ export class TimeSlotController { }) async getAllTimeSlots(@Res() res: Response) { const response = await this.timeSlotService.findAll() || []; - if(!response) { + if (!response) { const errorResponse = new GenericResponse({ exception: true, exceptionSeverity: 'HIGH', @@ -160,7 +161,7 @@ export class TimeSlotController { @Post() @ApiOperation({ summary: 'Insert a new timeSlot' }) - @ApiBody({ type: TimeSlot, description: 'TimeSlot data to insert' }) + @ApiBody({ type: TimeSlotDTO, description: 'TimeSlot data to insert' }) @ApiResponse({ status: 400, description: 'Invalid timeSlot data', @@ -178,7 +179,8 @@ export class TimeSlotController { status: 201, description: 'Successfully created a timeSlot', }) - async insert(@Body() timeSlot: TimeSlot, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true })) + async insert(@Body() timeSlot: TimeSlotDTO, @Res() res: Response) { if (!timeSlot) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class TimeSlotController { }, null); return res.status(400).send(response); } - delete timeSlot.id; const response = await this.timeSlotService.upsert(timeSlot, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class TimeSlotController { @Put() @ApiOperation({ summary: 'Update an existing timeSlot' }) - @ApiBody({ type: TimeSlot, description: 'TimeSlot data to update' }) + @ApiBody({ type: TimeSlotUpdateDTO, description: 'TimeSlot data to update' }) @ApiResponse({ status: 400, description: 'Invalid timeSlot data or ID missing', @@ -227,7 +228,8 @@ export class TimeSlotController { status: 200, description: 'Successfully updated timeSlot', }) - async update(@Body() timeSlot: TimeSlot, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() timeSlot: TimeSlotUpdateDTO, @Res() res: Response) { if (!timeSlot || !timeSlot.id) { const response = new GenericResponse({ exception: true, diff --git a/src/timeSlot/timeSlot.service.ts b/src/timeSlot/timeSlot.service.ts index 21780e1..6d72ea0 100644 --- a/src/timeSlot/timeSlot.service.ts +++ b/src/timeSlot/timeSlot.service.ts @@ -13,10 +13,7 @@ export class TimeSlotService { } async findByPk(id: number): Promise { - - const timeSlot = TimeSlot.findByPk(id,) - - return timeSlot + return TimeSlot.findByPk(id); } findOne(timeSlot: TimeSlot): Promise { @@ -31,7 +28,7 @@ export class TimeSlotService { return TimeSlot.destroy({ where: { id: id } }); } - async upsert(timeSlot: TimeSlot, insertIfNotFound: boolean): Promise { + async upsert(timeSlot: any, insertIfNotFound: boolean): Promise { if (timeSlot.id) { const existingTimeSlot = await this.findByPk(timeSlot.id); if (existingTimeSlot) { @@ -39,7 +36,6 @@ export class TimeSlotService { } } if (insertIfNotFound) { - return TimeSlot.create(timeSlot as any) } } diff --git a/src/user-watchlist/user-watchlist.controller.ts b/src/user-watchlist/user-watchlist.controller.ts index b9fe105..57f3fbf 100644 --- a/src/user-watchlist/user-watchlist.controller.ts +++ b/src/user-watchlist/user-watchlist.controller.ts @@ -1,14 +1,15 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; -import { UserWatchlistService } from './user-watchlist.service'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; +import { UserWatchlistService } from './user-watchlist.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; -import UserWatchlist from './user-watchlist.entity'; +import UserWatchlist from './user-watchlist.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { UserWatchlistDTO, UserWatchlistUpdateDTO } from './user-watchlist.dto'; @ApiTags('user-watchlist') @Controller('user-watchlist') export class UserWatchlistController { - constructor(private userWatchlistService: UserWatchlistService) {} + constructor(private userWatchlistService: UserWatchlistService) { } @Get("/all") @ApiOperation({ summary: 'Get all user watchlists' }) @@ -160,7 +161,7 @@ export class UserWatchlistController { @Post() @ApiOperation({ summary: 'Insert a new user watchlist' }) - @ApiBody({ type: UserWatchlist, description: 'User watchlist data to insert' }) + @ApiBody({ type: UserWatchlistDTO, description: 'User watchlist data to insert' }) @ApiResponse({ status: 400, description: 'Invalid user watchlist data', @@ -178,7 +179,8 @@ export class UserWatchlistController { status: 201, description: 'Successfully created a user watchlist', }) - async insert(@Body() userWatchlist: UserWatchlist, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async insert(@Body() userWatchlist: UserWatchlistDTO, @Res() res: Response) { if (!userWatchlist) { const response = new GenericResponse({ exception: true, @@ -188,7 +190,6 @@ export class UserWatchlistController { }, null); return res.status(400).send(response); } - delete userWatchlist.id; // Ensure no ID is passed in the creation const response = await this.userWatchlistService.upsert(userWatchlist, true); const httpResponse = new GenericResponse(null, response); res.status(201).send(httpResponse); @@ -196,7 +197,7 @@ export class UserWatchlistController { @Put() @ApiOperation({ summary: 'Update an existing user watchlist' }) - @ApiBody({ type: UserWatchlist, description: 'User watchlist data to update' }) + @ApiBody({ type: UserWatchlistUpdateDTO, description: 'User watchlist data to update' }) @ApiResponse({ status: 400, description: 'Invalid user watchlist data or ID missing', @@ -227,7 +228,8 @@ export class UserWatchlistController { status: 200, description: 'Successfully updated user watchlist', }) - async update(@Body() userWatchlist: UserWatchlist, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() userWatchlist: UserWatchlistUpdateDTO, @Res() res: Response) { if (!userWatchlist || !userWatchlist.id) { const response = new GenericResponse({ exception: true, diff --git a/src/user-watchlist/user-watchlist.service.ts b/src/user-watchlist/user-watchlist.service.ts index da09c99..4e73b8c 100644 --- a/src/user-watchlist/user-watchlist.service.ts +++ b/src/user-watchlist/user-watchlist.service.ts @@ -27,7 +27,7 @@ export class UserWatchlistService { return UserWatchlist.destroy({ where: { id: id } }); } - async upsert(userWatchlist: UserWatchlist, insertIfNotFound: boolean): Promise { + async upsert(userWatchlist: any, insertIfNotFound: boolean): Promise { if (userWatchlist.id) { const existingUserWatchlist = await this.findByPk(userWatchlist.id); if (existingUserWatchlist) { diff --git a/src/user/user-additional-details/user-additional-details.controller.ts b/src/user/user-additional-details/user-additional-details.controller.ts index d4e9c19..733f217 100644 --- a/src/user/user-additional-details/user-additional-details.controller.ts +++ b/src/user/user-additional-details/user-additional-details.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { Response } from 'express'; import { UserAdditionalDetailsService } from './user-additional-details.service'; import { GenericResponse } from 'src/common/GenericResponse.model'; import UserAdditionalDetail from './user-additional-details.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { UserAdditionalDetailDTO, UserAdditionalDetailUpdateDTO } from './user-additional-details.dto'; @ApiTags('user-additional-details') @Controller('users/addl/') @@ -163,7 +164,7 @@ export class UserAdditionalDetailsController { @Post() @ApiOperation({ summary: 'Insert a new user additional detail' }) - @ApiBody({ type: UserAdditionalDetail, description: 'User additional detail data to insert' }) + @ApiBody({ type: UserAdditionalDetailDTO, description: 'User additional detail data to insert' }) @ApiResponse({ status: 400, description: 'Failed to insert user additional detail', @@ -194,7 +195,8 @@ export class UserAdditionalDetailsController { status: 201, description: 'User additional detail successfully created', }) - async userAdditionalDetailsInsert(@Body() user: UserAdditionalDetail, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true })) + async userAdditionalDetailsInsert(@Body() user: UserAdditionalDetailDTO, @Res() res: Response) { if (!user) { const response = new GenericResponse({ exception: true, @@ -205,7 +207,6 @@ export class UserAdditionalDetailsController { res.status(400).send(response); return; } - delete user.id; const response = await this.userAdditionalDetailsService.upsert(user, true); if (!response) { const response = new GenericResponse({ @@ -223,7 +224,7 @@ export class UserAdditionalDetailsController { @Put() @ApiOperation({ summary: 'Update an existing user additional detail' }) - @ApiBody({ type: UserAdditionalDetail, description: 'User additional detail data to update' }) + @ApiBody({ type: UserAdditionalDetailUpdateDTO, description: 'User additional detail data to update' }) @ApiResponse({ status: 400, description: 'Failed to update user additional detail', @@ -254,7 +255,8 @@ export class UserAdditionalDetailsController { status: 200, description: 'User additional detail successfully updated', }) - async userAdditionalDetailsUpdate(@Body() user: UserAdditionalDetail, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async userAdditionalDetailsUpdate(@Body() user: UserAdditionalDetailUpdateDTO, @Res() res: Response) { if (!user || !user.id) { const response = new GenericResponse({ exception: true, diff --git a/src/user/user-additional-details/user-additional-details.dto.ts b/src/user/user-additional-details/user-additional-details.dto.ts new file mode 100644 index 0000000..c91fe2b --- /dev/null +++ b/src/user/user-additional-details/user-additional-details.dto.ts @@ -0,0 +1,50 @@ +import { IsString, IsNumber, IsDate, IsOptional, IsNotEmpty } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; + +export class UserAdditionalDetailDTO { + + @ApiProperty({ type: String }) + @IsString() + @IsNotEmpty() + addlDataType: string; + + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + userId: number; + + @ApiProperty({ type: String }) + @IsString() + @IsNotEmpty() + addlDataName: string; + + @ApiProperty({ type: Date, default: new Date() }) + @IsDate() + @IsOptional() + @Transform(({ value }) => value ? new Date(value) : new Date()) + validFrom: Date; + + @ApiProperty({ type: Date, default: new Date("2070-12-31") }) + @IsDate() + @IsOptional() + @Transform(({ value }) => value ? new Date(value) : new Date("2070-12-31")) + validTill: Date; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() + createdBy: string; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() + modifiedBy: string; +} + +export class UserAdditionalDetailUpdateDTO extends UserAdditionalDetailDTO { + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + id: number; +} diff --git a/src/user/user-additional-details/user-additional-details.service.ts b/src/user/user-additional-details/user-additional-details.service.ts index 00775de..ef6801d 100644 --- a/src/user/user-additional-details/user-additional-details.service.ts +++ b/src/user/user-additional-details/user-additional-details.service.ts @@ -23,7 +23,7 @@ export class UserAdditionalDetailsService { return UserAdditionalDetail.destroy({where: {id: id}}); } - async upsert(userDetail: UserAdditionalDetail, insertIfNotFound: boolean): Promise { + async upsert(userDetail: any, insertIfNotFound: boolean): Promise { if(userDetail.id) { const existingUser = await this.findByPk(userDetail.id); if(existingUser) { diff --git a/src/user/user-types/user-type.controller.ts b/src/user/user-types/user-type.controller.ts index 3dc411c..3a26149 100644 --- a/src/user/user-types/user-type.controller.ts +++ b/src/user/user-types/user-type.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { Response } from 'express'; import { GenericResponse } from 'src/common/GenericResponse.model'; import UserType from './user-type.entity'; import { UserTypesService } from './user-types.service'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { UserTypeDTO, UserTypeUpdateDTO } from './user-type.dto'; @ApiTags('user-types') @Controller('users/types') @@ -150,7 +151,7 @@ export class UserTypesController { @Post() @ApiOperation({ summary: 'Insert a new user type' }) - @ApiBody({ type: UserType, description: 'User type data to insert' }) + @ApiBody({ type: UserTypeDTO, description: 'User type data to insert' }) @ApiResponse({ status: 400, description: 'Failed to insert user type', @@ -168,7 +169,8 @@ export class UserTypesController { status: 201, description: 'User type successfully created', }) - async userTypeInsert(@Body() user: UserType, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true })) + async userTypeInsert(@Body() user: UserTypeDTO, @Res() res: Response) { if (!user) { const response = new GenericResponse({ exception: true, @@ -179,7 +181,6 @@ export class UserTypesController { res.status(400).send(response); return; } - delete user.id; const response = await this.userTypeService.upsert(user, true); if (!response) { const errorResponse = new GenericResponse({ @@ -196,7 +197,7 @@ export class UserTypesController { @Put() @ApiOperation({ summary: 'Update an existing user type' }) - @ApiBody({ type: UserType, description: 'User type data to update' }) + @ApiBody({ type: UserTypeUpdateDTO, description: 'User type data to update' }) @ApiResponse({ status: 400, description: 'Failed to update user type', @@ -227,7 +228,8 @@ export class UserTypesController { status: 200, description: 'User type successfully updated', }) - async userTypeUpdate(@Body() user: UserType, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async userTypeUpdate(@Body() user: UserTypeUpdateDTO, @Res() res: Response) { if (!user || !user.id) { const response = new GenericResponse({ exception: true, @@ -297,7 +299,7 @@ export class UserTypesController { return; } const response = await this.userTypeService.remove(id) || {}; - if(!response){ + if (!response) { const errorResponse = new GenericResponse({ exception: true, exceptionSeverity: 'HIGH', diff --git a/src/user/user-types/user-type.dto.ts b/src/user/user-types/user-type.dto.ts new file mode 100644 index 0000000..af90f97 --- /dev/null +++ b/src/user/user-types/user-type.dto.ts @@ -0,0 +1,78 @@ +import { IsString, IsNumber, IsDate, IsOptional, IsNotEmpty } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; + +export class UserTypeDTO { + + @ApiProperty({ type: String }) + @IsString() + @IsNotEmpty() + userTypeCode: string; + + @ApiProperty({ type: String }) + @IsString() + @IsNotEmpty() + userTypeName: string; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() + userTypeDesc: string; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() + status: string; + + @ApiProperty({ type: Date, default: new Date() }) + @IsDate() + @IsOptional() + @Transform(({ value }) => value ? new Date(value) : new Date()) + validFrom: Date; + + @ApiProperty({ type: Date, default: new Date("2070-12-31") }) + @IsDate() + @IsOptional() + @Transform(({ value }) => value ? new Date(value) : new Date("2070-12-31")) + validTill: Date; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() + createdBy: string; + + @ApiProperty({ type: String }) + @IsString() + @IsOptional() + modifiedBy: string; + + @ApiProperty({ type: Date }) + @IsDate() + @IsOptional() + @Transform(({ value }) => new Date(value)) + createdAt: Date; + + @ApiProperty({ type: Date }) + @IsDate() + @IsOptional() + @Transform(({ value }) => new Date(value)) + updatedAt: Date; + + @ApiProperty({ type: Date }) + @IsDate() + @IsOptional() + @Transform(({ value }) => value ? new Date(value) : null) + deletedAt: Date; + + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + version: number; +} + +export class UserTypeUpdateDTO extends UserTypeDTO { + @ApiProperty({ type: Number }) + @IsNumber() + @IsNotEmpty() + id: number; +} \ No newline at end of file diff --git a/src/user/user-types/user-types.service.ts b/src/user/user-types/user-types.service.ts index 5696379..e926023 100644 --- a/src/user/user-types/user-types.service.ts +++ b/src/user/user-types/user-types.service.ts @@ -25,7 +25,7 @@ export class UserTypesService { return UserType.destroy({where: {id: id}}); } - async upsert(userDetail: UserType, insertIfNotFound: boolean): Promise { + async upsert(userDetail: any, insertIfNotFound: boolean): Promise { if(userDetail.id) { const existingUser = await this.findByPk(userDetail.id); if(existingUser) { diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index c8320b9..657933f 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Delete, Get, Param, Post, Put, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, Res, UsePipes, ValidationPipe } from '@nestjs/common'; import { UserService } from './user.service'; import { Response } from 'express'; import { GenericResponse } from '../common/GenericResponse.model'; import { User } from './user.entity'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; +import { UserDTO, UserUpdateDTO } from './user.dto'; @ApiTags('users') @Controller('users') @@ -160,7 +161,7 @@ export class UserController { @Post() @ApiOperation({ summary: 'Insert a new user' }) - @ApiBody({ type: User, description: 'User data to insert' }) + @ApiBody({ type: UserDTO, description: 'User data to insert' }) @ApiResponse({ status: 400, description: 'Failed to insert user', @@ -179,7 +180,8 @@ export class UserController { status: 201, description: 'User successfully created', }) - async insert(@Body() user: User, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true})) + async insert(@Body() user: UserDTO, @Res() res: Response) { if (!user) { const response = new GenericResponse({ exception: true, @@ -189,7 +191,6 @@ export class UserController { }, null); return res.status(400).send(response); } - delete user.id; if (user.password) { user.password = this.encryptPassword(user.password); } @@ -209,7 +210,7 @@ export class UserController { @Put() @ApiOperation({ summary: 'Update an existing user' }) - @ApiBody({ type: User, description: 'User data to update' }) + @ApiBody({ type: UserUpdateDTO, description: 'User data to update' }) @ApiResponse({ status: 400, description: 'Failed to update user', @@ -240,7 +241,8 @@ export class UserController { status: 200, description: 'User successfully updated', }) - async update(@Body() user: User, @Res() res: Response) { + @UsePipes(new ValidationPipe({ whitelist: true, skipMissingProperties: true })) + async update(@Body() user: UserUpdateDTO, @Res() res: Response) { if (!user || !user.id) { const response = new GenericResponse({ exception: true, diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 14fce99..8bd0a28 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -30,7 +30,7 @@ export class UserService { return User.destroy({where: {id: id}}); } - async upsert(userDetail: User, insertIfNotFound: boolean): Promise { + async upsert(userDetail: any, insertIfNotFound: boolean): Promise { if(userDetail.id) { const existingUser = await this.findByPk(userDetail.id); if(existingUser) { @@ -41,8 +41,4 @@ export class UserService { return User.create(userDetail as any) } } - - async login(user: User): Promise { - return User.findOne({where: user as any, include: UserAdditionalDetail}) - } }