Resolve #2623
This commit is contained in:
		
							parent
							
								
									befc35a3ac
								
							
						
					
					
						commit
						a7e6b766be
					
				
					 26 changed files with 434 additions and 354 deletions
				
			
		| 
						 | 
					@ -2,31 +2,35 @@ import rndstr from 'rndstr';
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import App, { pack } from '../../../../models/app';
 | 
					import App, { pack } from '../../../../models/app';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: false
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							name: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							description: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							permission: {
 | 
				
			||||||
 | 
								validator: $.arr($.str).unique()
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO: Check it is valid url
 | 
				
			||||||
 | 
							callbackUrl: {
 | 
				
			||||||
 | 
								validator: $.str.optional.nullable,
 | 
				
			||||||
 | 
								default: null as any
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Create an app
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'name' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [name, nameErr] = $.str.get(params.name);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (nameErr) return rej('invalid name param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'description' parameter
 | 
					 | 
				
			||||||
	const [description, descriptionErr] = $.str.get(params.description);
 | 
					 | 
				
			||||||
	if (descriptionErr) return rej('invalid description param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'permission' parameter
 | 
					 | 
				
			||||||
	const [permission, permissionErr] = $.arr($.str).unique().get(params.permission);
 | 
					 | 
				
			||||||
	if (permissionErr) return rej('invalid permission param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'callbackUrl' parameter
 | 
					 | 
				
			||||||
	// TODO: Check it is valid url
 | 
					 | 
				
			||||||
	const [callbackUrl = null, callbackUrlErr] = $.str.optional.nullable.get(params.callbackUrl);
 | 
					 | 
				
			||||||
	if (callbackUrlErr) return rej('invalid callbackUrl param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate secret
 | 
						// Generate secret
 | 
				
			||||||
	const secret = rndstr('a-zA-Z0-9', 32);
 | 
						const secret = rndstr('a-zA-Z0-9', 32);
 | 
				
			||||||
| 
						 | 
					@ -36,9 +40,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
		createdAt: new Date(),
 | 
							createdAt: new Date(),
 | 
				
			||||||
		userId: user && user._id,
 | 
							userId: user && user._id,
 | 
				
			||||||
		name: name,
 | 
							name: name,
 | 
				
			||||||
		description: description,
 | 
							description: ps.description,
 | 
				
			||||||
		permission: permission,
 | 
							permission: ps.permission,
 | 
				
			||||||
		callbackUrl: callbackUrl,
 | 
							callbackUrl: ps.callbackUrl,
 | 
				
			||||||
		secret: secret
 | 
							secret: secret
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,23 +5,27 @@ import App from '../../../../models/app';
 | 
				
			||||||
import AuthSess from '../../../../models/auth-session';
 | 
					import AuthSess from '../../../../models/auth-session';
 | 
				
			||||||
import AccessToken from '../../../../models/access-token';
 | 
					import AccessToken from '../../../../models/access-token';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							token: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Accept
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'token' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [token, tokenErr] = $.str.get(params.token);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (tokenErr) return rej('invalid token param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Fetch token
 | 
						// Fetch token
 | 
				
			||||||
	const session = await AuthSess
 | 
						const session = await AuthSess
 | 
				
			||||||
		.findOne({ token: token });
 | 
							.findOne({ token: ps.token });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (session === null) {
 | 
						if (session === null) {
 | 
				
			||||||
		return rej('session not found');
 | 
							return rej('session not found');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,26 +1,27 @@
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Module dependencies
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
import * as uuid from 'uuid';
 | 
					import * as uuid from 'uuid';
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import App from '../../../../../models/app';
 | 
					import App from '../../../../../models/app';
 | 
				
			||||||
import AuthSess from '../../../../../models/auth-session';
 | 
					import AuthSess from '../../../../../models/auth-session';
 | 
				
			||||||
import config from '../../../../../config';
 | 
					import config from '../../../../../config';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const meta = {
 | 
				
			||||||
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							appSecret: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Generate a session
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @param {any} params
 | 
					 | 
				
			||||||
 * @return {Promise<any>}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default (params: any) => new Promise(async (res, rej) => {
 | 
					export default (params: any) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'appSecret' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [appSecret, appSecretErr] = $.str.get(params.appSecret);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (appSecretErr) return rej('invalid appSecret param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Lookup app
 | 
						// Lookup app
 | 
				
			||||||
	const app = await App.findOne({
 | 
						const app = await App.findOne({
 | 
				
			||||||
		secret: appSecret
 | 
							secret: ps.appSecret
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (app == null) {
 | 
						if (app == null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,25 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import AuthSess, { pack } from '../../../../../models/auth-session';
 | 
					import AuthSess, { pack } from '../../../../../models/auth-session';
 | 
				
			||||||
import { ILocalUser } from '../../../../../models/user';
 | 
					import { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const meta = {
 | 
				
			||||||
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							token: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Show a session
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'token' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [token, tokenErr] = $.str.get(params.token);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (tokenErr) return rej('invalid token param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Lookup session
 | 
						// Lookup session
 | 
				
			||||||
	const session = await AuthSess.findOne({
 | 
						const session = await AuthSess.findOne({
 | 
				
			||||||
		token: token
 | 
							token: ps.token
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (session == null) {
 | 
						if (session == null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,40 +1,41 @@
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Module dependencies
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import App from '../../../../../models/app';
 | 
					import App from '../../../../../models/app';
 | 
				
			||||||
import AuthSess from '../../../../../models/auth-session';
 | 
					import AuthSess from '../../../../../models/auth-session';
 | 
				
			||||||
import AccessToken from '../../../../../models/access-token';
 | 
					import AccessToken from '../../../../../models/access-token';
 | 
				
			||||||
import { pack } from '../../../../../models/user';
 | 
					import { pack } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const meta = {
 | 
				
			||||||
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							appSecret: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							token: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Generate a session
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @param {any} params
 | 
					 | 
				
			||||||
 * @return {Promise<any>}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default (params: any) => new Promise(async (res, rej) => {
 | 
					export default (params: any) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'appSecret' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [appSecret, appSecretErr] = $.str.get(params.appSecret);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (appSecretErr) return rej('invalid appSecret param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Lookup app
 | 
						// Lookup app
 | 
				
			||||||
	const app = await App.findOne({
 | 
						const app = await App.findOne({
 | 
				
			||||||
		secret: appSecret
 | 
							secret: ps.appSecret
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (app == null) {
 | 
						if (app == null) {
 | 
				
			||||||
		return rej('app not found');
 | 
							return rej('app not found');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get 'token' parameter
 | 
					 | 
				
			||||||
	const [token, tokenErr] = $.str.get(params.token);
 | 
					 | 
				
			||||||
	if (tokenErr) return rej('invalid token param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Fetch token
 | 
						// Fetch token
 | 
				
			||||||
	const session = await AuthSess
 | 
						const session = await AuthSess
 | 
				
			||||||
		.findOne({
 | 
							.findOne({
 | 
				
			||||||
			token: token,
 | 
								token: ps.token,
 | 
				
			||||||
			appId: app._id
 | 
								appId: app._id
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import DriveFile, { pack } from '../../../../../models/drive-file';
 | 
					import DriveFile, { pack } from '../../../../../models/drive-file';
 | 
				
			||||||
import { ILocalUser } from '../../../../../models/user';
 | 
					import { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -23,11 +24,11 @@ export const meta = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	const [md5, md5Err] = $.str.get(params.md5);
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	if (md5Err) return rej('invalid md5 param');
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const file = await DriveFile.findOne({
 | 
						const file = await DriveFile.findOne({
 | 
				
			||||||
		md5: md5,
 | 
							md5: ps.md5,
 | 
				
			||||||
		'metadata.userId': user._id,
 | 
							'metadata.userId': user._id,
 | 
				
			||||||
		'metadata.deletedAt': { $exists: false }
 | 
							'metadata.deletedAt': { $exists: false }
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,18 +1,25 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import * as speakeasy from 'speakeasy';
 | 
					import * as speakeasy from 'speakeasy';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							token: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'token' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [token, tokenErr] = $.str.get(params.token);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (tokenErr) return rej('invalid token param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const _token = token.replace(/\s/g, '');
 | 
						const _token = ps.token.replace(/\s/g, '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (user.twoFactorTempSecret == null) {
 | 
						if (user.twoFactorTempSecret == null) {
 | 
				
			||||||
		return rej('二段階認証の設定が開始されていません');
 | 
							return rej('二段階認証の設定が開始されていません');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,19 +4,26 @@ import * as speakeasy from 'speakeasy';
 | 
				
			||||||
import * as QRCode from 'qrcode';
 | 
					import * as QRCode from 'qrcode';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
import config from '../../../../../config';
 | 
					import config from '../../../../../config';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							password: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'password' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [password, passwordErr] = $.str.get(params.password);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (passwordErr) return rej('invalid password param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Compare password
 | 
						// Compare password
 | 
				
			||||||
	const same = await bcrypt.compare(password, user.password);
 | 
						const same = await bcrypt.compare(ps.password, user.password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!same) {
 | 
						if (!same) {
 | 
				
			||||||
		return rej('incorrect password');
 | 
							return rej('incorrect password');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,19 +1,26 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import * as bcrypt from 'bcryptjs';
 | 
					import * as bcrypt from 'bcryptjs';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							password: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'password' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [password, passwordErr] = $.str.get(params.password);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (passwordErr) return rej('invalid password param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Compare password
 | 
						// Compare password
 | 
				
			||||||
	const same = await bcrypt.compare(password, user.password);
 | 
						const same = await bcrypt.compare(ps.password, user.password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!same) {
 | 
						if (!same) {
 | 
				
			||||||
		return rej('incorrect password');
 | 
							return rej('incorrect password');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,38 +2,47 @@ import $ from 'cafy';
 | 
				
			||||||
import AccessToken from '../../../../models/access-token';
 | 
					import AccessToken from '../../../../models/access-token';
 | 
				
			||||||
import { pack } from '../../../../models/app';
 | 
					import { pack } from '../../../../models/app';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							offset: {
 | 
				
			||||||
 | 
								validator: $.num.optional.min(0),
 | 
				
			||||||
 | 
								default: 0,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sort: {
 | 
				
			||||||
 | 
								validator: $.str.optional.or('desc|asc'),
 | 
				
			||||||
 | 
								default: 'desc',
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'limit' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'offset' parameter
 | 
					 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'sort' parameter
 | 
					 | 
				
			||||||
	const [sort = 'desc', sortError] = $.str.optional.or('desc asc').get(params.sort);
 | 
					 | 
				
			||||||
	if (sortError) return rej('invalid sort param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get tokens
 | 
						// Get tokens
 | 
				
			||||||
	const tokens = await AccessToken
 | 
						const tokens = await AccessToken
 | 
				
			||||||
		.find({
 | 
							.find({
 | 
				
			||||||
			userId: user._id
 | 
								userId: user._id
 | 
				
			||||||
		}, {
 | 
							}, {
 | 
				
			||||||
			limit: limit,
 | 
								limit: ps.limit,
 | 
				
			||||||
			skip: offset,
 | 
								skip: ps.offset,
 | 
				
			||||||
			sort: {
 | 
								sort: {
 | 
				
			||||||
				_id: sort == 'asc' ? 1 : -1
 | 
									_id: ps.sort == 'asc' ? 1 : -1
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Serialize
 | 
					 | 
				
			||||||
	res(await Promise.all(tokens.map(token => pack(token.appId, user, {
 | 
						res(await Promise.all(tokens.map(token => pack(token.appId, user, {
 | 
				
			||||||
		detail: true
 | 
							detail: true
 | 
				
			||||||
	}))));
 | 
						}))));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,30 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import * as bcrypt from 'bcryptjs';
 | 
					import * as bcrypt from 'bcryptjs';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							currentPassword: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							newPassword: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'currentPasword' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [currentPassword, currentPasswordErr] = $.str.get(params.currentPasword);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (currentPasswordErr) return rej('invalid currentPasword param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'newPassword' parameter
 | 
					 | 
				
			||||||
	const [newPassword, newPasswordErr] = $.str.get(params.newPassword);
 | 
					 | 
				
			||||||
	if (newPasswordErr) return rej('invalid newPassword param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Compare password
 | 
						// Compare password
 | 
				
			||||||
	const same = await bcrypt.compare(currentPassword, user.password);
 | 
						const same = await bcrypt.compare(ps.currentPassword, user.password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!same) {
 | 
						if (!same) {
 | 
				
			||||||
		return rej('incorrect password');
 | 
							return rej('incorrect password');
 | 
				
			||||||
| 
						 | 
					@ -25,7 +32,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate hash of password
 | 
						// Generate hash of password
 | 
				
			||||||
	const salt = await bcrypt.genSalt(8);
 | 
						const salt = await bcrypt.genSalt(8);
 | 
				
			||||||
	const hash = await bcrypt.hash(newPassword, salt);
 | 
						const hash = await bcrypt.hash(ps.newPassword, salt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	await User.update(user._id, {
 | 
						await User.update(user._id, {
 | 
				
			||||||
		$set: {
 | 
							$set: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,19 +3,26 @@ import * as bcrypt from 'bcryptjs';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { publishMainStream } from '../../../../stream';
 | 
					import { publishMainStream } from '../../../../stream';
 | 
				
			||||||
import generateUserToken from '../../common/generate-native-user-token';
 | 
					import generateUserToken from '../../common/generate-native-user-token';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							password: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'password' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [password, passwordErr] = $.str.get(params.password);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (passwordErr) return rej('invalid password param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Compare password
 | 
						// Compare password
 | 
				
			||||||
	const same = await bcrypt.compare(password, user.password);
 | 
						const same = await bcrypt.compare(ps.password, user.password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!same) {
 | 
						if (!same) {
 | 
				
			||||||
		return rej('incorrect password');
 | 
							return rej('incorrect password');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,30 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { publishMainStream } from '../../../../stream';
 | 
					import { publishMainStream } from '../../../../stream';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							name: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							value: {
 | 
				
			||||||
 | 
								validator: $.any.nullable
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'name' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [name, nameErr] = $.str.get(params.name);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (nameErr) return rej('invalid name param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'value' parameter
 | 
					 | 
				
			||||||
	const [value, valueErr] = $.any.nullable.get(params.value);
 | 
					 | 
				
			||||||
	if (valueErr) return rej('invalid value param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const x: any = {};
 | 
						const x: any = {};
 | 
				
			||||||
	x[`clientSettings.${name}`] = value;
 | 
						x[`clientSettings.${name}`] = ps.value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	await User.update(user._id, {
 | 
						await User.update(user._id, {
 | 
				
			||||||
		$set: x
 | 
							$set: x
 | 
				
			||||||
| 
						 | 
					@ -28,6 +35,6 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
	// Publish event
 | 
						// Publish event
 | 
				
			||||||
	publishMainStream(user._id, 'clientSettingUpdated', {
 | 
						publishMainStream(user._id, 'clientSettingUpdated', {
 | 
				
			||||||
		key: name,
 | 
							key: name,
 | 
				
			||||||
		value
 | 
							value: ps.value
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,29 +1,36 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { publishMainStream } from '../../../../stream';
 | 
					import { publishMainStream } from '../../../../stream';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							home: {
 | 
				
			||||||
 | 
								validator: $.arr($.obj({
 | 
				
			||||||
 | 
									name: $.str,
 | 
				
			||||||
 | 
									id: $.str,
 | 
				
			||||||
 | 
									place: $.str,
 | 
				
			||||||
 | 
									data: $.obj()
 | 
				
			||||||
 | 
								}).strict())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'home' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [home, homeErr] = $.arr($.obj({
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
		name: $.str,
 | 
					 | 
				
			||||||
		id: $.str,
 | 
					 | 
				
			||||||
		place: $.str,
 | 
					 | 
				
			||||||
		data: $.obj()
 | 
					 | 
				
			||||||
	}).strict()).get(params.home);
 | 
					 | 
				
			||||||
	if (homeErr) return rej('invalid home param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	await User.update(user._id, {
 | 
						await User.update(user._id, {
 | 
				
			||||||
		$set: {
 | 
							$set: {
 | 
				
			||||||
			'clientSettings.home': home
 | 
								'clientSettings.home': ps.home
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res();
 | 
						res();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	publishMainStream(user._id, 'homeUpdated', home);
 | 
						publishMainStream(user._id, 'homeUpdated', ps.home);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,28 +1,35 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { publishMainStream } from '../../../../stream';
 | 
					import { publishMainStream } from '../../../../stream';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							home: {
 | 
				
			||||||
 | 
								validator: $.arr($.obj({
 | 
				
			||||||
 | 
									name: $.str,
 | 
				
			||||||
 | 
									id: $.str,
 | 
				
			||||||
 | 
									data: $.obj()
 | 
				
			||||||
 | 
								}).strict())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'home' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [home, homeErr] = $.arr($.obj({
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
		name: $.str,
 | 
					 | 
				
			||||||
		id: $.str,
 | 
					 | 
				
			||||||
		data: $.obj()
 | 
					 | 
				
			||||||
	}).strict()).get(params.home);
 | 
					 | 
				
			||||||
	if (homeErr) return rej('invalid home param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	await User.update(user._id, {
 | 
						await User.update(user._id, {
 | 
				
			||||||
		$set: {
 | 
							$set: {
 | 
				
			||||||
			'clientSettings.mobileHome': home
 | 
								'clientSettings.mobileHome': ps.home
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res();
 | 
						res();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	publishMainStream(user._id, 'mobileHomeUpdated', home);
 | 
						publishMainStream(user._id, 'mobileHomeUpdated', ps.home);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,31 +1,38 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import User, { ILocalUser } from '../../../../models/user';
 | 
					import User, { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { publishMainStream } from '../../../../stream';
 | 
					import { publishMainStream } from '../../../../stream';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
	secure: true
 | 
					
 | 
				
			||||||
 | 
						secure: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							id: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							data: {
 | 
				
			||||||
 | 
								validator: $.obj()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'id' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [id, idErr] = $.str.get(params.id);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (idErr) return rej('invalid id param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get 'data' parameter
 | 
						if (ps.id == null && ps.data == null) return rej('you need to set id and data params if home param unset');
 | 
				
			||||||
	const [data, dataErr] = $.obj().get(params.data);
 | 
					 | 
				
			||||||
	if (dataErr) return rej('invalid data param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (id == null && data == null) return rej('you need to set id and data params if home param unset');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let widget;
 | 
						let widget;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//#region Desktop home
 | 
						//#region Desktop home
 | 
				
			||||||
	if (widget == null && user.clientSettings.home) {
 | 
						if (widget == null && user.clientSettings.home) {
 | 
				
			||||||
		const desktopHome = user.clientSettings.home;
 | 
							const desktopHome = user.clientSettings.home;
 | 
				
			||||||
		widget = desktopHome.find((w: any) => w.id == id);
 | 
							widget = desktopHome.find((w: any) => w.id == ps.id);
 | 
				
			||||||
		if (widget) {
 | 
							if (widget) {
 | 
				
			||||||
				widget.data = data;
 | 
									widget.data = ps.data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			await User.update(user._id, {
 | 
								await User.update(user._id, {
 | 
				
			||||||
				$set: {
 | 
									$set: {
 | 
				
			||||||
| 
						 | 
					@ -39,9 +46,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
	//#region Mobile home
 | 
						//#region Mobile home
 | 
				
			||||||
	if (widget == null && user.clientSettings.mobileHome) {
 | 
						if (widget == null && user.clientSettings.mobileHome) {
 | 
				
			||||||
		const mobileHome = user.clientSettings.mobileHome;
 | 
							const mobileHome = user.clientSettings.mobileHome;
 | 
				
			||||||
		widget = mobileHome.find((w: any) => w.id == id);
 | 
							widget = mobileHome.find((w: any) => w.id == ps.id);
 | 
				
			||||||
		if (widget) {
 | 
							if (widget) {
 | 
				
			||||||
				widget.data = data;
 | 
									widget.data = ps.data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			await User.update(user._id, {
 | 
								await User.update(user._id, {
 | 
				
			||||||
				$set: {
 | 
									$set: {
 | 
				
			||||||
| 
						 | 
					@ -57,11 +64,11 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
		const deck = user.clientSettings.deck;
 | 
							const deck = user.clientSettings.deck;
 | 
				
			||||||
		deck.columns.filter((c: any) => c.type == 'widgets').forEach((c: any) => {
 | 
							deck.columns.filter((c: any) => c.type == 'widgets').forEach((c: any) => {
 | 
				
			||||||
			c.widgets.forEach((w: any) => {
 | 
								c.widgets.forEach((w: any) => {
 | 
				
			||||||
				if (w.id == id) widget = w;
 | 
									if (w.id == ps.id) widget = w;
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		if (widget) {
 | 
							if (widget) {
 | 
				
			||||||
				widget.data = data;
 | 
									widget.data = ps.data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			await User.update(user._id, {
 | 
								await User.update(user._id, {
 | 
				
			||||||
				$set: {
 | 
									$set: {
 | 
				
			||||||
| 
						 | 
					@ -74,7 +81,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (widget) {
 | 
						if (widget) {
 | 
				
			||||||
		publishMainStream(user._id, 'widgetUpdated', {
 | 
							publishMainStream(user._id, 'widgetUpdated', {
 | 
				
			||||||
			id, data
 | 
								id: ps.id, data: ps.data
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		res();
 | 
							res();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@ import History from '../../../../models/messaging-history';
 | 
				
			||||||
import Mute from '../../../../models/mute';
 | 
					import Mute from '../../../../models/mute';
 | 
				
			||||||
import { pack } from '../../../../models/messaging-message';
 | 
					import { pack } from '../../../../models/messaging-message';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -12,13 +13,19 @@ export const meta = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kind: 'messaging-read'
 | 
						kind: 'messaging-read',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'limit' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const mute = await Mute.find({
 | 
						const mute = await Mute.find({
 | 
				
			||||||
		muterId: user._id,
 | 
							muterId: user._id,
 | 
				
			||||||
| 
						 | 
					@ -33,12 +40,11 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
 | 
				
			||||||
				$nin: mute.map(m => m.muteeId)
 | 
									$nin: mute.map(m => m.muteeId)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}, {
 | 
							}, {
 | 
				
			||||||
			limit: limit,
 | 
								limit: ps.limit,
 | 
				
			||||||
			sort: {
 | 
								sort: {
 | 
				
			||||||
				updatedAt: -1
 | 
									updatedAt: -1
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Serialize
 | 
					 | 
				
			||||||
	res(await Promise.all(history.map(h => pack(h.messageId, user))));
 | 
						res(await Promise.all(history.map(h => pack(h.messageId, user))));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import App, { pack } from '../../../../models/app';
 | 
					import App, { pack } from '../../../../models/app';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -8,17 +9,24 @@ export const meta = {
 | 
				
			||||||
		'en-US': 'Get my apps'
 | 
							'en-US': 'Get my apps'
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	requireCredential: true
 | 
						requireCredential: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							offset: {
 | 
				
			||||||
 | 
								validator: $.num.optional.min(0),
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'limit' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'offset' parameter
 | 
					 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const query = {
 | 
						const query = {
 | 
				
			||||||
		userId: user._id
 | 
							userId: user._id
 | 
				
			||||||
| 
						 | 
					@ -27,8 +35,8 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
 | 
				
			||||||
	// Execute query
 | 
						// Execute query
 | 
				
			||||||
	const apps = await App
 | 
						const apps = await App
 | 
				
			||||||
		.find(query, {
 | 
							.find(query, {
 | 
				
			||||||
			limit: limit,
 | 
								limit: ps.limit,
 | 
				
			||||||
			skip: offset,
 | 
								skip: ps.offset,
 | 
				
			||||||
			sort: {
 | 
								sort: {
 | 
				
			||||||
				_id: -1
 | 
									_id: -1
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@ import $ from 'cafy';
 | 
				
			||||||
import Vote from '../../../../../models/poll-vote';
 | 
					import Vote from '../../../../../models/poll-vote';
 | 
				
			||||||
import Note, { pack } from '../../../../../models/note';
 | 
					import Note, { pack } from '../../../../../models/note';
 | 
				
			||||||
import { ILocalUser } from '../../../../../models/user';
 | 
					import { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -10,16 +11,23 @@ export const meta = {
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							offset: {
 | 
				
			||||||
 | 
								validator: $.num.optional.min(0),
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'limit' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'offset' parameter
 | 
					 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get votes
 | 
						// Get votes
 | 
				
			||||||
	const votes = await Vote.find({
 | 
						const votes = await Vote.find({
 | 
				
			||||||
| 
						 | 
					@ -46,14 +54,14 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
 | 
				
			||||||
				$ne: null
 | 
									$ne: null
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}, {
 | 
							}, {
 | 
				
			||||||
			limit: limit,
 | 
								limit: ps.limit,
 | 
				
			||||||
			skip: offset,
 | 
								skip: ps.offset,
 | 
				
			||||||
			sort: {
 | 
								sort: {
 | 
				
			||||||
				_id: -1
 | 
									_id: -1
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Serialize
 | 
						res(await Promise.all(notes.map(note => pack(note, user, {
 | 
				
			||||||
	res(await Promise.all(notes.map(async note =>
 | 
							detail: true
 | 
				
			||||||
		await pack(note, user, { detail: true }))));
 | 
						}))));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,19 +4,36 @@ import Note from '../../../../models/note';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { packMany } from '../../../../models/note';
 | 
					import { packMany } from '../../../../models/note';
 | 
				
			||||||
import es from '../../../../db/elasticsearch';
 | 
					import es from '../../../../db/elasticsearch';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const meta = {
 | 
				
			||||||
 | 
						desc: {
 | 
				
			||||||
 | 
							'ja-JP': '投稿を検索します。',
 | 
				
			||||||
 | 
							'en-US': 'Search notes.'
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							query: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							offset: {
 | 
				
			||||||
 | 
								validator: $.num.optional.min(0),
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'query' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [query, queryError] = $.str.get(params.query);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (queryError) return rej('invalid query param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'offset' parameter
 | 
					 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'limit' parameter
 | 
					 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 30).get(params.limit);
 | 
					 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (es == null) return rej('searching not available');
 | 
						if (es == null) return rej('searching not available');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,12 +41,12 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
 | 
				
			||||||
		index: 'misskey',
 | 
							index: 'misskey',
 | 
				
			||||||
		type: 'note',
 | 
							type: 'note',
 | 
				
			||||||
		body: {
 | 
							body: {
 | 
				
			||||||
			size: limit,
 | 
								size: ps.limit,
 | 
				
			||||||
			from: offset,
 | 
								from: ps.offset,
 | 
				
			||||||
			query: {
 | 
								query: {
 | 
				
			||||||
				simple_query_string: {
 | 
									simple_query_string: {
 | 
				
			||||||
					fields: ['text'],
 | 
										fields: ['text'],
 | 
				
			||||||
					query: query,
 | 
										query: ps.query,
 | 
				
			||||||
					default_operator: 'and'
 | 
										default_operator: 'and'
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,76 +0,0 @@
 | 
				
			||||||
const ms = require('ms');
 | 
					 | 
				
			||||||
import $ from 'cafy';
 | 
					 | 
				
			||||||
import Note, { pack } from '../../../../models/note';
 | 
					 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export const meta = {
 | 
					 | 
				
			||||||
	desc: {
 | 
					 | 
				
			||||||
		'ja-JP': '人気の投稿の一覧を取得します。',
 | 
					 | 
				
			||||||
		'en-US': 'Get trend notes.'
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	requireCredential: true
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					 | 
				
			||||||
	// Get 'limit' parameter
 | 
					 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
					 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'offset' parameter
 | 
					 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'reply' parameter
 | 
					 | 
				
			||||||
	const [reply, replyErr] = $.bool.optional.get(params.reply);
 | 
					 | 
				
			||||||
	if (replyErr) return rej('invalid reply param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'renote' parameter
 | 
					 | 
				
			||||||
	const [renote, renoteErr] = $.bool.optional.get(params.renote);
 | 
					 | 
				
			||||||
	if (renoteErr) return rej('invalid renote param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'media' parameter
 | 
					 | 
				
			||||||
	const [media, mediaErr] = $.bool.optional.get(params.media);
 | 
					 | 
				
			||||||
	if (mediaErr) return rej('invalid media param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'poll' parameter
 | 
					 | 
				
			||||||
	const [poll, pollErr] = $.bool.optional.get(params.poll);
 | 
					 | 
				
			||||||
	if (pollErr) return rej('invalid poll param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const query = {
 | 
					 | 
				
			||||||
		_id: { $gte: new Date(Date.now() - ms('1days')) },
 | 
					 | 
				
			||||||
		renoteCount: { $gt: 0 },
 | 
					 | 
				
			||||||
		'_user.host': null
 | 
					 | 
				
			||||||
	} as any;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (reply != undefined) {
 | 
					 | 
				
			||||||
		query.replyId = reply ? { $exists: true, $ne: null } : null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (renote != undefined) {
 | 
					 | 
				
			||||||
		query.renoteId = renote ? { $exists: true, $ne: null } : null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (media != undefined) {
 | 
					 | 
				
			||||||
		query.fileIds = media ? { $exists: true, $ne: null } : null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (poll != undefined) {
 | 
					 | 
				
			||||||
		query.poll = poll ? { $exists: true, $ne: null } : null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Issue query
 | 
					 | 
				
			||||||
	const notes = await Note
 | 
					 | 
				
			||||||
		.find(query, {
 | 
					 | 
				
			||||||
			limit: limit,
 | 
					 | 
				
			||||||
			skip: offset,
 | 
					 | 
				
			||||||
			sort: {
 | 
					 | 
				
			||||||
				renoteCount: -1,
 | 
					 | 
				
			||||||
				_id: -1
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Serialize
 | 
					 | 
				
			||||||
	res(await Promise.all(notes.map(async note =>
 | 
					 | 
				
			||||||
		await pack(note, user, { detail: true }))));
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
| 
						 | 
					@ -2,33 +2,36 @@ import $ from 'cafy';
 | 
				
			||||||
import Subscription from '../../../../models/sw-subscription';
 | 
					import Subscription from '../../../../models/sw-subscription';
 | 
				
			||||||
import { ILocalUser } from '../../../../models/user';
 | 
					import { ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import config from '../../../../config';
 | 
					import config from '../../../../config';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	requireCredential: true
 | 
						requireCredential: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							endpoint: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							auth: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							publickey: {
 | 
				
			||||||
 | 
								validator: $.str
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * subscribe service worker
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'endpoint' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [endpoint, endpointErr] = $.str.get(params.endpoint);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (endpointErr) return rej('invalid endpoint param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'auth' parameter
 | 
					 | 
				
			||||||
	const [auth, authErr] = $.str.get(params.auth);
 | 
					 | 
				
			||||||
	if (authErr) return rej('invalid auth param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'publickey' parameter
 | 
					 | 
				
			||||||
	const [publickey, publickeyErr] = $.str.get(params.publickey);
 | 
					 | 
				
			||||||
	if (publickeyErr) return rej('invalid publickey param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if already subscribed
 | 
						// if already subscribed
 | 
				
			||||||
	const exist = await Subscription.findOne({
 | 
						const exist = await Subscription.findOne({
 | 
				
			||||||
		userId: user._id,
 | 
							userId: user._id,
 | 
				
			||||||
		endpoint: endpoint,
 | 
							endpoint: ps.endpoint,
 | 
				
			||||||
		auth: auth,
 | 
							auth: ps.auth,
 | 
				
			||||||
		publickey: publickey,
 | 
							publickey: ps.publickey,
 | 
				
			||||||
		deletedAt: { $exists: false }
 | 
							deletedAt: { $exists: false }
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,9 +44,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	await Subscription.insert({
 | 
						await Subscription.insert({
 | 
				
			||||||
		userId: user._id,
 | 
							userId: user._id,
 | 
				
			||||||
		endpoint: endpoint,
 | 
							endpoint: ps.endpoint,
 | 
				
			||||||
		auth: auth,
 | 
							auth: ps.auth,
 | 
				
			||||||
		publickey: publickey
 | 
							publickey: ps.publickey
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res({
 | 
						res({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,20 +1,27 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import User from '../../../../models/user';
 | 
					import User from '../../../../models/user';
 | 
				
			||||||
import { validateUsername } from '../../../../models/user';
 | 
					import { validateUsername } from '../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const meta = {
 | 
				
			||||||
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							username: {
 | 
				
			||||||
 | 
								validator: $.str.pipe(validateUsername)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Check available username
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default async (params: any) => new Promise(async (res, rej) => {
 | 
					export default async (params: any) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'username' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [username, usernameError] = $.str.pipe(validateUsername).get(params.username);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (usernameError) return rej('invalid username param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get exist
 | 
						// Get exist
 | 
				
			||||||
	const exist = await User
 | 
						const exist = await User
 | 
				
			||||||
		.count({
 | 
							.count({
 | 
				
			||||||
			host: null,
 | 
								host: null,
 | 
				
			||||||
			usernameLower: username.toLowerCase()
 | 
								usernameLower: ps.username.toLowerCase()
 | 
				
			||||||
		}, {
 | 
							}, {
 | 
				
			||||||
			limit: 1
 | 
								limit: 1
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,30 +1,38 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import User, { pack, ILocalUser } from '../../../models/user';
 | 
					import User, { pack, ILocalUser } from '../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const meta = {
 | 
				
			||||||
 | 
						requireCredential: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							offset: {
 | 
				
			||||||
 | 
								validator: $.num.optional.min(0),
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sort: {
 | 
				
			||||||
 | 
								validator: $.str.optional.or('+follower|-follower'),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Lists all users
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'limit' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get 'offset' parameter
 | 
					 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get 'sort' parameter
 | 
					 | 
				
			||||||
	const [sort, sortError] = $.str.optional.or('+follower|-follower').get(params.sort);
 | 
					 | 
				
			||||||
	if (sortError) return rej('invalid sort param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Construct query
 | 
					 | 
				
			||||||
	let _sort;
 | 
						let _sort;
 | 
				
			||||||
	if (sort) {
 | 
						if (ps.sort) {
 | 
				
			||||||
		if (sort == '+follower') {
 | 
							if (ps.sort == '+follower') {
 | 
				
			||||||
			_sort = {
 | 
								_sort = {
 | 
				
			||||||
				followersCount: -1
 | 
									followersCount: -1
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
		} else if (sort == '-follower') {
 | 
							} else if (ps.sort == '-follower') {
 | 
				
			||||||
			_sort = {
 | 
								_sort = {
 | 
				
			||||||
				followersCount: 1
 | 
									followersCount: 1
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					@ -35,17 +43,14 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Issue query
 | 
					 | 
				
			||||||
	const users = await User
 | 
						const users = await User
 | 
				
			||||||
		.find({
 | 
							.find({
 | 
				
			||||||
			host: null
 | 
								host: null
 | 
				
			||||||
		}, {
 | 
							}, {
 | 
				
			||||||
			limit: limit,
 | 
								limit: ps.limit,
 | 
				
			||||||
			sort: _sort,
 | 
								sort: _sort,
 | 
				
			||||||
			skip: offset
 | 
								skip: ps.offset
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Serialize
 | 
						res(await Promise.all(users.map(user => pack(user, me))));
 | 
				
			||||||
	res(await Promise.all(users.map(async user =>
 | 
					 | 
				
			||||||
		await pack(user, me))));
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import $ from 'cafy';
 | 
					import $ from 'cafy';
 | 
				
			||||||
import UserList, { pack } from '../../../../../models/user-list';
 | 
					import UserList, { pack } from '../../../../../models/user-list';
 | 
				
			||||||
import { ILocalUser } from '../../../../../models/user';
 | 
					import { ILocalUser } from '../../../../../models/user';
 | 
				
			||||||
 | 
					import getParams from '../../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -10,19 +11,24 @@ export const meta = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kind: 'account-write'
 | 
						kind: 'account-write',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							title: {
 | 
				
			||||||
 | 
								validator: $.str.range(1, 100)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'title' parameter
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
	const [title, titleErr] = $.str.range(1, 100).get(params.title);
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
	if (titleErr) return rej('invalid title param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// insert
 | 
						// insert
 | 
				
			||||||
	const userList = await UserList.insert({
 | 
						const userList = await UserList.insert({
 | 
				
			||||||
		createdAt: new Date(),
 | 
							createdAt: new Date(),
 | 
				
			||||||
		userId: user._id,
 | 
							userId: user._id,
 | 
				
			||||||
		title: title,
 | 
							title: ps.title,
 | 
				
			||||||
		userIds: []
 | 
							userIds: []
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ import { getFriendIds } from '../../common/get-friends';
 | 
				
			||||||
import Mute from '../../../../models/mute';
 | 
					import Mute from '../../../../models/mute';
 | 
				
			||||||
import * as request from 'request';
 | 
					import * as request from 'request';
 | 
				
			||||||
import config from '../../../../config';
 | 
					import config from '../../../../config';
 | 
				
			||||||
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -13,10 +14,25 @@ export const meta = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	requireCredential: true,
 | 
						requireCredential: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kind: 'account-read'
 | 
						kind: 'account-read',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params: {
 | 
				
			||||||
 | 
							limit: {
 | 
				
			||||||
 | 
								validator: $.num.optional.range(1, 100),
 | 
				
			||||||
 | 
								default: 10
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							offset: {
 | 
				
			||||||
 | 
								validator: $.num.optional.min(0),
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
 | 
						const [ps, psErr] = getParams(meta, params);
 | 
				
			||||||
 | 
						if (psErr) return rej(psErr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (config.user_recommendation && config.user_recommendation.external) {
 | 
						if (config.user_recommendation && config.user_recommendation.external) {
 | 
				
			||||||
		const userName = me.username;
 | 
							const userName = me.username;
 | 
				
			||||||
		const hostName = config.hostname;
 | 
							const hostName = config.hostname;
 | 
				
			||||||
| 
						 | 
					@ -45,14 +61,6 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		// Get 'limit' parameter
 | 
					 | 
				
			||||||
		const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
					 | 
				
			||||||
		if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Get 'offset' parameter
 | 
					 | 
				
			||||||
		const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
					 | 
				
			||||||
		if (offsetErr) return rej('invalid offset param');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// ID list of the user itself and other users who the user follows
 | 
							// ID list of the user itself and other users who the user follows
 | 
				
			||||||
		const followingIds = await getFriendIds(me._id);
 | 
							const followingIds = await getFriendIds(me._id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,15 +80,13 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				host: null
 | 
									host: null
 | 
				
			||||||
			}, {
 | 
								}, {
 | 
				
			||||||
				limit: limit,
 | 
									limit: ps.limit,
 | 
				
			||||||
				skip: offset,
 | 
									skip: ps.offset,
 | 
				
			||||||
				sort: {
 | 
									sort: {
 | 
				
			||||||
					followersCount: -1
 | 
										followersCount: -1
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Serialize
 | 
							res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
 | 
				
			||||||
		res(await Promise.all(users.map(async user =>
 | 
					 | 
				
			||||||
			await pack(user, me, { detail: true }))));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue