const UB = require('@unitybase/ub')
/* global ubs_message_recipient */
// eslint-disable-next-line camelcase
const me = ubs_message_recipient
me.entity.addMethod('accept')
me.entity.addMethod('addRoles')
me.entity.addMethod('removeRoles')
/**
* Mark message with specified ID as read by recipient (current logged in user)
* @method accept
* @memberOf ubs_message_recipient_ns.prototype
* @memberOfModule @unitybase/ubs
* @published
* @param {ubMethodParams} ctx
* @param {Number} ctx.mParams.execParams.ID
*/
me.accept = function (ctx) {
const execParams = ctx.mParams.execParams
if (!execParams || !execParams.ID) {
throw new Error('Invalid value of parameter ID')
}
let request = {
fieldList: ['ID'],
execParams: {
ID: execParams.ID,
acceptDate: new Date()
},
ID: execParams.ID,
__skipOptimisticLock: true
}
let inst = UB.DataStore('ubs_message_recipient')
ctx.mParams.resultData = inst.run('update', request)
}
/**
* Add all users with roles `roles` to a message recipient list
* @method addRoles
* @memberOf ubs_message_recipient_ns.prototype
* @memberOfModule @unitybase/ubs
* @published
* @param {ubMethodParams} ctx
* @param {number} ctx.mParams.execParams.messageID
* @param {string} ctx.mParams.execParams.roles Comma separated role list
*/
me.addRoles = function (ctx) {
const execParams = ctx.mParams.execParams
if (!execParams || !execParams.messageID) {
throw new Error('Invalid value of parameter messageID')
}
if (!execParams || !execParams.roles) {
throw new Error('Invalid value of parameter roles')
}
let roles = String(execParams.roles).split(',').map(Number)
let messageID = execParams.messageID
let users = []
let rInst = UB.DataStore('ubs_message_recipient')
rInst.run('select', {
entity: 'uba_userrole',
fieldList: ['userID', 'roleID'],
whereList: {
role: {
expression: '[roleID]',
condition: 'in',
values: {
roleID: roles
}
}
}
})
while (!rInst.eof) {
users.push(Number(rInst.get('userID')))
rInst.next()
}
let request = {
fieldList: ['messageID', 'userID'],
execParams: {
messageID: messageID,
userID: 0
}
}
let inst = UB.Repository('ubs_message_recipient')
.attrs(['ID', 'messageID', 'userID'])
.where('[messageID]', '=', messageID, 'message')
.where('[userID]', 'in', users, 'user')
.selectAsStore()
while (!inst.eof) {
let userIdx = users.indexOf(Number(inst.get('userID')))
if (userIdx >= 0) {
users.splice(userIdx, 1)
}
inst.next()
}
for (let i = 0, L = users.length; i < L; i++) {
request.execParams.userID = users[i]
inst.run('insert', request)
}
}
/**
* Add all users with roles `roles` to a message recipient list
* @method removeRoles
* @memberOf ubs_message_recipient_ns.prototype
* @memberOfModule @unitybase/ubs
* @published
* @param {ubMethodParams} ctx
* @param {number} ctx.mParams.execParams.messageID
* @param {string} ctx.mParams.execParams.roles Comma separated role list
*/
me.removeRoles = function (ctx) {
const execParams = ctx.mParams.execParams
if (!execParams || !execParams.messageID) {
throw new Error('Invalid value of parameter messageID')
}
if (!execParams || !execParams.roles) {
throw new Error('Invalid value of parameter roles')
}
let roles = String(execParams.roles).split(',').map(Number)
let messageID = execParams.messageID
let users = []
let rInst = UB.Repository('uba_userrole')
.attrs(['userID', 'roleID'])
.where('[roleID]', 'in', roles)
.select()
while (!rInst.eof) {
users.push(Number(rInst.get('userID')))
rInst.next()
}
rInst = UB.Repository('ubs_message_recipient')
.attrs(['ID', 'userID', 'messageID'])
.where('messageID', '=', messageID)
.where('userID', 'in', users)
.where('acceptDate', 'isNull')
.select()
let request = {
execParams: {
ID: 0
}
}
let store = UB.DataStore('ubs_message_recipient')
while (!rInst.eof) {
request.execParams.ID = rInst.get('ID')
store.run('delete', request)
rInst.next()
}
}