dazjsx
Version:
参考nestjs,基于KOA2的一款轻量级的后端开发框架
185 lines (184 loc) • 8.05 kB
JavaScript
"use strict";
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DazExportFactory = void 0;
const koa_router_1 = __importDefault(require("koa-router"));
const koa_jwt_1 = __importDefault(require("koa-jwt"));
const typeorm_1 = require("typeorm");
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
const __1 = require("..");
const util_1 = require("../util");
const service_1 = require("../service");
class DazExportFactory {
constructor(coExport) {
this.entity = [];
this.controller = [];
this.export = coExport;
if (this.export) {
this.setRedisOption();
this.setController();
this.setJwtOption();
}
}
setRedisOption() {
const redis = util_1.R.getMetadata(__1.REDIS_OPTION, this.export) || {};
service_1.RedisService.option = redis;
util_1.R.setMetadata(__1.SCOP_RANG, { scope: 'root' }, service_1.RedisService);
}
setJwtOption() {
const jwt = util_1.R.getMetadata(__1.JWT_SERCET, this.export);
if (util_1.Tool.isNotEmptyObject(jwt)) {
if (util_1.Tool.isIoc(jwt)) {
const { inject, useFactory } = jwt;
const arg = inject.map((r) => new r());
this.jwt = useFactory(...arg);
}
this.jwt = jwt;
}
}
setController() {
this.controller = util_1.R.getArrayMetadata(__1.CONTROLLER_EXPORT, this.export);
this.entity = util_1.R.getArrayMetadata(__1.ENTITY_METADATA, this.export);
const module = util_1.R.getArrayMetadata(__1.MODULE_METADATA, this.export);
module.map((r) => {
const con = util_1.R.getArrayMetadata(__1.CONTROLLER_EXPORT, r);
const entity = util_1.R.getArrayMetadata(__1.ENTITY_METADATA, r);
if (con) {
this.controller.push(...con);
}
this.entity.push(...entity);
});
}
getEntity() {
return this.entity;
}
getResult(result, isJwt) {
var _a, _b, _c;
if (!util_1.Tool.isNotEmptyObject(isJwt) || !((_a = this.jwt) === null || _a === void 0 ? void 0 : _a.secret)) {
return result;
}
const { keys } = isJwt;
const val = {
_id: null,
};
keys.map((r) => {
val[r] = util_1.Tool.isNotEmptyObject(result) ? result[r] || null : null;
});
const token = jsonwebtoken_1.default.sign(val, (_b = this.jwt) === null || _b === void 0 ? void 0 : _b.secret, {
expiresIn: ((_c = this.jwt) === null || _c === void 0 ? void 0 : _c.expiresIn) || '1 days',
});
return {
access_token: token,
user: result,
};
}
JwtVerify(name, inst) {
const isSkipJwt = util_1.R.getMetadata(__1.CONTROLLER_SKIP_JWT, inst);
const isSkip = util_1.R.getMetadata(__1.CONTROLLER_SKIP_JWT, inst[name]);
return async (ctx) => {
var _a, _b, _c;
if (!(isSkipJwt || isSkip) && ((_a = this.jwt) === null || _a === void 0 ? void 0 : _a.secret)) {
try {
await (0, koa_jwt_1.default)({ secret: (_b = this.jwt) === null || _b === void 0 ? void 0 : _b.secret })(ctx, async () => { });
const token = ctx.header.authorization;
const _d = jsonwebtoken_1.default.verify(token.split(' ')[1], (_c = this.jwt) === null || _c === void 0 ? void 0 : _c.secret), { exp, iat } = _d, payload = __rest(_d, ["exp", "iat"]);
ctx.request[__1.Param.USER] = payload;
}
catch (error) {
ctx.status = 401;
ctx.errorMessage = error.message;
return false;
}
}
return true;
};
}
getFactoryArg(target) {
const providers = util_1.R.getArrayMetadata('design:paramtypes', target);
const args = providers.map((provider) => {
const { scope, entity } = util_1.R.getObjectMetadata(__1.SCOP_RANG, provider);
switch (scope) {
case 'any':
return new provider(...this.getFactoryArg(provider));
case 'root':
const scopsData = util_1.R.getArrayMetadata(__1.SCOP_RANG, this);
const pr = scopsData.find((r) => r instanceof provider);
if (!pr) {
const tg = new provider(...this.getFactoryArg(provider));
util_1.R.setMetadata(__1.SCOP_RANG, [...scopsData, tg], this);
return tg;
}
return pr;
case 'typeOrm':
return (0, typeorm_1.getRepository)(entity);
default:
throw new Error(`依赖注入错误:${provider.name}为未使用injectable控制反转,无法注入引用`);
}
});
return args;
}
processController(inst) {
return new inst(...this.getFactoryArg(inst));
}
getRouters() {
const router = new koa_router_1.default();
this.controller.forEach((inst) => {
const controller = this.processController(inst);
const prefix = util_1.R.getMetadata(__1.CONTROLLER_METADATA, inst);
const logs = new service_1.LogService(inst.name);
util_1.R.getMethodPrototype(controller).map(({ name, methodFn }) => {
const { method, path } = util_1.R.getObjectMetadata(__1.METHOD_PATH_METADATA, methodFn);
const handler = this.handlerFactory(name, controller, util_1.R.getMetadata(__1.PARAM_METADATA, controller, name));
if (method && router[method.toLocaleLowerCase()]) {
logs.info(`{ ${util_1.Tool.getPath(prefix, path)} , ${method} }`);
router[method.toLocaleLowerCase()](util_1.Tool.getPath(prefix, path), handler);
}
});
});
return router;
}
handlerFactory(name, inst, paramList) {
return async (ctx, next) => {
const isSuccess = await this.JwtVerify(name, inst)(ctx);
const isJwt = util_1.R.getMetadata(__1.JWT_LOGIN_SIGN, inst[name]);
if (isSuccess || isJwt) {
try {
const args = this.extractParameters(ctx, next, paramList);
const result = await inst[name](...args);
ctx.status = 200;
ctx.proBody = this.getResult(result, isJwt);
}
catch (err) {
ctx.status = 500;
ctx.errorMessage = err.message;
}
}
await next();
};
}
extractParameters(ctx, next, paramList = []) {
if (!paramList.length) {
return [ctx, next];
}
const args = [];
paramList.forEach(({ key, index, type }) => {
args[index] = util_1.Tool.getParams(ctx.request, type)(key);
});
args.push(ctx, next);
return args;
}
}
exports.DazExportFactory = DazExportFactory;