Вызвать событие веб-сокета из класса обслуживания в NestJS

Привет, ребята, я новичок в NestJs. Пожалуйста, помогите мне. Я пытаюсь отправить событие всем аффилированным лицам всякий раз, когда создается новый запрос. Но я не знаю, как мне получить доступ к EventsGateway в классе RequestService и создать событие оттуда. Вот код

events.gateway.ts

import {
  MessageBody,
  SubscribeMessage,
  WebSocketGateway,
  WebSocketServer,
  WsResponse,
  ConnectedSocket
} from '@nestjs/websockets';
import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Server, Socket } from 'socket.io';

@WebSocketGateway()

export class EventsGateway {

  @WebSocketServer()
  private server: Server;
  public usersBySocketId: Object = {};
  public usersById: Object = {};

  @SubscribeMessage("user logged in")
  async findAll(@MessageBody() data: any,
    @ConnectedSocket() socket: Socket,
  ): Promise<Observable<WsResponse<number>>> {
    this.usersBySocketId[socket.id] = data;
    this.usersBySocketId[socket.id]["socket"] = socket;

    this.usersById[data.id] = data;
    this.usersById[data.id]['socketId'] = socket.id;
    
    return from([1, 2, 3]).pipe(map(item => ({ event: 'events', data: item })));
  }

  handleDisconnect(socket: Socket) {
    if (this.usersBySocketId[socket.id]) {
      const userId = this.usersBySocketId[socket.id].userId;
      delete this.usersBySocketId[socket.id];
      delete this.usersById[userId];
    }
  }

}

events.module.ts

import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';

@Module({
  imports: [],
  providers: [
    EventsGateway,
  ],

})
export class EventsModule { }

request.service.ts

import { Request, Affiliate } from '../lib/index';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { RequestDto } from './request.dto';
import { BaseService } from '../lib/base.service';

@Injectable()
export class RequestService extends BaseService {
  constructor(
    @InjectModel('request') public readonly requestModel: Model<Request>,
    @InjectModel('Affiliate') public readonly affiliateModel: Model<Affiliate>,
  ) {
    super();
  }

  async createRequest(data: RequestDto): Promise<string> {
    try {
      const newRequest = new this.requestModel(data);
      const result = await newRequest.save();

      // get affiliates which provices service in data.zip
      const affiliates = await this.affiliateModel.find({
        areaServices: { $in: [data.zip] }
      }).populate('businessOwner');

      // get access to userById and socket of EventsGateway somehow and find affilates socket IDs from userById

      /***
        const socketIds = affiliates
        .filter(affiliate => {
          if(userById[affiliate.id]) {
            return true;
          } else return false;
        })
        .map(affilate => {
          return userById[affiliate.id][socketId]
        })

        socket.to(socketIds).emit("new request created");
      ***/

      return result;
    }
    catch (err) {
      throw err;
    }
  }
}

0 ответов

Другие вопросы по тегам