diff --git a/src/controllers/user.controller.js b/src/controllers/user.controller.js index c595b0e..83d1aee 100644 --- a/src/controllers/user.controller.js +++ b/src/controllers/user.controller.js @@ -12,6 +12,18 @@ class UserController { next(error); } } + // 프로필 수정 + async updateProfile(req, res, next) { + try { + const userId = req.user.id; // 토큰에서 내 ID 추출 + const body = req.body; // 클라이언트가 보낸 수정할 데이터 + const result = await userService.updateProfile(userId, body); + + return res.success(result, "프로필 수정 성공"); + } catch (error) { + next(error); + } + } } export default new UserController(); \ No newline at end of file diff --git a/src/dtos/user.dto.js b/src/dtos/user.dto.js index cb04f0d..1332803 100644 --- a/src/dtos/user.dto.js +++ b/src/dtos/user.dto.js @@ -1,17 +1,39 @@ +export const bodyToProfileDto = (body) => { + return { + nickname: body.nickname, + phoneNum: body.phoneNum, + email: body.email, + profileImage: body.profileImage, + }; +}; + export const responseFromUser = (user) => { return { userId: user.id, nickname: user.nickname, + phoneNum: user.phoneNum, email: user.email, - profileImage: user.profileImage, // 프로필 이미지 추가 - phoneNumber: user.phoneNumber, + profileImage: user.profileImage, + phoneNum: user.phoneNum, deadlineAlarm: user.deadlineAlarm, taskAlarm: user.taskAlarm, - folders: user.folders.map((folder) => ({ - folderId: folder.id, - name: folder.folderTitle, - color: folder.color, - - })), + folders: user.folders + ? user.folders.map((folder) => ({ + folderId: folder.id, + name: folder.folderTitle, + color: folder.color, + })) + : [], + }; +}; + +export const responseFromUpdatedUser = (user) => { + return { + userId: user.id, + nickname: user.nickname, + phoneNum: user.phoneNum || user.phoneNumber, + email: user.email, + profileImage: user.profileImage, + updatedAt: user.updatedAt, }; }; \ No newline at end of file diff --git a/src/repositories/user.repository.js b/src/repositories/user.repository.js index 2cb5941..27f8f73 100644 --- a/src/repositories/user.repository.js +++ b/src/repositories/user.repository.js @@ -8,4 +8,18 @@ export const getUserData = async (userId) => { }); return user; -}; \ No newline at end of file +}; + +export const updateProfile = async (userId, data) => { + const updatedUser = await prisma.user.update({ + where: { id: userId }, + data: { + nickname: data.nickname, + phoneNum: data.phoneNum, + email: data.email, + profileImage: data.profileImage, + }, + }); + + return updatedUser; +} \ No newline at end of file diff --git a/src/routes/user.route.js b/src/routes/user.route.js index 9c02102..ebd61e1 100644 --- a/src/routes/user.route.js +++ b/src/routes/user.route.js @@ -5,4 +5,6 @@ const userRouter = express.Router(); userRouter.get('/me', authenticate, userController.getMyInfo); +userRouter.patch('/profile', authenticate, userController.updateProfile); + export default userRouter; \ No newline at end of file diff --git a/src/services/user.service.js b/src/services/user.service.js index ac1068a..3cc48d6 100644 --- a/src/services/user.service.js +++ b/src/services/user.service.js @@ -1,16 +1,42 @@ -import { NotFoundError } from "../errors/custom.error.js"; -import { responseFromUser } from "../dtos/user.dto.js"; -import { getUserData } from "../repositories/user.repository.js"; +import { NotFoundError, BadRequestError } from "../errors/custom.error.js"; +import { responseFromUser, responseFromUpdatedUser, bodyToProfileDto } from "../dtos/user.dto.js"; +import { getUserData, updateProfile } from "../repositories/user.repository.js"; class UserService { async getMyInfo(userId) { const user = await getUserData(userId); if (!user) { - throw new NotFoundError("USER_NOT_FOUND", "해당 사용자를 찾을 수 없습니다."); + throw new NotFoundError( + "USER_NOT_FOUND", + "해당 사용자를 찾을 수 없습니다." + ); } return responseFromUser(user); } + + +// 프로필 수정 + async updateProfile(userId, body) { + if (body.nickname && body.nickname.length > 10) { + throw new BadRequestError( + "INVALID_NICKNAME", + "닉네임은 최대 10자까지만 가능합니다." + ); + } + + const isUserExist = await getUserData(userId); + if (!isUserExist) { + throw new NotFoundError( + "USER_NOT_FOUND", + "해당 사용자를 찾을 수 없습니다." + ); + } + const updateData = bodyToProfileDto(body); + const updatedUser = await updateProfile(userId, updateData); + return responseFromUpdatedUser(updatedUser); + } } -export default new UserService(); \ No newline at end of file +export default new UserService(); +