This commit is contained in:
syuilo 2017-03-02 03:16:39 +09:00
parent 6256a8bdfc
commit a53edc96be
3 changed files with 39 additions and 31 deletions

View file

@ -4,8 +4,9 @@
* Module dependencies * Module dependencies
*/ */
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import validate from '../../validator';
import parse from '../../../common/text'; import parse from '../../../common/text';
import Post from '../../models/post'; import { Post, isValidText } from '../../models/post';
import User from '../../models/user'; import User from '../../models/user';
import Following from '../../models/following'; import Following from '../../models/following';
import DriveFile from '../../models/drive-file'; import DriveFile from '../../models/drive-file';
@ -15,16 +16,15 @@ import notify from '../../common/notify';
import event from '../../event'; import event from '../../event';
import config from '../../../conf'; import config from '../../../conf';
/**
* 最大文字数
*/
const maxTextLength = 1000;
/** /**
* 添付できるファイルの数 * 添付できるファイルの数
*/ */
const maxMediaCount = 4; const maxMediaCount = 4;
function hasDuplicates(array) {
return (new Set(array)).size !== array.length;
}
/** /**
* Create a post * Create a post
* *
@ -37,30 +37,16 @@ module.exports = (params, user, app) =>
new Promise(async (res, rej) => new Promise(async (res, rej) =>
{ {
// Get 'text' parameter // Get 'text' parameter
let text = params.text; const [text, textErr] = validate(params.text, 'string', false, isValidText);
if (text !== undefined && text !== null) { if (textErr) return rej('invalid text');
if (typeof text != 'string') {
return rej('text must be a string');
}
text = text.trim();
if (text.length == 0) {
text = null;
} else if (text.length > maxTextLength) {
return rej('too long text');
}
} else {
text = null;
}
// Get 'media_ids' parameter // Get 'media_ids' parameter
let medias = params.media_ids; const [mediaIds, mediaIdsErr] = validate(params.media_ids, 'array', false, x => !hasDuplicates(x));
let files = []; if (mediaIdsErr) return rej('invalid media_ids');
if (medias !== undefined && medias !== null) {
if (!Array.isArray(medias)) {
return rej('media_ids must be an array');
}
if (medias.length > maxMediaCount) { let files = [];
if (mediaIds !== null) {
if (mediaIds.length > maxMediaCount) {
return rej('too many media'); return rej('too many media');
} }

View file

@ -1,3 +1,7 @@
import db from '../../db/mongodb'; import db from '../../db/mongodb';
export default db.get('posts') as any; // fuck type definition export default db.get('posts') as any; // fuck type definition
export function isValidText(text: string): boolean {
return text.length <= 1000 && text.trim() != '';
}

View file

@ -2,7 +2,15 @@ import * as mongo from 'mongodb';
type Type = 'id' | 'string' | 'number' | 'boolean' | 'array' | 'object'; type Type = 'id' | 'string' | 'number' | 'boolean' | 'array' | 'object';
export default <T>(value: any, isRequired: boolean, type: Type, validator?: (any) => boolean): [T, string] => { type Validator<T> = ((x: T) => boolean | string) | ((x: T) => boolean | string)[];
function validate(value: any, type: 'id', isRequired?: boolean): [mongo.ObjectID, string];
function validate(value: any, type: 'string', isRequired?: boolean, validator?: Validator<string>): [string, string];
function validate(value: any, type: 'number', isRequired?: boolean, validator?: Validator<number>): [number, string];
function validate(value: any, type: 'boolean', isRequired?: boolean): [boolean, string];
function validate(value: any, type: 'array', isRequired?: boolean, validator?: Validator<any[]>): [any[], string];
function validate(value: any, type: 'object', isRequired?: boolean, validator?: Validator<Object>): [Object, string];
function validate<T>(value: any, type: Type, isRequired?: boolean, validator?: Validator<T>): [T, string] {
if (value === undefined || value === null) { if (value === undefined || value === null) {
if (isRequired) { if (isRequired) {
return [null, 'is-required'] return [null, 'is-required']
@ -49,11 +57,21 @@ export default <T>(value: any, isRequired: boolean, type: Type, validator?: (any
break; break;
} }
if (type == 'id') value = new mongo.ObjectID(value);
if (validator) { if (validator) {
if (!validator(value)) { const validators = Array.isArray(validator) ? validator : [validator];
return [null, 'invalid-format']; for (let i = 0; i < validators.length; i++) {
const result = validators[i](value);
if (result === false) {
return [null, 'invalid-format'];
} else if (typeof result == 'string') {
return [null, result];
}
} }
} }
return [value, null]; return [value, null];
}; }
export default validate;