기능 순서
- 사용자는 프로필 페이지에서 정보 수정 버튼을 통해 현재 정보를 다른 정보로 바꿀 수 있다.
- 어떤 사용자가 어떤 요청을 보냈는 지 식별하기 위해서는 요칭 시에 Header로 보내는 JWT token을 통해 사용자 인증 과정을 거친다
Route
// 사용자 정보 수정 시에 프로필 이미지도 변경이 가능 하기에 multy middleware 추가
router.patch('/', uploadImage.single('profile'), verifyTokenMiddleware, updateUserProfile);
Controller
// 사용자 프로필 수정
// @route patch /users
// @header Authorization Bearer token
export const updateUserProfile = async (req: Request, res: Response) => {
try {
const { username, password, bio } = req.body;
const profile = req.file?.filename;
await updateUserProfileService({userId: req.body.userId, username, password, bio, profile});
responseSuccess(res, null, 'User profile updated successfully', 200);
return
} catch (error) {
handleControllerError({res, error, message: 'Failed to update user profile', statusCode: 400});
}
}
- 해당 컨트롤러에 요청이 오기 전 Middleware에서 토큰을 통해 사용자를 인증하는 과정을 거침
- 해당 정보를 바탕으로 userId를 추출할 수 있는데 이를 Service에 넘겨 줌
- 정보 수정 시에는 username / bio / profile 개만 업데이트 가능 ( 현재 구현 시에는 )
Service
// 사용자 프로필 수정 함수
interface UpdateUserProfileProps {
userId: number;
username: string;
password: string;
bio: string;
profile?: string; // 만약 profile이 있다면 기존 profile을 삭제하고 새로운 profile을 저장
}
export const updateUserProfile = async (updateProps: UpdateUserProfileProps): Promise<void> => {
try {
const findUser = await userRepository.findOne({
where: { id: updateProps.userId }
});
if (!findUser) {
throw new Error('User not found');
}
if (!comparePassword({password: updateProps.password, hashedPassword: findUser.password})) {
throw new Error('Password is incorrect');
}
// update user profile data
findUser.username = updateProps.username;
findUser.bio = updateProps.bio;
// if profile exists, delete old profile and save new profile
if (updateProps.profile) {
if (findUser.profile) {
deleteUserProfile(findUser.profile);
}
findUser.profile = updateProps.profile;
}
// 업데이트 해준 후 저장
await userRepository.save(findUser);
return
} catch (error) {
handleError({error, message: 'Failed to update user profile'});
throw error;
}
}
- userId를 통해 사용자 정보를 객체로 가져옴
- 수정 요청 시에 입력한 비밀번호와 현재 객체의 비밀번호가 동일한 지 확인
- 사용자 프로필이 기존에 있다면 해당 파일은 삭제해주고 프로필이 없다면 프로필 정보 업데이트
- save Method를 통해 프로필 정보 업데이트
결과
'Team_Mate > Backend' 카테고리의 다른 글
사용자 비밀번호 변경 기능 구현 (0) | 2025.01.02 |
---|---|
NodeJS 사용자 정보 조회 기능 구현 (0) | 2024.12.22 |
Service에서의 에러 핸들링 방법 (0) | 2024.12.22 |
NodeJS 로그아웃 기능 구현 (1) | 2024.12.20 |
NodeJS 로그인 기능 구현 (0) | 2024.12.20 |