치지직 앱으로 연동하고, 연동 확인된 ID만 접속할 수 있도록 수정, 개발용으로는 채널ID를 수동으로 접속할 수 있도록 변경.
최초 추천 고정 배치 추가.
This commit is contained in:
31
app/api/rooms/[roomId]/add-dice/route.ts
Normal file
31
app/api/rooms/[roomId]/add-dice/route.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { assertChannelRoomAccess } from '@/lib/auth/room-access';
|
||||
import { addDice, getRoom, notifyRoom, toPublicRoom } from '@/lib/rooms/store';
|
||||
|
||||
export const runtime = 'nodejs';
|
||||
|
||||
type Params = { params: Promise<{ roomId: string }> };
|
||||
|
||||
export async function POST(request: Request, { params }: Params) {
|
||||
const { roomId } = await params;
|
||||
const room = getRoom(roomId);
|
||||
if (!room) {
|
||||
return NextResponse.json({ error: '방을 찾을 수 없습니다.' }, { status: 404 });
|
||||
}
|
||||
|
||||
const access = await assertChannelRoomAccess(room, request);
|
||||
if (!access.ok) return access.response;
|
||||
|
||||
const body = (await request.json().catch(() => ({}))) as { count?: number };
|
||||
const count = Number(body.count ?? 1);
|
||||
if (!Number.isFinite(count) || count < 1) {
|
||||
return NextResponse.json({ error: 'count는 1 이상이어야 합니다.' }, { status: 400 });
|
||||
}
|
||||
|
||||
const updated = addDice(roomId, count);
|
||||
if (!updated) {
|
||||
return NextResponse.json({ error: '처리 실패' }, { status: 500 });
|
||||
}
|
||||
notifyRoom(roomId);
|
||||
return NextResponse.json({ room: toPublicRoom(updated) });
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { assertChannelRoomAccess } from '@/lib/auth/room-access';
|
||||
import {
|
||||
consumeDice,
|
||||
getRoom,
|
||||
@@ -17,6 +18,9 @@ export async function POST(request: Request, { params }: Params) {
|
||||
return NextResponse.json({ error: '방을 찾을 수 없습니다.' }, { status: 404 });
|
||||
}
|
||||
|
||||
const access = await assertChannelRoomAccess(room, request);
|
||||
if (!access.ok) return access.response;
|
||||
|
||||
const body = (await request.json().catch(() => ({}))) as { count?: number };
|
||||
const count = Math.max(1, Math.trunc(body.count ?? 1));
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import {
|
||||
cancelScheduledDisconnectRoomChat,
|
||||
scheduleDisconnectRoomChat,
|
||||
} from '@/lib/chzzk/chat-session';
|
||||
import { assertChannelRoomAccess } from '@/lib/auth/room-access';
|
||||
import {
|
||||
addRoomViewer,
|
||||
getRoom,
|
||||
@@ -26,6 +27,9 @@ export async function GET(request: Request, { params }: Params) {
|
||||
});
|
||||
}
|
||||
|
||||
const access = await assertChannelRoomAccess(room, request);
|
||||
if (!access.ok) return access.response;
|
||||
|
||||
const clientId =
|
||||
new URL(request.url).searchParams.get('clientId')?.trim() ||
|
||||
crypto.randomUUID();
|
||||
@@ -40,14 +44,12 @@ export async function GET(request: Request, { params }: Params) {
|
||||
presenceHeld = false;
|
||||
const { emptied } = removeRoomViewer(roomId, clientId);
|
||||
if (emptied) {
|
||||
// 즉시 끊지 않음 — 빠른 재입장과 경쟁하지 않도록 유예
|
||||
scheduleDisconnectRoomChat(roomId);
|
||||
}
|
||||
};
|
||||
|
||||
const stream = new ReadableStream({
|
||||
start(controller) {
|
||||
// 재입장 시 예약된 disconnect 취소
|
||||
cancelScheduledDisconnectRoomChat(roomId);
|
||||
addRoomViewer(roomId, clientId);
|
||||
presenceHeld = true;
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { assertChannelRoomAccess } from '@/lib/auth/room-access';
|
||||
import { getRoom, toPublicRoom } from '@/lib/rooms/store';
|
||||
|
||||
export const runtime = 'nodejs';
|
||||
|
||||
type Params = { params: Promise<{ roomId: string }> };
|
||||
|
||||
export async function GET(_request: Request, { params }: Params) {
|
||||
export async function GET(request: Request, { params }: Params) {
|
||||
const { roomId } = await params;
|
||||
const room = getRoom(roomId);
|
||||
if (!room) {
|
||||
return NextResponse.json({ error: '방을 찾을 수 없습니다.' }, { status: 404 });
|
||||
}
|
||||
const access = await assertChannelRoomAccess(room, request);
|
||||
if (!access.ok) return access.response;
|
||||
return NextResponse.json({ room: toPublicRoom(room) });
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { assertChannelRoomAccess } from '@/lib/auth/room-access';
|
||||
import {
|
||||
addDiceFromDonation,
|
||||
getRoom,
|
||||
@@ -17,6 +18,9 @@ export async function POST(request: Request, { params }: Params) {
|
||||
return NextResponse.json({ error: '방을 찾을 수 없습니다.' }, { status: 404 });
|
||||
}
|
||||
|
||||
const access = await assertChannelRoomAccess(room, request);
|
||||
if (!access.ok) return access.response;
|
||||
|
||||
const body = (await request.json().catch(() => ({}))) as {
|
||||
payAmount?: number;
|
||||
donatorNickname?: string;
|
||||
|
||||
Reference in New Issue
Block a user