You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.6 KiB
90 lines
2.6 KiB
import {
|
|
OnGatewayConnection,
|
|
OnGatewayDisconnect,
|
|
SubscribeMessage,
|
|
WebSocketGateway,
|
|
WebSocketServer,
|
|
} from '@nestjs/websockets';
|
|
import { Socket, Server } from 'socket.io';
|
|
import { User } from 'src/users/user.entity';
|
|
import { UsersService } from 'src/users/users.service';
|
|
import { UnauthorizedException } from '@nestjs/common';
|
|
import { ChatService } from './chat.service';
|
|
import { Channel } from './model/channel.entity';
|
|
import { Message } from './model/message.entity';
|
|
|
|
import { CreateChannelDto } from './model/create-channel.dto'
|
|
|
|
@WebSocketGateway({
|
|
cors: {
|
|
origin: [
|
|
'http://localhost:5000',
|
|
'http://localhost:80',
|
|
'http://localhost:8080',
|
|
],
|
|
},
|
|
})
|
|
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
|
|
@WebSocketServer()
|
|
server: Server;
|
|
|
|
constructor(
|
|
private userService: UsersService,
|
|
private chatservice: ChatService,
|
|
) { }
|
|
|
|
async handleConnection(socket: Socket) {
|
|
try {
|
|
const user: User = await this.userService.findOne(socket.data.user.id);
|
|
if (!user) {
|
|
socket.emit('Error', new UnauthorizedException());
|
|
socket.disconnect();
|
|
return;
|
|
} else {
|
|
socket.data.user = user;
|
|
const channels = await this.chatservice.getChannelsForUser(user.id);
|
|
// Only emit rooms to the specific connected client
|
|
return this.server.to(socket.id).emit('channel', channels);
|
|
}
|
|
} catch {
|
|
socket.emit('Error', new UnauthorizedException());
|
|
socket.disconnect();
|
|
return;
|
|
}
|
|
}
|
|
|
|
handleDisconnect(socket: Socket) {
|
|
socket.disconnect();
|
|
}
|
|
|
|
async onCreateChannel(socket: Socket, channel: CreateChannelDto): Promise<Channel> {
|
|
return this.chatservice.createChannel(channel, socket.data.user);
|
|
}
|
|
|
|
@SubscribeMessage('joinChannel')
|
|
async onJoinChannel(socket: Socket, channel: Channel) {
|
|
//add user to channel
|
|
const messages = await this.chatservice.findMessagesInChannelForUser(
|
|
channel,
|
|
socket.data.user,
|
|
);
|
|
this.server.to(socket.id).emit('messages', messages);
|
|
}
|
|
|
|
@SubscribeMessage('leaveChannel')
|
|
async onLeaveChannel(socket: Socket) {
|
|
await this.chatservice.deleteBySocketId(socket.id);
|
|
}
|
|
|
|
@SubscribeMessage('addMessage')
|
|
async onAddMessage(socket: Socket, message: Message) {
|
|
const createdMessage: Message = await this.chatservice.createMessage({
|
|
...message,
|
|
author: socket.data.user,
|
|
});
|
|
const channel = await this.chatservice.getChannel(
|
|
createdMessage.channel.id,
|
|
);
|
|
//send new Message to all joined Users currently online of the channel
|
|
}
|
|
}
|
|
|