diff --git a/src/api/endpoints/posts/create.js b/src/api/endpoints/posts/create.js index 92aeb3d08..eadc886c5 100644 --- a/src/api/endpoints/posts/create.js +++ b/src/api/endpoints/posts/create.js @@ -4,7 +4,6 @@ * Module dependencies */ import validate from '../../validator'; -import hasDuplicates from '../../../common/has-duplicates'; import parse from '../../../common/text'; import { Post, isValidText } from '../../models/post'; import User from '../../models/user'; @@ -32,10 +31,9 @@ module.exports = (params, user, app) => if (textErr) return rej('invalid text'); // Get 'media_ids' parameter - const [mediaIds, mediaIdsErr] = validate(params.media_ids, 'array', false, [ - x => !hasDuplicates(x), + const [mediaIds, mediaIdsErr] = validate(params.media_ids, 'set', false, x => x.length > 4 ? 'too many media' : true - ]); + ); if (mediaIdsErr) return rej('invalid media_ids'); let files = []; @@ -135,8 +133,7 @@ module.exports = (params, user, app) => let poll = null; if (_poll !== null) { - const [pollChoices, pollChoicesErr] = validate(params.poll, 'array', false, [ - choices => !hasDuplicates(choices), + const [pollChoices, pollChoicesErr] = validate(params.poll, 'set', false, [ choices => { const shouldReject = choices.some(choice => { if (typeof choice != 'string') return true; diff --git a/src/api/validator.ts b/src/api/validator.ts index 830786a18..3c426054e 100644 --- a/src/api/validator.ts +++ b/src/api/validator.ts @@ -1,6 +1,7 @@ import * as mongo from 'mongodb'; +import hasDuplicates from '../common/has-duplicates'; -type Type = 'id' | 'string' | 'number' | 'boolean' | 'array' | 'object'; +type Type = 'id' | 'string' | 'number' | 'boolean' | 'array' | 'set' | 'object'; type Validator = ((x: T) => boolean | string) | ((x: T) => boolean | string)[]; @@ -9,6 +10,7 @@ function validate(value: any, type: 'string', isRequired?: boolean, validator?: function validate(value: any, type: 'number', isRequired?: boolean, validator?: Validator): [number, string]; function validate(value: any, type: 'boolean', isRequired?: boolean): [boolean, string]; function validate(value: any, type: 'array', isRequired?: boolean, validator?: Validator): [any[], string]; +function validate(value: any, type: 'set', isRequired?: boolean, validator?: Validator>): [Set, string]; function validate(value: any, type: 'object', isRequired?: boolean, validator?: Validator): [Object, string]; function validate(value: any, type: Type, isRequired?: boolean, validator?: Validator): [T, string] { if (value === undefined || value === null) { @@ -50,6 +52,14 @@ function validate(value: any, type: Type, isRequired?: boolean, validator?: V } break; + case 'set': + if (!Array.isArray(value)) { + return [null, 'must-be-an-array']; + } else if (hasDuplicates(value)) { + return [null, 'duplicated-contents']; + } + break; + case 'object': if (typeof value != 'object') { return [null, 'must-be-an-onject'];