@@ -2,6 +2,8 @@ import z from "zod";
22import { authMiddleware } from "./auth" ;
33import Elysia from "elysia" ;
44import { redis } from "@/lib/redis" ;
5+ import { Message , realtime } from "@/lib/realtime" ;
6+ import { nanoid } from "nanoid" ;
57
68export 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