I have a users service class:
<code>// users.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma.service';
@Injectable()
export class UsersService {
constructor(private prisma: PrismaService) {}
async findOne(username: string) {
console.log("username in service: ", username);
return this.prisma.users.findUnique({
where: { username },
});
}
async createUser(data: { username: string; password: string; role: string }) {
return this.prisma.users.create({
data,
});
}
async findFirstCoordinator() {
return this.prisma.users.findFirst({
where: { username: 'COORDINATOR' },
});
}
}
</code>
<code>// users.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma.service';
@Injectable()
export class UsersService {
constructor(private prisma: PrismaService) {}
async findOne(username: string) {
console.log("username in service: ", username);
return this.prisma.users.findUnique({
where: { username },
});
}
async createUser(data: { username: string; password: string; role: string }) {
return this.prisma.users.create({
data,
});
}
async findFirstCoordinator() {
return this.prisma.users.findFirst({
where: { username: 'COORDINATOR' },
});
}
}
</code>
// users.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma.service';
@Injectable()
export class UsersService {
constructor(private prisma: PrismaService) {}
async findOne(username: string) {
console.log("username in service: ", username);
return this.prisma.users.findUnique({
where: { username },
});
}
async createUser(data: { username: string; password: string; role: string }) {
return this.prisma.users.create({
data,
});
}
async findFirstCoordinator() {
return this.prisma.users.findFirst({
where: { username: 'COORDINATOR' },
});
}
}
And the main websocket class:
<code>import { WebSocketGateway, SubscribeMessage, MessageBody, ConnectedSocket, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { UsersService } from 'src/Services/users.service';
import { PrismaService } from 'src/prisma.service';
@WebSocketGateway({
namespace: '/chat',
cors: {
origin: '*',
methods: ['GET', 'POST']
}
})
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
constructor(private usersService: UsersService, private prisma: PrismaService) {}
async handleConnection(client: Socket) {
console.log(`Client connected: ${client.id}`);
}
async handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
}
@SubscribeMessage('register')
async handleRegister(@ConnectedSocket() client: Socket, @MessageBody() data: { username: string }) {
console.log("username: ", data.username);
const user = await this.usersService.findOne(data.username);
if (!user) {
client.emit('error', 'User not found');
return;
}
client.data.user = user; // Store user details in socket data
client.join(user.id.toString()); // Join a room named after the user's ID
}
@SubscribeMessage('message')
async handleMessage(@ConnectedSocket() client: Socket, @MessageBody() data: { targetId?: number; message: string }) {
const user = client.data.user;
if (!user) {
client.emit('error', 'User not registered');
return;
}
const coordinator = await this.usersService.findFirstCoordinator();
const targetId = coordinator.id;
const message = await this.prisma.message.create({
data: {
userId: user.id,
targetId: targetId,
text: data.message,
}
});
this.server.to(targetId.toString()).emit('receiveMessage', {
from: user.username,
message: data.message,
messageId: message.id,
createdAt: message.createdAt
});
}
}
</code>
<code>import { WebSocketGateway, SubscribeMessage, MessageBody, ConnectedSocket, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { UsersService } from 'src/Services/users.service';
import { PrismaService } from 'src/prisma.service';
@WebSocketGateway({
namespace: '/chat',
cors: {
origin: '*',
methods: ['GET', 'POST']
}
})
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
constructor(private usersService: UsersService, private prisma: PrismaService) {}
async handleConnection(client: Socket) {
console.log(`Client connected: ${client.id}`);
}
async handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
}
@SubscribeMessage('register')
async handleRegister(@ConnectedSocket() client: Socket, @MessageBody() data: { username: string }) {
console.log("username: ", data.username);
const user = await this.usersService.findOne(data.username);
if (!user) {
client.emit('error', 'User not found');
return;
}
client.data.user = user; // Store user details in socket data
client.join(user.id.toString()); // Join a room named after the user's ID
}
@SubscribeMessage('message')
async handleMessage(@ConnectedSocket() client: Socket, @MessageBody() data: { targetId?: number; message: string }) {
const user = client.data.user;
if (!user) {
client.emit('error', 'User not registered');
return;
}
const coordinator = await this.usersService.findFirstCoordinator();
const targetId = coordinator.id;
const message = await this.prisma.message.create({
data: {
userId: user.id,
targetId: targetId,
text: data.message,
}
});
this.server.to(targetId.toString()).emit('receiveMessage', {
from: user.username,
message: data.message,
messageId: message.id,
createdAt: message.createdAt
});
}
}
</code>
import { WebSocketGateway, SubscribeMessage, MessageBody, ConnectedSocket, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { UsersService } from 'src/Services/users.service';
import { PrismaService } from 'src/prisma.service';
@WebSocketGateway({
namespace: '/chat',
cors: {
origin: '*',
methods: ['GET', 'POST']
}
})
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
constructor(private usersService: UsersService, private prisma: PrismaService) {}
async handleConnection(client: Socket) {
console.log(`Client connected: ${client.id}`);
}
async handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
}
@SubscribeMessage('register')
async handleRegister(@ConnectedSocket() client: Socket, @MessageBody() data: { username: string }) {
console.log("username: ", data.username);
const user = await this.usersService.findOne(data.username);
if (!user) {
client.emit('error', 'User not found');
return;
}
client.data.user = user; // Store user details in socket data
client.join(user.id.toString()); // Join a room named after the user's ID
}
@SubscribeMessage('message')
async handleMessage(@ConnectedSocket() client: Socket, @MessageBody() data: { targetId?: number; message: string }) {
const user = client.data.user;
if (!user) {
client.emit('error', 'User not registered');
return;
}
const coordinator = await this.usersService.findFirstCoordinator();
const targetId = coordinator.id;
const message = await this.prisma.message.create({
data: {
userId: user.id,
targetId: targetId,
text: data.message,
}
});
this.server.to(targetId.toString()).emit('receiveMessage', {
from: user.username,
message: data.message,
messageId: message.id,
createdAt: message.createdAt
});
}
}
So, when i start the project and in postman make socket.io request to ws://localhost:3001/chat and press Connect, it connects and in server message that client is connected is printed, but when i try to “register” or send “message” server does not respond at all