79 lines
1.8 KiB
TypeScript
79 lines
1.8 KiB
TypeScript
|
|
import { Injectable } from '@nestjs/common';
|
||
|
|
import { PrismaService } from '../prisma/prisma.service';
|
||
|
|
import { customAlphabet } from 'nanoid';
|
||
|
|
|
||
|
|
const nanoid = customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 6);
|
||
|
|
|
||
|
|
@Injectable()
|
||
|
|
export class RoomsService {
|
||
|
|
constructor(private prisma: PrismaService) {}
|
||
|
|
|
||
|
|
async createRoom(hostId: string, questionPackId: string, settings?: any) {
|
||
|
|
const code = nanoid();
|
||
|
|
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours
|
||
|
|
|
||
|
|
const room = await this.prisma.room.create({
|
||
|
|
data: {
|
||
|
|
code,
|
||
|
|
hostId,
|
||
|
|
questionPackId,
|
||
|
|
expiresAt,
|
||
|
|
...settings,
|
||
|
|
},
|
||
|
|
include: {
|
||
|
|
host: true,
|
||
|
|
questionPack: true,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
await this.prisma.participant.create({
|
||
|
|
data: {
|
||
|
|
userId: hostId,
|
||
|
|
roomId: room.id,
|
||
|
|
name: room.host.name || 'Host',
|
||
|
|
role: 'HOST',
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
return room;
|
||
|
|
}
|
||
|
|
|
||
|
|
async getRoomByCode(code: string) {
|
||
|
|
return this.prisma.room.findUnique({
|
||
|
|
where: { code },
|
||
|
|
include: {
|
||
|
|
host: true,
|
||
|
|
participants: {
|
||
|
|
include: { user: true },
|
||
|
|
},
|
||
|
|
questionPack: true,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
async joinRoom(roomId: string, userId: string, name: string, role: 'PLAYER' | 'SPECTATOR') {
|
||
|
|
return this.prisma.participant.create({
|
||
|
|
data: {
|
||
|
|
userId,
|
||
|
|
roomId,
|
||
|
|
name,
|
||
|
|
role,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
async updateRoomStatus(roomId: string, status: 'WAITING' | 'PLAYING' | 'FINISHED') {
|
||
|
|
return this.prisma.room.update({
|
||
|
|
where: { id: roomId },
|
||
|
|
data: { status },
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
async updateParticipantScore(participantId: string, score: number) {
|
||
|
|
return this.prisma.participant.update({
|
||
|
|
where: { id: participantId },
|
||
|
|
data: { score },
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|