Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b968ae0
added update user info endpoint and tests
bhuvanh66 Dec 4, 2025
5830938
merge
swarkewalia Feb 1, 2026
bd3f846
merge fixes
swarkewalia Feb 1, 2026
061c4a8
some fixes
swarkewalia Feb 1, 2026
8a8420c
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Feb 16, 2026
6411d03
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Feb 17, 2026
dc91943
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Feb 18, 2026
3f6119c
update endpoints
swarkewalia Feb 19, 2026
9df9b00
update user entity
swarkewalia Feb 19, 2026
9a7f68f
update service tests
swarkewalia Feb 21, 2026
50ffbec
fix git tests
swarkewalia Feb 21, 2026
4d9140d
switch put to patch
swarkewalia Feb 21, 2026
f9ae01b
nits
swarkewalia Feb 21, 2026
3910aaa
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Feb 22, 2026
a4f5fd1
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Feb 27, 2026
7cfbbb5
merge
swarkewalia Feb 28, 2026
118c7a0
refactored service tests
swarkewalia Mar 1, 2026
d941e2f
all comments
swarkewalia Mar 1, 2026
c35b42b
fix tests
swarkewalia Mar 1, 2026
ec6d6cf
merge changes
swarkewalia Mar 1, 2026
6547ec0
prettier
swarkewalia Mar 1, 2026
2122134
test fixes
swarkewalia Mar 1, 2026
5664b18
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Mar 6, 2026
698ab4a
Merge branch 'main' into BH/SSF-102-Update-User-Info
swarkewalia Mar 8, 2026
a697e79
Merge branch 'main' of https://github.com/Code-4-Community/ssf into B…
swarkewalia Mar 11, 2026
d34b290
addressed comments
swarkewalia Mar 11, 2026
628f035
fix tests
swarkewalia Mar 11, 2026
6519f88
prettier
swarkewalia Mar 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions apps/backend/src/users/dtos/update-user-info.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {
IsString,
IsPhoneNumber,
IsOptional,
IsNotEmpty,
MaxLength,
} from 'class-validator';

export class updateUserInfoDto {
@IsOptional()
@IsString()
@IsNotEmpty()
@MaxLength(255)
firstName?: string;

@IsOptional()
@IsString()
@IsNotEmpty()
@MaxLength(255)
lastName?: string;

@IsOptional()
@IsString()
@IsNotEmpty()
@IsPhoneNumber('US', {
message:
'phone must be a valid phone number (make sure all the digits are correct)',
})
phone?: string;
}
45 changes: 32 additions & 13 deletions apps/backend/src/users/users.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { BadRequestException } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { User } from './users.entity';
import { Role } from './types';
import { userSchemaDto } from './dtos/userSchema.dto';

import { Test, TestingModule } from '@nestjs/testing';
import { mock } from 'jest-mock-extended';
import { updateUserInfoDto } from './dtos/update-user-info.dto';
import { Pantry } from '../pantries/pantries.entity';
import { BadRequestException } from '@nestjs/common';
import { AuthenticatedRequest } from '../auth/authenticated-request';

const mockUserService = mock<UsersService>();
Expand Down Expand Up @@ -79,24 +80,42 @@ describe('UsersController', () => {
});
});

describe('PUT /:id/role', () => {
it('should update user role with valid role', async () => {
const updatedUser = { ...mockUser1, role: Role.ADMIN };
describe('PATCH /:id', () => {
it('should update user info with valid information', async () => {
const updatedUser = {
...mockUser1,
firstName: 'UpdatedFirstName',
lastName: 'UpdatedLastName',
phone: '777-777-7777',
};
mockUserService.update.mockResolvedValue(updatedUser as User);

const result = await controller.updateRole(1, Role.ADMIN);
const updateUserSchema: updateUserInfoDto = {
firstName: 'UpdatedFirstName',
lastName: 'UpdatedLastName',
phone: '777-777-7777',
};
const result = await controller.updateInfo(1, updateUserSchema);

expect(result).toEqual(updatedUser);
expect(mockUserService.update).toHaveBeenCalledWith(1, {
role: Role.ADMIN,
});
expect(mockUserService.update).toHaveBeenCalledWith(1, updateUserSchema);
});

it('should throw BadRequestException for invalid role', async () => {
await expect(controller.updateRole(1, 'invalid_role')).rejects.toThrow(
BadRequestException,
it('should throw BadRequestException when DTO is empty', async () => {
mockUserService.update.mockRejectedValue(
new BadRequestException(
'At least one field must be provided to update',
),
);

const updateUserSchema: updateUserInfoDto = {};

await expect(controller.updateInfo(1, updateUserSchema)).rejects.toThrow(
new BadRequestException(
'At least one field must be provided to update',
),
);
expect(mockUserService.update).not.toHaveBeenCalled();
expect(mockUserService.update).toHaveBeenCalledWith(1, updateUserSchema);
});
});

Expand Down
16 changes: 6 additions & 10 deletions apps/backend/src/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,15 @@ import {
Get,
Param,
ParseIntPipe,
Put,
Post,
BadRequestException,
Body,
Patch,
Req,
} from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './users.entity';
import { Role } from './types';
import { userSchemaDto } from './dtos/userSchema.dto';
import { updateUserInfoDto } from './dtos/update-user-info.dto';
import { AuthenticatedRequest } from '../auth/authenticated-request';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { UseGuards } from '@nestjs/common';
Expand All @@ -38,15 +37,12 @@ export class UsersController {
return this.usersService.remove(userId);
}

@Put('/:id/role')
async updateRole(
@Patch('/:id')
async updateInfo(
@Param('id', ParseIntPipe) id: number,
@Body('role') role: string,
@Body() dto: updateUserInfoDto,
): Promise<User> {
if (!Object.values(Role).includes(role as Role)) {
throw new BadRequestException('Invalid role');
}
return this.usersService.update(id, { role: role as Role });
return this.usersService.update(id, dto);
}

@Post('/')
Expand Down
18 changes: 15 additions & 3 deletions apps/backend/src/users/users.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,25 @@ export class User {
})
role!: Role;

@Column()
@Column({
type: 'varchar',
name: 'first_name',
length: 255,
})
firstName!: string;

@Column()
@Column({
type: 'varchar',
name: 'last_name',
length: 255,
})
lastName!: string;

@Column()
@Column({
type: 'varchar',
name: 'email',
length: 255,
})
email!: string;

@Column({
Expand Down
Loading
Loading