Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions src/controllers/comment.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export const handleAddComment = async (req, res, next) => {
*/

try{
console.log("댓글 추가를 요청했습니다!");
// console.log("댓글 추가를 요청했습니다!");
const commentData = bodyToComment(req.body, req.user.id ,parseInt(req.params.momentId));
const newComment = await addUserComment(commentData);
res.status(StatusCodes.OK).success(newComment);
Expand Down Expand Up @@ -146,7 +146,7 @@ export const handleAddComment = async (req, res, next) => {

*/
try{
console.log("댓글 수정 기능 요청했습니다!");
// console.log("댓글 수정 기능 요청했습니다!");
const momentId = parseInt(req.params.momentId);
const commentId = parseInt(req.params.commentId);
const editData = bodyToEditComment(req.body, req.user.id, momentId, commentId);
Expand Down Expand Up @@ -208,7 +208,7 @@ export const handleAddComment = async (req, res, next) => {
*/

try{
console.log("댓글 삭제 기능 요청");
// console.log("댓글 삭제 기능 요청");
const deleteData = bodyToDeleteComment(req.user.id, req.params.commentId);
const deleteComment = await deleteUserComment(deleteData);
res.status(StatusCodes.OK).success(deleteComment);
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/like.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ export const handleLikeMoment = async (req, res, next) => {
*/

try{
console.log("Like를 요청했습니다!");
// console.log("Like를 요청했습니다!");
const like = await likeMoment(bodyToLike(req.body,req.user.id));
res.status(StatusCodes.OK).success(like);
} catch (error) {
Expand Down Expand Up @@ -122,7 +122,7 @@ export const handleDeleteLikeMoment = async (req, res, next) =>{
*/

try{
console.log("Like 삭제를 요청했습니다!");
// console.log("Like 삭제를 요청했습니다!");
const like = await deleteMomentLike(bodyToDeleteLike(req.body), req.user.id);
res.status(StatusCodes.OK).success(like);
} catch (error) {
Expand Down
85 changes: 51 additions & 34 deletions src/controllers/moment.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ import {
bodyToCreateMoment,
bodyToUpdateMoment,
responseFromMyMomentDetail,
responseFromFriendsMoments,
responseFromFriendMomentDetail } from "../dtos/moment.dto.js";
responseFromOtherUserMoments,
responseFromOtherUserMomentDetail } from "../dtos/moment.dto.js";
import {
momentCreate,
momentUpdate,
momentDelete,
getMyMoments,
getMyMomentDetail,
getFriendsMoments,
getFriendMomentDetail } from "../services/moment.service.js";
getOtherUserMoments,
getOtherUserMomentDetail } from "../services/moment.service.js";


export const handleCreateMoment = async (req, res, next) => {
Expand Down Expand Up @@ -228,66 +228,83 @@ export const handleGetMyMomentDetail = async (req, res, next) => {
}
};

export const handleGetOtherUserMoments = async (req, res, next) => {
try {

// userId 확인: 잘못된 값이 전달되는지 확인
const userId = Number(req.params.userId);
console.log("Received userId from params:", req.params.userId); // 확인용 로그 추가
if (isNaN(userId)) {
throw new Error("유효하지 않은 사용자 ID입니다.");
}

export const handleGetFriendsMoments = async (req, res, next) => {
/*
#swagger.tags = ['Moments']
#swagger.summary = '친구의 Moment 목록 조회 API'
#swagger.description = '친구의 페이지에서 해당 친구의 Moment 게시물 목록을 조회합니다.'
#swagger.security = [{
"bearerAuth": []
}]

*/
// getOtherUserMoments 함수에서 userId 확인
const responseData = await getOtherUserMoments(userId);

try {
console.log("친구의 Moment 목록 조회 요청");
const friendId = parseInt(req.params.friendId, 10);
const moments = await getFriendsMoments(friendId);
res.status(StatusCodes.OK).json({
resultType: "SUCCESS",
error: null,
success: {
data: responseFromFriendsMoments(moments)
}
success: { data: responseData }
});

} catch (error) {
console.error("❌ 특정 사용자의 Moment 목록 조회 오류:", error);
next(error);
}
};


export const handleGetFriendMomentDetail = async (req, res, next) => {







export const handleGetOtherUserMomentDetail = async (req, res, next) => {
/*
#swagger.tags = ['Moments']
#swagger.summary = '친구의 특정 Moment 상세 조회 API'
#swagger.description = '친구의 페이지에서 특정 Moment 게시물의 상세 정보를 조회합니다.'
#swagger.security = [{
"bearerAuth": []
}]
#swagger.summary = '특정 사용자의 특정 Moment 상세 조회 API'
#swagger.description = '특정 사용자의 페이지에서 특정 Moment 게시물의 상세 정보를 조회합니다.'
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['userId'] = {
in: "path",
required: true,
description: "조회할 사용자의 ID",
schema: { type: "integer", example: 1234 }
}
#swagger.parameters['momentId'] = {
in: "path",
required: true,
description: "조회할 Moment의 ID",
schema: { type: "integer", example: 456 }
}

*/

try {
console.log("친구의 특정 Moment 상세 조회 요청");
const friendId = parseInt(req.params.friendId, 10);
const momentId = parseInt(req.params.momentId, 10);
const moment = await getFriendMomentDetail(friendId, momentId);
console.log("특정 사용자의 Moment 목록 조회 요청");

const userId = parseInt(req.params.userId, 10);
if (isNaN(userId)) {
throw new Error("유효하지 않은 사용자 ID입니다.");
}

const moments = await getOtherUserMoments(userId);

// 🔍 responseFromOtherUserMoments() 변환 결과 확인
const responseData = responseFromOtherUserMoments(moments);
console.log("Swagger 응답 데이터:", JSON.stringify(responseData, null, 2));

res.status(StatusCodes.OK).json({
resultType: "SUCCESS",
error: null,
success: {
data: responseFromFriendMomentDetail(moment)
data: responseData
}
});
} catch (error) {
console.error("특정 사용자의 Moment 목록 조회 오류:", error);
next(error);
}
};
};

22 changes: 11 additions & 11 deletions src/dtos/like.dto.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
export const bodyToLike = ({ moment }, userId) => {
return {
fromUserId: userId,
userId: moment.userId,
entityId: moment.id,
entityType: moment.entityType || "moment",
};
};
export const bodyToDeleteLike = ({ like }) => {
return { likeId: like?.likeId };
};
return {
fromUserId: userId,
userId: moment.userId,
entityId: moment.id,
entityType: moment.entityType || "moment",
};
};

export const bodyToDeleteLike = ({ like }) => {
return { likeId: like?.likeId };
};
61 changes: 42 additions & 19 deletions src/dtos/moment.dto.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,33 +194,56 @@ export const responseFromMyMomentDetail = (moment) => {
};


// 친구의 Moment 목록 조회 DTO
export const responseFromFriendsMoments = (moments) => {
return moments.map(moment => ({
userId: moment.userId,
momentId: moment.id,
title: moment.title,
status: moment.status,
createdAt: formatDateTime(moment.createdAt),
updatedAt: formatDateTime(moment.updatedAt),
thumbnailUrl: moment.momentContents[0]?.url || null
}));
export const responseFromOtherUserMoments = (moments) => {
if (!Array.isArray(moments)) {
console.error("❌ moments가 배열이 아님:", moments);
return [];
}

return moments.map(moment => {
if (!moment || typeof moment.id === "undefined") {
console.error("❌ moment.id가 유실됨! 원인 추적 필요:", moment);
return null;
}

const transformedMoment = {
userId: Number(moment.userId), // ✅ bigint 변환
momentId: Number(moment.id), // ✅ bigint 변환
title: moment.title,
date: moment.createdAt ? moment.createdAt.toISOString().split("T")[0] : "날짜 없음",
userName: moment.user?.name ?? "알 수 없음",
likingCount: Number(moment.likingCount ?? 0),
commentCount: Number(moment._count?.comments ?? 0),
thumbnailURL: moment.momentContents?.length > 0 ? moment.momentContents[0].url : null
};

return transformedMoment;
}).filter(moment => moment !== null);
};

// 친구의 moment 상세 조회 DTO
export const responseFromFriendMomentDetail = (moment) => {




// 친구의 Moment 상세 조회 DTO
export const responseFromOtherUserMomentDetail = (moment) => {
if (!moment || !moment.id) {
console.error("잘못된 moment 데이터:", moment);
return null;
}

return {
userId: moment.userId,
momentId: moment.id,
title: moment.title,
status: moment.status,
plannerId: moment.plannerId || null,
createdAt: formatDateTime(moment.createdAt),
updatedAt: formatDateTime(moment.updatedAt),
date: formatDate(moment.createdAt),
plannerId: moment.plannerId ?? null,
createdAt: formatDateTime(moment.createdAt),
updatedAt: formatDateTime(moment.updatedAt),
momentContents: moment.momentContents.map(content => ({
sortOrder: content.sortOrder,
content: content.content,
url: content.url,
url: content.url ?? null
}))
};
};
};
13 changes: 6 additions & 7 deletions src/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ export class DuplicateLikeMomentError extends Error {
statusCode = 409; //Conflict

constructor(data) {
const reason = '이미 존재하는 좋아요입니다다.';
const reason = '이미 존재하는 좋아요입니다.';
super(reason);
this.reason = reason;
this.data = data;
Expand Down Expand Up @@ -177,20 +177,19 @@ export class LikeIdMissingError extends Error {
statusCode = 400; // Bad Request

constructor(data) {
const reason = 'likeId가 요청 데이터에 없습니다';
const reason = 'likeId가 요청 데이터에 없습니다.';
super(reason);
this.reason = reason;
this.data = data;
}
}

//entityId, entityType 또는 userId가 누락
export class ValidationError extends Error{
export class EntityValidationError extends Error{
errorCode = "L005";
statusCode = 400; // Bad Request

constructor(data) {
const reason = 'entityId, entityType 또는 userId가 누락되었습니다.';
const reason = 'entityId 또는 entityType가 누락되었습니다.';
super(reason);
this.reason = reason;
this.data = data;
Expand All @@ -207,7 +206,7 @@ export class DatabaseError extends Error{
statusCode = 500; // Internal Server Error

constructor(data) {
const reason = '데이터베이스 연결에 실패했습니다';
const reason = '데이터베이스 연결에 실패했습니다.';
super(reason);
this.reason = reason;
this.data = data;
Expand All @@ -218,7 +217,7 @@ export class momentIdNotFoundError extends Error {
statusCode = 404; // Not Found

constructor(data) {
const reason = '존재하지 않는 게시글입니다';
const reason = '존재하지 않는 게시글입니다.';
super(reason);
this.reason = reason;
this.data = data;
Expand Down
8 changes: 4 additions & 4 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,17 +187,17 @@ import {
handleDeleteMoment,
handleGetMyMoments,
handleGetMyMomentDetail,
handleGetFriendsMoments,
handleGetFriendMomentDetail
handleGetOtherUserMoments,
handleGetOtherUserMomentDetail
} from "./controllers/moment.controller.js";

app.post("/moments", authenticateJWT, handleCreateMoment); //모먼트 생성
app.patch("/moments/:momentId", authenticateJWT, handleUpdateMoment); //모먼트 수정
app.delete("/moments/:momentId", authenticateJWT, handleDeleteMoment); //모먼트 삭제
app.get("/mypage/moments", authenticateJWT, handleGetMyMoments); //마이페이지에서 나의 moment게시글 목록 조회
app.get("/mypage/moments/:momentId", authenticateJWT, handleGetMyMomentDetail); //마이페이지에서 나의 특정 moment게시물 조회
app.get("/friends/:friendId/moments", authenticateJWT, handleGetFriendsMoments) //친구페이지 moment게시물 목록 조회
app.get("/friends/:friendId/moments/momentId", authenticateJWT, handleGetFriendMomentDetail); //친구페이지 특정 moment게시물 조회
app.get("/users/:userId/moments", authenticateJWT, handleGetOtherUserMoments) //친구페이지 moment게시물 목록 조회
app.get("/users/:userId/moments/momentId", authenticateJWT, handleGetOtherUserMomentDetail); //친구페이지 특정 moment게시물 조회



Expand Down
Loading