|
import _ from 'lodash';
|
|
|
|
import APIException from '@/lib/exceptions/APIException.ts';
|
|
import EX from '@/api/consts/exceptions.ts';
|
|
import logger from '@/lib/logger.ts';
|
|
import util from '@/lib/util.ts';
|
|
|
|
export interface RequestOptions {
|
|
time?: number;
|
|
}
|
|
|
|
export default class Request {
|
|
|
|
|
|
method: string;
|
|
|
|
url: string;
|
|
|
|
path: string;
|
|
|
|
type: string;
|
|
|
|
headers: any;
|
|
|
|
search: string;
|
|
|
|
query: any;
|
|
|
|
params: any;
|
|
|
|
body: any;
|
|
|
|
files: any[];
|
|
|
|
remoteIP: string | null;
|
|
|
|
time: number;
|
|
|
|
constructor(ctx, options: RequestOptions = {}) {
|
|
const { time } = options;
|
|
this.method = ctx.request.method;
|
|
this.url = ctx.request.url;
|
|
this.path = ctx.request.path;
|
|
this.type = ctx.request.type;
|
|
this.headers = ctx.request.headers || {};
|
|
this.search = ctx.request.search;
|
|
this.query = ctx.query || {};
|
|
this.params = ctx.params || {};
|
|
this.body = ctx.request.body || {};
|
|
this.files = ctx.request.files || {};
|
|
this.remoteIP = this.headers["X-Real-IP"] || this.headers["x-real-ip"] || this.headers["X-Forwarded-For"] || this.headers["x-forwarded-for"] || ctx.ip || null;
|
|
this.time = Number(_.defaultTo(time, util.timestamp()));
|
|
}
|
|
|
|
validate(key: string, fn?: Function) {
|
|
try {
|
|
const value = _.get(this, key);
|
|
if (fn) {
|
|
if (fn(value) === false)
|
|
throw `[Mismatch] -> ${fn}`;
|
|
}
|
|
else if (_.isUndefined(value))
|
|
throw '[Undefined]';
|
|
}
|
|
catch (err) {
|
|
logger.warn(`Params ${key} invalid:`, err);
|
|
throw new APIException(EX.API_REQUEST_PARAMS_INVALID, `Params ${key} invalid`);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
} |