/var/www/p4ela.kz/server/delivery/services
Edit: /var/www/p4ela.kz/server/delivery/services/webSocket.service.js (4563B)
const { Server } = require('socket.io')
const { isSet, isEmpty } = require('../api/utils/validator.util')
const logger = require('../logger')({ service: 'WebSocketService' })
module.exports = class WebSocketService {
constructor({ db, httpServer }) {
this.io = new Server(httpServer, {
origin: "*:*",
cors: {
origin: "*",
methods: ["GET", "POST"]
}
})
this.io.on('connection', (socket) => {
logger.child({ socket: socket.id, event: 'connection', status: 'success' }).info()
socket.on('login', async ({ uid, appId }) => {
logger.child({ socket: socket.id }).info('login')
try {
if (!isSet(uid) || isEmpty(uid)) {
throw new Error('Uid required')
}
if (!isSet(appId) || isEmpty(appId)) {
throw new Error('appId required')
}
const user = await db.user.findOne({
include: [{ model: db.branch, through: 'branch_users', as: 'userBranches' }],
where: { uid: uid }
})
if (!user) {
throw new Error('User not found')
}
// всякие проверки, подкрлючение к группам ...
socket.userId = user.id
socket.uid = uid
if (appId) {
socket.appId = appId
switch (parseInt(appId)) {
case APPID.OPERATOR:
socket.join('operators')
if (user.userBranches) {
for (const b of user.userBranches) {
socket.join(`operators-branch-${b.id}`)
}
}
break
case APPID.WAITER:
socket.join('waiters')
if (user.userBranches) {
for (const b of user.userBranches) {
socket.join(`waiters-branch-${b.id}`)
}
}
break
case APPID.DRIVER:
socket.join('drivers')
if (user.userBranches) {
for (const b of user.userBranches) {
socket.join(`drivers-branch-${b.id}`)
}
}
break
case APPID.CLIENT:
socket.join('clients')
}
}
socket.emit('login', { status: 'success' })
logger.child({ socket: socket.id, event: 'login', status: 'success' }).info()
} catch (error) {
socket.emit('login', { status: 'error', message: error.message })
logger
.child({ socket: socket.id, event: 'login', status: 'error' })
.info(error.message)
}
})
socket.on('disconnect', (reason) => {
logger.child({ socket: socket.id, event: 'disconnect' }).info(reason)
})
})
}
SendToAll = (event, param) => {
return this.io.emit(event, param)
}
SendToClients = async (event, param) => {
return this.io.to('clients').emit(event, param)
}
SendToDrivers = async (event, param) => {
return this.io.to('drivers').emit(event, param)
}
SendToDriversByBranch = async (branchId, event, param) => {
return this.io.to(`drivers-branch-${branchId}`).emit(event, param)
}
SendToOperators = async (event, param) => {
// const opers = await this.io.in('operators').fetchSockets()
// console.log(opers)
return this.io.to('operators').emit(event, param)
}
SendToOperatorsByBranch = async (branchId, event, param) => {
return this.io.to(`operators-branch-${branchId}`).emit(event, param)
}
SendToWaiters = async (event, param) => {
return this.io.to('waiters').emit(event, param)
}
SendToWaitersByBranch = async (branchId, event, param) => {
return this.io.to(`waiters-branch-${branchId}`).emit(event, param)
}
SendToClient = async (userId, event, param) => {
const sockets = (await this.io.in('clients').fetchSockets())?.filter(
(p) => p.userId == userId
)
if (sockets.length == 0) {
return false
}
for (const socket of sockets) {
socket.emit(event, param)
}
return true
}
SendToDriver = async (userId, event, param) => {
const sockets = (await this.io.in('drivers').fetchSockets())?.filter(
(p) => p.userId == userId
)
if (sockets.length == 0) {
return false
}
for (const socket of sockets) {
socket.emit(event, param)
}
return true
}
SendToOperator = async (userId, event, param) => {
const sockets = (await this.io.in('operators').fetchSockets())?.filter(
(p) => p.userId == userId
)
if (sockets.length == 0) {
return false
}
for (const socket of sockets) {
socket.emit(event, param)
}
return true
}
SendToWaiter = async (userId, event, param) => {
const sockets = (await this.io.in('waiters').fetchSockets())?.filter(
(p) => p.userId == userId
)
if (sockets.length == 0) {
return false
}
for (const socket of sockets) {
socket.emit(event, param)
}
return true
}
}