mirror of
https://github.com/wassname/talk.git
synced 2026-09-12 13:01:11 +08:00
Merge branch 'master' into subscriptions
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* The key must be composed of alpha characters with periods seperating them.
|
||||
*/
|
||||
const KEY_REGEX = /^(?:[A-Za-z][A-Za-z\.]*[A-Za-z])?(?:[A-Za-z]*)$/;
|
||||
|
||||
/**
|
||||
* Allows metadata properties to be set/unset from specific models. It is the
|
||||
* expecatation of this API that the metadata field is either accessed later
|
||||
* directly, or accessed as a result of another database load rather than
|
||||
* this service providing an interface to do so.
|
||||
*
|
||||
* @class MetadataService
|
||||
*/
|
||||
class MetadataService {
|
||||
|
||||
/**
|
||||
* Parses a key by ensuring that if it is either a string, or an array with
|
||||
* only characters defined in the `KEY_REGEX`
|
||||
*
|
||||
* @static
|
||||
* @param {String|Array} key
|
||||
* @returns {String} string form of the key
|
||||
*
|
||||
* @memberOf Metadata
|
||||
*/
|
||||
static parseKey(key) {
|
||||
if (Array.isArray(key)) {
|
||||
key = key.join('.');
|
||||
}
|
||||
|
||||
if ((typeof key !== 'string') || !KEY_REGEX.test(key) || key.length === 0) {
|
||||
throw new Error(`${key} is not valid, only a-zA-Z. allowed`);
|
||||
}
|
||||
|
||||
return ['metadata', key].join('.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an object on the metadata field of an object. An example could be:
|
||||
*
|
||||
* @example
|
||||
* const MetadataService = require('services/metadata');
|
||||
* const CommentModel = require('models/comment');
|
||||
*
|
||||
* // Sets the property `loaded` on the comment with `id=1`.
|
||||
* MetadataService.set(CommentModel, '1', 'loaded', true);
|
||||
*
|
||||
* @static
|
||||
* @param {mongoose.Model} model the mongoose model for the object
|
||||
* @param {String} id the value for the field `id` of the model
|
||||
* @param {String|Array} key key for the metadata field
|
||||
* @param {any} value javascript object to set the value of the metadata to
|
||||
* @returns {Promise} resolves when the update is complete
|
||||
*
|
||||
* @memberOf Metadata
|
||||
*/
|
||||
static async set(model, id, key, value) {
|
||||
key = MetadataService.parseKey(key);
|
||||
|
||||
return model.update({id}, {
|
||||
$set: {
|
||||
[key]: value
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the value for the metadata field as the specific key.
|
||||
*
|
||||
* @example
|
||||
* const MetadataService = require('services/metadata');
|
||||
* const CommentModel = require('models/comment');
|
||||
*
|
||||
* // Removes the property `loaded` on the comment with `id=1`.
|
||||
* MetadataService.unset(CommentModel, '1', 'loaded');
|
||||
*
|
||||
* @static
|
||||
* @param {mongoose.Model} model the mongoose model for the object
|
||||
* @param {String} id the value for the field `id` of the model
|
||||
* @param {String|Array} key key for the metadata field
|
||||
* @returns
|
||||
*
|
||||
* @memberOf Metadata
|
||||
*/
|
||||
static async unset(model, id, key) {
|
||||
key = MetadataService.parseKey(key);
|
||||
|
||||
return model.update({id}, {
|
||||
$unset: {[key]: ''}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MetadataService;
|
||||
+47
-6
@@ -1,3 +1,4 @@
|
||||
const assert = require('assert');
|
||||
const bcrypt = require('bcrypt');
|
||||
const url = require('url');
|
||||
const jwt = require('jsonwebtoken');
|
||||
@@ -253,26 +254,28 @@ module.exports = class UsersService {
|
||||
* @param {Boolean} checkAgainstWordlist enables cheching against the wordlist
|
||||
* @return {Promise}
|
||||
*/
|
||||
static isValidUsername(username, checkAgainstWordlist = true) {
|
||||
static async isValidUsername(username, checkAgainstWordlist = true) {
|
||||
const onlyLettersNumbersUnderscore = /^[A-Za-z0-9_]+$/;
|
||||
|
||||
if (!username) {
|
||||
return Promise.reject(errors.ErrMissingUsername);
|
||||
throw errors.ErrMissingUsername;
|
||||
}
|
||||
|
||||
if (!onlyLettersNumbersUnderscore.test(username)) {
|
||||
|
||||
return Promise.reject(errors.ErrSpecialChars);
|
||||
throw errors.ErrSpecialChars;
|
||||
}
|
||||
|
||||
if (checkAgainstWordlist) {
|
||||
|
||||
// check for profanity
|
||||
console.log('Username profanity check disabled: ', Wordlist.usernameCheck(username));
|
||||
let err = await Wordlist.usernameCheck(username);
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
// No errors found!
|
||||
return Promise.resolve(username);
|
||||
return username;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -834,4 +837,42 @@ module.exports = class UsersService {
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Ignore another user
|
||||
* @param {String} userId the id of the user that is ignoring another users
|
||||
* @param {String[]} usersToIgnore Array of user IDs to ignore
|
||||
*/
|
||||
static ignoreUsers(userId, usersToIgnore) {
|
||||
assert(Array.isArray(usersToIgnore), 'usersToIgnore is an array');
|
||||
assert(usersToIgnore.every(u => typeof u === 'string'), 'usersToIgnore is an array of string user IDs');
|
||||
if (usersToIgnore.includes(userId)) {
|
||||
throw new Error('Users cannot ignore themselves');
|
||||
}
|
||||
|
||||
// TODO: For each usersToIgnore, make sure they exist?
|
||||
return UserModel.update({id: userId}, {
|
||||
$addToSet: {
|
||||
ignoresUsers: {
|
||||
$each: usersToIgnore
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop ignoring other users
|
||||
* @param {String} userId the id of the user that is ignoring another users
|
||||
* @param {String[]} usersToStopIgnoring Array of user IDs to stop ignoring
|
||||
*/
|
||||
static async stopIgnoringUsers(userId, usersToStopIgnoring) {
|
||||
assert(Array.isArray(usersToStopIgnoring), 'usersToStopIgnoring is an array');
|
||||
assert(usersToStopIgnoring.every(u => typeof u === 'string'), 'usersToStopIgnoring is an array of string user IDs');
|
||||
await UserModel.update({id: userId}, {
|
||||
$pullAll: {
|
||||
ignoresUsers: usersToStopIgnoring
|
||||
}
|
||||
});
|
||||
console.log('Mongo wrote stopIgnoringUsers', usersToStopIgnoring);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user