mark room as in progress

This commit is contained in:
Devin Zuczek
2026-07-07 00:57:32 -04:00
parent 2a95b5ba9b
commit 605ba02e6e
2 changed files with 51 additions and 3 deletions
+24 -1
View File
@@ -4,7 +4,12 @@ import { useWorkersLogger } from 'workers-tagged-logger'
import { withNotFound, withOnError } from '@repo/hono-helpers'
import { validateAndGetAccountId } from './jwt'
import { createRoomInstance, getJoinableInstance, getRoomInstancesByRoom } from './room-instance-db'
import {
createRoomInstance,
getJoinableInstance,
getRoomInstancesByRoom,
setRoomInstanceInProgress,
} from './room-instance-db'
import { getOrCreateDormRoom, getRoomById, getRoomByName } from './rooms-db'
import type { Context } from 'hono'
@@ -488,6 +493,24 @@ const app = new Hono<App>()
// ---- Room instance -------------------------------------------------------
.post('/roominstance/:id/reportjoinresult', (c) => c.body(null, 200))
// The room owner flips the instance's in-progress flag once the session starts
// (e.g. a game round begins). Body is a form post: `inProgress=True|False`.
.put('/roominstance/:id/inprogress', async (c) => {
const id = await authedId(c)
if (id === null) return unauthorized(c)
const instanceId = Number.parseInt(c.req.param('id'), 10)
if (Number.isNaN(instanceId)) return c.body(null, 404)
const body = await c.req.parseBody().catch(() => ({}) as Record<string, unknown>)
const inProgress =
typeof body.inProgress === 'string' && body.inProgress.toLowerCase() === 'true'
const instance = await setRoomInstanceInProgress(c.env.DB, instanceId, inProgress)
if (!instance) return c.body(null, 404)
return c.body(null, 200)
})
// Rooms flagged as needing a developer/moderator to spawn in. No such queue
// yet → empty list.
.get('/rooms/requiring/developer', (c) => c.json([]))
+27 -2
View File
@@ -176,10 +176,34 @@ export async function getRoomInstance(db: D1Database, id: number): Promise<RoomI
return row ? toDto(parse(row.data)) : null
}
/**
* Flip an instance's `isInProgress` flag, rewriting the JSON blob (the generated
* `is_in_progress` column follows it). Returns the updated DTO, or null when the
* instance doesn't exist.
*/
export async function setRoomInstanceInProgress(
db: D1Database,
id: number,
isInProgress: boolean
): Promise<RoomInstanceDto | null> {
const row = await db
.prepare('SELECT data FROM room_instance WHERE id = ?1')
.bind(id)
.first<{ data: string }>()
if (!row) return null
const stored = parse(row.data)
stored.isInProgress = isInProgress
await db
.prepare('UPDATE room_instance SET data = ?1 WHERE id = ?2')
.bind(JSON.stringify(stored), id)
.run()
return toDto(stored)
}
/**
* The oldest joinable public instance of a room (not private, not full, joins
* enabled), or null when there's none to join. Used by matchmaking to reuse an
* existing instance before creating a new one.
* enabled, not already in progress), or null when there's none to join. Used by
* matchmaking to reuse an existing instance before creating a new one.
*/
export async function getJoinableInstance(
db: D1Database,
@@ -189,6 +213,7 @@ export async function getJoinableInstance(
.prepare(
`SELECT data FROM room_instance
WHERE room_id = ?1 AND is_private = 0 AND is_full = 0 AND join_disabled = 0
AND is_in_progress = 0
ORDER BY id LIMIT 1`
)
.bind(roomId)