UNPKG

dazjsx

Version:

参考nestjs,基于KOA2的一款轻量级的后端开发框架

185 lines (184 loc) 8.05 kB
"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;