import express from "express"; import { EncryptedTodoService } from "./todo-service.js"; const app = express(); const todoService = new EncryptedTodoService(); app.use(express.json()); app.use(express.static("public")); // Create user app.post("/api/users", async (req, res) => { try { const { userId } = req.body; if (!userId) { return res.status(400).json({ error: "userId is required" }); } const user = await todoService.createUser(userId); res.json(user); } catch (error) { res.status(400).json({ error: error.message }); } }); // Get all users (for sharing) app.get("/api/users", async (req, res) => { try { const users = Array.from(todoService.users.keys()); res.json(users); } catch (error) { res.status(400).json({ error: error.message }); } }); // Add todo app.post("/api/users/:userId/todos", async (req, res) => { try { const { userId } = req.params; const { text } = req.body; if (!text) { return res.status(400).json({ error: "Todo text is required" }); } const todoId = await todoService.addTodo(userId, text); res.json({ todoId }); } catch (error) { res.status(400).json({ error: error.message }); } }); // Get todos (decrypted) app.get("/api/users/:userId/todos", async (req, res) => { try { const { userId } = req.params; const todos = await todoService.getTodos(userId); res.json(todos); } catch (error) { res.status(400).json({ error: error.message }); } }); // Get encrypted todos app.get("/api/users/:userId/todos/encrypted", async (req, res) => { try { const { userId } = req.params; // Get the user's todo IDs const todoIds = todoService.userTodos.get(userId) || new Set(); // Get the encrypted todos const encryptedTodos = Array.from(todoIds) .map((todoId) => { const todo = todoService.todos.get(todoId); if (!todo) return null; return { id: todoId, encrypted: todo.encrypted, createdAt: todo.createdAt, }; }) .filter((todo) => todo !== null); res.json(encryptedTodos); } catch (error) { res.status(400).json({ error: error.message }); } }); // Delete todo app.delete("/api/users/:userId/todos/:todoId", async (req, res) => { try { const { userId, todoId } = req.params; await todoService.deleteTodo(userId, todoId); res.json({ success: true }); } catch (error) { res.status(400).json({ error: error.message }); } }); // Share todo with another user app.post("/api/users/:userId/todos/:todoId/share", async (req, res) => { try { const { userId, todoId } = req.params; const { recipientId } = req.body; if (!recipientId) { return res.status(400).json({ error: "Recipient ID is required" }); } await todoService.shareTodo(userId, todoId, recipientId); res.json({ success: true }); } catch (error) { res.status(400).json({ error: error.message }); } }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Encrypted Todo server running on port ${PORT}`); });