@@ -3,43 +3,82 @@ import { getAuth } from "~/lib/auth";
33import { getDB } from "~/lib/db" ;
44import { hai , haiyama } from "~/lib/db/schema" ;
55import { dbHaiToHai } from "~/lib/hai" ;
6+ import { type GameState , getRedisClient , init } from "~/lib/redis" ;
67import type { Route } from "./+types/play" ;
78
8- export async function loader ( { context, request } : Route . LoaderArgs ) {
9+ export async function loader ( {
10+ context,
11+ request,
12+ } : Route . LoaderArgs ) : Promise < GameState > {
913 const { env } = context . cloudflare ;
1014 const db = getDB ( env ) ;
1115 const auth = getAuth ( env ) ;
1216 const session = await auth . api . getSession ( { headers : request . headers } ) ;
17+
1318 if ( ! session ?. user ?. id ) {
1419 throw new Response ( "Unauthorized" , { status : 401 } ) ;
1520 }
1621 const userId = session . user . id ;
1722
18- const randomHaiyama = await db
19- . select ( )
20- . from ( haiyama )
21- . orderBy ( sql `RANDOM()` )
22- . limit ( 1 ) ;
23+ // Check if game state already exists in Redis
24+ const redisClient = getRedisClient ( env ) ;
25+ await redisClient . connect ( ) ;
26+
27+ try {
28+ const existingGameState = await redisClient . get ( `user:${ userId } :game` ) ;
29+
30+ if ( existingGameState ) {
31+ // Return existing game state from Redis
32+ await redisClient . quit ( ) ;
33+ return JSON . parse ( existingGameState ) ;
34+ }
35+
36+ // No existing game state, so initialize from PostgreSQL
37+ const randomHaiyama = await db
38+ . select ( )
39+ . from ( haiyama )
40+ . orderBy ( sql `RANDOM()` )
41+ . limit ( 1 ) ;
42+
43+ if ( randomHaiyama . length === 0 ) {
44+ await redisClient . quit ( ) ;
45+ throw new Response ( "No haiyama found" , { status : 404 } ) ;
46+ }
47+
48+ const selectedHaiyama = randomHaiyama [ 0 ] ;
49+ const rawHaiData = await db
50+ . select ( )
51+ . from ( hai )
52+ . where ( sql `${ hai . haiyamaId } = ${ selectedHaiyama . id } ` )
53+ . orderBy ( hai . order ) ;
54+
55+ const haiData = rawHaiData . map ( ( hai ) => dbHaiToHai ( hai ) ) ;
56+
57+ // Initialize game state in Redis
58+ await init ( redisClient , userId , haiData ) ;
59+
60+ // Get the initialized game state to return
61+ const gameStateJSON = await redisClient . get ( `user:${ userId } :game` ) ;
62+ const gameState = gameStateJSON ? JSON . parse ( gameStateJSON ) : null ;
2363
24- if ( randomHaiyama . length === 0 ) {
25- throw new Response ( "No haiyama found" , { status : 404 } ) ;
64+ await redisClient . quit ( ) ;
65+ return gameState ;
66+ } catch ( error ) {
67+ await redisClient . quit ( ) ;
68+ throw error instanceof Error ? error : new Error ( String ( error ) ) ;
2669 }
27- const selectedHaiyama = randomHaiyama [ 0 ] ;
28- const rawHaiData = await db
29- . select ( )
30- . from ( hai )
31- . where ( sql `${ hai . haiyamaId } = ${ selectedHaiyama . id } ` )
32- . orderBy ( hai . order ) ;
33- const haiData = rawHaiData . map ( ( hai ) => dbHaiToHai ( hai ) ) ;
34- //TODO: store data in redis
35- return haiData ;
3670}
3771
3872export default function Page ( { loaderData } : Route . ComponentProps ) {
39- console . log ( loaderData ) ;
73+ const exampleHai = loaderData . haiyama [ 0 ] ;
4074 return (
4175 < >
4276 < p > Play Page</ p >
77+ < img
78+ src = { `/hai/${ exampleHai . kind } _${ exampleHai . value } .png` }
79+ alt = { `${ hai . kind } ${ hai . value } ` }
80+ className = "cursor-pointer"
81+ />
4382 </ >
4483 ) ;
4584}
0 commit comments