Skip to content

Commit 342a382

Browse files
committed
api: implement POST and GET messages
1 parent 31e9ad5 commit 342a382

1 file changed

Lines changed: 37 additions & 2 deletions

File tree

src/app/api/[[...slugs]]/messages.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import z from "zod";
22
import { authMiddleware } from "./auth";
33
import Elysia from "elysia";
44
import { redis } from "@/lib/redis";
5+
import { Message, realtime } from "@/lib/realtime";
6+
import { nanoid } from "nanoid";
57

68
export const messages = new Elysia({ prefix: "/messages" })
79
.use(authMiddleware)
@@ -17,9 +19,24 @@ export const messages = new Elysia({ prefix: "/messages" })
1719
throw new Error("Room not found");
1820
}
1921

20-
console.log("SENDING MESSAGE", { sender, text });
22+
const message: Message = {
23+
id: nanoid(),
24+
sender,
25+
text,
26+
timestamp: Date.now(),
27+
roomId,
28+
};
2129

22-
return { message: "Message sent" };
30+
await redis.rpush(`messages:${roomId}`, {
31+
...message,
32+
token: auth.token,
33+
});
34+
await realtime.channel(`chat:${roomId}`).emit("chat.message", message);
35+
36+
const remaining = await redis.ttl(`meta:${roomId}`);
37+
await redis.expire(`messages:${roomId}`, remaining);
38+
await redis.expire(`history:${roomId}`, remaining);
39+
await redis.expire(roomId, remaining);
2340
},
2441
{
2542
query: z.object({ roomId: z.string() }),
@@ -28,4 +45,22 @@ export const messages = new Elysia({ prefix: "/messages" })
2845
text: z.string().max(1000),
2946
}),
3047
},
48+
)
49+
.get(
50+
"/",
51+
async ({ auth }) => {
52+
const messages = await redis.lrange<Message>(
53+
`messages:${auth.roomId}`,
54+
0,
55+
-1,
56+
);
57+
58+
return {
59+
messages: messages.map((m) => ({
60+
...m,
61+
token: m.token === auth.token ? auth.token : undefined,
62+
})),
63+
};
64+
},
65+
{ query: z.object({ roomId: z.string() }) },
3166
);

0 commit comments

Comments
 (0)