diff --git a/app/db.server.ts b/app/db.server.ts deleted file mode 100644 index 7216a95..0000000 --- a/app/db.server.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { SupabaseClient } from "@supabase/supabase-js"; -import { createClient } from "@supabase/supabase-js"; - -import type { Database } from "~/models/database.types"; -import { NODE_ENV, SUPABASE_ANON_KEY, SUPABASE_URL } from "~/utils"; - -let db: SupabaseClient; - -declare global { - // eslint-disable-next-line no-var - var __db__: SupabaseClient; -} - -// this is needed because in development we don't want to restart -// the server with every change, but we want to make sure we don't -// create a new client with every change either. -// in production we'll have a single client. -if (NODE_ENV === "production") { - db = initializeDB(); -} else { - if (!global.__db__) { - global.__db__ = initializeDB(); - } - db = global.__db__; -} - -function initializeDB() { - return createClient(SUPABASE_URL, SUPABASE_ANON_KEY); -} - -export { db }; diff --git a/app/models/report.server.ts b/app/models/report.server.ts index 305d39e..240c4f7 100644 --- a/app/models/report.server.ts +++ b/app/models/report.server.ts @@ -1,5 +1,6 @@ -import { db } from "~/db.server"; +import { AuthSession } from "~/models/auth"; import type { Database } from "~/models/database.types"; +import { getSupabase } from "~/supabase"; type ReportTable = Database["public"]["Tables"]["reports"]; @@ -9,8 +10,10 @@ export async function insertReport( gameId: string, reason: string, userId?: string, + accessToken?: AuthSession["accessToken"], ) { - const { data, error } = await db + const client = getSupabase(accessToken); + const { data, error } = await client .from<"reports", ReportTable>("reports") .insert({ created_by: userId, diff --git a/app/models/room-event.server.ts b/app/models/room-event.server.ts index d012923..956dae9 100644 --- a/app/models/room-event.server.ts +++ b/app/models/room-event.server.ts @@ -1,14 +1,19 @@ -import { db } from "~/db.server"; import type { ActionType } from "~/engine"; +import { AuthSession } from "~/models/auth"; import type { Database, Json } from "~/models/database.types"; +import { getSupabase } from "~/supabase"; type RoomEventTable = Database["public"]["Tables"]["room_events"]; export type DbRoomEvent = RoomEventTable["Row"]; /* Reads */ -export async function getRoomEvents(roomId: number): Promise { - const { data, error } = await db +export async function getRoomEvents( + roomId: number, + accessToken?: AuthSession["accessToken"], +): Promise { + const client = getSupabase(accessToken); + const { data, error } = await client .from<"room_events", RoomEventTable>("room_events") .select("*") .order("ts", { ascending: true }) @@ -27,8 +32,10 @@ export async function createRoomEvent( roomId: number, type: ActionType, payload?: Json, + accessToken?: AuthSession["accessToken"], ) { - const { data, error } = await db + const client = getSupabase(accessToken); + const { data, error } = await client .from<"room_events", RoomEventTable>("room_events") .insert({ room_id: roomId, diff --git a/app/models/room.server.ts b/app/models/room.server.ts index db2a83b..cd71b8a 100644 --- a/app/models/room.server.ts +++ b/app/models/room.server.ts @@ -1,5 +1,6 @@ -import { db } from "~/db.server"; +import { AuthSession } from "~/models/auth"; import type { Database } from "~/models/database.types"; +import { getSupabase } from "~/supabase"; import { getRandomWord } from "~/utils"; type RoomTable = Database["public"]["Tables"]["rooms"]; @@ -7,8 +8,12 @@ type Room = RoomTable["Row"]; /* Reads */ -export async function getRoom(roomId: number): Promise { - const { data, error } = await db +export async function getRoom( + roomId: number, + accessToken?: AuthSession["accessToken"], +): Promise { + const client = getSupabase(accessToken); + const { data, error } = await client .from<"rooms", RoomTable>("rooms") .select("*") .eq("id", roomId); @@ -27,10 +32,11 @@ export async function getRoom(roomId: number): Promise { /* Writes */ -export async function createRoom(gameId: string) { +export async function createRoom(gameId: string, accessToken?: string) { + const client = getSupabase(accessToken); const word = getRandomWord(); - const { data, error } = await db + const { data, error } = await client .from<"rooms", RoomTable>("rooms") .insert({ name: word, game_id: gameId }) .select(); diff --git a/app/routes/game_.$gameId.play.tsx b/app/routes/game_.$gameId.play.tsx index 8073099..3eee0ec 100644 --- a/app/routes/game_.$gameId.play.tsx +++ b/app/routes/game_.$gameId.play.tsx @@ -1,16 +1,18 @@ import type { LoaderFunctionArgs } from "@remix-run/node"; import { redirect } from "@remix-run/node"; +import { getValidAuthSession } from "~/models/auth"; import { createRoom } from "~/models/room.server"; -export async function loader({ params }: LoaderFunctionArgs) { +export async function loader({ request, params }: LoaderFunctionArgs) { const gameId = params.gameId; if (!gameId) { throw new Response("game ID not found", { status: 404 }); } - const roomName = await createRoom(gameId); + const authSession = await getValidAuthSession(request); + const roomName = await createRoom(gameId, authSession?.accessToken); throw redirect(`/room/${roomName}`); } diff --git a/app/routes/report.tsx b/app/routes/report.tsx index 576bc3f..c3fe7ae 100644 --- a/app/routes/report.tsx +++ b/app/routes/report.tsx @@ -62,7 +62,7 @@ export async function action({ request }: ActionFunctionArgs) { const roomId = parseInt(parts[0]); const name = parts[1]; - const room = await getRoom(roomId); + const room = await getRoom(roomId, authSession?.accessToken); if (!room || room.name !== name) { return json( { success: false, message: `room "${roomNameAndId}" not found` }, @@ -71,7 +71,12 @@ export async function action({ request }: ActionFunctionArgs) { } const reason = formData.get("reason") as string; - await insertReport(room.game_id, reason, authSession?.userId); + await insertReport( + room.game_id, + reason, + authSession?.userId, + authSession?.accessToken, + ); return json({ success: true, @@ -100,7 +105,12 @@ export async function action({ request }: ActionFunctionArgs) { } const reason = formData.get("reason") as string; - await insertReport(gameId, reason, authSession?.userId); + await insertReport( + gameId, + reason, + authSession?.userId, + authSession?.accessToken, + ); return json( { success: true, message: `Reported game ${gameId}.` }, diff --git a/app/routes/room.$roomId.answer.tsx b/app/routes/room.$roomId.answer.tsx index 604e9da..bdb6a34 100644 --- a/app/routes/room.$roomId.answer.tsx +++ b/app/routes/room.$roomId.answer.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -39,11 +40,17 @@ export async function action({ request, params }: ActionFunctionArgs) { return json({ type: ActionType.Answer, payload: { i, j, userId, answer } }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.Answer, { i, j, userId, answer }); + await createRoomEvent( + room.id, + ActionType.Answer, + { i, j, userId, answer }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.buzz.tsx b/app/routes/room.$roomId.buzz.tsx index dbdf8cc..bd80072 100644 --- a/app/routes/room.$roomId.buzz.tsx +++ b/app/routes/room.$roomId.buzz.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -40,17 +41,23 @@ export async function action({ request, params }: ActionFunctionArgs) { return json({ type: ActionType.Buzz, payload: { i, j, userId, deltaMs } }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.Buzz, { - i, - j, - userId, - deltaMs, - }); + await createRoomEvent( + room.id, + ActionType.Buzz, + { + i, + j, + userId, + deltaMs, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.check.tsx b/app/routes/room.$roomId.check.tsx index a6261c6..54fda75 100644 --- a/app/routes/room.$roomId.check.tsx +++ b/app/routes/room.$roomId.check.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -44,17 +45,23 @@ export async function action({ request, params }: ActionFunctionArgs) { }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.Check, { - i, - j, - userId, - correct, - }); + await createRoomEvent( + room.id, + ActionType.Check, + { + i, + j, + userId, + correct, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.choose-clue.tsx b/app/routes/room.$roomId.choose-clue.tsx index b768416..10a95ab 100644 --- a/app/routes/room.$roomId.choose-clue.tsx +++ b/app/routes/room.$roomId.choose-clue.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -34,16 +35,22 @@ export async function action({ request, params }: ActionFunctionArgs) { return json({ type: ActionType.ChooseClue, payload: { i, j, userId } }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.ChooseClue, { - i, - j, - userId, - }); + await createRoomEvent( + room.id, + ActionType.ChooseClue, + { + i, + j, + userId, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.next-clue.tsx b/app/routes/room.$roomId.next-clue.tsx index a89efab..d4dbd2a 100644 --- a/app/routes/room.$roomId.next-clue.tsx +++ b/app/routes/room.$roomId.next-clue.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -34,16 +35,22 @@ export async function action({ request, params }: ActionFunctionArgs) { return json({ type: ActionType.NextClue, payload: { i, j, userId } }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.NextClue, { - i, - j, - userId, - }); + await createRoomEvent( + room.id, + ActionType.NextClue, + { + i, + j, + userId, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.player.tsx b/app/routes/room.$roomId.player.tsx index e9c79b9..23254f4 100644 --- a/app/routes/room.$roomId.player.tsx +++ b/app/routes/room.$roomId.player.tsx @@ -34,12 +34,12 @@ export async function action({ request, params }: ActionFunctionArgs) { return json({ type, payload: { userId, name } }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - const authSession = await getValidAuthSession(request); // Mark the game as started if it hasn't been already if (authSession && request.method === "POST") { const solve = await getSolve( @@ -57,10 +57,15 @@ export async function action({ request, params }: ActionFunctionArgs) { } } - await createRoomEvent(room.id, type, { - userId, - name, - }); + await createRoomEvent( + room.id, + type, + { + userId, + name, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.start.tsx b/app/routes/room.$roomId.start.tsx index 8744d23..dbfd900 100644 --- a/app/routes/room.$roomId.start.tsx +++ b/app/routes/room.$roomId.start.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -28,15 +29,21 @@ export async function action({ request, params }: ActionFunctionArgs) { return json({ type: ActionType.StartRound, payload: { round, userId } }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.StartRound, { - round, - userId, - }); + await createRoomEvent( + room.id, + ActionType.StartRound, + { + round, + userId, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomId.wager.tsx b/app/routes/room.$roomId.wager.tsx index 211254d..d73c6dc 100644 --- a/app/routes/room.$roomId.wager.tsx +++ b/app/routes/room.$roomId.wager.tsx @@ -2,6 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/node"; import { json } from "@remix-run/node"; import { ActionType } from "~/engine"; +import { getValidAuthSession } from "~/models/auth"; import { createRoomEvent } from "~/models/room-event.server"; import { getRoom } from "~/models/room.server"; @@ -55,17 +56,23 @@ export async function action({ request, params }: ActionFunctionArgs) { }); } - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const room = await getRoom(roomId, authSession?.accessToken); if (!room) { throw new Response("room not found", { status: 404 }); } - await createRoomEvent(room.id, ActionType.SetClueWager, { - i, - j, - userId, - wager, - }); + await createRoomEvent( + room.id, + ActionType.SetClueWager, + { + i, + j, + userId, + wager, + }, + authSession?.accessToken, + ); return null; } diff --git a/app/routes/room.$roomName.tsx b/app/routes/room.$roomName.tsx index bdaf688..0d700d6 100644 --- a/app/routes/room.$roomName.tsx +++ b/app/routes/room.$roomName.tsx @@ -31,14 +31,14 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const roomParts = roomName.split("-"); const roomId = parseInt(roomParts[0]); const roomWord = roomParts[1]; + console.log("getting valid auth session"); + const authSession = await getValidAuthSession(request); console.log("getting room", roomId); - const room = await getRoom(roomId); + const room = await getRoom(roomId, authSession?.accessToken); if (!room || room.name !== roomWord) { throw new Response("room not found", { status: 404 }); } - console.log("getting valid auth session"); - const authSession = await getValidAuthSession(request); console.log("getting game", room.game_id); const game = await getGame(room.game_id, authSession?.userId); if (!game) { @@ -52,7 +52,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const accessToken = authSession?.accessToken; console.log("getting room events for room", room.id); - const roomEvents = await getRoomEvents(room.id); + const roomEvents = await getRoomEvents(room.id, accessToken); const name = getRandomEmoji(); console.log("applying", roomEvents.length, "room events to state"); diff --git a/app/routes/room.$roomName_.summary/route.tsx b/app/routes/room.$roomName_.summary/route.tsx index 28e8a9a..cc5eaee 100644 --- a/app/routes/room.$roomName_.summary/route.tsx +++ b/app/routes/room.$roomName_.summary/route.tsx @@ -33,26 +33,27 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const roomParts = roomName.split("-"); const roomId = parseInt(roomParts[0]); const roomWord = roomParts[1]; - const room = await getRoom(roomId); + const authSession = await getValidAuthSession(request); + const userId = authSession?.userId; + const accessToken = authSession?.accessToken; + const room = await getRoom(roomId, accessToken); if (!room || room.name !== roomWord) { throw new Response("room not found", { status: 404 }); } - const authSession = await getValidAuthSession(request); - const userId = authSession?.userId; - const game = await getGame(room.game_id, authSession?.userId); + const game = await getGame(room.game_id, userId); if (!game) { throw new Response("game not found", { status: 404 }); } - const roomEvents = await getRoomEvents(room.id); + const roomEvents = await getRoomEvents(room.id, accessToken); if (userId) { const state = applyRoomEventsToState(stateFromGame(game), roomEvents); if (state.type === GameState.GameOver && state.players.has(userId)) { - const solve = await getSolve(userId, game.id, authSession?.accessToken); + const solve = await getSolve(userId, game.id, accessToken); if (solve && solve.solved_at === null) { - await markSolved(userId, game.id, room.id, authSession?.accessToken); + await markSolved(userId, game.id, room.id, accessToken); } } } diff --git a/app/supabase/client.ts b/app/supabase/client.ts index b67f3ff..6c7f68a 100644 --- a/app/supabase/client.ts +++ b/app/supabase/client.ts @@ -1,4 +1,5 @@ import { createClient } from "@supabase/supabase-js"; +import { AuthSession } from "~/models/auth"; import type { Database } from "~/models/database.types"; import { @@ -42,7 +43,7 @@ function getSupabaseClient(supabaseKey: string, accessToken?: string) { * * Reason : https://github.com/rphlmr/supa-fly-stack/pull/43#issue-1336412790 */ -function getSupabase(accessToken?: string) { +function getSupabase(accessToken?: AuthSession["accessToken"]) { return getSupabaseClient(SUPABASE_ANON_KEY, accessToken); }