Skip to content

Commit 1d583fb

Browse files
authored
Merge pull request #390 from PromptPlace/develop
Develop -> Main
2 parents 4538508 + 839b264 commit 1d583fb

11 files changed

Lines changed: 999 additions & 3 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": "1.0.0",
44
"main": "index.js",
55
"scripts": {
6-
"dev": "ts-node-dev --respawn --transpile-only src/index.ts",
6+
"dev": "dotenv -e .env.dev -- ts-node-dev --respawn --transpile-only src/index.ts",
77
"test": "echo \"Error: no test specified\" && exit 1",
88
"start": "node dist/index.js",
99
"prebuild": "npm run generate:swagger",
@@ -68,6 +68,7 @@
6868
"@types/swagger-jsdoc": "^6.0.4",
6969
"@types/swagger-ui-express": "^4.1.8",
7070
"@types/uuid": "^10.0.0",
71+
"dotenv-cli": "^11.0.0",
7172
"nodemon": "^3.1.10",
7273
"prisma": "^6.11.1",
7374
"ts-node": "^10.9.2",

pnpm-lock.yaml

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE `ChatParticipant` ADD COLUMN `unreadCount` INTEGER NOT NULL DEFAULT 0;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/*
2+
Warnings:
3+
4+
- You are about to drop the column `unreadCount` on the `ChatParticipant` table. All the data in the column will be lost.
5+
6+
*/
7+
-- AlterTable
8+
ALTER TABLE `ChatParticipant` DROP COLUMN `unreadCount`,
9+
ADD COLUMN `unread_count` INTEGER NOT NULL DEFAULT 0;

prisma/schema.prisma

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,11 +515,12 @@ model ChatParticipant {
515515
room_id Int
516516
user_id Int
517517
last_read_message_id Int?
518+
unread_count Int @default(0)
518519
519520
chatRoom ChatRoom @relation("RoomParticipants", fields: [room_id], references: [room_id], onDelete: Cascade)
520521
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
521522
lastReadMessage ChatMessage? @relation("LastReadMessage", fields: [last_read_message_id], references: [message_id], onDelete: SetNull)
522-
523+
523524
@@unique([room_id, user_id])
524525
}
525526

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import { Request, Response } from "express";
2+
import { chatService } from "../services/chat.service";
3+
import {
4+
CreateChatRoomRequestDto,
5+
GetChatRoomListRequestDto,
6+
ChatFilterType
7+
} from "../dtos/chat.dto";
8+
9+
export const createOrGetChatRoom = async (req: Request, res: Response): Promise<void> => {
10+
if (!req.user) {
11+
res.fail({
12+
statusCode: 401,
13+
error: "no user",
14+
message: "로그인이 필요합니다.",
15+
});
16+
return;
17+
}
18+
19+
try {
20+
const userId = (req.user as { user_id: number }).user_id;
21+
const { partner_id } = req.body as CreateChatRoomRequestDto;
22+
23+
const result = await chatService.createOrGetChatRoomService(userId, partner_id);
24+
25+
res.success(result, "채팅방을 성공적으로 생성/반환했습니다.");
26+
} catch (err: any) {
27+
console.error(err);
28+
res.fail({
29+
error: err.name || "InternalServerError",
30+
message: err.message || "채팅방 생성/반환 중 오류가 발생했습니다.",
31+
statusCode: err.statusCode || 500,
32+
});
33+
}
34+
};
35+
36+
export const getChatRoomDetail = async (req: Request, res: Response): Promise<void> => {
37+
if (!req.user) {
38+
res.fail({
39+
statusCode: 401,
40+
error: "no user",
41+
message: "로그인이 필요합니다.",
42+
});
43+
return;
44+
}
45+
46+
try{
47+
const userId = (req.user as { user_id: number }).user_id;
48+
49+
const roomId = Number(req.params.roomId);
50+
const cursor = req.query.cursor ? Number(req.query.cursor) : undefined;
51+
const limit = req.query.limit ? Number(req.query.limit) : 20;
52+
53+
if (isNaN(roomId)) {
54+
res.fail({ statusCode: 400, error: "BadRequest", message: "올바른 roomId 필요합니다." });
55+
return;
56+
}
57+
58+
const result = await chatService.getChatRoomDetailService(roomId, userId, cursor, limit);
59+
60+
res.success(result, "채팅방 상세를 성공적으로 조회했습니다.");
61+
} catch (err: any) {
62+
console.error(err);
63+
res.fail({
64+
error: err.name || "InternalServerError",
65+
message: err.message || "채팅방 상세 조회 중 오류가 발생했습니다.",
66+
statusCode: err.statusCode || 500,
67+
});
68+
}
69+
}
70+
71+
// == 채팅방 목록
72+
export const getChatRoomList = async(req: Request, res: Response) => {
73+
if (!req.user) {
74+
res.fail({
75+
statusCode: 401,
76+
error: "no user",
77+
message: "로그인이 필요합니다.",
78+
});
79+
return;
80+
}
81+
82+
try{
83+
const userId = (req.user as { user_id: number }).user_id;
84+
const { cursor, limit, filter, search } = req.query as unknown as GetChatRoomListRequestDto;
85+
86+
if (filter && filter !== "all" && filter !== "unread" && filter !== "pinned") {
87+
res.fail({ statusCode: 400, error: "BadRequest", message: "올바른 filter값이 필요합니다." });
88+
return;
89+
}
90+
91+
const result = await chatService.getChatRoomListService(
92+
userId,
93+
cursor ? Number(cursor) : undefined,
94+
limit ? Number(limit) : undefined,
95+
filter,
96+
search as string
97+
);
98+
res.success(result, "채팅방 목록을 성공적으로 조회했습니다.");
99+
} catch (err: any) {
100+
console.error(err);
101+
res.fail({
102+
error: err.name || "InternalServerError",
103+
message: err.message || "채팅방 목록 조회 중 오류가 발생했습니다.",
104+
statusCode: err.statusCode || 500,
105+
});
106+
}
107+
}

0 commit comments

Comments
 (0)