All files / web/src/db/schema room-join-requests.ts

100% Statements 45/45
100% Branches 2/2
100% Functions 1/1
100% Lines 45/45

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 462x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 39x 39x 39x 2x 2x 2x 2x  
import { createId } from '@paralleldrive/cuid2'
import { integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'
import { arcadeRooms } from './arcade-rooms'
 
/**
 * Join requests for approval-only rooms
 */
export const roomJoinRequests = sqliteTable(
  'room_join_requests',
  {
    id: text('id')
      .primaryKey()
      .$defaultFn(() => createId()),
 
    roomId: text('room_id')
      .notNull()
      .references(() => arcadeRooms.id, { onDelete: 'cascade' }),
 
    // Requesting user
    userId: text('user_id').notNull(),
    userName: text('user_name', { length: 50 }).notNull(),
 
    // Request status
    status: text('status', {
      enum: ['pending', 'approved', 'denied'],
    })
      .notNull()
      .default('pending'),
 
    // Timestamps
    requestedAt: integer('requested_at', { mode: 'timestamp' })
      .notNull()
      .$defaultFn(() => new Date()),
    reviewedAt: integer('reviewed_at', { mode: 'timestamp' }),
    reviewedBy: text('reviewed_by'), // Host user ID who reviewed
    reviewedByName: text('reviewed_by_name', { length: 50 }),
  },
  (table) => ({
    // One pending request per user per room
    userRoomIdx: uniqueIndex('idx_room_join_requests_user_room').on(table.userId, table.roomId),
  })
)
 
export type RoomJoinRequest = typeof roomJoinRequests.$inferSelect
export type NewRoomJoinRequest = typeof roomJoinRequests.$inferInsert