155 lines
5.5 KiB
TypeScript
155 lines
5.5 KiB
TypeScript
import type { Express, Request, Response } from "express";
|
|
import { internalChatStorage } from "./storage";
|
|
|
|
export function registerInternalChatRoutes(app: Express): void {
|
|
app.get("/api/chat/threads", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const threads = await internalChatStorage.getUserThreads(req.user!.id);
|
|
res.json(threads);
|
|
} catch (error) {
|
|
console.error("Error fetching threads:", error);
|
|
res.status(500).json({ error: "Failed to fetch threads" });
|
|
}
|
|
});
|
|
|
|
app.get("/api/chat/threads/:id", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const threadId = parseInt(req.params.id);
|
|
const userId = req.user!.id;
|
|
|
|
const isParticipant = await internalChatStorage.isUserInThread(userId, threadId);
|
|
if (!isParticipant) {
|
|
return res.status(403).json({ error: "Access denied" });
|
|
}
|
|
|
|
const thread = await internalChatStorage.getThread(threadId);
|
|
const participants = await internalChatStorage.getThreadParticipants(threadId);
|
|
const messages = await internalChatStorage.getThreadMessages(threadId);
|
|
|
|
res.json({ ...thread, participants, messages });
|
|
} catch (error) {
|
|
console.error("Error fetching thread:", error);
|
|
res.status(500).json({ error: "Failed to fetch thread" });
|
|
}
|
|
});
|
|
|
|
app.post("/api/chat/threads/direct", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const { userId: targetUserId } = req.body;
|
|
if (!targetUserId) {
|
|
return res.status(400).json({ error: "userId is required" });
|
|
}
|
|
|
|
const thread = await internalChatStorage.createDirectThread(req.user!.id, targetUserId);
|
|
res.status(201).json(thread);
|
|
} catch (error) {
|
|
console.error("Error creating direct thread:", error);
|
|
res.status(500).json({ error: "Failed to create thread" });
|
|
}
|
|
});
|
|
|
|
app.post("/api/chat/threads/group", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const { name, memberIds } = req.body;
|
|
if (!name || !memberIds || !Array.isArray(memberIds)) {
|
|
return res.status(400).json({ error: "name and memberIds are required" });
|
|
}
|
|
|
|
const thread = await internalChatStorage.createGroupThread(name, req.user!.id, memberIds);
|
|
res.status(201).json(thread);
|
|
} catch (error) {
|
|
console.error("Error creating group thread:", error);
|
|
res.status(500).json({ error: "Failed to create group" });
|
|
}
|
|
});
|
|
|
|
app.get("/api/chat/threads/:id/messages", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const threadId = parseInt(req.params.id);
|
|
const userId = req.user!.id;
|
|
|
|
const isParticipant = await internalChatStorage.isUserInThread(userId, threadId);
|
|
if (!isParticipant) {
|
|
return res.status(403).json({ error: "Access denied" });
|
|
}
|
|
|
|
const messages = await internalChatStorage.getThreadMessages(threadId);
|
|
res.json(messages);
|
|
} catch (error) {
|
|
console.error("Error fetching messages:", error);
|
|
res.status(500).json({ error: "Failed to fetch messages" });
|
|
}
|
|
});
|
|
|
|
app.post("/api/chat/threads/:id/messages", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const threadId = parseInt(req.params.id);
|
|
const userId = req.user!.id;
|
|
const { body } = req.body;
|
|
|
|
if (!body || !body.trim()) {
|
|
return res.status(400).json({ error: "Message body is required" });
|
|
}
|
|
|
|
const isParticipant = await internalChatStorage.isUserInThread(userId, threadId);
|
|
if (!isParticipant) {
|
|
return res.status(403).json({ error: "Access denied" });
|
|
}
|
|
|
|
const message = await internalChatStorage.createMessage(threadId, userId, body);
|
|
res.status(201).json(message);
|
|
} catch (error) {
|
|
console.error("Error sending message:", error);
|
|
res.status(500).json({ error: "Failed to send message" });
|
|
}
|
|
});
|
|
|
|
app.post("/api/chat/threads/:id/read", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const threadId = parseInt(req.params.id);
|
|
const userId = req.user!.id;
|
|
|
|
await internalChatStorage.markAsRead(threadId, userId);
|
|
res.json({ success: true });
|
|
} catch (error) {
|
|
console.error("Error marking as read:", error);
|
|
res.status(500).json({ error: "Failed to mark as read" });
|
|
}
|
|
});
|
|
|
|
app.get("/api/chat/users", async (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.isAuthenticated()) {
|
|
return res.status(401).json({ error: "Not authenticated" });
|
|
}
|
|
const allUsers = await internalChatStorage.getAllUsers();
|
|
const otherUsers = allUsers.filter(u => u.id !== req.user!.id);
|
|
res.json(otherUsers);
|
|
} catch (error) {
|
|
console.error("Error fetching users:", error);
|
|
res.status(500).json({ error: "Failed to fetch users" });
|
|
}
|
|
});
|
|
}
|