@xrengine/server-core
Version:
Shared components for XREngine server
235 lines (218 loc) • 7.63 kB
text/typescript
import '@feathersjs/transport-commons'
import { Application } from '../../../declarations'
import logger from '../../ServerLogger'
import { Channel } from './channel.class'
import channelDocs from './channel.docs'
import hooks from './channel.hooks'
import createModel from './channel.model'
// Add this service to the service type index
declare module '@xrengine/common/declarations' {
interface ServiceTypes {
channel: Channel
}
}
export default (app: Application) => {
const options = {
Model: createModel(app),
paginate: app.get('paginate')
}
/**
* Initialize our service with any options it requires and docs
*/
const event = new Channel(options, app)
event.docs = channelDocs
app.use('channel', event)
const service: any = app.service('channel')
service.hooks(hooks)
/**
* A method which is used to create channel
*
* @param data which is parsed to create channel
* @returns created channel data
*/
service.publish('created', async (data): Promise<any> => {
try {
let targetIds
if (data.channelType === 'user') {
data.user1 = await app.service('user').get(data.userId1)
data.user2 = await app.service('user').get(data.userId2)
targetIds = []
} else if (data.channelType === 'group') {
if (data.group == null) {
data.group = await app.service('group').Model.findOne({
where: {
id: data.groupId
}
})
}
const groupUsers = await app.service('group-user').Model.findAll({
where: {
groupId: data.groupId
},
include: [
{
model: app.service('user').Model
}
]
})
if (data.group?.dataValues) {
data.group.dataValues.groupUsers = groupUsers
} else if (data.group) {
data.group.groupUsers = groupUsers
}
targetIds = groupUsers.map((groupUser) => groupUser.userId)
} else if (data.channelType === 'party') {
if (data.party == null) data.party = await app.service('party').Model.findOne({ where: { id: data.partyId } })
const partyUsers = await app.service('party-user').find({ query: { partyId: data.partyId } })
if (data.party?.dataValues) data.party.dataValues.party_users = partyUsers.data
else if (data.party) data.party.party_users = partyUsers.data
targetIds = partyUsers.data.map((partyUser) => partyUser.userId)
} else if (data.channelType === 'instance') {
if (data.instance == null) {
data.instance = await app.service('instance').Model.findOne({
where: {
id: data.instanceId,
ended: false
}
})
}
const instanceUsers = await app.service('user').Model.findAll({
where: {
instanceId: data.instanceId
}
})
if (data.instance?.dataValues) {
data.instance.dataValues.instanceUsers = instanceUsers
} else if (data.instance) {
data.instance.instanceUsers = instanceUsers
}
targetIds = instanceUsers.map((instanceUser) => instanceUser.id)
}
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
return Promise.all(
targetIds.map((userId) => {
return app.channel(`userIds/${userId}`).send({
channel: data
})
})
)
} catch (err) {
logger.error(err)
throw err
}
})
/**
* A method used to update channel
*
* @param data which is used to update channel
* @returns updated channel data
*/
service.publish('patched', async (data): Promise<any> => {
try {
let targetIds
if (data.channelType === 'user') {
data.user1 = await app.service('user').get(data.userId1)
data.user2 = await app.service('user').get(data.userId2)
targetIds = [data.userId1, data.userId2]
} else if (data.channelType === 'group') {
if (data.group == null) {
data.group = await app.service('group').Model.findOne({
where: {
id: data.groupId
}
})
}
const groupUsers = await app.service('group-user').Model.findAll({
where: {
groupId: data.groupId
},
include: [
{
model: app.service('user').Model
}
]
})
if (data.group?.dataValues) {
data.group.dataValues.groupUsers = groupUsers
} else if (data.group) {
data.group.groupUsers = groupUsers
}
targetIds = groupUsers.map((groupUser) => groupUser.userId)
} else if (data.channelType === 'party') {
if (data.party == null) data.party = await app.service('party').Model.findOne({ where: { id: data.partyId } })
const partyUsers = await app.service('party-user').find({ query: { partyId: data.partyId } })
if (data.party?.dataValues) data.party.dataValues.party_users = partyUsers.data
else if (data.party) data.party.party_users = partyUsers.data
targetIds = partyUsers.data.map((partyUser) => partyUser.userId)
} else if (data.channelType === 'instance') {
if (data.instance == null) {
data.instance = await app.service('instance').Model.findOne({
where: {
id: data.instanceId,
ended: false
}
})
}
const instanceUsers = await app.service('user').Model.findAll({
where: {
instanceId: data.instanceId
}
})
if (data.instance?.dataValues) {
data.instance.dataValues.instanceUsers = instanceUsers
} else if (data.instance) {
data.instance.instanceUsers = instanceUsers
}
targetIds = instanceUsers.map((instanceUser) => instanceUser.id)
}
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
return Promise.all(
targetIds.map((userId) => {
return app.channel(`userIds/${userId}`).send({
channel: data
})
})
)
} catch (err) {
logger.error(err)
throw err
}
})
/**
* A method used to remove specific channel
*
* @param data which contains userId! and userId2
* @returns deleted channel data
*/
service.publish('removed', async (data): Promise<any> => {
let targetIds
if (data.channelType === 'user') {
targetIds = [data.userId1, data.userId2]
} else if (data.channelType === 'group') {
const groupUsers = await app.service('group-user').Model.findAll({
where: {
groupId: data.groupId
}
})
targetIds = groupUsers.map((groupUser) => groupUser.userId)
} else if (data.channelType === 'party') {
const partyUsers = await app.service('party-user').Model.findAll({ where: { partyId: data.partyId } })
targetIds = partyUsers.map((partyUser) => partyUser.userId)
} else if (data.channelType === 'instance') {
const instanceUsers = await app.service('user').Model.findAll({
where: {
instanceId: data.instanceId
}
})
targetIds = instanceUsers.map((instanceUser) => instanceUser.id)
}
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
return Promise.all(
targetIds.map((userId) => {
return app.channel(`userIds/${userId}`).send({
channel: data
})
})
)
})
}