import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Match, check } from 'meteor/check'; import { appTokensCollection } from '../../../push/server'; import { API } from '../api'; import PushNotification from '../../../push-notifications/server/lib/PushNotification'; import { canAccessRoom } from '../../../authorization/server/functions/canAccessRoom'; import { Users, Messages, Rooms } from '../../../models/server'; API.v1.addRoute('push.token', { authRequired: true }, { post() { const { type, value, appName } = this.bodyParams; let { id } = this.bodyParams; if (id && typeof id !== 'string') { throw new Meteor.Error('error-id-param-not-valid', 'The required "id" body param is invalid.'); } else { id = Random.id(); } if (!type || (type !== 'apn' && type !== 'gcm')) { throw new Meteor.Error('error-type-param-not-valid', 'The required "type" body param is missing or invalid.'); } if (!value || typeof value !== 'string') { throw new Meteor.Error('error-token-param-not-valid', 'The required "value" body param is missing or invalid.'); } if (!appName || typeof appName !== 'string') { throw new Meteor.Error('error-appName-param-not-valid', 'The required "appName" body param is missing or invalid.'); } let result; Meteor.runAsUser(this.userId, () => { result = Meteor.call('raix:push-update', { id, token: { [type]: value }, appName, userId: this.userId, }); }); return API.v1.success({ result }); }, delete() { const { token } = this.bodyParams; if (!token || typeof token !== 'string') { throw new Meteor.Error('error-token-param-not-valid', 'The required "token" body param is missing or invalid.'); } const affectedRecords = appTokensCollection.remove({ $or: [{ 'token.apn': token, }, { 'token.gcm': token, }], userId: this.userId, }); if (affectedRecords === 0) { return API.v1.notFound(); } return API.v1.success(); }, }); API.v1.addRoute('push.get', { authRequired: true }, { get() { const params = this.requestParams(); check(params, Match.ObjectIncluding({ id: String, })); const receiver = Users.findOneById(this.userId); if (!receiver) { throw new Error('error-user-not-found'); } const message = Messages.findOneById(params.id); if (!message) { throw new Error('error-message-not-found'); } const room = Rooms.findOneById(message.rid); if (!room) { throw new Error('error-room-not-found'); } if (!canAccessRoom(room, receiver)) { throw new Error('error-not-allowed'); } const data = PushNotification.getNotificationForMessageId({ receiver, room, message }); return API.v1.success({ data }); }, });