parent
e3fd4fd8ee
commit
fa4b479e92
@ -0,0 +1,218 @@ |
||||
RocketChat.API.v1.addRoute('users.create', { authRequired: true }, { |
||||
post: function() { |
||||
try { |
||||
check(this.bodyParams, { |
||||
email: String, |
||||
name: String, |
||||
password: String, |
||||
username: String, |
||||
active: Match.Maybe(Boolean), |
||||
role: Match.Maybe(String), |
||||
joinDefaultChannels: Match.Maybe(Boolean), |
||||
requirePasswordChange: Match.Maybe(Boolean), |
||||
sendWelcomeEmail: Match.Maybe(Boolean), |
||||
verified: Match.Maybe(Boolean), |
||||
customFields: Match.Maybe(Object) |
||||
}); |
||||
|
||||
//New change made by pull request #5152
|
||||
if (typeof this.bodyParams.joinDefaultChannels === 'undefined') { |
||||
this.bodyParams.joinDefaultChannels = true; |
||||
} |
||||
|
||||
const newUserId = RocketChat.saveUser(this.userId, this.bodyParams); |
||||
|
||||
if (this.bodyParams.customFields) { |
||||
RocketChat.saveCustomFields(newUserId, this.bodyParams.customFields); |
||||
} |
||||
|
||||
if (this.bodyParams.active === false) { |
||||
Meteor.runAsUser(this.userId, () => { |
||||
Meteor.call('setUserActiveStatus', newUserId, false); |
||||
}); |
||||
} |
||||
|
||||
return RocketChat.API.v1.success({ user: RocketChat.models.Users.findOneById(newUserId) }); |
||||
} catch (e) { |
||||
return RocketChat.API.v1.failure(e.name + ': ' + e.message); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
RocketChat.API.v1.addRoute('users.delete', { authRequired: true }, { |
||||
post: function() { |
||||
if (!RocketChat.authz.hasPermission(this.userId, 'delete-user')) { |
||||
return RocketChat.API.v1.unauthorized(); |
||||
} |
||||
|
||||
if (!this.bodyParams.userId) { |
||||
return RocketChat.API.v1.failure('Body param "userId" is required'); |
||||
} |
||||
|
||||
try { |
||||
Meteor.runAsUser(this.userId, () => { |
||||
Meteor.call('deleteUser', this.bodyParams.userId); |
||||
}); |
||||
} catch (e) { |
||||
return RocketChat.API.v1.failure(e.name + ': ' + e.message); |
||||
} |
||||
|
||||
return RocketChat.API.v1.success(); |
||||
} |
||||
}); |
||||
|
||||
RocketChat.API.v1.addRoute('users.getPresence', { authRequired: true }, { |
||||
get: function() { |
||||
if (this.queryParams.userId && this.userId !== this.queryParams.userId) { |
||||
if (RocketChat.models.Users.find({ _id: this.queryParams.userId }).count() !== 1) { |
||||
return RocketChat.API.v1.failure(`Failed to find a user with the id of "${this.queryParams.userId}"`); |
||||
} |
||||
|
||||
const user = RocketChat.models.Users.findOneById(this.queryParams.userId, { fields: { status: 1 }}); |
||||
return RocketChat.API.v1.success({ |
||||
presence: user.status |
||||
}); |
||||
} |
||||
|
||||
const user = RocketChat.models.Users.findOneById(this.userId); |
||||
return RocketChat.API.v1.success({ |
||||
presence: user.status, |
||||
connectionStatus: user.statusConnection, |
||||
lastLogin: user.lastLogin |
||||
}); |
||||
} |
||||
}); |
||||
|
||||
RocketChat.API.v1.addRoute('users.info', { authRequired: true }, { |
||||
get: function() { |
||||
if (!this.queryParams.userId) { |
||||
return RocketChat.API.v1.failure('The query parameter "userId" must be supplied.'); |
||||
} |
||||
|
||||
const user = RocketChat.models.Users.findOneById(this.queryParams.userId); |
||||
|
||||
if (!user) { |
||||
return RocketChat.API.v1.failure(`No user was found with the id of "${this.queryParams.userId}"`); |
||||
} |
||||
|
||||
let result = undefined; |
||||
try { |
||||
Meteor.runAsUser(this.userId, () => { |
||||
result = Meteor.call('getFullUserData', { filter: user.username, limit: 1 }); |
||||
}); |
||||
} catch (e) { |
||||
return RocketChat.API.v1.failure(e.name + ': ' + e.message); |
||||
} |
||||
|
||||
if (!result || result.length !== 1) { |
||||
return RocketChat.API.v1.failure(`Failed to get the user data for the userId of "${this.queryParams.userId}".`); |
||||
} |
||||
|
||||
return RocketChat.API.v1.success({ |
||||
user: result[0] |
||||
}); |
||||
} |
||||
}); |
||||
|
||||
RocketChat.API.v1.addRoute('users.list', { authRequired: true }, { |
||||
get: function() { |
||||
let result = undefined; |
||||
try { |
||||
Meteor.runAsUser(this.userId, () => { |
||||
result = Meteor.call('getFullUserData', {}); |
||||
}); |
||||
} catch (e) { |
||||
return RocketChat.API.v1.failure(e.name + ': ' + e.message); |
||||
} |
||||
|
||||
if (!result) { |
||||
return RocketChat.API.v1.failure('Failed to get the users data.'); |
||||
} |
||||
|
||||
return RocketChat.API.v1.success({ |
||||
users: result |
||||
}); |
||||
} |
||||
}); |
||||
|
||||
RocketChat.API.v1.addRoute('users.setAvatar', { authRequired: true }, { |
||||
post: function() { |
||||
try { |
||||
check(this.bodyParams, { avatarUrl: Match.Maybe(String) }); |
||||
|
||||
const user = Meteor.users.findOne(this.userId); |
||||
|
||||
if (this.bodyParams.avatarUrl) { |
||||
RocketChat.setUserAvatar(user, this.bodyParams.avatarUrl, '', 'url'); |
||||
} else { |
||||
const Busboy = Npm.require('busboy'); |
||||
const busboy = new Busboy({ headers: this.request.headers }); |
||||
|
||||
Meteor.wrapAsync((callback) => { |
||||
busboy.on('file', Meteor.bindEnvironment((fieldname, file, filename, encoding, mimetype) => { |
||||
if (fieldname !== 'image') { |
||||
return callback(new Meteor.Error('invalid-field')); |
||||
} |
||||
|
||||
const imageData = []; |
||||
file.on('data', Meteor.bindEnvironment((data) => { |
||||
imageData.push(data); |
||||
})); |
||||
|
||||
file.on('end', Meteor.bindEnvironment(() => { |
||||
RocketChat.setUserAvatar(user, Buffer.concat(imageData), mimetype, 'rest'); |
||||
callback(); |
||||
})); |
||||
|
||||
this.request.pipe(busboy); |
||||
})); |
||||
})(); |
||||
} |
||||
} catch (e) { |
||||
return RocketChat.API.v1.failure(e.name + ': ' + e.message); |
||||
} |
||||
|
||||
return RocketChat.API.v1.success(); |
||||
} |
||||
}); |
||||
|
||||
RocketChat.API.v1.addRoute('users.update', { authRequired: true }, { |
||||
post: function() { |
||||
try { |
||||
check (this.bodyParams, { |
||||
userId: String, |
||||
data: { |
||||
email: Match.Maybe(String), |
||||
name: Match.Maybe(String), |
||||
password: Match.Maybe(String), |
||||
username: Match.Maybe(String), |
||||
active: Match.Maybe(Boolean), |
||||
role: Match.Maybe(String), |
||||
joinDefaultChannels: Match.Maybe(Boolean), |
||||
requirePasswordChange: Match.Maybe(Boolean), |
||||
sendWelcomeEmail: Match.Maybe(Boolean), |
||||
verified: Match.Maybe(Boolean), |
||||
customFields: Match.Maybe(Object) |
||||
} |
||||
}); |
||||
|
||||
const userData = _.extend({ _id: this.bodyParams.userId }, this.bodyParams.data); |
||||
|
||||
RocketChat.saveUser(this.userId, userData); |
||||
|
||||
if (this.bodyParams.data.customFields) { |
||||
RocketChat.saveCustomFields(this.bodyParams.userId, this.bodyParams.data.customFields); |
||||
} |
||||
|
||||
if (typeof this.bodyParams.data.active !== 'undefined') { |
||||
Meteor.runAsUser(this.userId, () => { |
||||
Meteor.call('setUserActiveStatus', this.bodyParams.userId, this.bodyParams.data.active); |
||||
}); |
||||
} |
||||
|
||||
return RocketChat.API.v1.success({ user: RocketChat.models.Users.findOneById(this.bodyParams.userId) }); |
||||
} catch (e) { |
||||
return RocketChat.API.v1.failure(e.name + ': ' + e.message); |
||||
} |
||||
} |
||||
}); |
@ -0,0 +1,50 @@ |
||||
/* globals RocketChat */ |
||||
RocketChat.getFullUserData = function({userId, filter, limit}) { |
||||
let fields = { |
||||
name: 1, |
||||
username: 1, |
||||
status: 1, |
||||
utcOffset: 1, |
||||
type: 1, |
||||
active: 1 |
||||
}; |
||||
|
||||
if (RocketChat.authz.hasPermission(userId, 'view-full-other-user-info')) { |
||||
fields = _.extend(fields, { |
||||
emails: 1, |
||||
phone: 1, |
||||
statusConnection: 1, |
||||
createdAt: 1, |
||||
lastLogin: 1, |
||||
services: 1, |
||||
requirePasswordChange: 1, |
||||
requirePasswordChangeReason: 1, |
||||
roles: 1 |
||||
}); |
||||
} else { |
||||
limit = 1; |
||||
} |
||||
|
||||
filter = s.trim(filter); |
||||
|
||||
if (!filter && limit === 1) { |
||||
return undefined; |
||||
} |
||||
|
||||
const options = { |
||||
fields: fields, |
||||
limit: limit, |
||||
sort: { username: 1 } |
||||
}; |
||||
|
||||
if (filter) { |
||||
if (limit === 1) { |
||||
return RocketChat.models.Users.findByUsername(filter, options); |
||||
} else { |
||||
const filterReg = new RegExp(s.escapeRegExp(filter), 'i'); |
||||
return RocketChat.models.Users.findByUsernameNameOrEmailAddress(filterReg, options); |
||||
} |
||||
} |
||||
|
||||
return RocketChat.models.Users.find({}, options); |
||||
}; |
@ -0,0 +1,11 @@ |
||||
Meteor.methods({ |
||||
getFullUserData({ filter = '', limit }) { |
||||
const result = RocketChat.getFullUserData({ userId: Meteor.userId(), filter, limit }); |
||||
|
||||
if (!result) { |
||||
return result; |
||||
} |
||||
|
||||
return result.fetch(); |
||||
} |
||||
}); |
Loading…
Reference in new issue