arcadia-suite-sv/server/chat/routes.ts

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" });
}
});
}