Skip to content
Open
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
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/controllers/post.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ export async function getPosts(req, res) {
export async function getRecentPosts(req, res) {
try {
const limit = Number(req.query.limit ?? 5);
const result = await postService.getRecentPosts(limit);
const userDormId = req.user?.dorm_id ?? null;
const result = await postService.getRecentPosts(limit, userDormId);
return res.status(200).json(result);
} catch (err) {
return res.status(err.status ?? 500).json({ message: err.message });
Expand Down Expand Up @@ -80,4 +81,3 @@ export async function getPostDetail(req, res) {
return res.status(err.status ?? 500).json({ message: err.message });
}
}

33 changes: 33 additions & 0 deletions src/controllers/user.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,39 @@ export async function getMe(req, res) {
}
}

export async function getMyPosts(req, res) {
try {
const userId = req.user.user_id;
const result = await userService.getMyPosts(userId, req.query);
return res.status(200).json(result);
} catch (err) {
console.error(err);
return res.status(err.status ?? 500).json({ message: err.message });
}
}

export async function getMyComments(req, res) {
try {
const userId = req.user.user_id;
const result = await userService.getMyComments(userId, req.query);
return res.status(200).json(result);
} catch (err) {
console.error(err);
return res.status(err.status ?? 500).json({ message: err.message });
}
}

export async function getMyParties(req, res) {
try {
const userId = req.user.user_id;
const result = await userService.getMyParties(userId, req.query);
return res.status(200).json(result);
} catch (err) {
console.error(err);
return res.status(err.status ?? 500).json({ message: err.message });
}
}

export async function updateMe(req, res) {
try {
const userId = req.user.user_id;
Expand Down
3 changes: 3 additions & 0 deletions src/routes/user.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import * as userController from "../controllers/user.controller.js";
const router = Router();

router.get("/me", authMiddleware, userController.getMe);
router.get("/me/posts", authMiddleware, userController.getMyPosts);
router.get("/me/comments", authMiddleware, userController.getMyComments);
router.get("/me/parties", authMiddleware, userController.getMyParties);
router.patch("/me", authMiddleware, userController.updateMe);

export default router;
14 changes: 13 additions & 1 deletion src/services/auth.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@ async function register(data) {
return {
accessToken: token,
user: {
user_id: user.user_id,
name: user.name,
email: user.email,
dorm_id: user.dorm_id,
dorm_name: user.dorm?.dorm_name ?? null,
room_no: user.room_no ?? null,
phone: user.phone ?? null,
account_number: user.account_number ?? null,
created_at: user.created_at
},
};
}
Expand Down Expand Up @@ -70,12 +73,15 @@ async function login(data) {
return {
accessToken: token,
user: {
user_id: user.user_id,
name: user.name,
email: user.email,
dorm_id: user.dorm_id,
dorm_name: user.dorm?.dorm_name ?? null,
room_no: user.room_no ?? null,
phone: user.phone ?? null,
account_number: user.account_number ?? null,
created_at: user.created_at
},
};
}
Expand All @@ -93,12 +99,15 @@ async function getMe(user_id) {
}

return {
user_id: user.user_id,
name: user.name,
email: user.email,
dorm_id: user.dorm_id,
dorm_name: user.dorm?.dorm_name ?? null,
room_no: user.room_no,
phone: user.phone,
account_number: user.account_number ?? null,
created_at: user.created_at
};
}

Expand All @@ -110,13 +119,16 @@ async function updateMe(user_id, data) {
});

return {
user_id: user.user_id,
name: user.name,
email: user.email,
dorm_id: user.dorm_id,
dorm_name: user.dorm?.dorm_name ?? null,
room_no: user.room_no,
phone: user.phone,
account_number: user.account_number ?? null,
created_at: user.created_at
};
}

export default { register, login, getMe, updateMe };
export default { register, login, getMe, updateMe };
17 changes: 17 additions & 0 deletions src/services/dorm.service.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
import prisma from "../config/prisma.js";

const DEFAULT_DORMS = [
{ dorm_id: 1, dorm_name: "남제관" },
{ dorm_id: 2, dorm_name: "용지관" },
{ dorm_id: 3, dorm_name: "광교관" },
{ dorm_id: 4, dorm_name: "화홍관" },
{ dorm_id: 5, dorm_name: "국제학사관" },
{ dorm_id: 6, dorm_name: "일신관" }
];

async function getAllDorms() {
const count = await prisma.dormitory.count();
if (count === 0) {
await prisma.dormitory.createMany({
data: DEFAULT_DORMS,
skipDuplicates: true
});
}

return await prisma.dormitory.findMany({
orderBy: { dorm_id: "asc" }
});
Expand Down
18 changes: 14 additions & 4 deletions src/services/post.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,21 @@ async function getPosts(query) {
};
}

async function getRecentPosts(limit = 5) {
async function getRecentPosts(limit = 5, userDormId = null) {
const where = {
status: "active",
};

// 택시는 dorm 제한 없음, 그 외에는 로그인 사용자의 dorm_id로 필터
if (userDormId !== null) {
where.OR = [
{ category: "taxi" },
{ dorm_id: Number(userDormId) },
];
}

const posts = await prisma.post.findMany({
where: {
status: "active"
},
where,
include: {
user: {
select: { name: true, dorm_id: true }
Expand Down
187 changes: 184 additions & 3 deletions src/services/user.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,170 @@ async function getMe(user_id) {
throw e;
}

return user;
return {
user_id: user.user_id,
email: user.email,
name: user.name,
dorm_id: user.dorm_id,
dorm_name: user.dorm?.dorm_name ?? null,
room_no: user.room_no,
phone: user.phone,
account_number: user.account_number,
created_at: user.created_at
};
}

function buildPagination(query) {
const page = Number(query.page ?? 1);
const size = Number(query.size ?? 10);
const skip = (page - 1) * size;
return { page, size, skip };
}

async function getMyPosts(user_id, query = {}) {
const { page, size, skip } = buildPagination(query);

const where = {
user_id,
...(query.category ? { category: query.category } : {}),
};

const [posts, totalCount] = await Promise.all([
prisma.post.findMany({
where,
include: {
party: {
include: { members: true },
},
dorm: {
select: { dorm_name: true },
},
_count: {
select: { comments: true },
},
},
orderBy: { created_at: "desc" },
skip,
take: size,
}),
prisma.post.count({ where }),
]);

const items = posts.map((post) => {
const { dorm, _count, ...restPost } = post;
return {
...restPost,
dorm_name: dorm?.dorm_name ?? null,
current_member_count: post.party ? post.party.members.length : null,
comment_count: _count.comments,
};
});

return { items, totalCount, page, size };
}

async function getMyComments(user_id, query = {}) {
const { page, size, skip } = buildPagination(query);

const [comments, totalCount] = await Promise.all([
prisma.comment.findMany({
where: { user_id },
include: {
post: {
include: {
dorm: { select: { dorm_name: true } },
party: {
include: { members: true },
},
_count: { select: { comments: true } },
},
},
user: { select: { name: true } },
},
orderBy: { created_at: "desc" },
skip,
take: size,
}),
prisma.comment.count({ where: { user_id } }),
]);

const items = comments.map((comment) => {
const { post, ...restComment } = comment;
if (!post) return { ...restComment, post: null };

const { dorm, _count, ...restPost } = post;

return {
...restComment,
post: {
...restPost,
dorm_name: dorm?.dorm_name ?? null,
current_member_count: post.party ? post.party.members.length : null,
comment_count: _count.comments,
},
};
});

return { items, totalCount, page, size };
}

async function getMyParties(user_id, query = {}) {
const { page, size, skip } = buildPagination(query);

const where = {
party: {
is: {
OR: [
{ host_id: user_id },
{ members: { some: { user_id } } },
],
},
},
};

const [posts, totalCount] = await Promise.all([
prisma.post.findMany({
where,
include: {
user: { select: { name: true, dorm_id: true } },
party: {
include: {
members: true,
host: { select: { user_id: true, name: true } },
},
},
dorm: { select: { dorm_name: true } },
_count: { select: { comments: true } },
},
orderBy: { created_at: "desc" },
skip,
take: size,
}),
prisma.post.count({ where }),
]);

const items = posts.map((post) => {
const { dorm, _count, ...restPost } = post;
const party = restPost.party;
const isHost = party?.host_id === user_id;
const isMember = party?.members.some((m) => m.user_id === user_id) ?? false;

return {
...restPost,
dorm_name: dorm?.dorm_name ?? null,
comment_count: _count.comments,
party: party
? {
...party,
current_member_count: party.members.length,
is_joined: isHost || isMember,
}
: null,
party_role: isHost ? "host" : isMember ? "member" : "guest",
};
});

return { items, totalCount, page, size };
}

async function updateMe(user_id, body) {
Expand Down Expand Up @@ -56,14 +219,32 @@ async function updateMe(user_id, body) {
room_no: true,
phone: true,
account_number: true,
created_at: true
created_at: true,
dorm: {
select: {
dorm_name: true
}
}
}
});

return updated;
return {
user_id: updated.user_id,
email: updated.email,
name: updated.name,
dorm_id: updated.dorm_id,
dorm_name: updated.dorm?.dorm_name ?? null,
room_no: updated.room_no,
phone: updated.phone,
account_number: updated.account_number,
created_at: updated.created_at
};
}

export default {
getMe,
getMyPosts,
getMyComments,
getMyParties,
updateMe,
};