diff --git a/apps/backend/src/users/dtos/updateUserInfo.dto.ts b/apps/backend/src/users/dtos/updateUserInfo.dto.ts new file mode 100644 index 00000000..75f87bc2 --- /dev/null +++ b/apps/backend/src/users/dtos/updateUserInfo.dto.ts @@ -0,0 +1,19 @@ +import { IsString, IsPhoneNumber, IsOptional } from 'class-validator'; + +export class updateUserInfo { + @IsOptional() + @IsString() + firstName?: string; + + @IsOptional() + @IsString() + lastName?: string; + + @IsOptional() + @IsString() + @IsPhoneNumber('US', { + message: + 'phone must be a valid phone number (make sure all the digits are correct)', + }) + phone?: string; +} diff --git a/apps/backend/src/users/users.controller.spec.ts b/apps/backend/src/users/users.controller.spec.ts index 78d116a3..8111d1fc 100644 --- a/apps/backend/src/users/users.controller.spec.ts +++ b/apps/backend/src/users/users.controller.spec.ts @@ -7,6 +7,7 @@ import { userSchemaDto } from './dtos/userSchema.dto'; import { Test, TestingModule } from '@nestjs/testing'; import { mock } from 'jest-mock-extended'; +import { updateUserInfo } from './dtos/updateUserInfo.dto'; const mockUserService = mock(); @@ -116,6 +117,38 @@ describe('UsersController', () => { }); }); + describe('PUT :id/info', () => { + it('should update user info with valid information', async () => { + const updatedUser = { + ...mockUser1, + firstName: 'UpdatedFirstName', + lastName: 'UpdatedLastName', + phone: '777-777-7777', + }; + mockUserService.update.mockResolvedValue(updatedUser); + + const updateUserSchema: updateUserInfo = { + firstName: 'UpdatedFirstName', + lastName: 'UpdatedLastName', + phone: '777-777-7777', + }; + const result = await controller.updateInfo(1, updateUserSchema); + + expect(result).toEqual(updatedUser); + expect(mockUserService.update).toHaveBeenCalledWith(1, updateUserSchema); + }); + + it('should update user info with defaults', async () => { + mockUserService.update.mockResolvedValue(mockUser1); + + const updateUserSchema: Partial = {}; + const result = await controller.updateInfo(1, updateUserSchema); + + expect(result).toEqual(mockUser1); + expect(mockUserService.update).toHaveBeenCalledWith(1, updateUserSchema); + }); + }); + describe('POST /api/users', () => { it('should create a new user with all required fields', async () => { const createUserSchema: userSchemaDto = { diff --git a/apps/backend/src/users/users.controller.ts b/apps/backend/src/users/users.controller.ts index 93a4dc01..f0eb426e 100644 --- a/apps/backend/src/users/users.controller.ts +++ b/apps/backend/src/users/users.controller.ts @@ -17,6 +17,7 @@ import { User } from './user.entity'; import { Role } from './types'; import { VOLUNTEER_ROLES } from './types'; import { userSchemaDto } from './dtos/userSchema.dto'; +import { updateUserInfo } from './dtos/updateUserInfo.dto'; //import { CurrentUserInterceptor } from '../interceptors/current-user.interceptor'; @Controller('users') @@ -51,6 +52,21 @@ export class UsersController { return this.usersService.update(id, { role: role as Role }); } + @Put(':id/info') + async updateInfo( + @Param('id', ParseIntPipe) id: number, + @Body() updateUserInfo: updateUserInfo, + ) { + const { firstName, lastName, phone } = updateUserInfo; + + const updateData: Partial = {}; + if (firstName !== undefined) updateData.firstName = firstName; + if (lastName !== undefined) updateData.lastName = lastName; + if (phone !== undefined) updateData.phone = phone; + + return this.usersService.update(id, updateData); + } + @Post('/') async createUser(@Body() createUserDto: userSchemaDto): Promise { const { email, firstName, lastName, phone, role } = createUserDto;