You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.3 KiB
67 lines
2.3 KiB
9 years ago
|
# Text Moderation with Firebase Cloud Functions
|
||
|
|
||
|
This template shows how to perform server side moderation of text written to a Firebase DB.
|
||
|
|
||
|
For instance if a user added the message "I DON'T LIKE THIS APP!! This is POOP!!!" this will get moderated to a - more civilized - non uppercase message: "I don't like this app. This is ****".
|
||
|
|
||
|
## Cloud Function Code
|
||
|
|
||
|
See file [index.js](index.js) and [moderation-string-utils.js](moderation-string-utils.js) for the moderation code.
|
||
|
|
||
|
Moderation of the messages is performed using [bad-words](https://www.npmjs.com/package/bad-words) a bad words remover that uses an external [list of bad-words](https://github.com/web-mech/badwords-list) and is currently mostly aimed at filtering english bad words. Also messages that contains mostly upper case characters are re-capitalized correctly using [capitalize-sentence](https://www.npmjs.com/package/capitalize-sentence).
|
||
|
|
||
|
The dependencies are listed in [package.json](package.json).
|
||
|
|
||
|
## Sample Database Structure
|
||
|
|
||
|
Users anonymously add a message text to the `/messages` list:
|
||
|
|
||
|
```
|
||
|
/functions-project-12345
|
||
|
/messages
|
||
|
/key-123456
|
||
|
text: "This is my first message!"
|
||
|
/key-123457
|
||
|
text: "This is my second message!"
|
||
|
```
|
||
|
|
||
|
## Trigger rules
|
||
|
|
||
|
Below is the trigger rule for the `moderator` function making sure it's triggered only when a new message is created and not every time it's updated.
|
||
|
|
||
|
```
|
||
|
"functions": {
|
||
|
".source": "functions",
|
||
|
"moderator": {
|
||
|
"triggers": {
|
||
|
"database": {
|
||
|
"path": "/messages/$message",
|
||
|
"condition": "!data.exists()" // Only run the function once on new messages
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Security Rules
|
||
|
|
||
|
The following security rules ensures users cannot read a message before it has been sanitized. The function adds a `sanitize` attribute (boolean) to the messages once they have been moderated.
|
||
|
Also we make sure that users can only create a message and not edit them. We also make sure they cannot set the sanitized flag already.
|
||
|
|
||
|
```
|
||
|
{
|
||
|
"rules": {
|
||
|
"messages": {
|
||
|
"$message": {
|
||
|
// Users can only add new messages. Not modify or delete them. Also makes sure they cannot mark a message as
|
||
|
// already sanitized.
|
||
|
".write": "!data.exists() && !newData.child('sanitized').exists()'"
|
||
|
".read": "data.child('sanitized').val() === true"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|